Godot中如何让玩家朝向自身移动方向旋转?
代码失效核心原因
你编写的逻辑存在明显的逻辑冲突:每次调用rotate_object_local()完成旋转计算后,立刻执行了transform.basis = Basis(),无参构造的Basis代表世界坐标系下无旋转的初始姿态,这行代码会直接覆盖你刚才的旋转结果,所以看起来没有任何效果。
除此之外你的现有实现还存在几个不符合需求的问题:
rotate_object_local第三个参数为旋转弧度值,你设置的1弧度约等于57度,若在帧循环中执行会导致旋转速度过快,需要乘以帧间隔delta实现帧率无关的计算- 分按键单独判断旋转的逻辑冗余,无法适配斜向移动等多按键同时触发的场景
- 绕
Vector3.LEFT轴旋转会导致物体上下俯仰,不符合常规3D角色沿水平方向朝向移动方向的需求
修复后的实现方案
推荐直接根据输入向量对齐朝向,逻辑更简洁也更容易扩展,可直接放在_physics_process回调中执行:
# 收集输入方向 var input_dir = Vector3.ZERO input_dir.z = Input.get_action_strength("move_backward") - Input.get_action_strength("move_forward") input_dir.x = Input.get_action_strength("move_right") - Input.get_action_strength("move_left") input_dir = input_dir.normalized() # 有有效输入时更新朝向 if input_dir.length_squared() > 0: # 直接对齐到移动方向,Y轴保持向上 transform.basis = Basis.looking_at(input_dir, Vector3.UP) # 若需要平滑旋转效果可替换为下面的代码,10为旋转速度系数,数值越大旋转越快 # transform.basis = transform.basis.slerp(Basis.looking_at(input_dir, Vector3.UP), 10 * delta)
如果你的项目是2D的,需要调整为使用rotation属性适配2D坐标系的计算逻辑。
内容的提问来源于stack exchange,提问作者FreddieLumsden
相关产品推荐
相关产品推荐

