首页 > 解决方案 > 在 Unity 中沿其移动方向旋转对象

问题描述

我有一个 2D 对象,它简单地向前移动,直到它撞到另一个对象,其中物理材料导致对象从另一个对象反弹。

我不是最擅长绘图,但这里有一个我想要它做的说明:(球体中的箭头表示球体当前面向的方向)

在此处输入图像描述

在此处输入图像描述

我把它的物理部分写得很好,但是物理材料不会旋转游戏对象,所以实际结果看起来更像这样:

在此处输入图像描述

我知道你可以很容易地通过变换设置对象的旋转,但是你如何获得游戏对象的移动方向,然后将旋转设置为该方向?

标签: c#unity3d2d

解决方案


首先,你需要知道图像的局部方向应该是指向运动的方向。这取决于您的设置,并且该问题不包含足够的信息来准确了解。可能是Vector3.upVector3.right。当然,世界方向是从速度中得知的。

Vector3 worldDirectionToPointForward = rb2d.velocity.normalized;
Vector3 localDirectionToPointForward = Vector3.right;

然后,您希望围绕 z 轴旋转精灵,使局部方向指向该方向。您可以使用transform.TransformDirection来找到球“指向”的当前方向,然后使用以下方法计算角度Vector3.SignedAngle

Vector3 currentWorldForwardDirection = transform.TransformDirection(
        localDirectionToPointForward);
float angleDiff = Vector3.SignedAngle(currentWorldForwardDirection, 
        worldDirectionToPointForward, Vector3.forward);

然后,将其绕 z 轴旋转该量,使用transform.Rotate.

transform.Rotate(Vector3.forward, angleDiff);

我会在与墙壁发生碰撞后这样做。另一种方法是将其放入 中LateUpdate,尽管这可能会干扰其他单一行为中发生的LateUpdate其他事情。但是,该LateUpdate方法最容易演示,因此我将在此处进行演示:

void LateUpdate()
{
    Vector3 worldDirectionToPointForward = rb2d.velocity.normalized;
    Vector3 localDirectionToPointForward = Vector3.right;

    Vector3 currentWorldForwardDirection = transform.TransformDirection(
            localDirectionToPointForward);
    float angleDiff = Vector3.SignedAngle(currentWorldForwardDirection, 
            worldDirectionToPointForward, Vector3.forward);

    transform.Rotate(Vector3.forward, angleDiff, Space.World);
}

推荐阅读