Contexto


A lo largo de los temas anteriores te has familiarizado con el lenguaje C#, que es un lenguaje con flexibilidad en su control de versiones y es uno de los lenguajes más potentes en la programación.

En el tema 6 aprendiste a crear un simple programa, utilzando C# en Unity. En este tema aprenderás a modificar y controlar un GameObject, utilizando sus componentes y un concepto nuevo llamado “Eventos”.

Explicación


7.1 Funciones de eventos

Los scripts en Unity no funcionan de la misma manera que un programa tradicional. En un programa tradicional, el código corre un ciclo hasta que termine su tarea y luego se detiene. En Unity, las funciones son activadas en respuesta a eventos que ocurren dentro del tiempo de juego.

Unity utiliza un esquema de nombramiento para identificar qué funciones llamar para un evento en particular. Ya vimos que existe una función llamada Start, que únicamente será llamada antes de la primera actualización de cuadro de objeto, es decir, justo antes de cargar un GameObject.

También existe una función de evento llamada Update, que será llamada cada vez que haya una actualización de cuadro, es decir, será llamada a intervalos regulares durante el juego, siempre y cuando esté cargado su GameObject.

Estas no son las únicas funciones de evento, existen muchas más que están disponibles en Unity; la lista completa puede ser encontrada en la página de referencia de Unity, para la clase MonoBehaviour, junto con los detalles de su uso. A continuación, iremos más a fondo en algunas de las funciones de evento más comunes.

 

Eventos de inicialización

Awake y Start son dos funciones que son llamadas automáticamente, cuando el script se carga en escena. Awake es el primero en ser llamado y funcionará, aunque el componente de script esté desactivado. Esta función regularmente es utilizada para inicializar un objeto o referenciar otros scripts, es decir, para asignarle propiedades o variables al objeto que utilizarás más adelante o que son parte de otro objeto.

La función Start es llamada antes de la actualización del primer cuadro o antes de la primera actualización de física de un objeto. Ésta solo será llamada si el componente Script está activado, por lo que puedes utilizarlo para cualquier cosa que quieras que suceda, una vez que el script sea activado; debes tomar en cuenta que estas funciones solo serán llamadas una vez en la vida del objeto, por lo que no se volverán a llamar si desactivas y vuelves a activar el script.

Toma en cuenta que todos los Awakes serán finalizados antes de llamar el primer Start. Esto quiere decir que la función Start puede hacer uso de cualquier otra inicialización que se haya introducido durante la fase Awake.

Un ejemplo de su uso podría ser al cargar un enemigo en un juego, podemos utilizar Awake para que éste tenga municiones, pero que solo pueda disparar hasta un tiempo determinado en el que el Script sea activado.

 

Eventos actualizados regularmente

Un juego es similar a una animación, con la diferencia de que los cuadros de animación se generan sobre la marcha, conforme jugamos, y está basada en nuestro aporte al presionar las teclas o mover las palancas de nuestro control.

La forma en la que un juego en Unity utiliza este aporte, es haciendo cambios en la posición, rotación, estados y comportamiento de los objetos cada vez que presionas las teclas y botones que están asignadas a ciertas acciones con tu programación. Estos cambios se generan dentro de la función Update, por lo que es una de las funciones más comunes en la programación de Unity.

Haz clic en cada elemento.

Update es una función que es llamada justo antes de que cada cuadro del juego sea renderizado y, por ello, antes de que se calculen las animaciones. Por eso, se utiliza para generar el movimiento de objetos que no estén basados en la física y para recibir los aportes del jugador al presionar los controles.

FixedUpdate es una función muy similar a Update, pero es llamada cada vez que se hace una actualización del motor de física de Unity, en lugar del renderizado de la animación. La mayor diferencia entre ellos es que Updatese utiliza para objetos que no utilizan la física y FixedUpdates solo se utiliza para objetos que la utilizan.

Otra diferencia entre ellos es que las actualizaciones de física y actualizaciones de cuadro no ocurren en la misma frecuencia, FixedUpdate tiene un tiempo de actualización más regular; mientras que la actualización de cuadro del motor de render ocurre cada vez que el siguiente cuadro está listo para ser mostrado, lo cual puede crear intervalos irregulares, por lo que se obtiene un resultado de tiempo más preciso si se utilizaFixedUpdate, en lugar de Update.

