Постоянное вращение на 90 не дает мне начального угла - PullRequest
1 голос
/ 06 мая 2020

У меня есть игровой объект, поворачивающийся на 90 градусов каждые две секунды, что дает объекту 4 возможных значения для его поворота по оси Z. Поскольку начальное вращение по оси Z составляет 45, другие значения будут 135, 225 и 315. Каждый раз, когда игровой объект вращается, он ищет свое текущее вращение по оси Z в Словаре:

static public Dictionary<int, string> rotDirection = new Dictionary<int, string>{
        {45, "NE"},
        {135, "SE"},
        {225, "SW"},
        {315, "NW"},
    };

Однако, он не находит начальное значение (45), так как на самом деле он получает 44. Почему это происходит?

float timer;
    void FixedUpdate()
    {
        timer -= Time.deltaTime;
        if (timer <= 0.0f)
        {
            timer += Constants.cannonRotationTime;

            //transform's initial (z) rotation is 45
            transform.Rotate(0.0f, 0.0f, 90);
            int angle = (int)transform.rotation.eulerAngles.z;
            Debug.Log("Angle: " + angle + ", direction: " +
            (Constants.rotDirection.ContainsKey(angle) ?
                Constants.rotDirection[angle] : "*NOT FOUND*"));
        }

Есть еще одна странность. Если я установил начальное (Z) вращение игрового объекта на 135, все значения будут найдены, он повернется на 45 вместо 44:

enter image description here

Теперь, если я установил его как 225 или 315, новое вращение не имеет смысла, вот что я получаю:

enter image description here

Почему это происходит и как можно ли этого избежать?

Ответы [ 3 ]

2 голосов
/ 06 мая 2020

Существует также специальная функция для округления до целого числа без необходимости преобразования перед этим:

Mathf.RoundToInt (float var)

int angle = Mathf.RoundToInt(transform.rotation.eulerAngles.z)
2 голосов
/ 06 мая 2020

Ваш код мне подходит. Может быть, здесь происходит какое-то забавное преобразование float в int?

Т.е. 44,99999 ° становится 44.

int angle = (int)transform.rotation.eulerAngles.z;

Можете ли вы Debug.Log угол, прежде чем преобразовать его в целое число?

1 голос
/ 06 мая 2020

Его округленная проблема: вы можете использовать Mathf.Round

int angle = (int)Mathf.Round(transform.rotation.eulerAngles.z);
...