Плавное движение Лерп? - PullRequest
       3

Плавное движение Лерп?

0 голосов
/ 27 сентября 2018

В настоящее время это мой скрипт для перемещения игрока по сцене.Как я могу сделать это плавно двигаться?

void FixedUpdate()
{
    bool running = Input.GetKey(KeyCode.LeftShift);

    float h = Input.GetAxisRaw("Horizontal");
    float v = Input.GetAxisRaw("Vertical");

    bool isWalking = Mathf.Abs(h) + Mathf.Abs(v) > 0;

    movement = ((running) ? runSpeed : walkSpeed) * new Vector3(h, 0.0f, v).normalized;
    if (isWalking)
    {
        transform.position += movement * Time.fixedDeltaTime;
        transform.LookAt(transform.position + movement);
    }

}

Ответы [ 5 ]

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

Перемещение в FixedUpdate должно быть очень плавным.Конечно, Vector3.Lerp может помочь с вашим движением, но почему, во-первых, он не плавный?

Я могу только догадываться, что у вас камера в обычном скрипте обновления или что есть некоторая интерполяция Rigidbody,Все, что вам нужно знать о плавном движении, объясняется здесь:

http://www.kinematicsoup.com/news/2016/8/9/rrypp5tkubynjwxhxjzd42s3o034o8

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

Вы можете использовать Vector3.Lerp(...).

Попробуйте этот код:

float smoothTime = 0.125f;
Vector3 newPos;

...

void FixedUpdate()
{
    bool running = Input.GetKey(KeyCode.LeftShift);
    float h = Input.GetAxisRaw("Horizontal");
    float v = Input.GetAxisRaw("Vertical");

    movement = ((running) ? runSpeed : walkSpeed) * new Vector3(h, 0.0f, v).normalized;

    //Set the new position
    if(movement.magnitude > 0)
        newPos = transform.position + movement;

    // Use Vector3.Lerp(...)
    transform.position = Vector3.Lerp(transform.position, newPos, smoothTime);
    transform.LookAt(transform.position);

}

Надеюсь, это поможет вам.

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

Прежде всего вам нужно поместить свой код в метод Update (), если вы хотите, чтобы он выполнял каждый кадр.FixedUpdate вызывается с фиксированными интервалами в зависимости от настроек проекта (вы можете изменить его в меню «Правка» -> «Настройки проекта» -> «Время» -> «Фиксированный временной шаг»).Обычно FixedUpdate () используется для вещей, связанных с физикой.

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

Функция FixedUpdate () запускается каждый фиксированный интервал, определенный Time.fixedDeltaTime (который можно установить с помощью TimeManager (Фиксированный временной шаг) или во время выполнения путем непосредственной установки Time.fixedDeltaTime в новое значение.

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

Например, с фиксированной шкалой времени 0,02 секунды и игра работает с частотой кадров 30 кадров в секунду (он же рендерит каждые 0,033 секунды) ваша игра будет делать это:

 - [Time: 0.020s] Character position += 0.02
 - [Time: 0.033s] Render frame with character at position 0.02
 - [Time: 0.040s] Character position += 0.02
 - [Time: 0.060s] Character position += 0.02
 - [Time: 0.066s] Render frame with character at position 0.06
 - [Time: 0.080s] Character position += 0.02
 - [Time: 0.099s] Render frame with character at position 0.08
 - [Time: 0.100s] Character position += 0.02
 - [Time: 0.120s] Character position += 0.02
 - [Time: 0.133s] Render frame with character at position 0.12

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

Есть несколько способов сделать вашего персонажа мплавно, хотя.

  1. Поместите ваш код в цикл Update () вместо цикла FixedUpdate () , это сместит позициюперсонажа каждый визуализированный кадр.Наряду с этим вы можете умножить скорость движения на Time.deltaTime, который является временем с момента визуализации предыдущего кадра (то есть время с момента последнего запуска Update () и перемещения персонажа)

  2. Использование Vector3.Lerp (..) / Quaterion.Lerp (..) или Vector3.MoveTowards (..) / Quaternion.RotateToward (..) с использованием значения времени / шага, умноженного на Time.deltaTime , для интерполяции движения персонажа, сохраняя его плавное движение относительно частоты кадров игры.

  3. Если у вашего персонажа есть компонент с твердым телом, вы можете просто установить интерполяцию с жестким телом для интерполяции, а затем переместить вашего персонажа, вызвав:

    characterRigidbody.MovePosition(wantedPosition);
    characterRigidbody.MoveRotation(wantedRotation);
    

    Как замену существующим движениям трансформации. (хранение вашего кода внутри цикла FixedUpdate ())

    Но учтите, что продолжение приема ваших Input. * Вызовов внутри FixedUpdate () опрашивает их больше, чем нужно, так что вы можете захотетьдвигаться твключите Update (), разделяя код движения и ввод кода прослушивания, если вы решите это сделать. (я разрабатываю игры для Android, так что, возможно, на ПК это не стоит беспокоиться так сильно, но, вероятно, все же стоит изменить)

Прямой ответ блока кода наХотя вопрос может состоять в том, чтобы просто попробовать это, что является комбинацией объяснения 1 и 2:

// How long in seconds will it take the lerps to finish moving into position
public float lerpSmoothingTime = 0.1f;

private Vector3 targetPosition;
private Quaternion targetRotation;

void Update()
{
    bool running = Input.GetKey(KeyCode.LeftShift);

    float h = Input.GetAxisRaw("Horizontal");
    float v = Input.GetAxisRaw("Vertical");

    bool isWalking = Mathf.Abs(h) + Mathf.Abs(v) > 0;

    movement = ((running) ? runSpeed : walkSpeed) * new Vector3(h, 0.0f, v).normalized;
    if (isWalking)
    {
        targetPosition += movement * Time.deltaTime;
        targetRotation = Quaternion.LookRotation(targetPosition - transform.position);
    }

    // Always lerping as if we suddenly stopped the lerp as isWalking became false the stop would be sudden rather than smoothly moving into position/rotation
    transform.position = Vector3.Lerp(transform.position, targetPosition, Time.deltaTime / lerpSmoothingTime);
    transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, Time.deltaTime / lerpSmoothingTime);    
}

Если вы хотите более подробно прочитать о плавно движущихся объектах, узнать о lerps или просто хотите больше примеровзатем ознакомьтесь с этим руководством на , как исправить заикание движения в Unity .

0 голосов
/ 27 сентября 2018
  1. Создание вектора скорости:

    Vector3 velocity = Vector3.zero;

  2. Добавьте ваш вектор движения к скорости:

    velocity += movement;

  3. Добавить скорость к фактическому положению:

    transform.position += velocity;

  4. Сгладить скорость, уменьшив ее с течением времени:

    velocity *= 0.975f;

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