Dynamic Label

Un script muy útil y corto es el que llamo DynamicLabel. La idea es que se use para UI, aunque perfectamente se puede usar para diálogos. Se trata de un script sencillo que usa la función string.Format(string format, params object[] args). Esta función nos permite construir una string usando datos en tiempo real.

La forma clásica de hacer esto es sumando strings, por ejemplo var result = “Armor : ” + player.Armor. Pero eso deja un montón de strings hardcodeadas en el código y complica la localización, por supuesto la string “Armor : ” puede ser un recurso localizado, pero hay un detalle. Sumar strings crea un pequeño overhead, string es un value type que se comporta como reference type para las operaciones de adición. En otras palabras, cuando uno escribe “Armor : ” + player armor, en realidad no está añadiendo caracteres a la string original, sino que está creando una nueva string. Recordemos lo que es una string a nivel de memoria, un array de caracteres, tiene definido el tamaño desde su inicialización y la única manera de modificarlo es generando una nueva instancia.

Por ende, démosle la bienvenida a la función string.Format(). Esta función suplanta patrones específicos por parámetros dados. El patrón especifico se escribe con el índice de parámetro encasillado entre corchetes, o sea algo así {0}, {1}, {2}, etc. Entonces si llamamos a la función de esta manera:

2017-08-10 17_13_52-marauders_dev - Microsoft Visual Studio

Nos va a devolver “Armor : 100”
Noten que el parámetro args fue enviado como un objeto y no como un array de objetos como define la firma del método. Esto es por la keyword params.

La keyword params solo puede ser usada en el último parámetro de un método y solo si es un array, lo que permite es pasarle varios argumentos separados por coma, es como si en la firma del método tuviéramos algo que diga Method(object o1, object o2, object o3, object o4, etc), también acepta que se le pasen arrays. También hay que notar que la función recibe objetos y automáticamente adentro les hace un ToString(), muy útil si tienen clases propias que puede ser resumido por defecto en una string.

¿Cómo entra esto en Unity?

Primero asumamos que DynamicLabel solo va a afectar el componente Text de UnityEngine.UI así que podemos especificar que este script requiere un componente de tipo Text. Sabemos que va a operar sobre un componente de tipo Text alojado en el mismo objeto, así que al momento de inicializarse ya puede obtener la referencia. Pero ¿qué pasa si nuestro objeto de texto es parte de un componente UI que no está despierto desde el inicio de la escena? Entonces también podemos poner unas líneas para asegurarnos que esto no sea un problema al llamar el método que actualiza el texto. Por último, este script debería exponer de manera publica la string que va a proveer el formato, esta string va a ser asignada en el editor.

Dynamic Label
La función dynamic label va a existir con un formato de string y periódicamente va a estar recibiendo información para ubicar en ese formato.

En el editor vamos a ver algo así:

DynamicLabel editor
En el editor vamos a tener un campo de texto para setear el formato de la etiqueta.

De afuera esto se consume como uno esperaría, llamado directo al método SetLabel con todos los parámetros necesarios.

DynamicLbl llamado
Varios llamados a la función SetLabel, el parámetro dentro del ToString es para especificar que omita o no los dígitos después del entero.

Finalmente, en la UI del juego vamos a tener el resultado adecuado

2017-08-10 17_19_28-Unity 5.6.0f3 Personal (64bit) - Arena.unity - marauders_dev - PC, Mac & Linux S

Responder

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. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s