使用单个操纵杆旋转 3D 对象

本文关键字:3D 对象 旋转 操纵杆 单个 | 更新日期: 2023-09-27 18:30:23

我正在Unity 3d中创建一款使用单个操纵杆的游戏。我正在尝试弄清楚如何使用操纵杆正确旋转 3d 对象。基本上,当操纵杆向上(或向前)时,物体将向前旋转,反之亦然。我的问题是,如果我向左或向右对角线向上推,让物体正确旋转。

我的操纵杆使用给出值 (0, 1

) 表示向上,(0, -1) 表示向下,(1, 0) 表示右侧,(-1, 0) 表示左侧。

如何让对象在操纵杆上向前或向后旋转并朝向对角线方向旋转?(如果这令人困惑,我很抱歉。我试图尽可能简单地问这个问题)。

现在这是我用来旋转的:

if ((x > 0 && x < .2f) || (x < 0 && x > .2f)) x = 0;
if ((y > 0 && y < .2f) || (y < 0 && y > .2f)) y = 0;
if (x < 0) car.transform.Rotate(car.transform.forward.x * 10f, car.transform.forward.y * 10f, -car.transform.forward.y * 10f);
else if (x > 0) car.transform.Rotate(car.transform.forward.x * 10f, car.transform.forward.y * 10f, car.transform.forward.y * 10f);
else car.transform.Rotate(car.transform.forward.x * 10f, car.transform.forward.y * 10f, 0f);

使用单个操纵杆旋转 3D 对象

看起来你不明白Transform.Rotate(第二次重载)。

这是方法的签名:

public void Rotate(float xAngle, float yAngle, float zAngle, Space relativeTo = Space.Self);

xAngle是绕x轴旋转的度数。传递正向量(car.transform.forward.x)的分量是试图将单位向量分量放入接受角度的参数中。概念和单位根本不匹配,因此结果将无法描述。

相反,您应该使用基于操纵杆位置的角度进行旋转。相对模式(默认Space.Self)将意味着操纵杆相对于对象的当前旋转起作用。

像这样的事情应该可以做到这一点,其中xy是你的操纵杆位置:

car.transform.Rotate(y, x, 0)

您可以仔细查看哪些操纵杆轴与哪些 Unity 轴匹配,也可以尝试移动x并四处y,直到它正常工作。您可能还需要根据自己的喜好否定xy