En este momento estás viendo En Unity, ¿qué sucede exactamente cuando implemento Update() y otros mensajes de MonoBehaviour?

 – Unity

En Unity, ¿qué sucede exactamente cuando implemento Update() y otros mensajes de MonoBehaviour? – Unity

En Unity, ¿qué sucede exactamente cuando implemento Update() y otros mensajes de MonoBehaviour?

– UnityAssets3Free

buenas , soy kein y para hoy os traigo
esta pregunta

Soy muy nuevo en C #, vengo de una sólida formación en Java, python y algunas cosas «web». Así que probablemente me falta algo de conocimiento aquí, que espero que alguien pueda completar por mí.

Al pasar por la API de secuencias de comandos de Unity, noté muchos métodos, enumerados en «Mensajes», que es mi primer punto de confusión. ¿Cuál es exactamente la diferencia entre un «Mensaje» y un «Método», para mí parecen ser lo mismo, pero la terminología me está volviendo loco.

Mi segundo punto de confusión es que cuando implemento un «Mensaje» como Actualizar() en mis clases derivadas, no necesito usar la palabra clave anular. ¿Qué me está molestando? ¿Por qué no me estaría escondiendo? En ese caso, ¿el bucle de actualización solo conocería MonoBehaviour y no mi clase derivada y llamaría a Update() en MonoBehaviour en lugar de mi clase? Esto me está poniendo en un bucle. Me estoy divirtiendo ¿Esto está pasando detrás de escena?

Me he llevado bastante bien con Unity y C#, este es solo un punto conflictivo para mí en el que siento que estoy perdiendo algo de conocimiento.

2 respuestas 2

Una cosa para recordar es que el equipo de Unity no necesariamente diseñó su API de secuencias de comandos (incluida la clase MonoBehaviour) para promover buenos principios de desarrollo de software; lo diseñaron para la accesibilidad y la facilidad de uso (especialmente para los no programadores). Esto está cambiando lentamente, pero todavía hay mucha inercia en torno a «lo que es fácil» en lugar de «lo que está bien».

Dicho esto, respondamos a tu pregunta. Acerca de «mensajes», consulte lo que dicen los documentos sobre Componente.EnviarMensaje:

Llama al método llamado methodName en cada MonoBehaviour en este objeto de juego.

Cuando miras la documentación para, digamos, colisionador y vea los métodos enumerados en la sección Mensajes, esto es una indicación de que si implementa estos métodos, se llamarán (a través de SendMessage) en respuesta a algún evento o acción (OnCollisionEnter, por ejemplo, «se llama cuando este colisionador/rigidbody comenzó a jugar otro rigidbody/collider»). Podría haberlos implementado como delegados de eventos, pero el equipo de Unity eligió implementar su propio sistema de mensajería usando cadenas, nuevamente, en nombre de la «facilidad de uso».

Con el mismo efecto, si recorre la cadena de herencia de una clase MonoBehaviour, notará que en ninguna parte de la cadena encontrará métodos declarados llamados Update o Start u otros eventos del ciclo de vida de sus scripts. Unity trata estos métodos como magia y los llama (nuevamente a través de SendMessage, al parecer) si existen en la clase de implementación. Por eso no importa si tu Update el método es público o protegido o incluso privado… todavía se llamará.

La forma en que lo hacen detrás de escena es mediante el uso de la reflexión para obtener el método que coincida, razón por la cual

 void update()
 void Update(bool inVariable)

no será llamado y

void Update() 

Vamos

Buscan un método que coincida tanto con el nombre como con la firma del parámetro (en este caso, no requiere argumento). Los dos primeros tienen un problema con las mayúsculas o la entrada de parámetros.

Cuando usa la reflexión, no necesita tener una función pública para llamarla, pero no está de más si la tiene.

Usan el mismo tipo para la mensajería, por lo que puede llamar a cualquier función, aunque están limitadas a recibir solo una variable con el mensaje.

nota: si aun no se resuelve tu pregunta por favor dejar un comentario y pronto lo podremos de nuevo , muchas gracias

por hoy,espero que te halla servido

Deja una respuesta