Как неинстанцированные загруженные префабы сравниваются с инстанцированными?

пример

В Unity5 предполагается, что GameObject с именем "SomeObject" был сохранен как префаб в Assets/Resources/SomeObject.prefabЯ знаю, что могу создать экземпляр префаба следующим образом:

GameObject prefab   = Resources.Load<GameObject>("SomeObject");
GameObject instance = GameObject.Instantiate(prefab);

После выполнения instance GameObject будет копией исходного префаба "SomeObject" и будет помещен в текущую активную сцену с именем "SomeObject(Clone)".


Насколько я понимаю, GameObject prefab представляет фактический сборный ресурс, и любые сделанные в нем изменения (имя параметра, добавление компонентов и т. д.) записываются в исходный сборный ресурс, и эти изменения сохраняются даже после выхода из режима воспроизведения редактора.

Вопросы

  1. Поскольку все объекты GameObject обычно хранятся в сцене, а scene собственность на GameObject prefab в приведенном выше примере кажется Unloaded/Invalid/ Безымянный, где именно я должен считать этот специальный GameObject? Кажется, я могу делать с ним все, что могу делать с обычными объектами GameObject, за исключением того, что их можно увидеть в иерархическом / сценарном представлении.

    Это эффективно в каком-то подвешенном состоянии или в особой псевдо-сцене? Кажется, сохраняется LoadSceneMode.Single сцена меняется, но не как особенная DontDestroyOnLoad сцена, в которую перемещаются объекты при передаче в GameObject.DontDestroyOnLoad(...),

  2. Есть ли еще какие-нибудь заметные различия между prefab а также instance в приведенном выше примере, кроме изменений времени жизни, недопустимая сцена и отличающиеся объекты друг от друга GetInstanceID(), так далее)?

  3. С звонка GameObject.Instantiate(...) на prefabвозвращает GameObject, который находится в допустимой сцене, есть ли способ вручную создать GameObject, которые находятся в похожем состоянии "без сцены"? Я знаю, что Unity намеревается, чтобы все объекты GameObject были в сценах, и поэтому это чисто академический вопрос.

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

1 ответ

Решение

1. Где именно я должен считать этот специальный GameObject?

Это в отдельном файле и не упоминается в сцене. однажды Resources.Load<GameObject>("SomeObject"); вызывается, он загружается в память в ожидании GameObject.Instantiate называется.

Если он объявлен как public GameObject prefab; и назначается из редактора вместо GameObject prefab Resources.Load<GameObject>("SomeObject");, он будет загружен в память автоматически при загрузке сцены.

2. Есть ли еще какие-нибудь примечательные различия между сборным домом и объектом?

Да.

Сборные не могут быть уничтожены с Destroy или же DestroyObject функция. Это должно быть уничтожено с DestroyImmediate функция, передавая true ко второму аргументу: DestroyImmediate(prefab, true);

3. Есть ли способ вручную создать объекты GameObject, которые находятся в похожем состоянии "без сцены"?

Нет, невозможно вручную создать объекты GameObject, которые находятся в похожем состоянии "без сцены".

Хотя вы можете подделать это.

Самое близкое к этому - сделать GameObject невидимым на вкладках редактора и иерархии инспектора, изменив GameObjects. hideFlags переменная затем деактивировать этот GameObject.

GameObject obj = new GameObject("SomeObject");
obj.hideFlags = HideFlags.HideInHierarchy | HideFlags.HideInInspector;

После этого деактивируйте GameObject:

obj.SetActive(false);

Теперь GameObject невидим в Редакторе, а также невидим в Сцене и Представлении Игры.


На самом деле нет большой разницы между префабами и типичным GameObject. Prefab - это просто контейнер, содержащий GameObject, чтобы его можно было повторно использовать и совместно использовать между сценами. Изменение одного префаба обновит любой его экземпляр.

Представьте, что у вас есть сотни GameObjects одного и того же типа в сцене, и вам нужно изменить их все. При использовании prefab вам нужно всего лишь изменить один из них или просто prefab, а затем нажать Apply, чтобы обновить другие экземпляры. Это единственное, что вы должны подумать о сборных.

Другие вопросы по тегам