Com fer un controlador de joc personalitzat amb Arduino i Unity

Com fer un controlador de joc personalitzat amb Arduino i Unity

Alguna vegada has volgut dissenyar el teu propi controlador de jocs? És més fàcil del que es pensa!





En aquest breu projecte construirem un senzill controlador de jocs personalitzat per utilitzar amb el motor de jocs Unity. Aquest controlador serà alimentat per un Arduino Uno, tot i que també podeu utilitzar una de les moltes alternatives que hi ha per a aquest projecte. També crearem un joc bàsic on utilitzarà el controlador per evitar la caiguda d’objectes i alentir el temps.





Per a aquest projecte necessitareu

  • Arduino o microcontrolador similar
  • 1 x 10k ohm resistència
  • 1 interruptor momentani
  • 1 x Potenciómetre
  • Filferros de connexió
  • Una pissarra
  • Motor de jocs Unity
  • El connector Uniduino d’Unity Asset Store (30 dòlars)
  • Codi de projecte complet, per si no el voleu escriure (no inclou el connector Uniduino)

La majoria d’aquestes coses estan disponibles en un kit d’inici Arduino. Si no teniu un kit d’inici, consulteu la nostra guia per triar-ne el millor.





Podeu fer que el vostre controlador sigui tan complicat com vulgueu, tot i que, per a aquest exemple, configurarem un potenciòmetre i un botó, perfectes per controlar un simple joc arcade.

Muntatge del controlador

Configureu la vostra taula de treball i Arduino tal com es mostra a la imatge següent. Això és el que farem servir com a controlador de joc, tot i que podeu utilitzar gairebé la mateixa configuració que un Controlador midi de bricolatge també!



Preparant el vostre Arduino

Un cop tingueu tot connectat, connecteu el vostre Arduino per USB. Arduino Software IDE dirigeix-te a Eines> Tauler i Eines> Port per seleccionar quin microcontrolador i quin port feu servir. L’IDE Arduino ve amb l’esbós que necessitem i el trobareu a sota Fitxer> Exemples> Firmata> Firmata estàndard . Feu clic a Puja i ja estareu a punt.

Si no coneixeu Arduino i el cap es fon lleugerament, consulteu el nostre Guia per a principiants per ajudar-lo a parlar bé amb l'ordinador.





Configuració del vostre projecte Unity

A Unity, obriu Finestra> Botiga de recursos per accedir a la botiga d’actius d’Unity des de l’Unity Editor. Cerqueu el connector Uniduino a Asset Store. Aquest connector us permetrà rebre i enviar dades a i des dels vostres pins d'Arduino a Unity. El connector en el moment de l’escriptura costa 30 dòlars. És possible per fer aquest projecte sense comprar el connector, tot i que és bastant més complicat i és possible que el complement sigui més convenient.

Aquest vídeo dels creadors del connector us guiarà pel procés de prova de tot el que funciona, juntament amb la primera configuració. Tingueu en compte que és possible que també hàgiu de restablir l'editor Unity al Windows.





Podem utilitzar aquest mateix panell de prova per provar el nostre controlador. Estableix el pin D2 a INPUT i Digital. Més avall, configureu el pin A5 a ANALOG. El potenciòmetre i el botó haurien de mostrar ara els valors a la pantalla al costat dels seus números de pin. Progrés, progressar!

Ara per fer alguna cosa que podem controlar

Tenim un controlador, però, què controlarem? Bé, les possibilitats són infinites, però per avui crearem un joc d'esquivar molt senzill per provar el nostre nou sistema de control. Passarem ràpidament a la configuració del joc, de manera que si sou totalment nou al motor d’Unity, és possible que trobeu el nostre Guia per a principiants de Programació de jocs Unity útil per obtenir els vostres coixinets.

Construirem un joc molt bàsic en què el vostre objectiu és esquivar la vostra esfera cap a l’esquerra i la dreta per evitar la caiguda de cubs, que utilitzarà el vostre controlador personalitzat de nova creació.

Creeu una nova escena i arrossegueu el prefabricat Uniduino des de Actius> Uniduino> Prefabres a la jerarquia i arrossegueu el prefabricat Uniduino a la jerarquia. Allà el necessitem per parlar entre el nostre joc i el controlador.

A la jerarquia Unity, feu clic a Crea> Esfera i utilitzeu la pestanya Transformar a l'Inspector per moure-la a la part inferior de la pantalla del joc.

És hora d’obtenir codificació

Ara, per afegir algun codi a aquesta festa. Amb l’esfera seleccionada a la jerarquia, feu clic a Afegiu component> Nou script a la part inferior de la finestra de l'Inspector. Posa-li un nom esferaMover i seleccioneu C Nítida des del menú desplegable. Feu clic a Crea i afegeix i l'script s'afegirà a GameObject. Feu-hi doble clic per obrir l'script i introduïu aquest codi:

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);
}
}

Preneu-vos un moment per llegir els comentaris del codi. Fins ara, hem declarat algunes variables per al nostre Arduino, els seus pins i la nostra Esfera. També hem utilitzat el fitxer

