使用单个操纵杆旋转 3D 对象
Rotating 3D object with a single joystick
我正在使用单个操纵杆在 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
。
我正在使用单个操纵杆在 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
。