Noticias

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

Herencia en prefabs e instanciar childs randoms.

Iniciado por MaanuRP, Febrero 28, 2016, 05:47:20 AM

Tema anterior - Siguiente tema
Hola, buenas noches.Estoy aprendiendo tanto Unity como C# al mismo tiempo, quizas sea mala idea pero tengo conocimientos previos en programacion por lo que espero que por mas que sea laborioso, pueda lograra adentrarme en este entorno.Empece con un simple tetris, para poder empezar con cosas simples tanto en Unity, como programacion, como en Blender. Ya lo he hecho en 2D en otros lenguajes con POO pero por alguna razon no termino de entender como funcionan ciertas cosas de como funciona aqui.1) Modele las piezas del tetris en Blender y las exporte a Unity. Puse el modelo en la escena, cree un objeto vacio con Rigidbody para que las piezas tengan gravedad y fui pasando una a una desde el primer objeto donde se me crearon al arrastrarlas a la escena al nuevo objeto vacio con Rigidbody, para que todas hereden este componente, supuse que siendo hijas, heredaban esto. Agregando a cada una un box collider adecuado a su forma.2) Cree un script para instanciar cada parte por separado, al hacerlo, se me instancia bien y afecta el box collider, pero el rigidbody no lo hereda.3) Solamente pude hacer que se instancien objetos a los cuales asigno en una variable publica por medio del editor. Lo que yo necesito es crear una lista la cual se llene por los child del prefab donde tengo como hijas a todas las piezas y que se elija un object random de esa lista e instanciarlo. 
    public Object prefab;
private Vector3 vector;
   
void Update () {
   
   vector = new Vector3 (Random.value, Random.value, Random.value);

   if (Input.GetKeyUp (KeyCode.KeypadEnter)) {
      Instantiate (prefab, vector, Random.rotation);
   }

}
Espero que mi duda se haya entendido, creo que es una tonteria y quizas me explaye demasiado, y que la duda no sea muy complicada para no quitarles mucho de su tiempo.Desde ya, muchas gracias y saludos!

  • ¿Tetris con físicas? ... 
Empieza por obtener un poco más de conceptos y estudiar el GamePlay de este juego. 