Inicieu i configureu mètodes per inicialitzar el nostre Arduino en temps d'execució. Permet desar el nostre script i tornar a l'editor Unity i veure què ha canviat.

Ara podem veure les nostres variables públiques a la finestra Inspector. Vegem a què podem entrar en aquesta etapa per ajudar-nos més endavant. Sabem quins pins utilitzem a l’Arduino de la nostra versió anteriorment, podem introduir-los. Del nostre experiment anterior, també sabem fins a quin punt volem que la nostra esfera pugui viatjar cap a l'esquerra i cap a la dreta perquè no caigui de la pantalla. Introduïm aquests valors ara.

Primers signes de vida

És hora de veure els valors del nostre Arduino a l’Unity Editor. De moment, podem afegir una línia de codi a la funció Actualització del nostre script esfèric i desar-lo de nou.

void Update ()
{
//We assign the value the arduino is reading from our potentionmeter to our potValue variable
potValue = arduino.analogRead(potPinNumber);
}

Ara que actualitzem la nostra variable potValue cada fotograma, podem veure el seu valor en temps real a Unity Inspector. Abans de fer-ne una prova, ara seria un bon moment per comprovar que el connector Uniduino escolta al port correcte. Feu clic a Uniduino a Heirarchy i comproveu el nom del port a l'Inspector. Si està en blanc, empleneu el número de port correcte per al vostre Arduino. En aquest cas era COM4, ​​tot i que pot ser diferent per a vosaltres. Comproveu amb l'IDE Arduino si no esteu segur.

Seleccioneu l'esfera a la jerarquia i feu clic al botó Reprodueix a la part superior de la pantalla. El sistema necessita uns segons per inicialitzar-se, després dels quals hauríeu de començar a veure canviar la variable Pot Value a l’inspector quan moveu el potenciòmetre.

Ara estem parlant! Bé, en rigor, Unity i Arduino parlen, però qui compta? Si heu arribat fins aquí i no veieu el canvi de valor a l'inspector, reviseu els passos de configuració i assegureu-vos que teniu el port correcte seleccionat per al vostre Arduino.

Movem aquesta esfera

Ara que ja tenim actualitzada la variable potValue, volem utilitzar aquest valor per moure la nostra esfera. Quan el potenciòmetre es troba a l'esquerra, volem que l'esfera quedi al costat esquerre de la pantalla i viceversa. Els objectes a Unity es situen en un punt de l'espai vectorial, determinat pels seus valors Transformació.posició . A la imatge següent, on l’esfera es troba al punt més a l’esquerra, la voldríem, podeu veure que el vector de posició és 9,5, -4, 0.

Volem afectar la posició X de l'esfera. Malauradament, l'ús directe dels valors del nostre potenciòmetre no funcionarà, ja que quan el potenciòmetre es troba a l'esquerra, dóna un valor de 0, cosa que posaria la nostra esfera al centre de la pantalla. A l’altre extrem, el valor màxim del potenciòmetre, 1023, situaria el cub a la dreta de la nostra pantalla. No és útil. El que necessitem aquí són algunes matemàtiques.

Per què fa les matemàtiques quan la unitat ho farà per vosaltres?

Per als que teniu por de mirar fixament un tros de paper cobert de números sense sentit (encara que n’hi ha llocs web fantàstics que us pot ajudar a aprendre matemàtiques), no us temeu. Necessitem una manera de fer que els nostres valors de potenciòmetre es corresponguin amb la posició X de la nostra esfera. Per sort, podem utilitzar un Mètode d’extensió .

Un mètode d’extensió és un script que ens fa una feina específica. En aquest cas, li donem els valors que tenim i els retorna mapejats els uns als altres, a punt per ser usats a la nostra esferaMover guió. A la part superior del tauler Projecte, feu clic a Crea> Script C # i anomeneu-lo ExtensionMethods. Introduïu el codi següent a l'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;
}
}

Deseu l'script i torneu al vostre script esfèric. Ara podem utilitzar aquesta funció de remap al nostre script ExtensionMethods de la nostra funció d'actualització per convertir els valors del potenciòmetre en valors utilitzables en el nostre joc. Sota on acabem d'assignar la variable potValue, escriviu el següent:

La sol·licitud ens mostra que el nostre Remap pren dos conjunts de valors De i A i els assigna junts. Podem introduir els nostres valors en això.

mappedPot = potValue.Remap(0, 1023, leftEdge, rightEdge);

Deseu el vostre script, torneu a l'editor Unity i premeu el botó de reproducció. Ara hauríeu de veure que la variable Mapped Pot canvia quan moveu el potenciòmetre per correspondre amb els valors que hem determinat per a les vores esquerra i dreta. Preneu-vos un moment per seure i agrair el vostre script ExtensionMethods. Ni una calculadora a la vista.

Nota: si observeu que els vostres valors s’inverteixen, de manera que, quan el potenciòmetre es troba a la dreta, obtindreu un valor negatiu per a la variable Mapped Pot, podeu configurar-lo al revés. Per sort, podeu solucionar-ho sense fer cap cablejat. Simplement podeu canviar els valors quan els torneu a mapar:

