Férreo 1 Report post Posted November 10, 2020 Hola! Tengo un problema que no consigo solucionar desde hace días y os agradecería si alguien pudiese ayudarme. Se trata de lo siguiente: en mi proyecto hay un objeto que "cambia de estado" y está controlado por la clase "item". El caso es que el cambio de estado se hace atendiendo al valor de un enumerador con dos valores: module, element. Según el valor estado, se ejecuta una función para aplicar las características pertinentes si es de un tipo u otro. En total son dos funciones que deben trabajar sincronizadas. La cosa es que module utiliza un modelo 3D para representarse y element un sprite. Entonces lo que estas dos funciones hacen es quitar y agregar los componentes necesarios. Y ahí está el problema. Cuando el script tiene que hacer la conversión de module a element, en ToElement(), me da un error al intentar agregar el componente SpriteRenderer porque se supone que MeshRenderer está aún en el objeto y son incompatibles. Pero resulta que no, el objeto no tiene MeshRenderer cuando Unity da el error y sin embargo me dice que no es posible. Gracias de antemano 😀 Share this post Link to post Share on other sites
francoe1 536 Report post Posted November 10, 2020 Hola @Férreo, el problema que estás teniendo se debe a que Unity no elimina el componente de forma inmediata, sino que, lo marca para ser eliminado, esto a fin de evitar referencias nulas dentro de un mismo ciclo. ¿Cómo se puede solucionar? 1 - La forma simple, usando DestroyImmediate() 2 - La forma practica, usar dos objetos diferentes Uno con SpriteRenderer y el otro con MeshRenderer ¿Esto es una herramienta del editor? Share this post Link to post Share on other sites
Férreo 1 Report post Posted November 11, 2020 Hola @francoe1, no es una herramienta del editor si no una función del propio juego. Antes que nada quería agradecerte tu respuesta, sin ella nunca me hubiese enterado de las fases del Destroy 😂 y gracias a eso he podido dar con una solución: he aislado las líneas que aplican el sprite en una corutina que comienza con un WaitForEndOfFrame(). Así al ciclo le da tiempo de acabar y no hay problemas de incompatibilidad. También me había planteado tu forma práctica y usar dos objetos pero... ya era algo personal 🙄😆 De nuevo gracias! 1 Share this post Link to post Share on other sites