Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

(RESUELTO)Como inicializar un GameObject en runtime

Iniciado por ftejada, Mayo 26, 2017, 05:06:38 PM

Tema anterior - Siguiente tema
Mayo 26, 2017, 05:06:38 PM Ultima modificación: Mayo 31, 2017, 11:08:14 AM por ftejada
Hola a todos!!
 
Tengo una duda. ¿Como puedo instanciar un GameObject en tiempo real mediante script, sin tener que utilizar un prefab arrastrado desde el inspector a una variable publica en el script que lo instancie??
 
Lo tipico seria esto:
 

public GameObject sphere;
void crearSphere()
{
sphere = (GameObject) Instantiate(sphere);   //Forma tipica.
}

 
Pero yo quiero poder hacerlo sin tener que arrastrar nada a la variable "sphere" que contendrá el GameObject instanciado.
 
Por cierto, lo que quiero instanciar realmente es un GameObject vacio que solo tenga el transform. Sin malla ni nada, solo el transform.
 
 
 
He buscado por google pero siempre encuentro la manera que ya conocia y he puesto ahi arriba.
 
 
 
Saludos y gracias por adelantado
 
 

Crea un GameObject llamando su constructor:
 

GameObject objeto;
void Start ()
{
objeto = new GameObject();
}

 
Te dejo la API:
 
https://docs.unity3d.com/ScriptReference/GameObject-ctor.html


Retomo este tema por un problema que me he dado cuenta.
 
 
 
Haciendo el "objeto = new GameObject();" en mi caso en una funcion Start() el gameObject que se crea en la escena permanece en el inspector despues de parar el play. Cuando le doy al play varias veces termino teniendo una coleccion de estos gameobject que creo via script... y tengo que borrarlos de la jerarquia de manera manual...
 
¿Por qué no se destruyen automaticamente al parar el Play y siguen apareciendo en la jerarquia de la escena???
 
¿Debo hacer algo para destruirlos? Pensaba que al crear un GameObject en tiempo real, cuando se paraba el runtime se destruia solo, pero sigue quedando en la jerarquia
 
 
 
Saludos

Supongo que crear de esta forma el GameObject es como crearlo desde la jerarquía, lo de Create Empty vamos, tal vez sea esa la diferencia entre instanciar un GO vacío y llamar al constructor de GameObject.
 
Siempre puedes llamar el destructor al finalizar:
 

void OnApplicationQuit()
{
Destroy(objeto);
}

 
 

Cita de: ftejada date=1496061174Haciendo el "objeto = new GameObject();" en mi caso en una funcion Start() el gameObject que se crea en la escena permanece en el inspector despues de parar el play
   


Dats impasibeel!! desde el runtime si creas con new gameObject no te pueden quedar fuera del runtime (en Editor) a no ser que tengas ExecuteinEditMode, de otra forma el motor deberia serializar/deserializar los datos (lo que hace con public en el inspector, que quedan guardados o con el System.Serializable) y tendrias un lindo sistema de guardado jajaj. Podrias subir todo tu codigo para ver?
 
Si haces como te dijo @juanma_teso te debe quedar un objeto nuevo llamado "GameObject" (me parece) sin nada, solo un componente transform, vos de ahi instancias lo que queres, pero cuando le das a salir del juego se deberia borrar.
 
PD: para mencionarlo nada mas, si queres meterle un nombre usalo con el constructor asi
 

pepeObj = new GameObject("pepe");

 
 

Gracias a ambos por contestar!!
 
Bueno el codigo es demasiado grande para subirlo @lightbug y está repartido en distintos scripts. Parece que el problema anda por lo que has comentado de "ExecuteInEditMode"
 
¿Hay alguna manera de solucionarlo para que Unity lo destruya automaticamente o tengo que utilizar necesariamente el destroy()?
 
Tengo un Script, llamado GestorCamaras que tiene el "ExecuteInEditMode". Este script(GestorCamaras) en su función Start() llama a la funcion de otro script que hace el "objeto = new GameObject();"
 
¿Cual es la mejor manera de gestionar esto para que no se quede un objeto nuevo en la jerarquia cada vez que hago play?
 
 
 
Saludos

Cita de: ftejada date=1496121718¿Cual es la mejor manera de gestionar esto para que no se quede un objeto nuevo en la jerarquia cada vez que hago play?
   


Si es un objeto de interes que lo vas a usar de vez en cuando podes simplemente verificar si existe previamente con un if, si no es asi lo creas, acordate que tenes la declaracion del objeto arriba, basta solo con ver si es null o no, pero si cada vez que ocurre start(no es lo mismo que el start del runtime, con ExecuteInEDitmode creo que pasa de otra forma) tenes un nuevo gameobject creado y Rereferenciado a la misma variable, es decir que las previas creaciones quedan dando vuelta sin proposito.
 
Tene en cuenta que los scripts con Executeineditmode tienen que ser solo creados por motivos de edicion, como un map editor o cosas asi, no se bien por donde va lo tuyo, pero si vas a crear algo asi lo mejor es tener el completo control de ello, como por ejemplo en el inspector tener un boton "crear Objeto" que si lo apretas crea a tu nuevo Objeto, y no crear cosas en un start o OnEnable, ya que, como te paso ahora, perdiste el rastro de cuando se creaba y te aparecian de mas. En resumen con lo del if de verificacion creo que deberia estar.
 
saludos

Gracias!! asi lo he hecho. Hago el if y solo lo crea la primera vez. Las demás veces busca el objeto y si lo encuentra lo devuelve para la variable...
 
 
 
Muchas gracias por la ayuda. Un saludo

Etiquetas: