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

如何设置对象旋转?鼠标指向角度控制旋转异常求助

问题原因与修复方案

你的代码存在三个核心问题,导致对象旋转方向随机:

1. 鼠标坐标转换逻辑颠倒

你误用了WorldToScreenPoint,这个方法是把世界坐标转成屏幕坐标,但你需要的是把屏幕鼠标位置转换为世界坐标,应该用ScreenToWorldPoint,同时要给Z轴指定有效深度(比如相机到物体的距离,避免得到相机所在平面的错误坐标)。

2. 坐标空间不匹配

你用屏幕空间的鼠标位置减去物体的世界空间位置计算方向向量,两个坐标不在同一空间,得到的方向完全错误,必须统一用世界空间坐标计算。

3. 旋转值比较错误

  • transform.rotation.z是四元数的分量,不是欧拉角的Z轴旋转角度,正确应该取transform.eulerAngles.z。
  • 浮点数不能直接用==判断相等,因为存在精度误差,要用Mathf.Approximately做近似比较。

修正后的代码

Camera cam = Camera.main;

// 将屏幕鼠标位置转为世界坐标,Z值取相机到物体的距离保证坐标正确
Vector3 mouseWorldPos = cam.ScreenToWorldPoint(
    new Vector3(Input.mousePosition.x, Input.mousePosition.y, cam.transform.position.z - transform.position.z)
);

// 计算世界空间下鼠标到物体的XY平面方向向量
Vector2 lookDir = new Vector2(
    mouseWorldPos.x - transform.position.x, 
    mouseWorldPos.y - transform.position.y
);

float angle = Mathf.Atan2(lookDir.y, lookDir.x) * Mathf.Rad2Deg;

// 近似判断是否需要旋转(可选,直接赋值旋转性能开销也很低)
if (!Mathf.Approximately(transform.eulerAngles.z, angle))
{
    transform.rotation = Quaternion.Euler(0, 0, angle);
}

额外说明

  • 如果是2D场景,确保相机为正交相机,Z轴设置避免坐标混淆。
  • 其实可以直接去掉判断逻辑,直接赋值旋转,Unity的Quaternion赋值性能开销极小,没必要额外做近似比较(除非有特殊性能需求)。

内容的提问来源于stack exchange,提问作者ratonotota

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:00:58