Finalmente, tenemos LateUpdate, función que se llama después de que Update y FixedUpdate han sido llamadas para todos los objetos en la escena y después de que todas las animaciones hayan sido calculadas. Un ejemplo de su uso existe al momento de mover una cámara. Si quieres que la cámara siga a un personaje o un objeto mientras éste se mueve, debes calcular el movimiento de la cámara una vez que el movimiento del objeto que estás siguiendo, ya haya sido calculado.

 

Eventos de física

Hay funciones que permitirán actuar en respuesta a las colisiones que reporta el motor de física, es decir, cuando dos objetos que tengan aplicado un componente de física, generen un reporte, que puedes utilizar para crear interacción entre diferentes objetos.

Haz clic en cada elemento.

OnCollisionEnter

La función OnCollisionEnter se llamará una vez que se haya hecho un contacto.

OnCollisionStay

OnCollisionStay se llamará cuando un contacto se mantenga por una cantidad delimitada de tiempo.

OnCollsionExit

OnCollsionExit será llamado una vez que un contacto se haya roto.

OnTriggerEnter, OnTriggerStay y OnTriggerExit

OnTriggerEnter, OnTriggerStay y OnTriggerExit son similares, pero serán llamadas cuando el componente de Collider, en el objeto, esté configurado como un Trigger, esto significa que no afectará directamente la física de la escena, sino que detectará cuando otro objeto entre sobre él, pero no tendrá ninguna interacción física.

Estas funciones pueden ser llamadas varias veces, en sucesiones, si un contacto o más son detectados durante la actualización de física; entonces un parámetro es pasado a la función, dando detalles de la colisión (posición, identidad del objeto que llega, etcétera).

 

 

 

7.2 Controlando GameObjects utilizando componentes

Para hacer cambios a las propiedades de un componente dentro de Unity, se utiliza la interfaz del inspector, por ejemplo, cambiar la posición, rotación o escala de un objeto, utilizando el componente Transform. Sin embargo, también es posible hacer estos cambios utilizando scripts.

La mayor ventaja de utilizar un script para modificar las propiedades de los componentes de un objeto es que, estos cambios, pueden aparecer gradualmente o pueden venir como respuesta del input del jugador.

 

Accediendo componentes del mismo GameObject

Para acceder los componentes del GameObject al que estás adjuntado el script, utiliza la función GetComponent, seguido del nombre del componente, entre los símbolos de menor que (<) y mayor que (>). Por lo general, se asigna al valor del componente a una variable, para que sea más fácil de usar en el resto del código.

En el siguiente ejemplo, llama al componente Rigidbody y guárdalo en una variable llamada “rb” y utiliza la función AddForce para agregar una fuerza de movimiento al objeto que va hacia arriba; por lo que, el objeto al que le aplicarás este código, flotará por sí solo hacia el aire.

void Start () {
Rigidbody rb = GetComponent<Rigidbody>();
rb.AddForce(Vector3.up * 10f);
}

También es posible agregar más de un script a tu objeto y referenciar un script en otro, utilizando la función GetComponent, en el cual pondrás el nombre de tu script componente, entre los símbolos de menor que (<) y mayor que (>).

 

Movimiento básico de objetos, utilizando Update

Ahora, se te muestra un pequeño ejemplo de cómo se puede utilizar lo visto en el tema, para crear un par de scripts muy simples, que permitan darle movimiento a un objeto de dos maneras diferentes.

Cierre


En este tema has aprendido más de la programación C#, por lo que ya sabes que Unity tiene una gran variedad de componentes para generar un videojuego de gran calidad. También conociste nuevos conceptos, como los diferentes tipos de funciones de eventos y su utilización para crear scripts que se ejecuten en el momento correcto y bajo las condiciones exactas.

Es importante que te familiarices con el procedimiento de programación, para obtener el resultado deseado en tus scripts. Todo esto llevará a que tu experiencia de uso de Unity sea más sencilla y agradable.

Checkpoint


Asegúrate de poder:

  • Conocer la diferencia entre los tipos de funciones de eventos y su uso apropiado.
  • Entender la manera en que se accede a los componentes de un GameObject desde un script y sus aplicaciones.

Referencias