Как неинстанцированные загруженные префабы сравниваются с инстанцированными?
пример
В 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
представляет фактический сборный ресурс, и любые сделанные в нем изменения (имя параметра, добавление компонентов и т. д.) записываются в исходный сборный ресурс, и эти изменения сохраняются даже после выхода из режима воспроизведения редактора.
Вопросы
Поскольку все объекты GameObject обычно хранятся в сцене, а
scene
собственность наGameObject prefab
в приведенном выше примере кажется Unloaded/Invalid/ Безымянный, где именно я должен считать этот специальный GameObject? Кажется, я могу делать с ним все, что могу делать с обычными объектами GameObject, за исключением того, что их можно увидеть в иерархическом / сценарном представлении.Это эффективно в каком-то подвешенном состоянии или в особой псевдо-сцене? Кажется, сохраняется
LoadSceneMode.Single
сцена меняется, но не как особеннаяDontDestroyOnLoad
сцена, в которую перемещаются объекты при передаче вGameObject.DontDestroyOnLoad(...)
,Есть ли еще какие-нибудь заметные различия между
prefab
а такжеinstance
в приведенном выше примере, кроме изменений времени жизни, недопустимая сцена и отличающиеся объекты друг от другаGetInstanceID()
, так далее)?С звонка
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, чтобы обновить другие экземпляры. Это единственное, что вы должны подумать о сборных.