Noticias

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

Como instanciar un objeto de una clase derivada de Mono

Iniciado por biztor, Agosto 17, 2015, 10:34:20 PM

Tema anterior - Siguiente tema
Buenas, aver si me puedo explicar. Tengo 1 script de logica del juego,el que crea un nuevo tablero. Ese tablero es otra clase creada en otro script, que hereda tambien de monobehaviour. 
public class Tablero:MonoBehaviour
{
public GameObject muro;
private byte ancho;
private byte largo;


public Tablero()
{
   this.ancho=6;
   this.largo=10;
}
public Tablero(byte ancho,byte largo)
{
   this.ancho=ancho;
   this.largo=largo;
}


public void Iniciar()
{
   for(byte x=0;x<ancho;x++)
   {
      for(byte y=0;y<largo;y++)
      {
         Instantiate(muro,new Vector3(x,y,0f),Quaternion.identity);
      }
   }
}
}
desde el script principal al crear el objeto (new tablero()  ),da error de que no se puede instanciar el objeto,el error es porque hereda de mono, el problema es que si a la clase Tablero, le quito la herencia de Mono, no puedo usar el instantiate, ni poner una variable publica para ponerle el Gameobject a instanciar.Como haceis vosotros,o que es lo mejor?. lo queria hacer asi para tenerlo mas organizado.Tambien he probado a meter la clase tablero, dentro de la clase principal. Asi funcionaria. Pero volvemos a lo mismo, tendria que meter la variable publica del GameObject que quiero instanciar en el script principal,porque sino no sale en el inspector. Y al llamar el metodo Iniciar() pasarle el gameobject. Pierdo la organizacion y el encapsulamiento.Como haceis vosotros? gracias. 

Pues instancia tablero en vez de new. Instantiate para mono y new para clases "puras".

Cita de: iRobb date=1439844521" data-ipsquote="" data-cite="iRobb" class="ipsQuotePues instancia tablero en vez de new. Instantiate para mono y new para clases "puras".
Ponme un ejemplo porque no entiendo. Como puedo usar los constructores con Instantiate?, ademas tendria que buscar la referencia con getComponent, cosa que es lenta, y ya perderia la ventaja de hacer:Tablero tablero=new Tablero(12,20); por ejemplo, sin get component ni nada.Nose, para mi que no lo acabo de entender del todo bien, o tiene que haber otra forma.Un saludo.

A ver, voy a marcar unas premisas y te cuento:1. Todas las clases derivadas de mono se deben instanciar con Instantiate y no contienen un contructor. Se utliza Start/Awake en su caso. Pueden utilizarse como Prefab y son serializables por defecto.2. Toda clase pura se instancia con el clásico new, que llama a su constructor. Deben serializarse explícitamente.Por tanto, cuando yo tengo que utilizar estructuras del estilo,-> Mono -> new Class1 (con gameobject)hago lo siguiente:Class1 :
private gameobject gClass1()
get g {}Mono:Start/Awake {
new Class1()
g = Instantiate()
}Espero que se entienda mejor ahora

Si, gracias. He probado a crear un prebaf de ese script, que es llamado desde el script principal, y en vez de un constructor, una funcion que hace de constructor. La verdad que nose porque me lie tanto. Gracias.


Para instanciar componentes(como MonoBehaviour) se utiliza AddComponent o se instancian GameObject completos con Instantiate, porque todos los componentes necesitan estar asociados a un GameObject.

Etiquetas: