Menu
CoddyTech

Update и LateUpdate

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

На каждом кадре 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

Задание

Средне

Игрок и его тег имени оба используют скрипт Mover. У Player значение target пустое, поэтому стрелки перемещают его. У NameTag в target указан игрок, поэтому тег располагается над ним на расстоянии offset.

Нажми Играть и удерживай клавишу со стрелкой: тег отстаёт от игрока. Здесь Update() тега выполняется первым и копирует положение игрока кадр назад. Исправь это так, чтобы тег находился точно над игроком в каждом кадре, а перемещение стрелками оставь в Update(). Затем нажми Проверить.

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

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);
            }
        }
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

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