ci-platforms / darwin arm64 smoke (push) Skipped
ci / build (amd64, linux, ubuntu-24.04) (push) Failing after 12m19s
ci-platforms / darwin amd64 smoke (push) Skipped
ci-platforms / windows amd64 smoke (push) Skipped
github-native / gitea-pending (push) Skipped
github-native / darwin amd64 native (push) Skipped
github-native / linux amd64 native (push) Skipped
github-native / windows amd64 native (push) Skipped
github-native / darwin arm64 native (push) Skipped
github-native / gitea-result (push) Skipped
ci / checks (push) Failing after 23m57s
ci / release (push) Skipped
GitHub / windows amd64 native GitHub-hosted native CI: failure
GitHub / darwin arm64 native GitHub-hosted native CI: failure
GitHub / darwin amd64 native GitHub-hosted native CI: failure
GitHub / linux amd64 native GitHub-hosted native CI: success
55 lines
5.8 KiB
Markdown
55 lines
5.8 KiB
Markdown
---
|
||
id: prefabs
|
||
title: Префабы
|
||
---
|
||
# Префабы
|
||
|
||

|
||
|
||
Префаб — это часть сцены для повторного использования, которая хранится в файле `.aeprefab`. Каждая его копия в сцене — экземпляр. Экземпляр показывает префаб и хранит собственные изменения — переопределения. Когда префаб меняется, все экземпляры следуют за ним, а их переопределения остаются.
|
||
|
||
В [примере с лампами](ref:prefabs/example) показаны несколько копий с разными переопределениями.
|
||
|
||
## Создание и размещение
|
||
|
||

|
||
|
||
- Перетащите узел из Иерархии на папку в «Ассетах» или выберите **Иерархия → Префаб → Создать префаб**. Узел станет экземпляром нового префаба и сохранит свои идентификаторы, поэтому ссылки на него продолжат работать.
|
||
- Перетащите `.aeprefab` в Иерархию или на панель «Сцена» либо выберите **Создать экземпляр в сцене** в его контекстном меню.
|
||
- Откройте префаб двойным щелчком или через **Префаб → Открыть префаб**. Сохранение префаба обновляет все открытые экземпляры за один шаг. Этот шаг можно отменить из любой из этих сцен.
|
||
|
||
## Переопределения
|
||
|
||
Любое изменение экземпляра — переопределение: свойство, добавленный или удалённый компонент, добавленный или удалённый узел, порядок дочерних узлов. Позиция, поворот и масштаб корня экземпляра всегда принадлежат самому экземпляру.
|
||
|
||
- Иерархия отмечает корни экземпляров значком префаба, а добавленные вами узлы — плюсом.
|
||
- Инспектор отмечает переопределённые свойства полосой слева, а добавленные компоненты — меткой `added`. В карточке «Префаб» наверху есть **Применить всё**, **Вернуть всё** и **Открыть**.
|
||
- Щёлкните правой кнопкой свойство, компонент или узел, чтобы применить его к префабу или вернуть.
|
||
|
||
Узлы из префаба внутри экземпляра сохраняют своего родителя. Чтобы переместить их, распакуйте экземпляр.
|
||
|
||
## Вложенные префабы и варианты
|
||
|
||
Префаб может содержать экземпляры других префабов. Когда вы применяете изменение, сделанное внутри вложенного экземпляра, выберите, куда оно пойдёт: в сам вложенный префаб или во внешний префаб как переопределение его вложенного экземпляра.
|
||
|
||
Вариант — это префаб, корень которого — экземпляр другого префаба: **Префаб → Создать вариант**. Вариант меняет то, что переопределяет, а во всём остальном следует своей основе.
|
||
|
||
## Неиспользуемые переопределения
|
||
|
||
Когда из префаба пропадает узел или компонент, который переопределяет экземпляр, переопределение сохраняется и попадает в список «Неиспользуемые переопределения» в карточке «Префаб». Оно ничего не делает, пока вы его не удалите. «Проблемы» показывают его как PFB002.
|
||
|
||
## Отсутствующие префабы
|
||
|
||
Если файла префаба нет, экземпляр загружается как пустой узел с именем префаба и сохраняется обратно без изменений. «Проблемы» показывают PFB001. Игра не блокируется.
|
||
|
||
## Распаковка
|
||
|
||
- **Распаковать** превращает экземпляр в обычные узлы; вложенные в него префабы становятся самостоятельными экземплярами.
|
||
- **Распаковать полностью** превращает всё в обычные узлы.
|
||
|
||
## Скрипты
|
||
|
||
`scene.Instantiate(prefab, parent)` создаёт копию во время игры. У копии новые идентификаторы узлов, а ссылки внутри неё указывают внутрь копии.
|
||
|
||
`node.IsPrefabInstance()` сообщает, является ли узел копией префаба или лежит ли внутри неё. `node.PrefabRoot()` возвращает корень этой копии.
|