You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity中2D精灵朝向指定点旋转时如何保持与相机垂直?

解决Unity 2D精灵朝向目标旋转时不可见的问题

嘿,我完全懂你遇到的糟心事——用LookRotation在2D项目里转蠕虫精灵,结果2D视图里直接看不到它了,只有切到3D视角才找得到。这事儿的核心原因是:LookRotation专为3D场景设计的旋转方法,它会让你的蠕虫在3D空间里完全转向目标,导致精灵本该对着相机的正面彻底偏离视角,自然在2D视图里就“消失”了。

问题根源

你之前的代码大概是这个路子:

Vector3 relativePos = target.transform.position - worm.transform.position;
Quaternion rotation = Quaternion.LookRotation(relativePos);
worm.transform.rotation = rotation;

这段代码会让蠕虫的前方向(Z轴)直接指向目标,但你的2D精灵默认是面朝相机的(比如Y轴朝上、Z轴对着相机),这么一旋转,精灵的侧面就怼向2D视图了,看起来就像凭空消失了一样。

正确的2D旋转方案

在2D场景里,我们只需要让精灵绕Z轴旋转(也就是在X/Y平面内转向目标),同时死死守住精灵正面朝向相机的状态。具体步骤如下:

  1. 只取目标和蠕虫在X/Y平面的相对位置(忽略Z轴,避免3D方向干扰)
  2. Mathf.Atan2算出这个方向对应的角度
  3. 把角度转成欧拉角,只设置Z轴的旋转值,X/Y轴保持为0

完整代码示例:

// 提取目标与蠕虫在X/Y平面的相对方向
Vector2 direction = new Vector2(
    target.transform.position.x - worm.transform.position.x,
    target.transform.position.y - worm.transform.position.y
);

// 将弧度转换为角度,计算旋转值
float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;

// 设置旋转:仅绕Z轴转,X/Y轴保持0(确保精灵正面始终对着相机)
worm.transform.rotation = Quaternion.Euler(0, 0, angle - 90); 
// 注:减90是因为默认精灵可能朝上,若你的精灵默认朝右,就去掉这个减号

细节补充

  • Mathf.Atan2(direction.y, direction.x):计算从蠕虫指向目标的方向与X轴正方向的夹角(弧度),转成角度后就是我们需要的Z轴旋转值。
  • 为什么要调90度?如果你的精灵默认是**朝上(Y轴正方向)**的,而Atan2算的是朝向X轴正方向的角度,所以得减90度让精灵正面对准目标;如果精灵默认朝右,就不用减。
  • 保持X/Y轴旋转为0:这能确保精灵的正面一直对着正交相机(相机沿Z轴正方向看向场景),不会再出现3D旋转导致的不可见问题。

效果对应

  • 图1(2D视图蠕虫不可见):因为LookRotation让精灵在3D空间里转偏了,正面完全离开相机视角,所以2D视图看不到。
  • 图2(3D视图可见):3D视角能看到精灵的侧面,说明精灵确实被旋转了,但方向完全不符合2D场景的需求。

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

火山引擎 最新活动