You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对基于光标位置的Unity物体旋转效果进行平滑处理

解决方案

你当前代码的问题有两个:

  1. 每帧直接对旋转属性硬赋值,没有过渡缓冲,所以角度变化时会非常突兀
  2. 代码存在重复定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:45:04