Як створити новий GameObject, не додаючи його на сцену?


10

Я створюю те, що по суті є моєю власною збірною системою. Ігрові об’єкти визначаються за допомогою файлу даних, читаних людиною. Я хотів би створити порожній GameObject, завантажити його з компонентами, визначеними у файлі даних, і мати його готовим і чекати Instantiate()дзвінка. Однак щоразу, коли я використовую GameObject go = new GameObject()новий ігровий об’єкт, додається на сцену.

Використовуючи Unity, вбудований у збірники, я можу завантажити збірник як GameObject, і він не додається до сцени. (Див. Приклад нижче)

Обґрунтуванням цього є те, що я хотів би мати один список, який містить GameObjects, деякі створені завантаженням збірок Unity, а інші створені моєю власною спеціальною системою збірок. Це має відбуватися під час запуску, і не може залучати редактор Unity (оскільки в ідеалі кінцеві користувачі зможуть визначити власні файли даних).

Як я можу створити новий GameObject, без Unity автоматично для нього?


Наприклад, я можу зробити такий дзвінок:

Resources.LoadAll("PrefabsDirectory", typeof(GameObject))

І я отримаю список GameObjects, жоден з яких не додається на сцену під час дзвінка. По суті, я створюю LoadAllметод для власних збірок, і так само я не хочу інстанціювати GameObjects під час виклику.


1
Боюся, ти не можеш. Думаю, вам доведеться затримати вміст вашого класу.
Роберто

Минуло час, коли я торкнувся Unity, але якщо виявиться, що це не обійтись, ви могли б просто зняти об'єкт зі сцени одразу після цього і отримати бажаний результат, просто трохи неефективно?
Кевін Рейд

@KevinReid Я вважаю, що єдиний спосіб зробити це - зателефонувати Destroyна GameObject. Що знімає його зі сцени і звільняє, роблячи його непридатним.
MichaelHouse

1
@PandaPajama має гарну ідею. Виклик go.SetActive(false)- найкращий спосіб створити щось на зразок об’єкта пулу. Це не зовсім те, що ви хочете, але, можливо, у вас може бути невелика група неактивних об'єктів, які пізніше клонуються для вашої власної інстанції.
AndrewEkeren

1
@ Byte56: Чому саме ви хочете заздалегідь створити свої власні попередні налаштування, а не просто скласти GO з необхідними компонентами на льоту, а інстанціювати їх за допомогою фабричного типу? З того, що я зрозумів, ви хочете дозволити користувачам "серіалізувати" збірники за допомогою "власних файлів даних", тому вам доведеться все-таки читати ці файли під час запуску та інстанціювати необхідні компоненти. Я щось пропускаю?
Heisenbug

Відповіді:


6

Ви можете змінити приховані позначки GameObject?

Я просто спробував запустити це:

GameObject myGameObject = new GameObject ();
myGameObject.name = "Obvious Name";

myGameObject.hideFlags = HideFlags.HideInHierarchy;

... і воно є, але це не в ієрархії. Технічно він знаходиться в сцені, але ви його не бачите, поки не зміните його прапори назад до HideFlags.None. Це не відповідь, яку ви шукаєте, але, принаймні, що стосується випуску цього розробникам, це чистіше, ніж групування ваших об'єктів.


1
Це в парі з відключенням його (тому жоден із сценаріїв не виконується) може працювати. Я спробую і дам вам знати. Це все ще робота навколо, але я думаю, що це те, що я залишаю на даний момент. І, наскільки ми знаємо, це може бути те, що робиться всередині, хоча я сумніваюся в цьому.
MichaelHouse

1
@ Byte56: Мені здалося, що це теж було вирішенням, але я насправді я виявив, що Unity робить саме те саме, що попередньо переглядає анімації: він створює прихований ігровий об'єкт на сцені та відтворює їх у кадр попереднього перегляду за допомогою спеціальної камери. То, можливо, це не звучить так чисто, але насправді це рішення, здається, використовується і всередині.
Heisenbug

1
Вибачте за пізнє прийняття. Я просто почав реалізовувати це, і це чудово працює. Дякую.
MichaelHouse

0

