Сцены и префабы
Сцены .rscene, префабы .rprefab, переопределения и независимые материалы.
Сцена описывает самостоятельный уровень или экран. Префаб хранит повторяемую часть: персонажа, дверь, автомобиль или декорацию.
| Роль | Файл | Содержимое |
|---|---|---|
| Сцена | Main.rscene | Мир, камера, свет и экземпляры объектов |
| Префаб | Props/Crate.rprefab | Один ящик, который можно разместить много раз |
Обе роли используют PackedEntity — сохранённое дерево сущностей. Роль определяется путём исходного файла, а не отдельным классом корня. Префаб можно запустить отдельно; сцену можно вложить в другое дерево. Выбор роли помогает организовать проект.
1. Подготовьте префаб ящика
- Через меню Файл / File создайте новый документ-префаб с корнем
Entity3D. - Назовите корень
Crate. Добавьте дочернийMeshInstance3Dс именемVisual. - В свойстве
MeshуVisualсоздайтеBoxMesh. ОставьтеScale = (1, 1, 1). - Сохраните документ как
asset://Props/Crate.rprefab.
Crate (Entity3D)
└── Visual (MeshInstance3D, BoxMesh)Это только видимый объект. Чтобы ящик останавливал персонажа, нужны физическое тело и форма столкновения; один меш не создаёт коллизию. См. движение в 3D.
2. Разместите два экземпляра
Откройте Main.rscene из первого проекта. Это главный уровень, а не Main.rprefab.
- Откройте Assets через Ctrl + Space и найдите
Props/Crate.rprefab. - Перетащите файл на корень
Mainв иерархии. Повторите действие. - Назовите экземпляры
CrateLeftиCrateRight. - Задайте им
Position = (-1.5, 0.5, 0)и(1.5, 0.5, 0). При стандартномBoxMeshвысотой 1 ящики окажутся над землёй, а не наполовину внутри неё. - Сохраните
Main.rsceneи нажмите F6. Камера должна видеть оба ящика.
Main (Entity3D)
├── Camera3D
├── …
├── CrateLeft [Crate.rprefab]
└── CrateRight [Crate.rprefab]3. Отличайте образец от переопределения
| Изменение | Где его делать | Что изменится |
|---|---|---|
| Новая форма ящика для всего проекта | В исходном Crate.rprefab | Экземпляры без собственного переопределения этого свойства |
| Положение одного ящика в уровне | У CrateLeft в Main.rscene | Только этот экземпляр |
| Разовый вариант цвета | В отдельной копии материала | Только объекты, которым назначена эта копия |
Для проверки откройте Crate.rprefab, передвиньте Visual вверх на 0.2 и сохраните. В уровне оба меша поднимутся относительно своих корней; корни CrateLeft и CrateRight останутся на разных местах.
Если значение уже переопределено у экземпляра, изменение образца может быть не видно. Выберите именно это свойство и верните значение образца через действие сброса/возврата в Inspector. Не удаляйте экземпляр целиком ради сброса одного поля. Сохраняйте и исходный префаб после его изменения, и уровень после изменения экземпляра.
Ресурс может быть общим
Разные экземпляры дерева не означают отдельные копии каждого Material, Mesh или другого Resource. Два меша могут ссылаться на один материал: изменение его Albedo тогда изменит оба.
Для независимого цвета сделайте материал уникальным/скопируйте его в Inspector и назначьте копию нужному мешу. Если независимость должна создаваться автоматически при каждом инстанцировании, изучите ResourceLocalToScene и особенности дублирования вложенных ресурсов в руководстве по ресурсам. Простая копия верхнего ресурса не гарантирует копирование всех вложенных объектов.
Создание из кода и сохранение
Загруженный PackedEntity — образец, а Instantiate() создаёт отдельное дерево. Оно входит в уровень после AddChild(). Координаты и другие параметры, нужные в _Ready(), задавайте до добавления в дерево.
Полный пример с маркером, поворотом, лимитом объектов и удалением: объекты во время игры. Изменения работающей игры не записываются автоматически в Main.rscene или Crate.rprefab; для прогресса нужен файл сохранения.
Если что-то не сработало
| Симптом | Проверка |
|---|---|
| Второй ящик перекрыл первый | Изменяйте Position корней экземпляров, а не только общий Visual в образце |
| Изменение образца не видно | Сохраните префаб; проверьте локальное переопределение нужного свойства |
| Перекрасились все ящики | Изменён общий материал; сначала создайте отдельный ресурс |
| Персонаж проходит через ящик | Добавьте физическое тело и форму столкновения |
| После запуска ящики пропали | Сохраните Main.rscene и проверьте камеру; изменения только в запущенной игре не сохраняются |
Меняйте роль документа штатными операциями редактора. Переименование расширения в проводнике само по себе не обновляет ссылки и зависимости проекта.