GiiGaTeam / GiiGaEngine

0 stars 0 forks source link

Prefabs #94

Open damibran opened 5 days ago

damibran commented 5 days ago

Это особый тип ассетов, позволяющий хранить весь GameObject со всеми компонентами и значениями свойств. Префаб выступает в роли шаблона для создания экземпляров хранимого объекта в сцене. Любые изменения в префабе немедленно отражаются и на всех его экземплярах, при этом вы можете переопределять компоненты и настройки для каждого экземпляра в отдельности.

Анализ файлов scene и prefab в unity:

Scene.txt Prefab.txt

У каждого элемента сериализации (GameObject/Component) имеется видимо уникальный (в рамках файла) fileID.

--- !u!1 &5755123991398664843
GameObject:

Удивительно, но также у каждого элемента (даже компонента) есть следующие поля:

m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}

Зачем они нужны пока не понимаю, случаев, когда id не 0 не видел.

Scene

В файле записан PrefabInstance имеющий список модификаций m_Modifications, записывающий изменения некоторого параметра элемента с индексом fileID (из файла prefab).

- target: {fileID: 5755123991398664843, guid: 9abb2082779f38d4f966e57eef0b2a53, type: 3}
      propertyPath: m_Name
      value: GameObjectMyPrefab
      objectReference: {fileID: 0}

также у PrefabInstance имеется следующий список:

m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []

и сам файл оригинала префаба m_SourcePrefab: {fileID: 100100000, guid: 9abb2082779f38d4f966e57eef0b2a53, type: 3}

Prefab

В файле также записаны GameObject'ы и Component'ы. Если в скриптах есть ссылки на GO или Comp, то они также записываются при помощи fileID:

MonoBehaviour:
  ...
  m_EditorClassIdentifier: 
  transfrom1: {fileID: 8168364855295709959}
  go2: {fileID: 1053527154274960376}

Если в скрипте в качестве параметра типа GameObject передать Prefab

Установится ссылка fileID корневого GameObject

Как отличить реальный GameObject от такого prefab

Судя по у GameObject есть поле принадлежности к сцене. У префаба нет принадлежности.

Вопросы

if0ne commented 19 hours ago

Стоит в этой версии добавлять Prefab Instancing, то есть если мы поменяли префаб, то поменялись свойства и в объектах, которые "отнаследовались" от префаба? Мне кажется, что это тяжело и займет много времени.

Как различать prefab от обычных GameObject в сцене (после загрузки в память)? и надо ли (точно нужно в editor режиме)

Может сделать 2 класса: GameObject и Prefab? И добавить конвертацию между ними, то есть можно создать GO на основе Prefab, а также можно создать новый ассет (Prefab) на основе GO. В скриптах будет использоваться класс Prefab для создания GO на его основе. Соответственно отображать иерархию GO на сцене будем только классов GO, prefab-ы будут лежать как ассеты.

damibran commented 18 hours ago

Стоит в этой версии добавлять Prefab Instancing, то есть если мы поменяли префаб, то поменялись свойства и в объектах, которые "отнаследовались" от префаба?

То есть запретить override свойств? Мне кажется тогда теряется большая часть смысла prefab. Ты не сможешь сделать prefab и выставив его на сцену поменять только один какой-нибудь материал, ну или ссылку на другой объект чем в оригинале, где вообще могло быть пусто.

Тем более как видно по файлам даже название корневого объекта уже переопределение. Как и Transform.

Будет ли это сложно хз, пока что представляется, что не очень. Но не один день, как в роадмапе, это точно)

damibran commented 17 hours ago

По поводу второго мне кажется проще всего во все gameobject добавить поле m_PrefabAsset, те у которых оно не ноль в рантайме соответственно и есть "отнаследованные".

А чтобы спавнить иметь какой-то список прототипов для всех префабов текущих сцен (или просто всех prefabasset), ну и по логике прототипа спавнить

damibran commented 17 hours ago

Стоит в этой версии добавлять Prefab Instancing, то есть если мы поменяли префаб, то поменялись свойства и в объектах, которые "отнаследовались" от префаба?

Я сейчас понял, что ты не про override свойств, а про изменение оригинала. Я просто не очень понимаю, как без одного сделать другое видимо.

Наверное в плане изменения оригинала, самая большая проблема будет это конфликты и их merge соответственно.

if0ne commented 17 hours ago

Стоит в этой версии добавлять Prefab Instancing, то есть если мы поменяли префаб, то поменялись свойства и в объектах, которые "отнаследовались" от префаба?

Я сейчас понял, что ты не про override свойств, а про изменение оригинала. Я просто не очень понимаю, как без одного сделать другое видимо.

Наверное в плане изменения оригинала, самая большая проблема будет это конфликты и их merge соответственно.

Оверрайд свойств легко сделать без отслеживания изменения оригинала. Тут еще проблема, как делать ссылки внутри GO, например, его скрипт ссылается на подобъект этого GO.

damibran commented 4 hours ago

Если в скриптах есть ссылки на GO или Comp, то они также записываются при помощи fileID:

Ну так вот есть пример с Unity, fileID.

Или ты о чем-то другом?

if0ne commented 4 hours ago

Если в скриптах есть ссылки на GO или Comp, то они также записываются при помощи fileID:

Ну так вот есть пример с Unity, fileID.

Или ты о чем-то другом?

Айди выглядит как решение. Тогда вопрос: этот айди в рамках префаба живет и при создании GO создаются уже фактические айдишники на конкретные компоненты и ГО на сцене?

damibran commented 3 hours ago

Да, думаю во время процедуры создания по прототипу, можно составлять мапу <fileID, UUID>, после создания компонентов и объектов, еще раз для каждого пройти и поставить ссылки на реальные объекты

if0ne commented 2 hours ago

Да, думаю во время процедуры создания по прототипу, можно составлять мапу <fileID, UUID>, после создания компонентов и объектов, еще раз для каждого пройти и поставить ссылки на реальные объекты

В принципе это должно работать