User Tag List

Página 1 de 2 12 ÚltimoÚltimo
Resultados 1 al 15 de 26

Tema: Instantiate usando foreach con múltiples GameObject no funciona

  1. #1

    Fecha de ingreso
    Sep 2001
    Mensajes
    23,077
    Mencionado
    406 Post(s)
    Tagged
    1 Tema(s)
    Agradecer Thanks Given 
    98
    Agradecer Thanks Received 
    1,199
    Thanked in
    Agradecido 503 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    9

    Instantiate usando foreach con múltiples GameObject no funciona

    Buenas!

    A ver si alguno puede ayudarme con este caso, porque me tiene un poco confuso.

    Uso un Instantiate para crear una explosión en los GameObject dependiendo de ciertos factores (por ejemplo, al chocar con una pared, o al aparecer el enemigo final en determinadas fases).
    Me funciona perfecto al hacerlo directamente sobre un GameObject en particular, normalmente al hacer un OnCollisionEnter, o incluso al finalizar una animación, mediante una llamada a una corutina, pero no tengo cojones de que me funcione con grupos de GameObjects. Por ejemplo, estoy haciendo que al entrar en un trigger, se destruyan automáticamente un grupo de enemigos, y quiero que todos explosionen al hacerlo.

    El proceso que estoy usando:

    Código:
        
    public GameObject Explosion; //(El prefrab con la explosión)
    private GameObject[] pajaros;
    private GameObject objeto; //(Este lo estoy usando como último recurso para hacer pruebas, originalmente no lo utilizaba).
    
        void Start () {
            pajaros = GameObject.FindGameObjectsWithTag("Pajaro");
        }
    
        void OnTriggerEnter2D(Collider2D other)
        {
            foreach (GameObject pajaro in pajaros)
            {
                objeto= Instantiate(Explosion, new Vector3(pajaro.transform.position.x, pajaro.transform.position.y, -1), pajaro.transform.rotation) as GameObject; //-1 simplemente para asegurarme de que la explosión aparezca por delante de los pájaros
                objeto.transform.localScale = new Vector3(2, 2, 0); //No lo necesito, pero estoy haciendo pruebas al no funcionarme. Originalmente lanzaba el Instantitate sin usar el GameObject "objeto"
                StartCoroutine(destruyePajaro(pajaro)); //La rutina que se carga los pájaros tras la explosión, esta se lanza sin problemas
            }
        }
    Pero no hay forma de que funcione. Los pájaros se destruyen, pero no se lanza la animación de la explosión en ninguno de ellos.
    ¿Alguna razón para que esto suceda?

    ¡Un saludo y gracias!
    Anarchy

  2. #2

    Fecha de ingreso
    Sep 2006
    Ubicación
    Malaga
    Mensajes
    7,561
    Mencionado
    47 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1,668
    Agradecer Thanks Received 
    1,922
    Thanked in
    Agradecido 1,289 veces en [ARG:2 UNDEFINED] posts
    Porque solo tienes una variable objeto (y no un array) y al ir asignando cada objeto del array pajaros se destruye el objeto apuntado anteriormente (explosion).

    Que conste que no tengo NPI de Unity pero supongo que pasaría eso si estuvieras usando java o algo así, con C++ tendrías memory leaks.

    -----Actualizado-----

    Y viendo los comentarios, supongo que al crear objetos dentro del bucle, al salir de este se destruyen por no estar asignados a nadie.
    No es lo mismo tener diez años de experiencia, que tener un año de experiencia diez veces.


    It is an undisputed truth that the Atari ST gets the best out of coders. No dedicated hardware, just the CPU and a frame buffer! Some call it Spartan, others name it Power Without The Price, and a select few say `challenge accepted'! --- by spkr from smfx

  3. #3

    Fecha de ingreso
    Sep 2001
    Mensajes
    23,077
    Mencionado
    406 Post(s)
    Tagged
    1 Tema(s)
    Agradecer Thanks Given 
    98
    Agradecer Thanks Received 
    1,199
    Thanked in
    Agradecido 503 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    9
    Yesss, creo que en eso tienes toda la razón, es lo que venía pensando en el coche.
    PERO, debo decir que la variable objeto la he añadido al final para hacer pruebas. Antes hacía el Instantiate directamente sobre cada objeto del array pajaros, sin utilizar la variable objeto, y el problema era el mismo. Añadí la variable objeto al final para hacer unas pruebas, y lo dejé así cuando hice la consulta (ahora la tengo quitada).
    Es decir, en lugar de
    Código:
    objeto= Instantiate(Explosion, new Vector3(pajaro.transform.position.x, pajaro.transform.position.y, -1), pajaro.transform.rotation) as GameObject;
    Estoy usando:
    Código:
    Instantiate(Explosion, new  Vector3(pajaro.transform.position.x, pajaro.transform.position.y, -1),  pajaro.transform.rotation);
    Esto me funciona sin problemas generando varios Instantiate consecutivos al tener varias colisiones, pero sólo sobre un único objeto, no si hago un foreach con un array de objetos.
    El nuevo objeto que se crea se destruye automáticamente al finalizar su animación.

    -----Actualizado-----

    Cita Iniciado por swapd0 Ver mensaje
    Que conste que no tengo NPI de Unity pero supongo que pasaría eso si estuvieras usando java o algo así, con C++ tendrías memory leaks.
    Estoy usando C#.

  4. #4

    Fecha de ingreso
    Sep 2006
    Ubicación
    Malaga
    Mensajes
    7,561
    Mencionado
    47 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1,668
    Agradecer Thanks Received 
    1,922
    Thanked in
    Agradecido 1,289 veces en [ARG:2 UNDEFINED] posts
    Prueba quitar el foreach y poner varios Instantiate(Explosion, new ...) seguidos, si eso funciona es porque al salir del bloque foreach se borran los objetos que se han creado dentro (y supongo) que no se han asignados a ninguna variable.

    Yo soy de C++, de C# he tocado lo justo para saber que no me gusta. XD

    -----Actualizado-----

    Lo digo porque si en C++ haces esto:
    Código:
    for (...)
    {
        Objeto x;
        ...
    }
    En cada iteracion del bucle se crea y se destruye el objeto x.
    No es lo mismo tener diez años de experiencia, que tener un año de experiencia diez veces.


    It is an undisputed truth that the Atari ST gets the best out of coders. No dedicated hardware, just the CPU and a frame buffer! Some call it Spartan, others name it Power Without The Price, and a select few say `challenge accepted'! --- by spkr from smfx

  5. #5

    Fecha de ingreso
    Jun 2004
    Ubicación
    Valencia
    Mensajes
    2,122
    Mencionado
    33 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    11
    Agradecer Thanks Received 
    102
    Thanked in
    Agradecido 57 veces en [ARG:2 UNDEFINED] posts
    Si estas llamando a destroy se destruye el gameobject que sea, y se para cualquier tipo de actividad que tenga asociada. Asi que en ese caso al destruirse no se mostraria nada mas.

    A bote pronto no veo mas error.... solo tener claro que al llamar a instantiate lo haces desde ese script usando el objeto donde esta puesto como padre

  6. #6

    Fecha de ingreso
    Sep 2001
    Mensajes
    23,077
    Mencionado
    406 Post(s)
    Tagged
    1 Tema(s)
    Agradecer Thanks Given 
    98
    Agradecer Thanks Received 
    1,199
    Thanked in
    Agradecido 503 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    9
    Sí, por eso el script que llama al Instantiate no depende de los pájaros. Es un objeto con un trigger el que lanza el script y los pájaros están en otro grupo de objetos diferente (el de enemigos), pero cada uno es independiente del otro.
    Probaré a desactivar el spriterenderer y el collider de cada uno en lugar de destruirlos (o de desactivarlos por completo), a ver qué pasa.

    También probaré a hacer los Instantiate separados, pero es que no tengo porqué conocer cuantos pájaros hay en escena, por eso uso el foreach. Estoy programándolo para poder crear bandadas de pájaros al azar más adelante y luego destruirlos automáticamente al realizar cierta acción.

  7. #7

    Fecha de ingreso
    Apr 2007
    Ubicación
    Anoeta
    Mensajes
    5,495
    Mencionado
    43 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    12
    Agradecer Thanks Received 
    100
    Thanked in
    Agradecido 70 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    27
    Por que no hacer que la wxplosion sea otro objeto, y lanzanrlo en el onDestroyEnter o lo que sea?

  8. #8

    Fecha de ingreso
    Sep 2001
    Mensajes
    23,077
    Mencionado
    406 Post(s)
    Tagged
    1 Tema(s)
    Agradecer Thanks Given 
    98
    Agradecer Thanks Received 
    1,199
    Thanked in
    Agradecido 503 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    9
    La explosión ya es otro objeto (un prefab con una animación). Lo que hago es un intantiate (que viene a ser "clonarlo") sobre el objeto pájaro, para que se muestre por delante, e inmediatamente después de finalizar, destruyo el objeto pájaro.
    Esto me funciona perfectamente sobre el personaje y sobre los jefes finales. Por eso me mosquea, porque en realidad es algo que me funciona sin problemas en muchos casos (al morir, al chocar a cierta velocidad, al aparecer el enemigo, al desaparecer, etc...), pero me falla al realizarlo sobre múltiples objetos usando el foreach.

  9. #9

    Fecha de ingreso
    Dec 2004
    Mensajes
    28,630
    Mencionado
    199 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    188
    Agradecer Thanks Received 
    2,626
    Thanked in
    Agradecido 1,639 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    11
    Por mi experiencia con div-fenix-bennu, parece que te está ocurriendo lo mismo que me pasaba a mi cuando mataba un proceso con s_kill; y es que se eliminaba del todo, se dejaba de ejecutar su código y con ello todas las acciones derivadas (explosiones, sonidos, etc).
    Si no encuentras otra solución podrías utilizar "la solución guarra"; crear una variable que sea accesible desde todas partes o al menos que sea accesible por todos los pájaros y demás implicados y poner una condición en el código de los pájaros en la que cuando la variable sea 1 el pajaro explote y desaparezca. entonces cuando quieras que mueran solo necesitas poner la variable a 1.
    Google stadia es un fracaso, google stadia funciona mal, google admite su fracaso con stadia la latencia es el problema intrinseco de stadia, el público abandona google stadia, stadia mal.

  10. #10

    Fecha de ingreso
    Jun 2004
    Ubicación
    Vivo en el pito foro...
    Mensajes
    20,686
    Mencionado
    70 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    230
    Agradecer Thanks Received 
    742
    Thanked in
    Agradecido 466 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    28
    ¿Estás modificando una lista dentro de un iterator? en Java es una operación ilegal.

  11. #11

    Fecha de ingreso
    Sep 2001
    Mensajes
    23,077
    Mencionado
    406 Post(s)
    Tagged
    1 Tema(s)
    Agradecer Thanks Given 
    98
    Agradecer Thanks Received 
    1,199
    Thanked in
    Agradecido 503 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    9
    Cita Iniciado por chipan Ver mensaje
    Por mi experiencia con div-fenix-bennu, parece que te está ocurriendo lo mismo que me pasaba a mi cuando mataba un proceso con s_kill; y es que se eliminaba del todo, se dejaba de ejecutar su código y con ello todas las acciones derivadas (explosiones, sonidos, etc).
    Si no encuentras otra solución podrías utilizar "la solución guarra"; crear una variable que sea accesible desde todas partes o al menos que sea accesible por todos los pájaros y demás implicados y poner una condición en el código de los pájaros en la que cuando la variable sea 1 el pajaro explote y desaparezca. entonces cuando quieras que mueran solo necesitas poner la variable a 1.
    Eso hago en otros casos. Unity te lo pone fácil, ya que en los Mechanism o animaciones permite poner condicionales para cambiar las rutinas de la animación. Luego desde el script le pasas el valor de la condicional al "Mechanism" y este actúa en consecuencia según lo hayas indicado. Pero es que me jode tener que hacer eso con algo que pensaba que solucionaría con 2 líneas de código.

  12. #12

    Fecha de ingreso
    Dec 2004
    Mensajes
    28,630
    Mencionado
    199 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    188
    Agradecer Thanks Received 
    2,626
    Thanked in
    Agradecido 1,639 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    11
    ¿Y no puede ser que al matar los pájaros las explosiones no hereden la posición indicada y ocurran fuera de pantalla?
    Google stadia es un fracaso, google stadia funciona mal, google admite su fracaso con stadia la latencia es el problema intrinseco de stadia, el público abandona google stadia, stadia mal.

  13. #13

    Fecha de ingreso
    Jul 2006
    Ubicación
    Madriz
    Mensajes
    1,297
    Mencionado
    28 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    176
    Agradecer Thanks Received 
    322
    Thanked in
    Agradecido 172 veces en [ARG:2 UNDEFINED] posts
    Por pegar así un tiro al aire...
    ¿Has probado a cambiar el foreach por un bucle for de toda la vida?

    Igualmente, después de cada Instantiate, prueba a usar un Debug.Log() con algo de info sobre el nuevo objeto... Si pruebas el juego en el editor de Unity, ves los nuevos objetos en la lista de GameObjects?

  14. #14

    Fecha de ingreso
    Apr 2006
    Ubicación
    Northlands (~Donosti)
    Mensajes
    4,867
    Mencionado
    29 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    27
    Agradecer Thanks Received 
    184
    Thanked in
    Agradecido 144 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por pakoito Ver mensaje
    ¿Estás modificando una lista dentro de un iterator? en Java es una operación ilegal.
    En c# tb.

    BTW, no uses foreach en unity. Tiene un bug que por culpa de mono y funciona mal.

    Salu2

    “I have seen things in the original DOTA that you people wouldn’t believe”. “I have seen Windrunner attack Techies off the bank of the upper river and die; I have seen heroes on fire off the shoulder of the Tree of Life. I watched spells glitter in the dark near the enemy base. All those moments are lost in battle, like… items off a courier in an AOE nuke.”

  15. #15

    Fecha de ingreso
    Nov 2007
    Mensajes
    218
    Mencionado
    2 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    2
    Agradecer Thanks Received 
    6
    Thanked in
    Agradecido 5 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por IronArthur Ver mensaje
    En c# tb.

    BTW, no uses foreach en unity. Tiene un bug que por culpa de mono y funciona mal.

    Salu2
    Hombre, tanto como un bug no es. Es una implementación y ya está. Seguramente para otras cosas que no sea juegos no pasará nada ni la gente se habrá percatado de que cree basura a tutiplen.

    Un saludo.

Página 1 de 2 12 ÚltimoÚltimo

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •