Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: biztor en Agosto 17, 2015, 10:34:20 PM

Título: Como instanciar un objeto de una clase derivada de Mono
Publicado por: biztor en Agosto 17, 2015, 10:34:20 PM
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. 
Título: Como instanciar un objeto de una clase derivada de Mono
Publicado por: iRobb en Agosto 17, 2015, 10:48:41 PM
Pues instancia tablero en vez de new. Instantiate para mono y new para clases "puras".
Título: Como instanciar un objeto de una clase derivada de Mono
Publicado por: biztor en Agosto 17, 2015, 11:46:11 PM
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.
Título: Como instanciar un objeto de una clase derivada de Mono
Publicado por: iRobb en Agosto 18, 2015, 08:16:25 AM
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
Título: Como instanciar un objeto de una clase derivada de Mono
Publicado por: biztor en Agosto 18, 2015, 07:55:57 PM
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.
Título: Como instanciar un objeto de una clase derivada de Mono
Publicado por: iRobb en Agosto 18, 2015, 08:16:29 PM
De nada
Título: Como instanciar un objeto de una clase derivada de Mono
Publicado por: kaito en Agosto 18, 2015, 10:37:49 PM
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.