如何对基于光标位置的Unity物体旋转效果进行平滑处理
解决方案
你当前代码的问题有两个:
- 每帧直接对旋转属性硬赋值,没有过渡缓冲,所以角度变化时会非常突兀
- 代码存在重复定义
rotationZ变量的语法问题,局部声明的变量覆盖了类成员变量
首先在类中新增平滑控制参数,保留类成员rotationZ的声明即可:
// 可调参数,数值越大旋转响应越快,越小越平滑 public float rotateSmoothSpeed = 8f; private float rotationZ;
然后修改旋转逻辑,使用Mathf.LerpAngle做角度插值(专门处理角度环360度/0度跳转的插值方法,不会出现反向旋转的问题):
Vector3 difference = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position; difference.Normalize(); // 计算目标旋转角度 float targetRotationZ = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg; // 对当前角度和目标角度做平滑插值 rotationZ = Mathf.LerpAngle(rotationZ, targetRotationZ, rotateSmoothSpeed * Time.deltaTime); // 赋值旋转 transform.rotation = Quaternion.Euler(0f, 0f, rotationZ);
额外优化建议
如果需要进一步解决光标靠近枢轴时的微小扰动导致的旋转抖动,可以添加距离死区判断,当光标距离物体小于阈值时不更新目标角度:
Vector3 difference = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position; // 添加死区判断,距离小于0.1f时不更新旋转 if (difference.magnitude < 0.1f) return; difference.Normalize(); // 后续插值逻辑同上
内容的提问来源于stack exchange,提问作者Greenbean 77
相关产品推荐
相关产品推荐

