Как сделать вращение, переведенное с аналогового ввода, менее «нервным» - PullRequest
0 голосов
/ 03 октября 2018

Я делаю игру (в Unity), в которой персонаж вращается вокруг указателя.Указатель определяет направление, в котором персонаж собирается двигаться.

Как так, то, как движется указатель, ощущается очень "нервно".Я хотел бы сделать это более естественным / более гладким, но у меня действительно нет идеи, как подходить к этой проблеме.

Вот как я вращаю указатель вокруг игрока:

        float x = Input.GetAxis("Horizontal"),
            y = Input.GetAxis("Vertical");

        if (x != 0 || y != 0) 
        {
            toRotate.rotation = Quaternion.Euler(new Vector3(0, 0, Mathf.Atan2(y, x) * Mathf.Rad2Deg));
        }

Я делаю это в функции Update().

toRotate - это Transform

Ответы [ 2 ]

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

Вы также можете использовать Quarternion.RotateTowards .

float x = Input.GetAxis("Horizontal")
float y = Input.GetAxis("Vertical");
float stepSize = 10 * Time.deltaTime;

if (x != 0 || y != 0) 
{
    var currentRotation = toRotate.rotation;
    var targetEuler = new Vector3(0, 0, Mathf.Atan2(y, x) * Mathf.Rad2Deg);
    var targetRotation = Quarternion.Euler(targetEuler);
    toRotate.rotation = Quarternion.RotateTowards(currentRotation, targetRotation, stepSize);
}
0 голосов
/ 03 октября 2018

Как указал Сичи, способ сделать это - использовать Quaternion.Lerp или Quaternion.Slerp для вращения.

Это работает довольно хорошо.

    float x = Input.GetAxis("Horizontal")
    float y = Input.GetAxis("Vertical");
    float lerpAmount= 10;

    if (x != 0 || y != 0) 
    {
        toRotate.rotation = Quaternion.Lerp(
            toRotate.rotation,
            Quaternion.Euler(new Vector3(0, 0, Mathf.Atan2(y, x) * Mathf.Rad2Deg),
            lerpAmount * Time.deltaTime);
    }
...