Introducción
Hoy les traigo una solución para que el jugador pueda activar botones, interruptores, palancas y más en Unity.
La solución consiste en tres Scripts que interactúan entre sí para resolver la detección de los elementos interactivos y su activación. Además se proveen dos Scripts extra a modo de ejemplo para lograr lo que se observa en el siguiente video:
Hay dos videos para esta solución, en la versión extensa hago la descarga de los archivos de esta página y configuro el sistema de interacción desde cero. En la versión corta explico de manera breve qué archivos contiene el paquete y cómo funciona el sistema.
VERSIÓN CORTA
VERSIÓN DETALLADA
Es importante mencionar que en esta solución no se resuelve ninguna accion en particular, si bien se proveen dos Scripts que ejemplifican la utilización, cada acción particular deberá ser programada.
Descripción de los archivos de descarga
Esta solución consiste en tres Scripts básicos: «CheckInteraction», «InteractionReceiver» y «IAction»
CheckInteraction se encarga de comprobar si se está observando algo con lo que se puede interactuar, se puede agregar a cualquier GameObject pero es coherente colocarlo en nuestro personaje.
InteractionReceiver se coloca en todos los objeto de nuestro mundo que el personaje pueda accionar, por ejemplo botones, palancas, puertas, etc. Los objetos que tengan asignado este Script debe tener también asignado un Collider para que el Script CheckInteraction pueda detecarlos.
IAction es una interfaz de programación, no se aplica sobre ningún GameObject pero es necesaria para la solución y debemos prestar atención a cómo usarla.
Se proveen dos Scripts que resuelven acciones a modo de ejemplo.
Extra: Interfaz gráfica
En el paquete también viene la interfaz gráfica simple que se ve en el video y que permite mostrar mensajes en pantalla.
Ejemplo de Aplicación – Activar botón en Unity
Ahora vamos a ver cómo usar esta solución para poder activar un botón en Unity y este abra un portón.
Para empezar partimos de una escena simple en la que hay un botón y un portón. Estos dos objetos pueden ser reemplazados simplemente con cubos.
Personaje
Colocamos en la escena el prefabricado FPSController de Standard Assets, si no tenés el paquete podés descargarlo haciendo clic acá.
A este prefabricado le vamos a asignar el Script ChequearInteraccion, el campo «minInteractionDistance» es la mínima distancia a la que tiene que estar el jugador para poder interactuar con el objeto, en mi caso pongo 4.
El campo «origenRayo» es el punto desde donde se origina el rayo para chequear la interacción, en este caso coloco la cámara del personaje, de esa forma el personaje podrá «ver» los objetos que estén en el centro de la pantalla.
Receptores – Botones o interruptores
Los objetos que se podrán accionar (como botones, interruptores, palancas, etc) tendrán asignado el Script «ReceptorInteraccion», esto hará que el Script «ChequearInteraccion» detecte estos objetos y permita accionarlos con la tecla E.
Podemos agregar un mensaje al receptor de interacción y luego hacer cosas con este mensaje, por ejemplo mostrarlo en un cartel en pantalla como se observa en el video, para esto hay una región marcado con comentarios en el Script ChequearInteraccion en la que se hace un Debug.Log mostrando el mensaje en consola.
Objetos con acción
Cuando pulsemos el botón van a ocurrir dos cosas, la primera es que el portón se abrirá o se cerrará dependiendo de su estado actual, la segunda acción es que el botón cambia a color verde cuando el portón está abierto y a rojo cuando está cerrado.
Estas dos acciones las programamos individualmente utilizando dos Scripts: Switch asignado al GameObject del botón (figura 2) y Porton asignado al GameObject del portón (figura 3).
Scripts que resuelven las acciones
Las acciones deberán ser programadas específicamente, es decir deberemos crear más Scripts que resuelvan la acción. Esto va a depender de las necesidades de cada uno.
En este artículo vamos a ver los dos Scripts que resuelven la acción del botón y del portón.
El requisito que deben tener los Scripts de acciones es que implementen la interfaz de programación «IAction» que viene en los archivos de descarga, esto hará que nuestro Script deba tener definido obligatoriamente un método llamado «Activate», dentro del cual haremos todo lo que tiene que hacer la acción al ser activada por el receptor.
En las figuras 4 y 5 vemos ejemplos para el botón y para el portón. Seguramente haga videos explicando cómo resolver más mecanismos utilizando esta solución y también es probable que mejoremos esta solución.
Asignar Acciones al receptor
Una vez que tenemos las acciones programadas, las asignamos a los GameObjects que correspondan y seleccionamos el objeto que usamos como activador de esas acciones (en este caso el botón).
En el Script ReceptorInteraccion tenemos un campo que se llama «ObjectsWithActions», el cual es un vector de GameObjects en el que colocaremos todos los objetos que serán activados al pulsar el botón.
Los objetos que coloquemos aquí deben tener asignado un Script que implemente IAction para funcionar, en el valor «Size» pongo 2 y asigno los GameObjects Porton y Boton, los cuales tienen asignados los Script Switch y Porton respectivamente (ver figuras 3 y 6).
Con esto logramos que al pulsar el botón el Script ReceptorAccion toma los objetos «Porton» y «Boton», obtenga sus Scripts que implementen la interfaz IAction y les ejecute a todos el método Activate.
Conclusión
En este artículo hemos visto cómo implementar la solución propuesta para resolver la activación de botones, interruptores o palancas en Unity.
La acción que realizarán los interruptores deberá ser resuelta de forma particular con otro Script, el único requisito es que implemente la interfaz IAction y en consecuencia se deba definir un método público llamado Activate.