Префабы: переиспользуемые шаблоны объектов

Если в игре сто одинаковых врагов, не настраивай каждого вручную. Сделай один шаблон — префаб — и штампуй копии.

Суть: Префаб (Prefab) — это сохранённый шаблон GameObject со всеми его компонентами и настройками. Из префаба создают любое число копий (инстансов). Изменил префаб — изменились все копии разом.

Представь, что у врага 8 компонентов с десятками настроек. Если поставить 50 таких врагов вручную, а потом захотеть им всем поднять здоровье — это 50 правок. Префаб решает проблему: ты настраиваешь врага один раз, перетаскиваешь его из Hierarchy в Project — рождается префаб-файл. Теперь любой враг на сцене — это инстанс этого префаба.

Магия в синхронизации: открыл префаб, поднял здоровье — и у всех 50 врагов на всех сценах оно изменилось. Это незаменимо для пуль, монет, врагов, платформ — всего, чего в игре много.

Как работает под капотом

Prefab "Enemy" (файл в Assets)
   |  (шаблон: спрайт, физика, здоровье=100)
   |
   +--> Instance #1 на сцене  (наследует шаблон)
   +--> Instance #2 на сцене  (наследует шаблон)
   +--> Instance #3 на сцене  (здоровье переопределено = 200)

Правка в самом Prefab -> летит во ВСЕ инстансы,
кроме тех свойств, что переопределены вручную.

Инстанс может переопределить отдельное свойство (override): например один враг-босс с увеличенным здоровьем. Тогда общая правка префаба применится ко всем, а переопределённое свойство у босса останется своим.

Префабы особенно важны для спавна — создания объектов во время игры. В коде это Instantiate(prefab). Смоделируем «фабрику врагов» на Python:

# Префаб как шаблон-словарь; инстанс — его копия
enemy_prefab = {"hp": 100, "speed": 2.0, "sprite": "slime.png"}

def instantiate(prefab, x, y):
    inst = dict(prefab)      # копия шаблона
    inst["x"], inst["y"] = x, y
    return inst

# Спавним волну из 3 врагов
wave = [instantiate(enemy_prefab, x=i * 4, y=0) for i in range(3)]
for i, e in enumerate(wave):
    print(f"Враг {i}: hp={e['hp']} в точке ({e['x']}, {e['y']})")

# Подняли hp в ПРЕФАБЕ — но уже созданные копии не меняются
enemy_prefab["hp"] = 150
print("Новый спавн получит hp =", instantiate(enemy_prefab, 0, 0)["hp"])

Та же логика на Python ▶ — Instantiate делает копию шаблона. Здесь видно тонкость: уже созданные копии хранят старое значение, новые берут новое. В Unity же правка самого ассета-префаба в редакторе летит во все инстансы — это разные вещи, не путай их.

Частые ошибки

  • Настраивать копии вручную вместо правки префаба. Создаёшь хаос: у каждого инстанса свои переопределения, и общая правка не работает.
  • Случайные override. Подвинул значение у инстанса — оно «отвязалось» от префаба. В Inspector такие свойства помечаются; следи за ними.
  • Не применять изменения. Изменил инстанс на сцене и хочешь, чтобы это попало в префаб? Нужно явно нажать Apply / Overrides → Apply All.

Best practices

  • Делай префаб из всего, что встречается больше одного раза: враги, пули, монеты, платформы, эффекты.
  • Используй варианты префабов (Prefab Variant) для разновидностей: базовый враг и его усиленная версия наследуют общий шаблон.
  • Спавни объекты в игре через Instantiate из префаба, а не копированием объекта со сцены.

Итоги: префаб — шаблон объекта, инстанс — его копия на сцене. Правка префаба разлетается по всем копиям, кроме переопределённых свойств. Префабы — основа спавна (Instantiate) и порядка в проекте. Делай префаб из всего, чего в игре много.

Префаб как источник правды

Думай о префабе как о «единственном источнике правды» для типа объекта. Если у тебя 200 монет на пяти уровнях и дизайнер решил, что монета теперь даёт не 1, а 5 очков, — без префаба это 200 ручных правок с гарантированными опечатками. С префабом это одна правка в одном месте, и она мгновенно расходится по всем уровням. Тот же принцип спасает при смене спрайта, звука подбора, размера коллайдера. Профессиональная привычка — заводить префаб сразу, как только понимаешь, что объект встретится больше одного раза, даже если сейчас он на сцене один. Переделать обычный объект в префаб позже можно, но раскидать уже наставленные вручную копии под общий шаблон гораздо больнее, чем начать с шаблона.

Проверьте себя
1. Что такое префаб (Prefab)?
AГотовая сцена
BСохранённый шаблон GameObject, из которого создают копии
CСкрипт на C#
DТип камеры
2. Каким методом во время игры создают копию префаба?
AGetComponent()
BDestroy()
CInstantiate()
DUpdate()