Вступить в клуб →
лёгкаявопросC# и жизненный цикл Unity

Изменили значение поля в коде, а объект на сцене ведёт себя по-старому

В компоненте врага было:

public class Enemy : MonoBehaviour
{
    [SerializeField] private float speed = 5f;
}

Разработчик поменял инициализатор на 12f, сохранил скрипт, дождался перекомпиляции и запустил сцену. Враг, давно расставленный на сцене, по-прежнему двигается со скоростью 5. Новый враг, созданный перетаскиванием скрипта на пустой объект, двигается со скоростью 12. Почему так?

  • Приватные поля не сериализуются в принципе, поэтому новое значение не применилось ни к одному из объектов, а разницу в поведении объясняет что-то другое
  • Значение сериализованного поля хранится в сцене или префабе и перекрывает инициализатор из кода: у старого объекта его меняют в инспекторе
  • Редактор закэшировал скомпилированные сборки и подставляет старую версию скрипта: помогает перезапуск Unity
  • Инициализаторы полей у наследников MonoBehaviour не выполняются вообще, поэтому осталось старое значение: присваивать такие поля можно только в Awake

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела