Unity 2D Непосредственное изменение rotation.z вызывает странное "плавное / плавное" вращение, которое останавливается на 180 - PullRequest
1 голос
/ 07 мая 2020

Я столкнулся со странной проблемой, связанной с влиянием на значения вращения преобразования Unity. Это может быть просто вещь Unity, но я не могу найти информацию о том, почему она будет действовать так, как есть. Я испытываю странный эффект прокрутки значений поворота, когда я пытаюсь постепенно увеличивать вращение моего 2D-персонажа.

public class PlayerController : MonoBehaviour
{

    public float speed = 1f;

    // Update is called once per frame
    void Update()
    {
        Vector3 pos = transform.position;
        Quaternion rot = transform.rotation;

        if(Input.GetKey(KeyCode.UpArrow))
        {
            pos += transform.right * speed * Time.deltaTime;
        }

        if(Input.GetKey(KeyCode.LeftArrow))
        {
            rot.z += 2 * Time.deltaTime;
        }

        if (Input.GetKey(KeyCode.RightArrow))
        {
            rot.z -= 2 * Time.deltaTime;
        }

        // Update the position
        transform.position = pos;
        transform.rotation = rot;

    }
}

GIF проблемы

enter image description here

На GIF-изображении вы можете видеть, что значение поворота сначала быстро увеличивается, а затем начинает замедляться по мере приближения к отметке 180. Может кто-нибудь объяснить мне, почему это происходит и как этого избежать?

1 Ответ

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

rot - это Quaternion, и если вы точно не знаете, что делаете , никогда не напрямую изменяйте его компоненты .. а это не только x, y , z, но также w и все перемещаются между -1 и 1.

То, что вы видите здесь, вероятно, ваше значение достигает максимального значения, а затем фиксируется на z = 1


Скорее используйте, например, Transform.Rotate или Quaternion.Euler(Vector3.forward * angle) и * оператор вместо

void Update()
{
    if(Input.GetKey(KeyCode.UpArrow))
    {
        transform.position += transform.right * speed * Time.deltaTime;
    }

    if(Input.GetKey(KeyCode.LeftArrow))
    {
        // Either directly rotate
        transform.Rotate(Vector3.forward * 2 * Time.deltaTime, Space.World);
    }

    if (Input.GetKey(KeyCode.RightArrow))
    {
        // Or use Eulers
        transform.rotation *= Quaternion.Euler(Vector3.forward * -2 * Time.deltaTime);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...