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 означает одно и то же в обоих случаях.
Задание
СреднеИгрок и его тег имени оба используют скрипт 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);
}
}
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы скриптинга в Unity
1Ваш первый скрипт
Привет, UnityРазместите кубДвигайте каждый кадрПоворачивайте каждую секундуУправляйте клавишамиПовторение: управляйте кубом4Векторы
Сложение векторовНаправленияЛокальное и мировое пространствоСкорость по диагоналиРасстояние между объектамиVector3 — это структураПовторение: пилот дрона10Жизненный цикл скрипта
Awake и StartUpdate и LateUpdateOnEnable и OnDisableПорядок вызовов жизненного циклаПовторение: регистратор жизненного цикла2Инспектор
Поля инспектораSerializeFieldЧисла с плавающей точкой и MathfАтрибуты инспектораПовторение: лифт5Преобразования и иерархия
Родители и детиМасштабПосмотри на объектыДвигайся к точкеПовторение: Луна на орбите6Игровые объекты и компоненты
Ссылки в InspectorПолучение компонентаОтсутствующие компонентыДобавление компонентаRequireComponentПоказать и скрытьПовторение: выключатель света