Префабы: переиспользуемые шаблоны объектов
Если в игре сто одинаковых врагов, не настраивай каждого вручную. Сделай один шаблон — префаб — и штампуй копии.
Суть: Префаб (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 ручных правок с гарантированными опечатками. С префабом это одна правка в одном месте, и она мгновенно расходится по всем уровням. Тот же принцип спасает при смене спрайта, звука подбора, размера коллайдера. Профессиональная привычка — заводить префаб сразу, как только понимаешь, что объект встретится больше одного раза, даже если сейчас он на сцене один. Переделать обычный объект в префаб позже можно, но раскидать уже наставленные вручную копии под общий шаблон гораздо больнее, чем начать с шаблона.