Unity中使用Rewired的第三人称角色控制器移动方向异常问题
问题解决:Rewired控制3D角色移动时出现上下位移而非前后移动
问题根源
Unity 3D空间的轴定义:
- X轴对应左右方向
- Y轴对应上下方向
- Z轴对应前后方向
你当前代码把Vertical输入(对应前后的输入信号)赋值给了moveVector.y,直接导致角色沿Y轴(上下)移动,而非预期的Z轴(前后)移动。
修复方案
1. 修正轴的赋值逻辑
修改GetInput方法,将前后输入对应到Z轴:
private void GetInput() { moveVector.x = player.GetAxis("Horizontal"); // 左右输入绑定X轴 moveVector.z = player.GetAxis("Vertical"); // 前后输入绑定Z轴 fire = player.GetButtonDown("Fire"); }
2. 适配角色转向(可选但推荐)
如果角色需要转向后保持输入方向与视角一致,需将世界空间的移动向量转换为角色本地坐标系方向:
修改ProcessInput中的移动代码:
private void ProcessInput() { // 处理移动 if(moveVector.x != 0.0f || moveVector.z != 0.0f) { // 将世界空间向量转为角色本地空间,保证转向后移动方向匹配视角 Vector3 localMove = transform.TransformDirection(moveVector); cc.Move(localMove * moveSpeed * Time.deltaTime); } // 其余开火代码保持不变... }
3. 移除冲突组件(关键)
你同时使用了CharacterController和Rigidbody,这两个组件会互相干扰(CharacterController会接管物理移动,Rigidbody的力会被覆盖)。如果用CharacterController做移动,需:
- 删除脚本中的
public Rigidbody rb;引用 - 移除角色对象上的Rigidbody组件
- 改用CharacterController实现跳跃(需自行处理重力和落地检测):
// 添加重力与垂直速度变量 private float gravity = 9.8f; private float verticalVelocity = 0; private void ProcessInput() { Vector3 moveDirection = Vector3.zero; // 处理水平移动 if(moveVector.x != 0.0f || moveVector.z != 0.0f) { moveDirection = transform.TransformDirection(moveVector); } // 处理重力与跳跃 if(cc.isGrounded) { verticalVelocity = 0; if(player.GetButtonDown("Jump")) { verticalVelocity = Mathf.Sqrt(jumpForce * 2 * gravity); } } else { verticalVelocity -= gravity * Time.deltaTime; } moveDirection.y = verticalVelocity; cc.Move(moveDirection * moveSpeed * Time.deltaTime); // 其余开火代码保持不变... }
额外检查点
- 确认Rewired输入映射中,
Horizontal绑定左右按键(如A/D、左摇杆左右),Vertical绑定前后按键(如W/S、左摇杆前后) - 可在Scene视图中观察角色的轴方向,验证X/Z轴是否符合预期
内容的提问来源于stack exchange,提问作者Styles
相关产品推荐
相关产品推荐

