Helpers Pt. 1: Referencias Globales

Algo que acostumbro a hacer casi que de entrada en todo proyecto es crear una carpeta de Helpers. Hasta ahora no he encontrado caso donde no tenga la necesidad de usar un Helper. El concepto de helper es una clase que va a servir de ayuda repetidamente para varios escenarios. Uno de los helpers que mas uso en Unity es el de referencias globales. Consiste en una clase estática que tiene propiedades cuyo fin es proveer acceso a objetos de la escena de manera cómoda.

Un buen escenario de ejemplo es un reproductor de audio centralizado. En Unity se usa AudioSource para reproducir un sonido. Si pensamos en aplicaciones como UI, necesitamos dar ese feedback al usuario de que apretó algo. El componente AudioSource no es muy amigable cuando se trata de reproducir diferentes sonidos, la instancia del componente tiene un sample cargado y es el que va a reproducir cuando se le llame (por supuesto este sample puede ser cambiado por código). Para sonidos de carácter informativo, como levantar un powerup se puede usar un único AudioSource cargado en un elemento de la escena.

Entonces digamos que tenemos un objeto para reproducir audios a demanda, es decir, un script que recibe el nombre o id de un sonido y lo reproduce. Bien, ahora ¿cómo referenciamos al objeto? No vamos a estar haciendo referencias manuales para todos los objetos que van a consumir esto ¿verdad? Siempre podemos acceder a un objeto de la escena usando GameObject.Find(«AudioPlayer»);, pero realmente queremos tener esa línea de código por todos lados? ¿Y qué pasa si se me ocurre cambiarle el nombre al objeto en la jerarquía? ¡Voy a tener que actualizar todo el código!

AudioPlayer
Audio player un único AudioSource y un repositorio de samples con sus respectivos Ids en un script aparte
AudioResources
Así es como audio resources se comporta, recibe el id de un sample, lo encuentra en el repositorio (array de AudioClips asignados en el editor), se lo asignga al AudioSource y lo reproduce

Acá es donde entra el uso de referencias globales. En C# podemos definir clases estáticas y métodos estáticos. Esto nos permite acceder a una función sin pasar por una instancia concreta de clase. Esto es importante porque nos ahorra estar referenciando objetos y buscar la instancia concreta donde ese dato está alojado.

Global References
La clase estatica Global References cumple la funcion de retornar una referencia del objeto requerido, todo accesible de una manera estatica, sin instancias.

De esta manera logramos centralizar el llamado concreto a la búsqueda del objeto en la jerarquía y existe solo un único lugar en el código donde está especificado su nombre.

Consumo de GlobalReferences
Así se consumen los métodos estáticos, no hay instancia, simplemente es una función que vive a nivel de definición de clase.

Es importante señalar que las referencias estáticas tienen que ser propiedades, no campos. Las propiedades van a ejecutarse cuando sean llamadas, los campos son inicializados una vez y al cambiar de escena la referencia se va a perder y el motor va a empezar a tirar null reference cuando se vuelva a intentar consumir la referencia global.

 

Un comentario sobre "Helpers Pt. 1: Referencias Globales"

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s