Resultados 1 al 5 de 5

No funciona script para diferentes instancias de un mismo objeto Unity 2d

  1. #1
    Fecha de ingreso
    Sep 2023
    Mensajes
    8

    No funciona script para diferentes instancias de un mismo objeto Unity 2d

    Pues empiezo a "molestaros" con un tema que no me deja avanzar en el videojuego que estoy creando. En resumen, lo que me pasa es que he creado un script para controlar la vida y las animaciones del enemigo. La cuestión es que el script funciona correctamente cuando sólo hay una instancia del prefab que he creado, pero si arrastro otro más a la escena, la cosa se pone fea.
    Os explico con más detalle:

    El mensaje que me sale en consola es el siguiente: "MissingReferenceException: The object of type 'Animator' has been destroyed but you are still trying to access it.Your script should either check if it is null or you should not destroy the object."

    Esto sucede cuando hay 2 instancias o más del mismo prefab. A mi entender (que es bastante limitado puesto que soy un novato con pedigree ), una vez que destruyo el primer prefab, es como si destruyera todos los componentes en sus copias, con lo cual no se puede acceder, en este caso, al componente Animator del resto.

    Necesito que me echéis un cabecillo para solucionar esto antes de que me vuelva loco. He intentado mil cosas pero no doy con la tecla.
    Si necesitáis (que imagino que sí) que os adjunte scripts u otra cosa, decídmelo y cumpliré vuestros deseos.

    Muchas gracias de antemano!!

  2. #2
    Fecha de ingreso
    Apr 2002
    Mensajes
    26,506

    Falta el componente Animator que ha sido destruido

    Según tu descripción, el error se produce porque estás tratando de acceder a un componente Animator que ha sido destruido. Esto puede suceder si estás utilizando el método Destroy() para destruir el prefab original. Cuando destruyes un prefab, todos sus componentes también son destruidos.

    Para solucionar este problema, puedes hacer una de las siguientes opciones:

    No destruir el prefab original. Esto evitará que los componentes del prefab sean destruidos.

    Crear una nueva instancia del prefab original cada vez que necesites un nuevo enemigo. Esto asegurará que cada enemigo tenga su propio componente Animator.

    Almacenar una referencia al componente Animator en el script del enemigo. Esto te permitirá acceder al componente incluso después de que el prefab haya sido destruido.

    Si optas por no destruir el prefab original, puedes usar el método GetComponent() para acceder al componente Animator cada vez que lo necesites. Por ejemplo:

    Código:
    public class EnemyScript : MonoBehaviour
    {
        private Animator animator;
    
        void Awake()
        {
            animator = GetComponent<Animator>();
        }
    
        void Update()
        {
            animator.SetFloat("Health", health);
        }
    }
    Si optas por crear una nueva instancia del prefab original cada vez que necesites un nuevo enemigo, puedes usar el método Instantiate() para crear una nueva instancia. Por ejemplo:

    Código:
    public class EnemySpawner : MonoBehaviour
    {
        void Start()
        {
            // Create a new instance of the enemy prefab
            Enemy enemy = Instantiate(enemyPrefab);
    
            // Add the enemy to the scene
            GameObject.AddComponent(enemy);
        }
    }
    A ver si esto te ayuda a solucionar tu problema.

    Un saludo.
    |Agradecer cuando alguien te ayuda es de ser agradecido|

  3. #3
    Fecha de ingreso
    Sep 2023
    Mensajes
    8
    Cita Iniciado por 3dpoder Ver mensaje
    Según tu descripción, el error se produce porque estás tratando de acceder a un componente Animator que ha sido destruido. Esto puede suceder si estás utilizando el método Destroy() para destruir el prefab original. Cuando destruyes un prefab, todos sus componentes también son destruidos.

    Para solucionar este problema, puedes hacer una de las siguientes opciones:

    No destruir el prefab original. Esto evitará que los componentes del prefab sean destruidos.

    Crear una nueva instancia del prefab original cada vez que necesites un nuevo enemigo. Esto asegurará que cada enemigo tenga su propio componente Animator.

    Almacenar una referencia al componente Animator en el script del enemigo. Esto te permitirá acceder al componente incluso después de que el prefab haya sido destruido.

    Si optas por no destruir el prefab original, puedes usar el método GetComponent() para acceder al componente Animator cada vez que lo necesites. Por ejemplo:

    Código:
    public class EnemyScript : MonoBehaviour
    {
        private Animator animator;
    
        void Awake()
        {
            animator = GetComponent<Animator>();
        }
    
        void Update()
        {
            animator.SetFloat("Health", health);
        }
    }
    Si optas por crear una nueva instancia del prefab original cada vez que necesites un nuevo enemigo, puedes usar el método Instantiate() para crear una nueva instancia. Por ejemplo:

    Código:
    public class EnemySpawner : MonoBehaviour
    {
        void Start()
        {
            // Create a new instance of the enemy prefab
            Enemy enemy = Instantiate(enemyPrefab);
    
            // Add the enemy to the scene
            GameObject.AddComponent(enemy);
        }
    }
    A ver si esto te ayuda a solucionar tu problema.

    Un saludo.
    Buenas de nuevo!
    Pues muchas gracias por las recomendaciones, amiguete. Mañana me pongo a ello y a ver si puedo desatascarme de una vez.
    Ya os informaré de mis próximas desventuras con Unity.

  4. #4
    Fecha de ingreso
    Sep 2023
    Mensajes
    8
    Por fin pude solucionarlo!!
    El problema era que declaraba una variable estática para crear instancias del objeto enemigo. Al ser estática, no dejaba tratar cada instancia por separado, sino que las trataba atodas como una sola y única. Por eso cuando destruía una instancia, también destruía los componentes de las otras.
    Una vez eliminada la palabra static, fuera problemas!!

    Me han salido unas cuantas canas para resolver el entuerto pero estoy feliz.

    Gracias por la ayuda!

  5. #5
    Fecha de ingreso
    Apr 2002
    Mensajes
    26,506
    Cita Iniciado por Stray Ver mensaje
    Me han salido unas cuantas canas para resolver el entuerto pero estoy feliz.


    Me alegro de que lo hayas podido solucionar, y gracias por compartirlo, un saludo.
    |Agradecer cuando alguien te ayuda es de ser agradecido|

Temas similares

  1. Blender Animar diferentes mallas pertenecientes al mismo objeto en Blender
    Por Hilonegro50 en el foro Animación y Rigging
    Respuestas: 7
    : 17-01-2020, 14:06
  2. Diferentes UV para mismo objeto
    Por ivanct79 en el foro Materiales y Texturizado
    Respuestas: 13
    : 24-11-2012, 16:30
  3. Blender Blender-vincular mismo objeto a diferentes huesos
    Por ivanct79 en el foro Animación y Rigging
    Respuestas: 2
    : 23-11-2012, 07:14
  4. Ciencia y curiosidades Varias instancias de un mismo programa en Mac os x
    Por Caronte en el foro Ciencia y curiosidades
    Respuestas: 3
    : 07-10-2009, 09:25
  5. Diferentes texturas en un mismo objeto
    Por Gepetto en el foro Materiales y Texturizado
    Respuestas: 0
    : 29-09-2005, 17:21

Etiquetas para este tema