角度转Vector3异常:游戏飞刀右键朝向移动功能失效
问题解决:飞刀朝向移动功能修复
核心错误分析
你当前代码的问题出在角度获取与方向计算上:
transform.rotation是四元数,它的x/y/z/w分量不是直观的欧拉角度,直接拿transform.rotation.x计算会得到完全错误的角度值,这是方向失效的根本原因。- 你绕Y轴旋转飞刀,却在XY平面计算方向,不符合3D空间的移动逻辑(飞刀应该在XZ平面水平移动)。
修复方案(两种可选)
方案1:基于欧拉角计算正确方向
直接获取绕Y轴的欧拉角,转换为弧度后计算XZ平面的移动方向:
private void Update() { if (Input.GetKeyDown(KeyCode.Mouse0)) { Jump(); _rotationSpeed = 250; } if (Input.GetKeyDown(KeyCode.Mouse1)) { _rotationSpeed = 0; // 获取Y轴欧拉角并转弧度(绕Y轴旋转的角度) float angle = transform.eulerAngles.y * Mathf.Deg2Rad; // 计算XZ平面的方向向量(Y轴保持0,确保水平移动) Vector3 direction = new Vector3(Mathf.Cos(angle), 0f, Mathf.Sin(angle)).normalized; Debug.Log(direction); // 施加力,可选改用ForceMode.Impulse获得更直接的瞬时效果 _rigidbody.AddForce(direction * 600, ForceMode.Force); } transform.Rotate(new Vector3(0, _rotationSpeed, 0) * Time.deltaTime); }
方案2:直接使用Transform方向向量(更简洁)
不需要计算角度,直接利用物体自身的朝向向量,更高效且不易出错:
private void Update() { if (Input.GetKeyDown(KeyCode.Mouse0)) { Jump(); _rotationSpeed = 250; } if (Input.GetKeyDown(KeyCode.Mouse1)) { _rotationSpeed = 0; // 根据你的飞刀模型朝向选择: // 如果尖端指向X轴正方向 → 使用transform.right Vector3 direction = transform.right; // 如果尖端指向Z轴正方向 → 使用transform.forward // Vector3 direction = transform.forward; // 确保方向水平(可选,根据需求调整) direction.y = 0f; direction = direction.normalized; Debug.Log(direction); _rigidbody.AddForce(direction * 600, ForceMode.Force); } transform.Rotate(new Vector3(0, _rotationSpeed, 0) * Time.deltaTime); }
额外优化建议
- 如果希望飞刀移动更“灵敏”,可以把
ForceMode.Force换成ForceMode.Impulse,后者是瞬时冲量,不受物体质量影响,更符合点击后立刻冲刺的手感。 - 确保你的Rigidbody组件勾选了
Use Gravity,否则跳跃后飞刀不会下落,影响游戏体验。
内容的提问来源于stack exchange,提问作者BoBoBo
相关产品推荐
相关产品推荐

