EulerAngles Unity в операторе if не работает должным образом с некоторыми значениями C # - PullRequest
0 голосов
/ 01 октября 2018

У меня есть автомобильная игра, и ездить можно только по осям x и z.Если автомобиль движется к положительному z (вращение == 0), то он должен что-то сделать, если он движется к положительному x (вращение == 90), то он должен сделать что-то еще и т. Д.

    if (transform.rotation.eulerAngles.y == 0)
    {
        richtung = 0;
        Debug.Log("north");
    }

    if (transform.rotation.eulerAngles.y == 90)
    {
        richtung = 1;
        Debug.Log("east");
    }

    if (transform.rotation.eulerAngles.y == -180 || transform.rotation.y == 180)
    {
        richtung = 2;
        Debug.Log("south");
    }

    if (transform.rotation.eulerAngles.y == -90)
    {
        richtung = 3;
        Debug.Log("west");
    }

Работает с севером и востоком, а с югом и западом - нет.Даже если я начну программу с вождения автомобиля с вращением == -180 ||180. Что я делаю не так?Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Поскольку вы настраиваете автомобиль только в четырех направлениях, вы можете установить больше одновременно.

Давайте рассмотрим, как вы используете клавиши A и D для вращения автомобиля, и автомобиль запускается с richtung =0.

public enum Direction { North, East, South, West }
public Direction VehicleDirection{ get{ return (Direction)richtung; } } 
private int richtung = 0;
void Update()
{
    if(Input.GetKeyDown(KeyCode.A))
    {
        if(++richtung == 4){ richtung == 0; }
    }
    else if(Input.GetKeyDown(KeyCode.D))
    {
       if(--richtung < 0){ richtung == 3; }
    }
}

Теперь вам не нужно заботиться о вращении, так как теперь вы можете сделать это с помощью значения richtung.В любом другом месте вы можете использовать VehicleDirection, чтобы более точно указать, куда он движется.

0 голосов
/ 01 октября 2018

Вам необходимо использовать неотрицательное значение, поскольку в документации указано, что оно должно быть между 0 и 360.

if (transform.rotation.eulerAngles.y == 180)
{
    richtung = 2;
    Debug.Log("south");
}

if (transform.rotation.eulerAngles.y == 270)
{
    richtung = 3;
    Debug.Log("west");
}

Третий случай был почти верным, но, к сожалению,вы использовали transform.rotation.y вместо transform.rotation.eulerAngles.y.

Как указывало @Everts, было бы лучше сравнивать значения со значением "epsilon", потому что float и double не совсем точны(из-за формата, в котором они хранятся в памяти).

Math.Abs(transform.rotation.eulerAngles.y - 180) < 0.001
...