使用单个操纵杆旋转 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);
看起来你不明白Transform.Rotate
(第二次重载)。
这是方法的签名:
public void Rotate(float xAngle, float yAngle, float zAngle, Space relativeTo = Space.Self);
xAngle
是绕x
轴旋转的度数。传递正向量(car.transform.forward.x
)的分量是试图将单位向量分量放入接受角度的参数中。概念和单位根本不匹配,因此结果将无法描述。
相反,您应该使用基于操纵杆位置的角度进行旋转。相对模式(默认Space.Self
)将意味着操纵杆相对于对象的当前旋转起作用。
像这样的事情应该可以做到这一点,其中x
和y
是你的操纵杆位置:
car.transform.Rotate(y, x, 0)
您可以仔细查看哪些操纵杆轴与哪些 Unity 轴匹配,也可以尝试移动x
并四处y
,直到它正常工作。您可能还需要根据自己的喜好否定x
或y
。