在游戏场景中,有一个物体A,有一个初始朝向,此时如果附近出现敌人,那么需要改变朝向,然后做一些其它事情,比如攻击等动作,这里要讨论的就是改变朝向这个动作。
针对2D世界:
假设A默认向右,这里可以用向量Vector2(1,0)表示其初始朝向,目标为target,则可以先计算目标方向,然后旋转到目标方向,关键代码如下(可以直接查看参考链接):
#http://kidscancode.org/blog/2018/04/godot3_tanks_part3/
#向目标target旋转
func aim(target, delta):
#计算目标向量
var target_dir = (target.global_position - global_position).normalized()
#注意当前方向受旋转影响
var current_dir = Vector2(1, 0).rotated(global_rotation)
#这里采用了线性插值方式,类似转身动画
#angle计算的是与x坐标的夹角,即Vector2(1, 0)
global_rotation = current_dir.linear_interpolate(target_dir, delta).angle()
pass
针对3D世界:
同样A默认向右Vector3(1,0,0),需要注意的是,我们这里仅针对Y轴旋转:
#正常情况下,一般是左右旋转,绕Y轴旋转
func aim(target, delta):
#计算目标向量
var target_dir = (target.global_transform.origin - global_transform.origin).normalized()
#注意当前方向受旋转影响,如果是Vector3(1, 0, 0),意味这目前初始向右。
#注意弧度与角度
var current_dir = Vector3(1, 0, 0).rotated(Vector3.UP , rotation.y)
#global_transform.rotated(
#这里采用了线性插值方式,类似转身动画
#angle计算的是与x坐标的夹角,即Vector3(1, 0, 0)
#注意选择总是针对局部,即以初始朝向为基础
rotation.y = current_dir.linear_interpolate(target_dir, delta).angle_to(Vector3(1, 0, 0))
pass