Estoy creando lo que es esencialmente mi propio sistema prefabricado. Los objetos del juego están definidos por un archivo de datos legibles por humanos. Me gustaría crear un GameObject vacío, cargarlo con los componentes definidos en el archivo de datos y tenerlo listo y esperando una Instantiate()
llamada. Sin embargo, cada vez que uso GameObject go = new GameObject()
un nuevo objeto de juego se agrega a la escena.
Utilizando Unity integrado en prefabricados, puedo cargar un prefabricado como GameObject, y no se agrega a la escena. (Ver ejemplo a continuación)
La razón detrás de esto es que me gustaría tener una lista que contenga GameObjects, algunos generados al cargar prefabricados de Unity y otros creados por mi sistema de prefabricados personalizado. Esto debe suceder en tiempo de ejecución y no puede involucrar al Editor de Unity (ya que, idealmente, los usuarios finales podrían definir sus propios archivos de datos).
¿Cómo puedo crear un nuevo GameObject, sin que Unity lo instale automáticamente?
Por ejemplo, puedo hacer una llamada como esta:
Resources.LoadAll("PrefabsDirectory", typeof(GameObject))
Y obtendré una lista de GameObjects, ninguno de los cuales se agrega a la escena cuando se realiza la llamada. Esencialmente, estoy creando un LoadAll
método para mis propios prefabricados, y del mismo modo, no quiero instanciar los GameObjects cuando se realiza la llamada.
fuente
Destroy
al GameObject. Lo que lo elimina de la escena y lo libera, haciéndolo inutilizable.go.SetActive(false)
es la mejor manera de crear algo así como un grupo de objetos. No es exactamente lo que desea, pero quizás podría tener un pequeño grupo de objetos inactivos que luego se clonarán para su instanciación personalizada.Respuestas:
¿Podrías cambiar las hideFlags de GameObject?
Acabo de intentar ejecutar esto:
... y está ahí, pero no está en la jerarquía. Técnicamente, está en la escena, pero no lo ves hasta que cambias sus banderas a HideFlags. Ninguno. No es la respuesta que está buscando, pero al menos en lo que respecta a lanzar esto a los desarrolladores, es más limpio que agrupar sus objetos.
fuente
No puedes hacer eso exactamente, desafortunadamente. Sin embargo, puede lograr el mismo patrón de diseño (es decir, abstraer la construcción de sus objetos y luego simplemente llamarlos con un solo comando más adelante) a través de un patrón Factory .
Cuando desee un objeto, llame a algo así
Factory.CreateGameEntity()
, y ese método manejará todo detrás de escena.fuente
GetComponent<>() != null
. Con mis archivos de datos, el analizador tiene que buscar el componente correcto en los datos. Lo mismo para obtener un valor desde el interior de un componente, y así sucesivamente. LaGameObject
clase proporciona una gran cantidad de funcionalidades que el analizador debe duplicar.No hay forma de hacerlo
go = new GameObject();
sin agregarlo a la escena.Estoy trabajando en un RTS donde la base de jugadores debe ser persistente, y esencialmente, serializamos todo lo que han hecho y lo cargamos nuevamente en tiempo de ejecución utilizando activos modificados de la tienda.
La mayoría sale a XML o JSON, por lo que es bastante sencillo cargar el archivo y manipularlo como desee.
fuente
La forma correcta es hacer un prefab, asigna ese prefab como un Objeto, luego, cuando quieras crear una instancia, solo usa la referencia de este Objeto y vuélvelo como un GameObject.
ex:
fuente
Para cargar un prefab en una variable para poder instanciarlo más tarde, usaría el siguiente código:
Lo hice en un proyecto con Unity 5.5. Estará disponible para crear instancias, pero no en la escena o parte de la jerarquía hasta que se cree una instancia normal.
fuente