Проблема с вращением Unity2D - PullRequest
1 голос
/ 04 февраля 2020

Я пытаюсь добавить парашют в свою игру, и мне нужно, чтобы он вращался на 45 градусов вправо, а затем на 45 градусов влево и продолжал чередоваться, диаграмма того, как мне нужно работать, ниже

enter image description here

Код, который я использую, выглядит следующим образом, однако он работает только на 1 стороне, затем не go назад.

        if (maxRotation <= transform.rotation.eulerAngles.z)
        {
            rotatingRight = false;
        }else if(minRotation <= transform.rotation.eulerAngles.z)
        {
            rotatingRight = true;
        }

        transform.Translate(Vector2.down * fallSpeed * Time.deltaTime);

        if (rotatingRight)
        {
            transform.Rotate(Vector3.forward * 45 * Time.deltaTime);
        }
        else
        {
            transform.Rotate(Vector3.forward * -45 * Time.deltaTime);
        }

Ответы [ 3 ]

1 голос
/ 04 февраля 2020

Как сказал 3Dave в комментариях, в основном вам нужно вращаться вправо, когда minRotation больше или равно eulerAngles.

if (maxRotation <= transform.rotation.eulerAngles.z)
{
    rotatingRight = false;
} else if (transform.rotation.eulerAngles.z <= minRotation)
{
    rotatingRight = true;
}

transform.Translate(Vector2.down * fallSpeed * Time.deltaTime);

if (rotatingRight)
{
    transform.Rotate(Vector3.forward * 45 * Time.deltaTime);
}
else
{
    transform.Rotate(Vector3.forward * -45 * Time.deltaTime);
}

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

0 голосов
/ 04 февраля 2020

Я смог решить это, выполнив это

        if (maxRotation == Math.Round(transform.rotation.eulerAngles.z))
        {
            rotatingRight = false;
        }else if(minRotation == Math.Round(transform.rotation.eulerAngles.z))
        {
            rotatingRight = true;
        }

        transform.Translate(Vector2.down * fallSpeed * Time.deltaTime);

        if (rotatingRight)
        {
            transform.Rotate(Vector3.forward * rotationSpeed * Time.deltaTime);
        }
        else
        {
            transform.Rotate(Vector3.back * rotationSpeed * Time.deltaTime);
        }
0 голосов
/ 04 февраля 2020

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

float rotationValue = 45;

if(transform.rotation.eulerAngles.z >= maxRotation)
{
    rotationValue = -45;
}
else if(transform.rotation.eulerAngles.z <= minRotation)
{
    rotationValue = -45;
}

transform.Translate(Vector2.down * fallSpeed * Time.deltaTime);


transform.Rotate(Vector3.forward, rotationValue * Time.deltaTime);
...