На жаль, ви не можете зробити це точно. Однак ви можете виконати ту саму схему дизайну (тобто абстрагувати будівлю ваших об'єктів, а потім просто зателефонувати їм за допомогою однієї команди пізніше) через заводський зразок .

Коли ви хочете об'єкт, зателефонуйте на щось подібне Factory.CreateGameEntity(), і цей метод буде обробляти все за кадром.


Це складніше, ніж можна подумати, але робить його не таким чистим. Я опублікую відповідь, буду детальною інформацією, але по суті аналізатор повинен бути досить складним. Наприклад, якщо я хочу перевірити, чи має збірний компонент компонент, перед тим як ініціювати, це так само просто GetComponent<>() != null. За допомогою моїх файлів даних аналізатор повинен шукати правильний компонент у даних. Те саме, щоб отримати значення зсередини компонента тощо. GameObjectКлас надає безліч функцій , які повинні бути дубльовані аналізатором.
MichaelHouse

Якщо ви можете надати докази чи навіть обґрунтування того, чому цього не можна зробити, це дозволить зробити цю відповідь повною.
MichaelHouse

Пізніше я побачу, чи зможу знайти будь-яку остаточну документацію щодо цього, зараз я можу знайти лише ці теми на форумі forum.unity3d.com/threads/… - answer.unity3d.com/questions/366273/… - відповіді.unity3d .com / questions / 19736 /…
jhocking

0

Не обійтися, go = new GameObject();не додавши його на сцену.

Я працюю над RTS, де база гравців повинна бути наполегливою, і по суті, ми серіалізуємо все, що вони зробили, і завантажуємо його назад під час виконання, використовуючи модифіковані активи з магазину.

Більшість вихідних даних у XML або JSON, тому завантажуйте файл та маніпулюйте ним як завгодно.


Дякую Марку. Чи можете ви надати докази чи обґрунтування того, що не зможете створити новий GameObject, не додавши його до сцени? У мене є власний код серіалізації, тому це не проблема, дякую за пропозицію.
MichaelHouse

-1

Правильний спосіб - це зробити збірний засіб, ви виділяєте цей збірник як Об'єкт, тоді, коли ви хочете створити інстанцію, просто використовуйте посилання на цей Об'єкт і передайте його як GameObject.

колишній:

private Object prefab;


public static GameObject Create(void)
{
   return (Instantiate(prefab , position , rotation) as GameObject);
}

1
Це за допомогою існуючої системи збірних пристроїв. Як зазначено в моєму питанні, я по суті створюю свою власну систему збірок. Частина вимог "не може залучати редактор Unity". Для створення збірної панелі використовується редактор Unity.
MichaelHouse

Що ви не можете зробити, вам знадобиться ліцензія для розробника, використовуючи їх SDK, щоб потім мати можливість робити власні дані. Якщо я не помиляюся, вони не поділяться своїм кодом без будь-якого bling bling. Але я знаю, що деякі люди змогли експортувати сцени з Unity на свій ігровий движок
Ericool

Ну, це очевидно можливо, оскільки я створив власну збірну систему, використовуючи вибрану відповідь. Ви можете дізнатися, як це зробити в курсі, який я створив, знайденому в моєму профілі.
MichaelHouse

ні, дякую, я закінчений ігровий програміст :) Ну, якщо вам це вдасться, вам не потрібно, щоб робити ігри
Ericool

Це система, яка по суті дозволяє кінцевим користувачам робити збірні. Це досить корисно в іграх для модників та іншого створеного кінцевим користувачем вмісту. (Так, так, я думаю, що це досить корисно для створення ігор).
MichaelHouse

-1

Для завантаження збірної в змінну, щоб ви могли інстанціювати її пізніше, ви використовуєте наступний код:

 GameObject ball = (GameObject)(Resources.Load ("myPrefab"));

Я зробив це в проекті з Unity 5.5. Він буде доступний для інстанції, але не в сцені або в частині ієрархії, поки не буде встановлений як нормальний.


Я відчуваю, що ви неправильно прочитали питання. Ця відповідь передбачає використання стандартної системи збірки за замовчуванням . Це питання задається в контексті створення спеціальної збірної системи, де це недоступно. Приклад внизу служить для подальшого висвітлення цього.
Gnemlock

"Як я можу створити новий GameObject, без Unity автоматично для нього?" Це питання, яке було задано, і цей код відповів на нього. Код можна змінити для отримання бажаних результатів за допомогою спеціальних систем завантаження.
darthhawk

Це по суті те, що я описую в прикладі, включеному в запитання. І це чудово працює для збірок, але не для створення нових ігрових об'єктів з файлів даних.
MichaelHouse
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.