Слишком высокая скорость диагонали - PullRequest
3 голосов
/ 12 февраля 2020

Как я могу сохранить скорость диагонали такой же, как горизонтальная и вертикальная скорость, не фиксируя никаких значений и не используя ".normaized". Я попытался нормализовать значения, но потерял значения джойстика от 1 до 0. Вот мой код:

void ListenInput()
{
    Vector3 rightDirection = camera.right;
    Vector3 frontDirection = camera.GetForwardFromAngleY();

    move = new Vector2(
        Input.GetAxis("Horizontal"),
        Input.GetAxis("Vertical")
        );

    MoveCharacter(rightDirection * move.x);
    MoveCharacter(frontDirection * move.y);
}

void MoveCharacter(Vector3 velocity)
{
    transform.position += velocity * Time.deltaTime * runningSpeed;
}

Ответы [ 2 ]

6 голосов
/ 12 февраля 2020

Здесь вы должны зафиксировать величину входного вектора2. Например, с Vector2.ClampMagnitude () из API Unity. Это сохранит входные данные не двоичными и предотвратит увеличение диагонали по сравнению с чисто горизонтальными / вертикальными входами.

void ListenInput()
{
    Vector3 rightDirection = camera.right;
    Vector3 frontDirection = camera.GetForwardFromAngleY();

    move = new Vector2(
        Input.GetAxis("Horizontal"),
        Input.GetAxis("Vertical")
        );

    move = Vector2.ClampMagnitude(move, 1f);

    MoveCharacter(rightDirection * move.x);
    MoveCharacter(frontDirection * move.y);
}

void MoveCharacter(Vector3 velocity)
{
    transform.position += velocity * Time.deltaTime * runningSpeed;
}
3 голосов
/ 12 февраля 2020

Если вы нормализуете вектор, убедитесь, что его длина равна 1 . Это отличный способ избежать излишеств, таких как «диагональное движение быстрее, чем нормальное движение».

Однако тот факт, что длина всегда равна 1, также означает, что нет «медленного движения» или «движения на полной скорости». Скорость "отличие от джойстика. Когда вы говорите: «Я потерял значения джойстика между 1 и 0», это связано с этим фактом.

Один из способов обойти это разработчики - использовать математическую формулу для масштабирования скорости.

Вы Могут:

  • Использовать наибольшее значение (горизонтальное или вертикальное) для управления скоростью
  • Использовать наименьшее значение
  • Использовать комбинацию из двух

Еще один способ сделать это - сохранить длительность go движения, а затем масштабировать скорость на основе этого. У этого метода есть свои проблемы, но он хорошо знаком игрокам.

Примеры

Например, если у меня есть:

  • horizontalInput = 1
  • verticalInput = 0.5

Это означает, что мой нормализованный вектор выглядит следующим образом:

Moving direction

Я мог бы:

Используйте наибольшее значение

Двигайтесь на полной скорости (1) в направлении моего вектора.

Используйте наименьшее значение

Двигайтесь на половинной скорости (0,5) по направлению моего вектора.

Использовать a Использовать комбинацию двух значений

Для этого примера, давайте использовать следующую формулу: (x+y)/2. Двигайтесь со скоростью 3/4 (0,75) в направлении моего вектора.

ПРИМЕЧАНИЕ: Эта формула не будет "чувствовать себя так хорошо", если у вас есть x=0 и y=1, это всего лишь пример. Скорее всего, вы хотите использовать Мин. , Макс. , Ср. и операторы if для управления скоростью.

Вы можете использовать разные формулы и различные приемы, чтобы сделать движение в вашей игре таким, каким вы хотите, но найдите время, чтобы проанализировать, ПОЧЕМУ это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...