[quote author=francoe1" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35265" data-ipsquote-contentcommentid="127573">
  • ¿Tetris con físicas? ... :o

no se si explicaste demasiado, pero no entiendo que necesitas? como poner objetos en una lista?

Febrero 28, 2016, 05:44:51 PM #4 Ultima modificación: Febrero 28, 2016, 05:47:01 PM por MaanuRP
[quote author=Braltor" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35265" data-ipsquote-contentcommentid="127591">no se si explicaste demasiado, pero no entiendo que necesitas? como poner objetos en una lista?[/quote]Quizas tengo mal creado el prefab por entender mal el concepto de como se programa con este motor. Mi intencion fue crear una "clase" poniendo un objeto vacio en la escena y luego hacer "sub clases" de este objeto poniendolas como hijas en la ventana "Hierachy", luego de eso lo arrastre hasta la ventanta "Project" para que se me cree el prefab.https://gyazo.com/211f667f66e4c05e068de7c79a95e951">https://gyazo.com/211f667f66e4c05e068de7c79a95e951 (Esta es la ventana "Hierachy" de mi escena)https://gyazo.com/fae150806d3926f3111aa2faecb639d9 date=1456676522]https://gyazo.com/fae150806d3926f3111aa2faecb639d9 (Esta es la carpeta donde guardo los prefabs, en la vetana "Project", despues de haber arrastrado ese objeto que cree para guardar las piezas)Lo que yo necesito es poder instanciar una "subclase" o un "hijo" del objeto o prefab "Pieces". Y tambien, como hacer que se herede, en todos los hijos, el componnente "Rigidbody" que puse en el prefab Pieces, para aprovechar este paradigma.

PD: Pido disculpas por si me explique mal o demasiado en el post.

Febrero 28, 2016, 06:33:47 PM #5 Ultima modificación: Febrero 28, 2016, 06:38:25 PM por Braltor
si tienes cruzados los conceptos de polimorfismo y componentes... los objetos heredan las propiedades y metodos pero no los componentes asociados... las instancias (por instantiate, no por new) COPIAN los componentes asociados, de ahi puede darte la impresion de que hay una herencia pero NUP!si quieres que se agregue el rigidbody por programacion tienes que usar addcomponent en un metodo, este metodo puede llamarse desde el awake/start del objeto... los metodos awake/start/update y otros no son polimorficos, son eventos de componentes

[quote author=Braltor" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35265" data-ipsquote-contentcommentid="127595 date=1456680827]si tienes cruzados los conceptos de polimorfismo y componentes... los objetos heredan las propiedades y metodos pero no los componentes asociados... las instancias (por instantiate, no por new) COPIAN los componentes asociados, de ahi puede darte la impresion de que hay una herencia pero NUP![/quote]Exacto, en el unico motor de videojuegos que use POO es en Game Maker que ahi no hay componentes, solamente eventos que si se heredan, por lo que en mi cabeza se heredaba todo jajaj. Entonces, ¿cual seria la forma correcta de darle Rigidbody a todas las subclases? ¿Añadiendo el componente en todas o añadiendo por codigo el componente Rigidbody a la clase padre? Por lo unico que genere esa clase padre fue para agregar el Rigidbody a todas. Con que los hijos copien el componente asociado al padre supongo que alcanza, ya que la herencia no es mas que eso, tener lo mismo que el padre. Pero creo que entendi mal lo que me quisiste explicar, ya que yo las creo por intantiate (Como muestro en el codigo del post) y no heredan ni copian ese Rigidbody.Y para instanciar un hijo aleatorio de mi prefab Pieces, ¿Como se haria? Ya que no se como acceder a tener los nombres o el GameObject de cada uno de ellos para guardalos en una lista y de ahi elegir una posicion random.

Una cosa es herencia y otra jerarquía , para instanciar deberias obtener la lista de los hijos de tu objeto, utilizando transform.GetChild() y almacenarlos en un arreglo,  luego el random con la misma.

Puedes obtener el número de objetos que tiene un objeto como hijos desde el transform, con esta clase también puedes acceder a el objeto hijo número X, luego sería utilizar la clase Random para el valor aleatorio. Debes saber que un hijo en la jerarquía de Unity puede no tener nada que ver con el padre, no es como en POO en este sentido, es más si el objeto base llámalo 'Puente' tiene un objeto hijo que sea 'baranda' pueden tener componentes diferentes, incluso dos iguales, como dos boxColliders con diferentes formas. Yo lo que haría sería tomar cada pieza por separado y añadirle sus componentes, lo puedes hacer desde el editor o un script que le agregue los componentes, como más te guste, luego arrastrarlas al Project para hacerlas prefabs y después trabajar con esos prefabs. Si quieres hacerlo de otra forma explica un poco para enterarnos jaja

[quote author=juanma_teso" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35265" data-ipsquote-contentcommentid="127598">Puedes obtener el número de objetos que tiene un objeto como hijos desde el transform, con esta clase también puedes acceder a el objeto hijo número X, luego sería utilizar la clase Random para el valor aleatorio. Debes saber que un hijo en la jerarquía de Unity puede no tener nada que ver con el padre, no es como en POO en este sentido, es más si el objeto base llámalo 'Puente' tiene un objeto hijo que sea 'baranda' pueden tener componentes diferentes, incluso dos iguales, como dos boxColliders con diferentes formas. Yo lo que haría sería tomar cada pieza por separado y añadirle sus componentes, lo puedes hacer desde el editor o un script que le agregue los componentes, como más te guste, luego arrastrarlas al Project para hacerlas prefabs y después trabajar con esos prefabs. Si quieres hacerlo de otra forma explica un poco para enterarnos jaja[/quote]Genial, creo que lo que mas me sirve es "Debes saber que un hijo en la jerarquía de Unity puede no tener nada que ver con el padre" que es el error grave que estaba cometiendo. Ordenar la jerarquia solamente sirve como forma de orden entonces, ¿no? Lo que es polimorfismo es si o si con scripts, si no entendi mal. No se si alguien de aqui uso ya Game Maker, pero estoy intentando hacer analogias entre ambos motores para guiarme y creo que es un error, tendria que empezar bien de 0. 

Febrero 28, 2016, 10:11:12 PM #10 Ultima modificación: Febrero 28, 2016, 10:14:23 PM por kaito
Puedes hacer un tetris 3D configurando las piezas con cubos con rigidbodys amarrados con FixedJoints: http://www.speedyshare.com/Xb9ja/tetris.unitypackage">http://www.speedyshare.com/Xb9ja/tetris.unitypackageY limitas todas las rotaciones y solo permites el desplazamiento en el eje Y.

Tener hijos en la jerarquía puede ser muy útil para ubicar los objetos en el espacio, por ejemplo puedes poner siempre un objeto hijo  'sombrero' a X distancia sobre el pivot, de esta manera se mueve junto con el personaje, o para tener una referencia rápida a los objetos hijos, como diferentes prefabs que se pueden usar en cualquier momento del juego varias veces, los instancias al principio, los desactivas y luego los buscas desde el padre, son los primeros ejemplos que se me vienen a la cabeza jaja pero habrá más.Exacto, puedes hacer una clase común para todas las piezas para que se comporten igual, y si quieres puedes hacer una nueva heredada para cada pieza pero no le veo mucha utilidad, porque en lo que difieren es en el Collider y es un componente separado, es una ventaja. El poliformismo yo lo veo útil para por ejemplo tener una clase EfectoParticula, en la que puedan haber diferentes comportamientos y quieras llamar siempre desde la misma referencia.Yo empecé con GameMaker pero antes de aprender a programar, Unity lo empecé a usar al poco de empezar las clases de programación.

[quote author=juanma_teso" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35265" data-ipsquote-contentcommentid="127605 date=1456696447]Tener hijos en la jerarquía puede ser muy útil para ubicar los objetos en el espacio, por ejemplo puedes poner siempre un objeto hijo  'sombrero' a X distancia sobre el pivot, de esta manera se mueve junto con el personaje, o para tener una referencia rápida a los objetos hijos, como diferentes prefabs que se pueden usar en cualquier momento del juego varias veces, los instancias al principio, los desactivas y luego los buscas desde el padre, son los primeros ejemplos que se me vienen a la cabeza jaja pero habrá más.Exacto, puedes hacer una clase común para todas las piezas para que se comporten igual, y si quieres puedes hacer una nueva heredada para cada pieza pero no le veo mucha utilidad, porque en lo que difieren es en el Collider y es un componente separado, es una ventaja. El poliformismo yo lo veo útil para por ejemplo tener una clase EfectoParticula, en la que puedan haber diferentes comportamientos y quieras llamar siempre desde la misma referencia.Yo empecé con GameMaker pero antes de aprender a programar, Unity lo empecé a usar al poco de empezar las clases de programación.[/quote]Me aclaras mucho el tema de jerarquia, creo que es algo sobre lo que tengo que aprender bastante ya que nunca habia trabajado con esto.Si, GameMaker te da la facilidad del D&D pero al poco tiempo ves que no tiene una curva de dificultad muy elevada para entrar en GML, pude aprender muy facil y rapido como programar en ese lenguaje y le saque mucho provecho en su momento, pero el paso a Unity es algo que veo necesario, mas que todo porque nunca tuve el dinero necesario para las licencias de GM.Muchas gracias por sus respuestas

por que no colocas los prefabs de tus piezas ya con rigidbody . al instanciarlas en el gameplay ya las traeran,using System.Collections.Generic;es una clase con la que puedes usar una Lista    public List<GameObject> ListPiezas;public List<GameObject> ListPiezasCreadas;luego puedes usar un random para sacar alguna pieza al azar:    int num = Random.Range (0, ListPiezas.Count);
        GameObject item = Instantiate (
ListPiezas [num].gameObject, RandomPosition (), Quaternion.identity) as GameObject;y cuando instancess una nueva pieza, la puedes guardar en otra lista. para futuro uso.ListPiezasCreadas.Add(item.gameObject); espero te de una idea n__n saludos. 

Etiquetas: