Unity玩家沿世界坐标系前进问题:如何让玩家朝自身朝向移动?
Unity玩家移动不跟随朝向的问题解决
问题根源
- 你的移动方向直接用了世界坐标系的
Vector3(-vertical, 0, 0),完全和玩家自身的朝向无关,所以不管玩家转多少角度,移动方向都固定不变。 - 代码里的
transform.TransformDirection(Vector3.forward)虽然能把玩家局部前方向转成世界方向,但你没把这个结果赋值给任何变量,等于白执行了这行代码。 - 逻辑上也有偏差:Unity默认的
Vertical轴对应前后移动,你却用它控制X轴方向,和常规W/S控制前后的操作逻辑不匹配。
解决方法
核心思路
让移动方向基于玩家自身的局部前方向,而非固定的世界坐标。
修正后的代码
void PlayerMover() { _step = _speed * _speedMultiplier * Time.deltaTime; PlayerBoost(); float vertical = Input.GetAxis("Vertical"); PlayerRotation(); // 用玩家自身的前方向乘以输入值,得到跟随朝向的移动方向 Vector3 direction = transform.forward * vertical; // 锁定Y轴,确保只在水平面上移动 direction.y = 0; transform.position += direction * _step; }
关键细节解释
transform.forward是Unity封装好的属性,直接返回玩家自身"前方"对应的世界坐标系方向向量,等价于你之前写的transform.TransformDirection(Vector3.forward),但更简洁。- 加上
direction.y = 0是为了避免玩家因为模型倾斜、地形高度差等原因出现意外的上下移动,保证移动始终在水平面上。 - 如果你的操作逻辑是W/S控制前后、A/D控制左右,可以补充水平方向的处理:
float horizontal = Input.GetAxis("Horizontal"); Vector3 direction = transform.forward * vertical + transform.right * horizontal; direction.y = 0; direction.Normalize(); // 防止斜向移动时速度翻倍
内容的提问来源于stack exchange,提问作者eyetengu
相关产品推荐
相关产品推荐

