Я создаю то, что по сути является моей собственной сборной системой. Игровые объекты определяются читаемым человеком файлом данных. Я хотел бы создать пустой GameObject, загрузить его с компонентами, определенными в файле данных, и подготовить его и ожидать Instantiate()
вызова. Однако всякий раз, когда я использую GameObject go = new GameObject()
новый игровой объект, он добавляется на сцену.
Используя встроенные префабы Unity, я могу загрузить префаб как GameObject, и он не добавляется в сцену. (См. Пример ниже)
Обоснование этого заключается в том, что я хотел бы иметь один список, содержащий GameObjects, некоторые из которых были сгенерированы путем загрузки префабов Unity, а другие созданы моей пользовательской префаб-системой. Это должно происходить во время выполнения и не может включать редактор Unity (поскольку в идеале конечные пользователи смогут определять свои собственные файлы данных).
Как я могу создать новый GameObject, без Unity, автоматически создающего его для меня?
Например, я могу позвонить так:
Resources.LoadAll("PrefabsDirectory", typeof(GameObject))
И я получу список GameObjects, ни один из которых не будет добавлен в сцену при вызове. По сути, я создаю LoadAll
метод для своих собственных префабов, а также я не хочу создавать экземпляры GameObjects при выполнении вызова.
источник
Destroy
GameObject. Что удаляет его со сцены и освобождает, делая его непригодным для использования.go.SetActive(false)
- лучший способ создать что-то вроде пула объектов. Это не совсем то, что вы хотите, но, возможно, у вас может быть небольшая группа неактивных объектов, которые впоследствии будут клонированы для вашей пользовательской реализации.Ответы:
Вы могли бы изменить hideFlags GameObject?
Я просто попытался запустить это:
... и это там, но это не в иерархии. Технически, он находится в сцене, но вы не увидите его, пока не измените его флаги обратно на HideFlags.None. Это не тот ответ, который вы ищете, но, по крайней мере, с точки зрения его публикации разработчикам, он чище, чем группировка ваших объектов.
источник
Вы не можете сделать это точно, к сожалению. Тем не менее, вы можете выполнить тот же шаблон проектирования (т. Е. Абстрагироваться от создания ваших объектов, а затем просто вызвать их с помощью одной команды) через шаблон Factory .
Когда вам нужен объект, вызывайте что-то вроде этого
Factory.CreateGameEntity()
, и этот метод будет обрабатывать все за кадром.источник
GetComponent<>() != null
. С моими файлами данных парсер должен искать правильный компонент в данных. То же самое для получения значения внутри компонента и так далее.GameObject
Класс предоставляет множество функций , которые должны быть дублированы анализатором.Нет способа обойтись
go = new GameObject();
без добавления этого на сцену.Я работаю над RTS, где база игроков должна быть постоянной, и, по сути, мы сериализуем все, что они сделали, и загружаем его обратно во время выполнения, используя измененные ресурсы из магазина.
Большая часть выводится в XML или JSON, поэтому довольно просто загрузить файл и манипулировать им, как вы хотите.
источник
Правильный способ состоит в том, чтобы создать префаб, вы выделяете этот префаб как объект, а затем, когда хотите создать экземпляр, просто используйте ссылку на этот объект и приводите его в качестве GameObject.
пример:
источник
Чтобы загрузить префаб в переменную, чтобы вы могли создать его экземпляр позже, вы должны использовать следующий код:
Я сделал это в проекте с Unity 5.5. Он будет доступен для создания экземпляра, но не в сцене или части иерархии, пока не будет создан как обычно.
источник