¿Alguna vez has querido diseñar tu propio controlador de juego? ¡Es más fácil de lo que piensas!
En este breve proyecto crearemos un controlador de juego personalizado simple para usar con el motor de juego de Unity. Este controlador estará alimentado por un Arduino Uno, aunque podría usar una de las muchas alternativas. Guía de compra de Arduino: ¿Qué placa debería obtener? Guía de compra de Arduino: ¿Qué placa debería obtener? Hay tantos tipos diferentes de tableros Arduino que hay, se te perdonaría por estar confundido. ¿Qué debería comprar para su proyecto? ¡Permítanos ayudarlo con esta guía de compra de Arduino! Lea más por ahí para este proyecto también. También crearemos un juego básico donde usarás tu controlador para evitar la caída de objetos y la ralentización del tiempo.
Para este proyecto necesitarás
- Arduino o microcontrolador similar
- Resistencia de 1 x 10k Ohm
- 1 x interruptor momentáneo
- 1 x Potenciómetro
- Cables de conexión
- Una placa de prueba
- Motor de juego Unity
- El complemento Uniduino de Unity Asset Store ($ 30)
- Complete el código del proyecto, en caso de que no quiera escribirlo (no incluye el complemento Uniduino)
La mayoría de estas cosas están disponibles en un kit de inicio Arduino. Si no tiene un kit de inicio, eche un vistazo a nuestra guía para elegir los mejores 4 mejores kits de inicio para Arduino Beginners 4 mejores kits de inicio para principiantes de Arduino Hay muchos excelentes proyectos de Arduino para principiantes que puede usar para comenzar, pero lo hará necesita un Arduino y algunos componentes primero. Aquí está nuestra selección de 4 de los mejores kits de inicio para ... Leer más uno para ti.
Puede hacer que su controlador sea tan complicado como lo desee, aunque para este ejemplo configuraremos un potenciómetro y un botón, perfecto para controlar un simple juego de arcade.
Ensamblar su controlador
Configure su tabla de pruebas y Arduino como se muestra en la imagen a continuación. Esto es lo que usaremos como nuestro controlador de juegos, aunque podrías usar casi la misma configuración que un controlador midi DIY Cómo hacer un controlador MIDI con un Arduino Cómo hacer un controlador MIDI con un Arduino Como un músico que ha acumulado una colección de instrumentos musicales y cajas de ruido, el humilde Arduino es la herramienta perfecta para crear un controlador MIDI personalizado. ¡Lee más también!
Preparar tu Arduino
Una vez que tenga todo conectado, conecte su Arduino a través de USB. En Arduino Software, dirígete a Herramientas> Tablero y Herramientas> Puerto para seleccionar qué microcontrolador y puerto estás usando. El IDE de Arduino viene incluido con el boceto que necesitamos, y puede encontrarlo en Archivo> Ejemplos> Firmata> StandardFirmata . Haga clic en Cargar y estará listo para comenzar.
Si eres nuevo en Arduino y tu cabeza se está derritiendo un poco, echa un vistazo a nuestra Guía para principiantes Comenzando con Arduino: una guía para principiantes Comenzando con Arduino: una guía para principiantes Arduino es una plataforma de prototipos electrónicos de código abierto basada en flexibilidad, fácil de usar usa hardware y software. Está dirigido a artistas, diseñadores, aficionados y cualquier persona interesada en crear objetos o entornos interactivos. Lea más para ayudarlo a hablar mejor con su computadora.
Configuración de su proyecto de unidad
En Unity, abra Window> Asset Store para acceder a Unity's Asset Store desde el Editor de Unity. Busque en el Almacén de activos el plugin Uniduino. Este complemento le permitirá recibir y enviar datos hacia y desde sus contactos Arduino dentro de Unity. El complemento al momento de escribir cuesta $ 30. Es posible realizar este proyecto sin comprar el complemento, aunque es bastante más complicado y es posible que encuentre el complemento más conveniente.
Este video de los creadores del complemento lo lleva por el proceso de probar que todo está funcionando, junto con la configuración por primera vez. Tenga en cuenta que también puede tener que restablecer el editor de Unity en Windows.
Podemos usar este mismo panel de prueba para probar nuestro controlador. Establezca Pin D2 en ENTRADA y Digital. Más abajo, ajuste el Pin A5 en ANALOG. Su potenciómetro y botón deberían mostrar valores en la pantalla al lado de sus números de pin ahora. ¡Progreso!
Ahora para hacer algo que podamos controlar
Entonces tenemos un controlador, pero ¿qué debemos controlar? Bueno, las posibilidades son infinitas, pero para hoy crearemos un juego de esquiva muy simple para probar nuestro nuevo sistema de control. Cambiaremos la configuración del juego bastante rápido, así que si eres totalmente nuevo en el motor de Unity, puedes encontrar nuestra Guía de juegos de Unity Game Programming Programación de un juego con unidad: una guía para principiantes Programación de un juego con unidad: una guía para principiantes En la evolución Con respecto al desarrollo de juegos independientes, Unity se ha convertido en una especie de estándar de facto: su bajo costo, facilidad de uso y su amplio conjunto de características lo hacen ideal para el desarrollo rápido de juegos. Lea más útil para orientarse.
Desarrollaremos un juego muy básico en el que tu objetivo es esquivar tu esfera hacia la izquierda y hacia la derecha para evitar la caída de cubos, lo que utilizará tu nuevo controlador personalizado.
Cree una nueva escena y arrastre la prefabricada de Uniduino desde Assets> Uniduino> Prefabs a su jerarquía y arrastre la prefab de Uniduino a la jerarquía. Lo necesitamos allí para hablar entre nuestro juego y el controlador.
En la jerarquía de Unity, haga clic en Crear> Esfera y use la pestaña Transformar en el Inspector para moverlo a la parte inferior de la pantalla del juego.
Es hora de obtener la codificación
Ahora para agregar un código a esta fiesta. Con la esfera seleccionada en la Jerarquía, haga clic en Agregar componente> Nueva secuencia de comandos en la parte inferior de su ventana de Inspector. Llámalo sphereMover y selecciona C Sharp en el menú desplegable. Haga clic en Crear y Agregar y la secuencia de comandos se agregará a GameObject. Haga doble clic en él para abrir el script e ingresar este código:
using UnityEngine; using System.Collections; using Uniduino; public class sphereMover : MonoBehaviour { //Headers aren't scrictly neccesary, but they make life easier back in the Inspector. [Header("Arduino Variables")] //we need to declare the Arduino as a variable public Arduino arduino; //we need to declare an integer for the pin number of our potentiometer, //making these variables public means we can change them in the editor later //if we change the layout of our arduino public int potPinNumber; //a float variable to hold the potentiometer value (0 - 1023) public float potValue; //we will later remap that potValue to the y position of our capsule and hold it in this variable public float mappedPot; //public int for our button pin public int buttonPinNumber; [Header("Sphere Variables")] //variables to hold the values we noted earlier for the sides of our screen public float leftEdge; public float rightEdge; // Use this for initialization void Start () {//and initialize we shall, starting with the Arduino Variable. //we are only using one arduino, so we can use Arduino.global to grab it. arduino = Arduino.global; arduino.Setup(ConfigurePins); } void ConfigurePins() { //configure the Arduino pin to be analog for our potentiometer arduino.pinMode(potPinNumber, PinMode.ANALOG); //Tell the Arduino to report any changes in the value of our potentiometer arduino.reportAnalog(5, 1); //configure our Button pin arduino.pinMode(buttonPinNumber, PinMode.INPUT); arduino.reportDigital((byte)(buttonPinNumber / 8), 1); } }
Tómese un momento para leer los comentarios del código. Hasta ahora, hemos declarado algunas variables para nuestro Arduino, sus pines y nuestra Esfera. También hemos usado el
Los métodos Start y ConfigurePins para inicializar nuestro Arduino en tiempo de ejecución. Guardaremos nuestro script, volveremos al editor de Unity y veremos qué ha cambiado.
Ahora podemos ver nuestras variables públicas en la ventana del Inspector. Veamos en qué podemos ingresar en esta etapa para ayudarnos más adelante. Sabemos qué pin estamos usando en el Arduino de nuestra versión anterior, podemos ingresarlos. También sabemos por nuestro experimento anterior cuánto queremos que nuestra esfera pueda viajar a izquierda y derecha para que no se caiga de la pantalla. Permite ingresar estos valores ahora.
Primeros signos de la vida
Es hora de ver realmente los valores de nuestro Arduino dentro del Editor de Unity. Por ahora, podemos agregar una línea de código a la función de actualización de nuestro script sphereMover y guardar el script nuevamente.
void Update () { //We assign the value the arduino is reading from our potentionmeter to our potValue variable potValue = arduino.analogRead(potPinNumber); }
Ahora que actualizamos nuestra variable potValue en cada cuadro, podemos ver su valor en tiempo real en Unity Inspector. Antes de darle una prueba, ahora sería un buen momento para verificar que el plug-in Uniduino esté escuchando en el puerto correcto. Haga clic en Uniduino en la jerarquía y verifique su nombre de puerto en el Inspector. Si está en blanco, complete el número de puerto correcto para su Arduino. En este caso, fue COM4, aunque puede ser diferente para usted. Verifique usando el IDE de Arduino si no está seguro.
Seleccione su esfera en la jerarquía y haga clic en el botón Reproducir en la parte superior de la pantalla. El sistema necesita unos segundos para inicializarse, después de lo cual debería comenzar a ver la variación de la variable Pot Value en el inspector cuando mueva el potenciómetro.
¡Ahora estamos hablando! Bueno, estrictamente hablando, la Unidad y el Arduino están hablando, pero ¿quién está contando? Si ha llegado hasta aquí y no ve el cambio de valor en el inspector, revise los pasos de configuración y asegúrese de que tiene seleccionado el puerto correcto para su Arduino.
Movemos esta esfera
Ahora que tenemos nuestra variable potValue siendo actualizada, queremos usar este valor para mover nuestra esfera. Cuando el potenciómetro está completamente hacia la izquierda, queremos que la esfera esté en el lado izquierdo de la pantalla, y viceversa. Los objetos en Unity están posicionados en un punto del espacio vectorial, determinado por los valores de su Transform.position. En la imagen de abajo, donde la esfera está en el punto más alejado hacia la izquierda, la queremos, puedes ver que su vector de posición es 9.5, -4, 0.
Queremos afectar la posición X de la esfera. Desafortunadamente, el uso de los valores de nuestro potenciómetro directamente no funcionará, ya que cuando el potenciómetro está completamente hacia la izquierda da un valor de 0, lo que colocaría nuestra esfera en el centro de la pantalla. En el otro extremo, el valor superior del potenciómetro, 1023, colocaría el cubo a la derecha de nuestra pantalla. Inútil. Lo que necesitamos aquí es algo de matemática.
¿Por qué hacer matemáticas cuando la unidad lo hará por usted?
Para aquellos de ustedes que temen mirar un pedazo de papel cubierto de números sin sentido (aunque hay algunos buenos sitios web). Los 20 sitios web que necesita para aprender matemáticas paso a paso. Los 20 sitios web que necesita para aprender matemáticas paso a paso. Hemos compilado el los mejores sitios para cada nivel para que pueda aprender de forma sistemática, obtener una mejor comprensión de las matemáticas de un nivel a la vez, y divertirse! Lea más que puede ayudarle a aprender matemáticas), no tema. Necesitamos una forma de hacer que nuestros valores de potenciómetro se correspondan con la posición X de nuestra esfera. Afortunadamente, podemos usar un Método de extensión .
Un método de extensión es un script que hace un trabajo específico para nosotros. En este caso, le damos los valores que tenemos, y los devuelve mapeados entre sí, listos para ser utilizados en nuestro script sphereMover . En la parte superior del panel Proyecto, haga clic en Crear> Script C # y asígnele el nombre ExtensionMethods. Ingrese el código a continuación en el script:
using UnityEngine; using System.Collections; public static class ExtensionMethods { //our handy dandy Remapper function public static float Remap (this float value, float from1, float to1, float from2, float to2) { return (value - from1) / (to1 - from1) * (to2 - from2) + from2; } }
Guarde el script y vuelva a su script sphereMover. Ahora podemos utilizar esta función Remapear en nuestro script ExtensionMethods en nuestra función Actualizar para convertir nuestros valores de potenciómetro en valores utilizables en nuestro juego. Debajo de donde acabamos de asignar la variable potValue, escriba lo siguiente:
El mensaje nos muestra que nuestro Remap toma dos conjuntos de valores From y To, y los mapea. Podemos ingresar nuestros valores en esto.
mappedPot = potValue.Remap(0, 1023, leftEdge, rightEdge);
Guarde su script, diríjase al editor de Unity y presione el botón de reproducción. Ahora debería ver que la variable Pot asignada cambia cuando mueve el potenciómetro para corresponder con los valores que determinamos para nuestros bordes izquierdo y derecho. Tómese un momento para sentarse y agradecer a su script ExtensionMethods. No es una calculadora a la vista.
Nota: si se da cuenta de que sus valores están invertidos, de modo que cuando su potenciómetro está completamente hacia la derecha, está obteniendo un valor negativo para su variable Maceta Mapeada, puede que tenga su potenciómetro configurado al revés. Afortunadamente, puedes arreglar esto sin hacer ningún cambio de cableado. Simplemente puede cambiar los valores cuando los reasigne:
Ahora finalmente tenemos valores utilizables. Ahora todo lo que queda por hacer es asignar esos valores a la posición X de nuestra esfera:
//Assign the mapped pot value to the sphere's x position transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);
Guarde su script, diríjase al editor de Unity y presione play. ¡Ahora debería poder mover su Esfera hacia la izquierda y hacia la derecha usando su potenciómetro!
Poniendo el botón a trabajar
Ahora que tenemos nuestra esfera en movimiento, ¿no sería bueno tener una forma de desacelerar un poco las cosas cuando nos encontramos en un aprieto? Vamos a usar nuestro botón para ralentizar el tiempo en nuestro juego. Abra su secuencia de comandos sphereMover y agregue este código a su función de actualización
//if Unity detects the button is being pressed, the time scale slows down if (arduino.digitalRead(buttonPinNumber) == 1){ Time.timeScale = 0.4f; } else Time.timeScale = 1.0f;
Ahora tenemos la mecánica de nuestro juego, ¡agreguemos algunos obstáculos! Vamos a usar el enemigo natural de la esfera, el cubo. En la jerarquía, haga clic en Crear> Objeto 3d> Cubo . En el inspector del cubo, Agregar componente> Física> Cuerpo rígido . Establezca el valor de arrastre del cuerpo rígido en 5. Además, en el componente Box Collider en el inspector, seleccione Is Trigger. Esto nos permitirá detectar colisiones con nuestra Esfera.
Cree una secuencia de comandos en el cubo y llámelo collideWithSphere, abra la secuencia de comandos y elimine las funciones de Inicio y Actualización, ya que esta vez no las necesitaremos. Ingrese este código:
using UnityEngine; using System.Collections; public class collideWithSphere : MonoBehaviour { void OnTriggerEnter(Collider other) { Destroy(other.gameObject); } }
OnTriggerEnter envía un mensaje cada vez que el colisionador disparador golpea a otro colisionador. En este caso, le estamos diciendo que destruya todo lo que toque. Guarde el script y regrese al editor de Unity. Arrastre el cubo desde la jerarquía al panel Proyecto. Notarás que el texto del cubo en la jerarquía se ha vuelto azul. Esto se debe a que hemos creado un prefabricado y lo hemos guardado en nuestro proyecto. Borre su cubo de la jerarquía ahora.
Todo lo que necesitamos ahora es un script para generar los cubos. En la jerarquía, haga clic en Crear> Crear vacío y cámbiele el nombre a Administrador de juegos en el Inspector y agregue un script llamado GameManager. Abra la secuencia de comandos y agregue este código:
using UnityEngine; using System.Collections; public class gameManager : MonoBehaviour { //a variable to hold the prefab we want to spawn public GameObject cube; //we want some variables to decide how any cubes to spawn //and how high above us we want them to spawn public int numberToSpwan; public float lowestSpawnheight; public float highestSpawnheight; // Use this for initialization void Start () { for (int i = 0; i< numberToSpwan; i++) { Instantiate(cube, new Vector3(Random.Range(-9, 9), Random.Range(lowestSpawnheight, highestSpawnheight), 0), Quaternion.identity); } } // Update is called once per frame void Update () { } }
Guarde el script. De vuelta en el editor, seleccione el Administrador de juegos en la jerarquía y arrastre su prefabricado de cubos desde el panel del proyecto a la variable Cubo en el Inspector. Llena los valores para tu desove aquí también. Puedes manipularlo para que sea tan difícil o fácil como quieras. Tenga en cuenta que vale la pena tener los cubos más bajos generados lo suficientemente alto como para permitir que Uniduino inicie, ¡perder el juego antes de que pueda moverse puede ser frustrante!
El proyecto terminado
Ahora cuando presionas play, los cubos aparecerán sobre ti y caerán. Puedes usar tu potenciómetro para evitarlos y tu botón para ralentizar el tiempo.
En este proyecto, hemos creado un controlador personalizado con Arduino, Unity y Uniduino configurados para comunicarnos con él, y hemos creado un juego simple para probarlo. Los conceptos aquí se pueden aplicar a casi cualquier proyecto, e incluso hay atascos de juegos que se especializan en controladores personalizados.
Con Arduino y Unity puedes crear un controlador personalizado a partir de casi cualquier cosa. ¿Has creado una alta fidelidad que controle una nave espacial? ¿Una tostadora que controla un juego de plataforma?
¡Si has hecho un proyecto como este, me encantaría verlo! ¡Publicalo en los comentarios a continuación!