Unity中用三角函数实现物体绕玩家旋转朝向鼠标的代码原理求教
功能总述
这段是Unity引擎2D场景下的逻辑代码,挂载到需要跟随的物体(比如枪支)上后,可实现物体始终围绕玩家公转、朝向与鼠标方向对齐的效果,所有逻辑每帧实时更新。
变量定义说明
public GameObject player; private Vector3 v3Pos; private float angle; private readonly float distance = 0.16f;
player:公转中心的玩家对象,需要在Inspector面板手动赋值v3Pos:临时存储坐标转换过程中的向量数据angle:存储鼠标相对于玩家的方向角度,单位为角度distance:轨道半径基准值,后续计算时会放大4倍使用
逐行逻辑解析
1. 鼠标坐标空间转换
v3Pos = Input.mousePosition; v3Pos.z = (player.transform.position.z - Camera.main.transform.position.z); v3Pos = Camera.main.ScreenToWorldPoint(v3Pos); v3Pos -= player.transform.position;
- 首先通过
Input.mousePosition获取鼠标的屏幕坐标,这个坐标的原点在屏幕左下角,单位为像素,默认z值为0 - 给
v3Pos.z赋值是为了保证后续转换后的世界坐标和玩家处于同一平面,避免深度偏差 ScreenToWorldPoint方法将屏幕坐标转换为Unity世界空间坐标,得到鼠标在场景中的实际位置- 最后减去玩家的世界坐标,得到鼠标相对于玩家的方向向量,原点对齐到玩家位置
2. 计算朝向角度
angle = Mathf.Atan2(v3Pos.y, v3Pos.x) * Mathf.Rad2Deg; if (angle < 0.0f) { angle += 360.0f; } transform.localEulerAngles = new Vector3(0, 0, angle);
Mathf.Atan2根据方向向量的y、x分量,计算出向量与X轴正方向的夹角,返回值为弧度,乘Mathf.Rad2Deg转换为角度,默认范围是-180°~180°- 加判断把负角度转换为0°~360°的正角度,避免后续计算出错
- 给物体的Z轴旋转赋值,实现物体朝向和鼠标方向对齐的效果
3. 计算公转轨道位置
float xPos = Mathf.Cos(Mathf.Deg2Rad * angle) * distance; float yPos = Mathf.Sin(Mathf.Deg2Rad * angle) * distance; transform.localPosition = new Vector3(player.transform.position.x + xPos * 4, player.transform.position.y + yPos * 4, 0);
- 把角度转回弧度,通过三角函数
Cos、Sin计算出对应角度下,单位圆上的X、Y分量 - 以玩家坐标为中心,加上偏移分量(乘4是硬编码的放大系数,实际生效的轨道半径为0.16*4=0.64),固定Z轴为0,得到物体在公转轨道上的最终位置,鼠标移动时角度变化,物体位置也会同步在轨道上移动
补充说明
这段代码默认适配2D正交相机场景,若用于透视相机或3D项目,需要调整深度计算逻辑;硬编码的系数4可以抽成公开变量,方便在编辑器中直接调整轨道半径。
内容的提问来源于stack exchange,提问作者omoor
相关产品推荐
相关产品推荐

