Sistema de interacción base para Unity – Activar botones e interruptores

Por GameDevTraum
activar botones e interruptores en unity

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 EXTENSA



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

ÚLTIMA ACTUALIZACIÓN 04/03/20

Esta solución consiste en tres Scripts básicos: “CheckInteraction”, “InteractionReceiver” y “IAction”

Basic Interaction System for First Person Character
Versión:1.1
Publicado:abril 3, 2020

Sistema básico de interacción 2D y 3D
Versión:1.3
Publicado:abril 24, 2020

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.

inspector del control en primera persona en unity, script para chequear interaccion y activar botones o interruptores en unity
Fig. 1: El Script ChequearInteraccion está asignado al control en primera persona.

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.

botones e interruptor en unity, como interactuar con objetos en unity
Fig. 2: El Script ReceptorInteraccion está asignado al objeto con el que podemos interactuar. Este objeto también tiene asignado el Script switch del ejemplo.

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).

inspector de un porton que se acciona en unity
Fig. 3: El portón tiene asignado el Script portón que viene en las descargas a modo de ejemplo.



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.

script para el comportamiento de un interruptor
Fig. 4: El Script Switch que viene como ejemplo implementa la interfaz Iaction.

script de unity para el comportamiento de un porton accionado a distancia
Fig. 5: El Script Porton que viene como ejemplo implementa la interfaz Iaction.

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).

Fig. 6: En el receptor configuramos las acciones.

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.