Introducción
En este artículo vamos a ver algunas alternativas para hacer indicadores lumínicos en Unity para que una máquina pueda reflejar su estado de encendido o el estado de alguna de sus variables booleanas.
Supongamos que tenemos un Script que modela el comportamiento de una máquina cualquiera. Esa máquina tiene estados que nos interesa representar en pantalla, por ejemplo si la máquina está encendida o apagada mediante un indicador LED.
Vamos a resolver esta situación de la siguiente manera, crearemos un Script que se encargue de controlar el estado del indicador luminoso y este Script tendrá un conjunto de funciones que se podrán llamar para cambiar el estado del indiciador. De esta forma logramos que la máquina no se encargue directamente de alterar el estado del indicador luminoso sino que le dice al Script de control en qué estado debe mostrarlo y luego el Script del indicador se encargará de resolver esa tarea dependiendo el tipo de indicador que implementemos.
Propongo esta forma de resolver el problema ya que existen muchas alternativas para hacer un indicador luminoso en Unity, entonces sería conveniente delegar ese comportamiento a otro Script en donde se ataque el problema en detalle, mientras que el aparato que debe usar el indicador luminoso simplemente ejecuta las funciones apropiadas. Esto nos facilita hacer mejoras al sistema o dotarlo de mayores prestaciones.
Alternativas para hacer un indicador luminoso en Unity
A continuación voy a mencionar algunas formas en las que se puede hacer un indicador luminoso en Unity.
Indicador con componente Light
Una alternativa es utilizar un GameObject que tenga asignado un componente Light, con esto obtendríamos una luz que interactúa con los modelos 3D de la escena. Para controlar la luz podríamos habilitar y deshabilitar el componente Light, o habilitar y deshabilitar el GameObject directamente. Sino también podemos modificar el color de la emisión de luz, por ejemplo verde para encendido y rojo para apagado.
Otra posibilidad es tener un GameObject con un componente Light para el estado de encendido y otro GameObject con componente Light para el estado apagado. Al momento de setear el estadodel indicador, apagamos un GameObject y encendemos el otro según corresponda.
Indicador con objeto 3D con material emisivo
Si contamos con un modelo 3D de una lámpara, podemos asignarle un material con emisividad, esto influye más que nada en la apareciencia del objeto, ya que estos materiales no suelen emitir luz que interactúa con los demás objetos. Sin embargo se puede combinar esta técnica con la anterior mensionada y así conseguir un resultado más interesante.
Indicador luminoso con Sprite
Es posible establecer un conjunto de Sprites que cumplan la función de indicador lumínico, un Sprite es una imagen, usualmente de fondo transparente, que se utiliza para renderizar objetos en 2D a través del componente Sprite Renderer .Como se ha mencionado anteriormente, podríamos tener un Sprite para la luz encendida y otro para la luz apagada, o podríamos cambiar el color de la luz según el estado.
Indicador con imagen en Canvas de la interfaz de usuario
Además se pueden incluir estos indicadores en la interfaz gráfica, en este caso se necesita configurar un Canvas y luego el indicador será un objeto que cuente con componente Image y que se encuentre dentro de la jerarquía del Canvas. Este caso es similar al de los Sprites, necesitaremos una imagen para la luz encendida y otra para la luz apagada, o utilizar el mismo Sprite pero modificar su color según el estado.
Ejemplo de indicador luminoso hecho en Unity C# (con descarga)
A continuación vamos a ver un ejemplo de implementación de un indicadir luminoso hecho en Unity, además haciendo clic en el siguiente enlace puedes descargar el paquete de Unity donde están los scripts y la escena ya montada, para que puedas importarlo y probarlo.
Descargar paquete de Unity – Indicador Luminoso C#
La jerarquía de la escena se ilustra en la figura 2, tenemos los objetos «Machine» e «IndicatorLight» que tienen asignado los Scripts «Machine» e «IndicatorLight» respectivamente, estos Scripts están basados en el esquema de la figura 1. El objeto GreenLight tiene un componente Light y es el que va a controlar el Script Indicator Light. Además tenemos dos botones en el Canvas que nos permitirán encender y apagar la máquina.
En las figuras 3 y 4 vemos el inspector de los GameObjects Machine e IndicatorLight. Noten como en el inspector del Script Machine hay una referencia asignada para un objeto tipo IndicatorLight, esto quiere decir que Machine podrá acceder a las funciones públicas que definamos dentro de Indicator Light. También observen cómo en el inspector del Script IndicatorLight hay una referencia para un componente Light, esto quiere decir que IndicatorLight podrá efectuar modificaciones sobre el componente Light, por ejemplo encenderlo y apagarlo, cambiar el color, intensidad, etc.
En la figura 5 vemos el inspector de uno de los botones del Canvas, noten como en el evento OnClick se ejecuta una función dentro de Machine. Para saber más sobre cómo usar botones en Unity, consultar este vídeo o este artículo.
Script del indicador lumínico
En la figura 6 vemos una captura del Script que controla el indicador, noten que solamente tiene una referencia para un componente Light llamada «myLight» (asignada en el inspector en la figura 4) y luego cuenta con una función pública que permite setear el estado del indicador, dicha función recibe como parámetro una variable booleana que dicta el estado a setear y dentro de la función lo que se hace es asignar el parámetro de la función al estado de activación del componente Light, quiere decir que si ejecutamos el método «SetIndicatorState(true)» la lámpara se encenderá y con SetIndicatorState(false) la lámpara se apagará. Aquí un vídeo completo sobre métodos en programación.
Script de la máquina que ocupa el indicador luminoso
En la figura 7 vemos el Script de la máquina, se tienen tres variables definidas en las líneas 5, 6 y 7, «machineInitialState» indica el estado inicial de la máquina cuando le demos a Play y se puede setear desde el inspector, como se observa en la figura 3. La variable IndicatorLight es una referencia para un objeto basado en el Script anterior, noten que este Script está asignado al GameObject con el mismo nombre «IndicatorLight», de modo que en el inspector de Machine, arrastramos el objeto que contiene el Script IndicatorLight para asignar la referencia. Referencias en programación es un tema muy importante, entenderlo nos permitirá dar con cualquier objeto que necesitemos modificar o utilizar en nuestros Scripts, para ello hice esta serie de vídeos.
El Script Machine además cuenta con una variable booleana pivada que indica el estado de activación de la máquina, la variable «machineActive», noten que en el método Start hacemos que esta variable sea igual al estado inicial y luego ejecutamos la función «SetMachineState» pasandocomo parámetro el propio estado de activación de la máquina.
La función «SetMachineState» está definida como pública, por lo que se puede ejecutar desde contextos externos al propio Script (por ejemplo desde los botones de la interfaz gráfica). Esta función lo que hace es setear el estado de activación de la máquina con el valor que se envía como parámetro (línea 17) y luego ejecuta la función pública del indicador lumínico pasando como parámetro el estado de activación de la máquina.