Un script en Unity no es como cualquier otra idea tradicional de un programa dónde el código corre continuamente en un ciclo hasta que complete su tarea. En vez, Unity pasa el control a un script de forma intermitente al llamar ciertas funciones que están declaradas dentro de él. Una vez una función haya finalizado de ejecutarse, el control es devuelto a Unity. Estas funciones son conocidas como event function (funciones de evento) ya que son activadas por Unity en respuesta a eventos que ocurren durante el tiempo de juego. Unity utiliza un esquema de nombramiento para identificar qué funciones llamar para un evento en particular. Por ejemplo, usted ya habrá visto la función Update (llamada antes que una actualización de cuadro ocurra) y la función Start (llamada justo antes de la primera actualización de cuadro del objeto). Muchas más funciones de evento están disponibles en Unity; la lista completa puede ser encontrada en la página de referencia script para la clase MonoBehaviour junto con los detalles de su uso. Las siguientes son algunas de las más comunes e importantes.
Un juego es como una animación dónde los cuadros de animación son generado en la marcha. Un concepto clave en la programación de juegos es el de hacer cambios a la posición, estados, y comportamientos de objetos en el juego justo antes de cada cuadro es renderizado. La función Update es el lugar principal para este tipo de código en Unity. Update es llamado antes de que el cuadro sea renderizado y también antes de que las animaciones sean calculadas.
void Update() {
float distance = speed * Time.deltaTime * Input.GetAxis("Horizontal");
transform.Translate(Vector3.right * distance);
}
El motor de física también actualiza en pasos de tiempo discretos de una manera similar al renderizado de cuadros. Una función separada de evento llamada FixedUpdate se llama justo antes de cada actualización de física. Debido a que las actualizaciones de física y actualizaciones de cuadro no ocurren en la misma frequencia, usted va a obtener un resultado más preciso de código de física si usted lo coloca en la función de FixedUpdate en vez de Update.
void FixedUpdate() {
Vector3 force = transform.forward * driveForce * Input.GetAxis("Vertical");
rigidbody.AddForce(force);
}
También es a veces útil ser capaz de hacer cambios adicionales en un punto después de que funciones 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 es dónde una cámara debería permanecer adiestrado en un objeto destino; el ajuste a la orientación de la cámara debería ser hecho después de que el objeto destino haya sido movido. Otro ejemplo es dónde el código script debería anular el efecto de una animación (digamos, para hacer la cabeza del objeto mirar hacia un objeto destino en la escena). La función LateUpdate puede ser utilizada para este tipo de situaciones.
void LateUpdate() {
Camera.main.transform.LookAt(target.transform);
}
A veces es útil ser capaz de llamar código de inicialización con anterioridad de cualquier actualización que ocurra en el tiempo de juego. La función Start es llamada antes de la actualización del primer cuadro o de física de un objeto. La función Awake es llamada para cada objeto en la escena en el tiempo cuando la escena carga. Tenga en cuenta que aunque las funciones varias del objeto Start y Awake son llamadas en un orden arbitrario, todos los Awakes habrán finalizado antes de que el primer Start es llamado. Esto significa que el código en la función Start puede hacer uso de otras inicializaciones previamente llevadas en la fase Awake.
Unity tiene un sistema para renderizar los controles GUI sobre la acción principal en la escena y responder a clicks hechos por estos controles. Este código es manejado algo diferente de la actualización por cuadro normal por lo que debería ser colocado en la función OnGUI, que será llamada periodicamente.
void OnGUI() {
GUI.Label(labelRect, "Game Over");
}
También puede detectar eventos del mouse que ocurren en un GameObject como aparece en la escena. Esto se puede usar para apuntar armas o mostrar información sobre el personaje que se encuentra actualmente bajo el puntero del mouse. Un conjunto de funciones de eventos OnMouseXXX (por ejemplo, OnMouseOver, OnMouseDown) está disponible para permitir que un script reaccione ante las acciones del usuario con el mouse. Por ejemplo, si se presiona el botón del mouse mientras el puntero está sobre un objeto en particular, se llamará una función OnMouseDown en el script de ese objeto si existe.
El motor de física va a reportar colisiones contra un objeto al llamar funciones de evento en el script de ese objeto. Las funciones OnCollisionEnter, OnCollisionStay y OnCollisionExit serán llamadas a medida que haya un contacto hecho, mantenido o roto. Las funciones correspondientes OnTriggerEnter, OnTriggerStay y OnTriggerExit serán llamadas cuando el collider del objeto esté configurado como un Trigger (ie, un collider que simplemente detecta cuando algo lo entra en vez que reaccionar físicamente). Estas funciones pueden ser llamadas varias veces en sucesiones si un contacto o más es detectado durante la actualización de física y entonces un parámetro es pasado a la función dando detalles de la colisión (posición, identidad del objeto que llega, etc).
void OnCollisionEnter(otherObj: Collision) {
if (otherObj.tag == "Arrow") {
ApplyDamage(10);
}
}