Ara per fi tenim valors utilitzables. Ara només queda assignar aquests valors a la posició X de la nostra esfera:

el disc dur extern no apareix al Windows 10 de gestió de discs
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

Deseu el vostre script, torneu a l'editor Unity i premeu Play. Ara hauríeu de poder moure l’esfera cap a l’esquerra i la dreta amb el potenciòmetre.

Posar el botó a la feina

Ara que tenim la nostra esfera en moviment, no seria bo tenir una manera d’alentir una mica les coses quan ens situem en un lloc ajustat? Utilitzarem el nostre botó per alentir el temps del nostre joc. Obriu el vostre script esfèric i afegiu aquest codi a la funció d'actualització

//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;

Ara tenim la mecànica del nostre joc, afegim alguns obstacles! Utilitzarem l’enemic natural de l’esfera, el cub. A la jerarquia, feu clic a Crea> Objecte 3D> Cub . En l'inspector del cub, Afegeix component> Física> Rigidbody . Establiu el valor d'arrossegament del cos rígid a 5. A més, sota el component Box Collider de l'inspector, seleccioneu Trigger. Això ens permetrà detectar col·lisions amb la nostra Esfera.

Creeu un script al cub i truqueu-lo collideWithSphere , obriu l'script i suprimiu les funcions d'inici i actualització, ja que no les necessitarem aquesta vegada. Introduïu aquest codi:

using UnityEngine;
using System.Collections;
public class collideWithSphere : MonoBehaviour
{
void OnTriggerEnter(Collider other)
{
Destroy(other.gameObject);
}
}

OnTriggerEnter envia un missatge sempre que el col·lisionador de disparadors colpeja un altre col·lisionador. En aquest cas, li diem que destrueixi tot el que toqui. Deseu l'script i torneu a l'editor Unity. Arrossegueu el cub des de la jerarquia fins al tauler Projecte. Notareu que el text del cub de la jerarquia s’ha tornat blau. Això es deu al fet que hem creat un prefabricat i l'hem desat al nostre projecte. Suprimiu el cub de la jerarquia ara.

Tot el que necessitem ara és un script per generar els cubs. A la jerarquia feu clic Crea> Crea buit i canvieu-lo amb el nom de Game Manager a l'Inspector i afegiu-hi un script anomenat gameManager. Obriu l'script i afegiu aquest codi:

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 {
Instantiate(cube, new Vector3(Random.Range(-9, 9), Random.Range(lowestSpawnheight, highestSpawnheight), 0), Quaternion.identity);
}
}

// Update is called once per frame
void Update ()
{

}
}

Deseu el guió. De nou a l'editor, seleccioneu el Gestor de jocs a la jerarquia i arrossegueu el prefabricat del cub des del tauler del projecte fins a la variable Cub del Inspector. Empleneu aquí també els valors per a la posta. Podeu jugar amb ell per fer-lo tan dur o fàcil com vulgueu. Tingueu en compte que val la pena que els vostres cubs més baixos generin prou alt per permetre que Uniduino pugui inicialitzar; pot ser frustrant perdre el joc abans de poder moure’s.

El projecte acabat

Ara, quan premeu la tecla de reproducció, els cubs apareixeran a sobre vostre i cauran. Podeu utilitzar el potenciòmetre per evitar-los i el botó per alentir el temps.

En aquest projecte hem creat un controlador personalitzat amb un Arduino, hem configurat Unity i Uniduino per comunicar-s’hi i hem creat un joc senzill per provar-lo. Els conceptes aquí es poden aplicar a gairebé qualsevol projecte, i fins i tot n’hi ha embús de joc especialitzat en controladors personalitzats .

Amb Arduino i Unity podeu crear un controlador personalitzat a partir de gairebé qualsevol cosa. Heu creat un equip d'alta fidelitat que controla una nau espacial? Una torradora que controla un joc de plataformes?

Si heu fet un projecte com aquest, m'encantaria veure'l. Publiqueu-lo als comentaris següents.

Compartir Compartir Tweet Correu electrònic 6 alternatives audibles: les millors aplicacions gratuïtes o econòmiques de audiollibres

Si no us ve de gust pagar audiollibres, aquí teniu algunes aplicacions fantàstiques que us permeten escoltar-les de forma gratuïta i legal.

Llegiu a continuació
Temes relacionats
  • Bricolatge
  • Programació
  • Arduino
  • Controlador de jocs
  • Desenvolupament de jocs
Sobre l'autor Ian Buckley(216 articles publicats)

Ian Buckley és periodista, músic, intèrpret i productor de vídeo independent que viu a Berlín, Alemanya. Quan no escriu ni a l’escenari, juga amb electrònica o codi de bricolatge amb l’esperança de convertir-se en un científic boig.

Més de Ian Buckley

Subscriu-te al nostre butlletí

Uniu-vos al nostre butlletí per obtenir consells tècnics, ressenyes, llibres electrònics gratuïts i ofertes exclusives.

Feu clic aquí per subscriure-us