Unity物体设置旋转至90度后仍持续旋转的问题求助
解决Unity物体旋转至90度后持续旋转的问题
问题根源分析
- 浮点数精度陷阱:你用
transformZ != 90作为循环终止条件,但float类型累加0.1时,由于二进制浮点数的精度限制,永远无法精确等于90,导致循环无限执行。 - 旋转逻辑错误:
transform.Rotate(0, 0, transformZ)是每次旋转transformZ度,而transformZ一直在递增,这会让物体旋转速度越来越快,完全偏离“转到90度停止”的需求。
修正方案一:固定步长旋转
适合需要匀速分步旋转的场景:
public class playerScript : MonoBehaviour { // 每次旋转的固定步长 public float rotateStep = 0.1f; // 目标Z轴旋转角度 private readonly float targetZ = 90f; IEnumerator Start() { transform.position = new Vector3(0, 0, 0); float currentZ = transform.eulerAngles.z; // 用<=判断替代精确相等,避免精度问题 while (currentZ < targetZ) { transform.Rotate(0, 0, rotateStep); currentZ += rotateStep; // 防止步长导致角度超过目标值,直接修正到目标角度 if (currentZ > targetZ) { transform.eulerAngles = new Vector3(0, 0, targetZ); break; } yield return new WaitForSeconds(0.1f); } } }
修正方案二:平滑插值旋转(推荐)
用Quaternion插值实现更自然的平滑旋转,同时避免欧拉角的万向锁问题:
public class playerScript : MonoBehaviour { // 旋转速度(值越大旋转越快) public float rotateSpeed = 20f; private readonly float targetZ = 90f; IEnumerator Start() { transform.position = new Vector3(0, 0, 0); Quaternion targetRotation = Quaternion.Euler(0, 0, targetZ); // 当当前旋转与目标旋转的夹角大于0.1度时继续旋转 while (Quaternion.Angle(transform.rotation, targetRotation) > 0.1f) { // 基于时间的平滑插值,保证不同帧率下速度一致 transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, rotateSpeed * Time.deltaTime); yield return null; } // 最后直接设置到目标角度,消除微小误差 transform.rotation = targetRotation; } }
关键注意事项
- 永远不要用
==或!=判断float类型的相等,改用范围比较或>=/<=逻辑。 - 复杂旋转场景优先使用Quaternion,避免欧拉角的万向锁问题。
- 基于时间的插值(如
Time.deltaTime)能保证旋转速度不受帧率影响。
内容的提问来源于stack exchange,提问作者CheeseGunner
相关产品推荐
相关产品推荐

