Godot中实现角色沿视角方向移动遇异常,求技术解决
Godot角色沿相机视线方向移动问题修复
你的代码存在几个核心问题,导致角色移动异常:
- 无效的方向向量:
direction初始化为空Vector3(),后续的旋转操作无法生成有效的移动方向,导致move_toward行为错乱。 - 错误的移动方式:直接修改
position会绕过CharacterBody3D的物理系统,且move_and_slide()依赖velocity属性生效,原代码中的调用完全无效。 - 未正确获取相机视线方向:没有基于相机朝向计算移动方向,也未限制移动在水平面上,导致出现非预期的上下移动。
修正后的代码(适配你的场景结构)
假设你的场景树是CharacterBody3D作为根节点,下方挂载Node3D(相机旋转支点),Node3D下是Camera3D:
extends CharacterBody3D @export var speed: float = 5.0 @export var camera_pivot: Node3D # 在编辑器中将场景中的Node3D拖拽到这里 func _physics_process(delta: float): # 获取前后方向的输入值(对应你设置的"forward"/"backward"输入映射) var forward_input = Input.get_axis("backward", "forward") # 获取相机的全局前向向量:Godot默认相机前向为-Z方向,所以取basis.z的反向 var camera_forward = camera_pivot.global_transform.basis.z * -1 # 移除Y轴分量,确保角色仅在水平面上移动 camera_forward.y = 0.0 # 归一化向量,避免斜向移动速度异常 camera_forward = camera_forward.normalized() # 计算最终移动方向并设置速度 velocity = camera_forward * forward_input * speed # 执行物理移动 move_and_slide()
关键说明
- 相机方向获取:通过
camera_pivot的全局变换获取前向,确保方向随相机旋转同步更新。 - 水平移动限制:将
camera_forward的Y分量设为0,彻底解决角色上下偏移的问题。 - 正确的物理移动:依赖CharacterBody3D的
velocity属性和move_and_slide(),既保证物理碰撞生效,又符合引擎的移动逻辑。
内容的提问来源于stack exchange,提问作者Mr Key8840
相关产品推荐
相关产品推荐

