Unity实现物体绕全局轴限幅旋转,添加D键逻辑后异常求解决
问题分析与修复方案
你的代码出现异常的核心问题有两个:
- 仅用单个
targetAngle变量,无法同时处理Z轴和X轴的独立旋转目标 - A键的
else分支会覆盖D键的输入逻辑——按住D键时,因为没按A,会直接执行回正逻辑,导致旋转无法生效
以下是修复后的完整代码,同时实现了所有按键的需求:
public float rotationSpeed = 100f; public float returnSpeed = 10f; // 拆分Z轴和X轴的目标角度,分别独立控制 private float targetZAngle = 0f; private float targetXAngle = 0f; void Update() { // 处理Z轴旋转(A/D键) if (Input.GetKey(KeyCode.A)) { // A键:向正Z轴旋转,限制在0~10度 targetZAngle = Mathf.Clamp(targetZAngle + rotationSpeed * Time.deltaTime, 0, 10); } else if (Input.GetKey(KeyCode.D)) { // D键:向负Z轴旋转,限制在-10~0度 targetZAngle = Mathf.Clamp(targetZAngle - rotationSpeed * Time.deltaTime, -10, 0); } else { // 未按A/D,Z轴缓慢回正 targetZAngle = Mathf.LerpAngle(targetZAngle, 0, returnSpeed * Time.deltaTime); } // 处理X轴旋转(W/S键) if (Input.GetKey(KeyCode.W)) { // W键:向正X轴旋转,限制在0~10度 targetXAngle = Mathf.Clamp(targetXAngle + rotationSpeed * Time.deltaTime, 0, 10); } else if (Input.GetKey(KeyCode.S)) { // S键:向负X轴旋转,限制在-10~0度 targetXAngle = Mathf.Clamp(targetXAngle - rotationSpeed * Time.deltaTime, -10, 0); } else { // 未按W/S,X轴缓慢回正 targetXAngle = Mathf.LerpAngle(targetXAngle, 0, returnSpeed * Time.deltaTime); } // 合并两个轴的旋转,应用到物体 transform.rotation = Quaternion.Euler(targetXAngle, 0, targetZAngle); }
关键修复点说明
- 拆分角度变量:用
targetZAngle和targetXAngle分别控制两个轴的旋转目标,避免互相干扰 - 独立按键判断:对A/D和W/S分别用
if-else if逻辑,确保同一轴的两个按键互斥,且未按键时才执行回正 - 正确的范围限制:每个按键对应的旋转方向设置了精准的
Clamp范围,比如D键限制在-10到0,确保不会超出±10度的要求 - 全局轴旋转:通过
Quaternion.Euler直接设置全局轴的旋转角度,符合需求中的全局轴旋转要求
内容的提问来源于stack exchange,提问作者Zvonko Sabljic
相关产品推荐
相关产品推荐

