如何检查一个对象是否面向 Unity C# 中的某个方向
How can I check if an object is facing a certain direction in Unity C#
对 Unity 和 C# 还是很陌生。当涉及到 setting/changing 对象的位置时,我通常可以找到解决方法,但是当涉及到旋转时,它仍然让我感到困惑,四元数,欧拉角等..
我正在尝试检查一个物体(头部)是否朝向某个方向,如果它没有朝向那个方向,则需要根据它的走向(向上、向下、向左或正确的)。这是我目前正在开发的蛇游戏(就像旧的自上而下的诺基亚游戏)。
我试图查找它,但 none 的答案是针对我正在尝试做的事情的。
到目前为止,这是我的玩家输入(代码片段):
private int GetAxisRaw(Axis axis)
{
if (axis == Axis.Horizontal)
{
bool left = Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A);
bool right = Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D);
if (left)
{
snakeHeadRotation.transform.Rotate(0, 180, 0); // Keeps rotating when left is pressed
return -1;
}
if (right)
{
snakeHeadRotation.transform.Rotate(0, -180, 0);
return 1;
}
return 0;
}
如你所见 snakeHeadRotation.transform.Rotate(0, 180, 0);例如,每次玩家按下左键时都会被调用,因此即使蛇仍在向左移动时也会转动蛇的头。
我的逻辑是将旋转值存储在某处(可能键入 Quaternion/bool)并检查该旋转值是否与设置为左侧的当前旋转值匹配(即 snakeHeadRotation.transform.Rotate (0, 180, 0);) 如果是这种情况,请不要做任何事情。如果不是,则将其设置为 snakeHeadRotation.transform.Rotate(0, 180, 0);例如。
代码看起来像(写出来):
private int GetAxisRaw(Axis axis)
{
if (axis == Axis.Horizontal)
{
bool left = Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A);
bool right = Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D);
if (left && rotation is not equal to snakeHeadRotation.transform.Rotate(0, 180, 0))
{
snakeHeadRotation.transform.Rotate(0, 180, 0);
return -1;
}
if (right)
{
snakeHeadRotation.transform.Rotate(0, -180, 0);
return 1;
}
return 0;
}
如前所述,我对设置或存储旋转值非常不熟悉。我怎样才能做到这一点?这是正确的方法还是更合乎逻辑的方法?这个我自己也想不通..
我希望我解释对了,我通常不擅长解释事情。
我将为每个方向创建 4 个四元数,并根据按下的键设置旋转(比如 hear.rotation = leftQ)。这是最简单的方法。
我目前不在电脑旁,但我会尽可能寻找其他解决方案
使用 Transform.Rotate(x)
会使您的头部相对于您当前的头部方向旋转 x
度。
我想你想要的是根据你按下的箭头键设置你头部的绝对旋转。因此,即使您多次按下同一个箭头键,头部也会保持在正确的方向。
为此,您可以为每个头部方向创建 4 个旋转,然后根据需要使用它们。
例如,如果您的头默认面向 forward
:
// create your directions
private static Quaternion forwardDirection = Quaternion.Identity;
private static Quaternion rightDirection = Quaternion.FromToRotation(Vector3.forward, Vector3.right);
private static Quaternion leftDirection = Quaternion.FromToRotation(Vector3.forward, Vector3.left);
private static Quaternion backDirection = Quaternion.FromToRotation(Vector3.forward, Vector3.back);
...
private int GetAxisRaw(Axis axis)
{
...
if (left)
{
// set the absolute direction of your head to the left
snakeHeadRotation.transform.rotation = leftDirection;
return -1;
}
if (right)
{
// set the absolute direction of your head to the right
snakeHeadRotation.transform.rotation = rightDirection;
return 1;
}
...
}
您可以将当前旋转与 4 个方向的已知旋转进行比较。
但不要那样做,出于以下几个原因这是不好的做法:
- 如果以后你想添加动画怎么办,例如头在 0.5 秒内转动,不是立即转动?
- 仅比较 4 个浮点数以检查 4 个可能方向之一是低效的。
改为创建一个枚举:
public enum Direction
{
Up,
Down,
Left,
Right
}
将这种类型的成员添加到您的行为中,以跟踪您的蛇头的去向。
类似于:
Direction direction;
...
private int GetAxisRaw(Axis axis)
{
switch (direction)
{
case Direction.Up:
if (left && !right)
direction = Direction.Left;
... turn snake left ...
else if (right && !left)
direction = Direction.Right;
... turn snake right ...
// ignore inputs for up or down if going up
break;
... repeat for the other directions and possible inputs ...
}
...
}
对 Unity 和 C# 还是很陌生。当涉及到 setting/changing 对象的位置时,我通常可以找到解决方法,但是当涉及到旋转时,它仍然让我感到困惑,四元数,欧拉角等..
我正在尝试检查一个物体(头部)是否朝向某个方向,如果它没有朝向那个方向,则需要根据它的走向(向上、向下、向左或正确的)。这是我目前正在开发的蛇游戏(就像旧的自上而下的诺基亚游戏)。
我试图查找它,但 none 的答案是针对我正在尝试做的事情的。
到目前为止,这是我的玩家输入(代码片段):
private int GetAxisRaw(Axis axis)
{
if (axis == Axis.Horizontal)
{
bool left = Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A);
bool right = Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D);
if (left)
{
snakeHeadRotation.transform.Rotate(0, 180, 0); // Keeps rotating when left is pressed
return -1;
}
if (right)
{
snakeHeadRotation.transform.Rotate(0, -180, 0);
return 1;
}
return 0;
}
如你所见 snakeHeadRotation.transform.Rotate(0, 180, 0);例如,每次玩家按下左键时都会被调用,因此即使蛇仍在向左移动时也会转动蛇的头。
我的逻辑是将旋转值存储在某处(可能键入 Quaternion/bool)并检查该旋转值是否与设置为左侧的当前旋转值匹配(即 snakeHeadRotation.transform.Rotate (0, 180, 0);) 如果是这种情况,请不要做任何事情。如果不是,则将其设置为 snakeHeadRotation.transform.Rotate(0, 180, 0);例如。
代码看起来像(写出来):
private int GetAxisRaw(Axis axis)
{
if (axis == Axis.Horizontal)
{
bool left = Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A);
bool right = Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D);
if (left && rotation is not equal to snakeHeadRotation.transform.Rotate(0, 180, 0))
{
snakeHeadRotation.transform.Rotate(0, 180, 0);
return -1;
}
if (right)
{
snakeHeadRotation.transform.Rotate(0, -180, 0);
return 1;
}
return 0;
}
如前所述,我对设置或存储旋转值非常不熟悉。我怎样才能做到这一点?这是正确的方法还是更合乎逻辑的方法?这个我自己也想不通..
我希望我解释对了,我通常不擅长解释事情。
我将为每个方向创建 4 个四元数,并根据按下的键设置旋转(比如 hear.rotation = leftQ)。这是最简单的方法。
我目前不在电脑旁,但我会尽可能寻找其他解决方案
使用 Transform.Rotate(x)
会使您的头部相对于您当前的头部方向旋转 x
度。
我想你想要的是根据你按下的箭头键设置你头部的绝对旋转。因此,即使您多次按下同一个箭头键,头部也会保持在正确的方向。
为此,您可以为每个头部方向创建 4 个旋转,然后根据需要使用它们。
例如,如果您的头默认面向 forward
:
// create your directions
private static Quaternion forwardDirection = Quaternion.Identity;
private static Quaternion rightDirection = Quaternion.FromToRotation(Vector3.forward, Vector3.right);
private static Quaternion leftDirection = Quaternion.FromToRotation(Vector3.forward, Vector3.left);
private static Quaternion backDirection = Quaternion.FromToRotation(Vector3.forward, Vector3.back);
...
private int GetAxisRaw(Axis axis)
{
...
if (left)
{
// set the absolute direction of your head to the left
snakeHeadRotation.transform.rotation = leftDirection;
return -1;
}
if (right)
{
// set the absolute direction of your head to the right
snakeHeadRotation.transform.rotation = rightDirection;
return 1;
}
...
}
您可以将当前旋转与 4 个方向的已知旋转进行比较。 但不要那样做,出于以下几个原因这是不好的做法:
- 如果以后你想添加动画怎么办,例如头在 0.5 秒内转动,不是立即转动?
- 仅比较 4 个浮点数以检查 4 个可能方向之一是低效的。
改为创建一个枚举:
public enum Direction
{
Up,
Down,
Left,
Right
}
将这种类型的成员添加到您的行为中,以跟踪您的蛇头的去向。 类似于:
Direction direction;
...
private int GetAxisRaw(Axis axis)
{
switch (direction)
{
case Direction.Up:
if (left && !right)
direction = Direction.Left;
... turn snake left ...
else if (right && !left)
direction = Direction.Right;
... turn snake right ...
// ignore inputs for up or down if going up
break;
... repeat for the other directions and possible inputs ...
}
...
}