Menu
CoddyTech

Update и LateUpdate

Часть раздела Основы скриптинга в Unity путешествия по Unity на Coddy. Урок 71 из 85.

В каждом кадре Unity вызывает Update() у каждого скрипта и только после того, как все они закончат работу, вызывает LateUpdate() у каждого скрипта. Вы не можете управлять тем, у какого объекта Update() вызовется первым.

Это важно для всего, что зависит от чего-то другого. Камера, которая копирует позицию игрока в Update(), может выполниться до того, как собственный Update() игрока переместит его, и тогда она скопирует позицию игрока кадр назад: камера будет отставать на шаг, причём это может измениться при добавлении объектов или перезагрузке сцены. В LateUpdate() копирование всегда происходит после перемещения игрока:

public Transform player;
public Vector3 offset = new Vector3(0, 3, -6);

void LateUpdate()
{
    transform.position = player.position + offset;
}

Правило: перемещайте объекты в Update(), а код, который реагирует на то, где они оказались, например камеры, подписи и прицеливание, размещайте в LateUpdate(). Оба метода выполняются один раз за кадр, и Time.deltaTime означает одно и то же в обоих случаях.

challenge icon

Задание

Средне

Пусть табличка с именем находится точно над игроком в каждом кадре.

  1. Добавь void LateUpdate(), который выполняется после Update() каждого скрипта.
  2. Перенеси в него часть if (target != null), а в Update() оставь только перемещение стрелками внутри if (target == null).

Нажми «Играть» и удерживай стрелку: табличка останется прямо над игроком. Затем нажми «Проверить».

Попробуйте сами

using UnityEngine;

public class Mover : MonoBehaviour
{
    public Transform target;
    public Vector3 offset;
    public float speed = 4f;

    void Update()
    {
        if (target != null)
        {
            transform.position = target.position + offset;
        }
        else
        {
            if (Input.GetKey(KeyCode.RightArrow))
            {
                transform.position += new Vector3(speed * Time.deltaTime, 0, 0);
            }
            if (Input.GetKey(KeyCode.LeftArrow))
            {
                transform.position -= new Vector3(speed * Time.deltaTime, 0, 0);
            }
        }
    }
}

Все уроки раздела Основы скриптинга в Unity

Потренируйтесь самостоятельно: Песочница Unity