Jump to content
Férreo

Problema entre Renders

Recommended Posts

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 😀

2020-11-10 (2).png

Share this post


Link to post
Share on other sites

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

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!

  • Thanks 1

Share this post


Link to post
Share on other sites

×
×
  • Create New...