Come creare un controller di gioco personalizzato con Arduino e Unity

Come creare un controller di gioco personalizzato con Arduino e Unity

Hai mai desiderato progettare il tuo controller di gioco? È più facile di quanto pensi!





In questo breve progetto costruiremo un semplice controller di gioco personalizzato da utilizzare con il motore di gioco Unity. Questo controller sarà alimentato da un Arduino Uno, anche se potresti utilizzare una delle tante alternative disponibili anche per questo progetto. Creeremo anche un gioco base in cui utilizzerai il controller per evitare la caduta di oggetti e rallentare il tempo.





Per questo progetto avrai bisogno

  • Arduino o microcontrollore simile
  • 1 x 10k Ohm resistore
  • 1 x interruttore momentaneo
  • 1 x potenziometro
  • Cavi di collegamento
  • Una breadboard
  • Motore di gioco Unity
  • Il plugin Uniduino da Unity Asset Store ($ 30)
  • Codice del progetto completo, nel caso non lo volessi scrivere (non include il plugin Uniduino)

La maggior parte di queste cose sono disponibili in uno starter kit Arduino. Se non hai uno starter kit, consulta la nostra guida per scegliere quello migliore per te.





Puoi rendere il tuo controller complicato quanto desideri, anche se per questo esempio imposteremo un potenziometro e un pulsante, perfetti per controllare un semplice gioco arcade.

Assemblaggio del controller

Configura la tua breadboard e Arduino come mostrato nell'immagine qui sotto. Questo è quello che useremo come controller di gioco, anche se potresti usare quasi la stessa identica configurazione di a Controller midi fai da te pure!



Preparare il tuo Arduino

Una volta che hai tutto cablato, collega il tuo Arduino tramite USB. Nell'IDE del software Arduino vai su Strumenti > Tavola e Strumenti > Porta per selezionare il microcontrollore e la porta in uso. L'IDE Arduino viene fornito in bundle con lo schizzo di cui abbiamo bisogno e puoi trovarlo sotto File> Esempi> Firmata> StandardFirmata . Fai clic su Carica e sarai pronto per partire.

Se non conosci Arduino e la tua testa si sta sciogliendo leggermente, dai un'occhiata al nostro Guida per principianti per aiutarti a farlo parlare bene con il tuo computer.





Configurare il tuo progetto Unity

In Unity, apri Finestra > Negozio di risorse per accedere all'Archivio risorse di Unity dall'editor di Unity. Cerca nell'Asset Store il plugin Uniduino. Questo plugin ti consentirà di ricevere e inviare dati da e verso i tuoi pin Arduino all'interno di Unity. Il plugin al momento della scrittura costa $ 30. È possibile fare questo progetto senza acquistare il plugin, anche se è un po' più complicato e potresti trovare il plugin più conveniente in tutto e per tutto.

Questo video dei creatori del plugin ti guida attraverso il processo di verifica che tutto funzioni, insieme alla configurazione iniziale. Tieni presente che potresti anche dover ripristinare l'editor Unity su Windows.





Possiamo usare questo stesso pannello di prova per testare il nostro controller. Impostare il pin D2 su INGRESSO e digitale. Più in basso, imposta il Pin A5 su ANALOG. Il potenziometro e il pulsante dovrebbero ora visualizzare i valori sullo schermo accanto ai loro numeri di pin. Progresso!

Ora per fare qualcosa che possiamo controllare

Quindi abbiamo un controller, ma cosa dobbiamo controllare? Bene, le possibilità sono infinite, ma per oggi creeremo un gioco di schivate molto semplice per testare il nostro nuovo sistema di controllo. Passeremo alla configurazione del gioco abbastanza rapidamente, quindi se sei totalmente nuovo nel motore di Unity potresti trovare il nostro Guida per principianti alla programmazione di giochi Unity utile per orientarsi.

Costruiremo un gioco molto semplice in cui il tuo obiettivo è schivare la tua sfera a sinistra e a destra per evitare la caduta di cubi, che utilizzerà il tuo controller personalizzato appena creato.

Crea una nuova scena e trascina il prefabbricato Uniduino da Assets > Uniduino > Prefabbricati nella tua gerarchia e trascina il prefabbricato Uniduino nella gerarchia. Ne abbiamo bisogno per parlare tra il nostro gioco e il controller.

Nella gerarchia Unity fare clic su Crea > Sfera e usa la scheda Trasforma nell'Ispettore per spostarlo nella parte inferiore della schermata di gioco.

È ora di iniziare a programmare

Ora per aggiungere del codice a questa festa. Con la sfera selezionata nella Gerarchia, fare clic su Aggiungi componente > Nuovo script nella parte inferiore della sua finestra di ispezione. Nominalo sphereMover e seleziona Do diesis dal menu a tendina. Clic Crea e aggiungi e lo script verrà aggiunto al GameObject. Fare doppio clic su di esso per aprire lo script e inserire questo codice:

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

Prenditi un momento per leggere i commenti sul codice. Finora abbiamo dichiarato alcune variabili per il nostro Arduino, i suoi pin e la nostra Sphere. Abbiamo anche usato il

Start e ConfigurePins per inizializzare il nostro Arduino in fase di esecuzione. Salviamo il nostro script, torniamo nell'editor di Unity e vediamo cosa è cambiato.

Ora possiamo vedere le nostre variabili pubbliche nella finestra Inspector. Vediamo cosa possiamo inserire in questa fase per aiutarci in seguito. Sappiamo quali pin stiamo usando su Arduino dalla nostra build precedente, possiamo inserirli. Sappiamo anche dal nostro esperimento precedente fino a che punto vogliamo che la nostra sfera possa viaggiare a sinistra e a destra in modo che non cada dallo schermo. Inseriamo questi valori ora.

Primi segni di vita

È ora di vedere effettivamente i valori dal nostro Arduino all'interno dell'editor di Unity. Per ora, possiamo aggiungere una riga di codice alla funzione di aggiornamento del nostro script sphereMover e salvare nuovamente lo script.

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

Ora che la nostra variabile potValue viene aggiornata ad ogni frame, possiamo vedere il suo valore in tempo reale nell'Unity Inspector. Prima di fare un test, ora sarebbe un buon momento per verificare che il plug-in Uniduino sia in ascolto sulla porta giusta. Fare clic su Uniduino nella gerarchia e controllare il nome della porta nell'ispettore. Se è vuoto, inserisci il numero di porta corretto per il tuo Arduino. In questo caso era COM4, ​​anche se potrebbe essere diverso per te. Controlla usando l'IDE Arduino se non sei sicuro.

Seleziona la tua sfera nella gerarchia e fai clic sul pulsante Riproduci nella parte superiore dello schermo. Il sistema ha bisogno di alcuni secondi per inizializzarsi, dopodiché dovresti iniziare a vedere la variabile Pot Value cambiare nell'ispettore quando muovi il potenziometro.

Adesso stiamo parlando! Beh, in senso stretto Unity e Arduino stanno parlando, ma chi sta contando? Se sei arrivato così lontano e non vedi il cambiamento del valore nell'ispettore, controlla i passaggi di configurazione e assicurati di aver selezionato la porta corretta per il tuo Arduino.

muoviamo questa sfera

Ora che abbiamo aggiornato la variabile potValue, vogliamo usare questo valore per spostare la nostra sfera. Quando il potenziometro è completamente a sinistra, vogliamo che la sfera si trovi sul lato sinistro dello schermo e viceversa. Gli oggetti in Unity sono posizionati in un punto nello spazio vettoriale, determinato dai valori di esso Trasforma.posizione . Nell'immagine qui sotto, dove la sfera è nel punto più a sinistra che vorremmo, puoi vedere che il suo vettore di posizione è 9,5, -4, 0.

Vogliamo influenzare la posizione X della sfera. Sfortunatamente l'uso diretto dei valori del nostro potenziometro non funzionerà, poiché quando il potenziometro è completamente a sinistra dà un valore di 0, il che metterebbe la nostra sfera proprio al centro dello schermo. All'estremo opposto, il valore più alto del potenziometro, 1023, posizionerebbe il cubo a destra del nostro schermo. Inutile. Quello che ci serve qui è un po' di matematica.

Perché fare matematica quando Unity lo farà per te?

Per quelli di voi là fuori che temono di fissare un pezzo di carta coperto di numeri senza senso (anche se ci sono alcuni ottimi siti web che può aiutarti a imparare la matematica), non temere. Abbiamo bisogno di un modo per far corrispondere i valori del nostro potenziometro alla posizione X della nostra sfera. Fortunatamente, possiamo usare an Metodo di estensione .

Un metodo di estensione è uno script che svolge un lavoro specifico per noi. In questo caso gli diamo i valori che abbiamo e li restituisce mappati tra loro, pronti per essere usati nel nostro sphereMover sceneggiatura. Nella parte superiore del pannello Progetto, fai clic su Crea > Script C# e chiamalo ExtensionMethods. Inserisci il codice qui sotto nello 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;
}
}

Salva lo script e torna allo script sphereMover. Ora possiamo usare questa funzione Remap nel nostro script ExtensionMethods nella nostra funzione Update per convertire i nostri valori del potenziometro in valori utilizzabili nel nostro gioco. Sotto dove abbiamo appena assegnato la variabile potValue, digita quanto segue:

Il prompt ci mostra che il nostro Remap prende due set di valori From e To e li mappa insieme. Possiamo inserire i nostri valori in questo.

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

Salva il tuo script, torna all'editor di Unity e premi il pulsante di riproduzione. Ora dovresti vedere che la variabile Mapped Pot cambia quando muovi il potenziometro, per corrispondere ai valori che abbiamo determinato per i nostri bordi sinistro e destro. Prenditi un momento per rilassarti e ringraziare il tuo script ExtensionMethods. Non una calcolatrice in vista.

Nota: se noti che i tuoi valori sono invertiti, quindi quando il tuo potenziometro è completamente a destra stai ottenendo un valore negativo per la tua variabile Mapped Pot, potresti avere il tuo potenziometro impostato nel modo sbagliato. Fortunatamente, puoi risolvere questo problema senza eseguire alcun ricablaggio. Puoi semplicemente cambiare i valori quando li rimappa:

Ora abbiamo finalmente dei valori utilizzabili. Ora non resta che assegnare quei valori alla posizione X della nostra sfera:

puoi rimborsare i giochi su ps4?
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

Salva il tuo script, torna all'editor di Unity e premi play. Ora dovresti essere in grado di spostare la tua Sfera a sinistra ea destra usando il tuo potenziometro!

Mettere il pulsante al lavoro

Ora che abbiamo la nostra sfera in movimento, non sarebbe bello avere un modo per rallentare un po' le cose quando ci troviamo in difficoltà? Useremo il nostro pulsante per rallentare il tempo nel nostro gioco. Apri il tuo script sphereMover e aggiungi questo codice alla tua funzione di aggiornamento

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

Ora abbiamo la meccanica del nostro gioco, aggiungiamo qualche ostacolo! Useremo il nemico naturale della sfera, il cubo. Nella gerarchia, fare clic su Crea > Oggetto 3D > Cubo . Nell'ispettore del cubo, Aggiungi componente > Fisica > Corpo rigido . Imposta il valore di trascinamento del corpo rigido su 5. Inoltre, sotto il componente Box Collider nell'inspector, seleziona Is Trigger. Questo ci permetterà di rilevare le collisioni con la nostra Sfera.

Crea uno script sul cubo e chiamalo collidereConSfera , apri lo script ed elimina le funzioni di avvio e aggiornamento poiché questa volta non ne avremo bisogno. Inserisci questo codice:

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

OnTriggerEnter invia un messaggio ogni volta che il collisore trigger colpisce un altro collisore. In questo caso, gli stiamo dicendo di distruggere qualunque cosa tocchi. Salva lo script e torna all'editor di Unity. Trascina il cubo dalla gerarchia al pannello Progetto. Noterai che il testo del cubo nella gerarchia è diventato blu. Questo perché abbiamo creato un prefabbricato e lo abbiamo salvato nel nostro progetto. Elimina ora il tuo cubo dalla gerarchia.

Tutto ciò di cui abbiamo bisogno ora è uno script per generare i cubi. Nella gerarchia clicca Crea > Crea vuoto e rinominalo in Game Manager nell'Inspector e aggiungi uno script chiamato gameManager. Apri lo script e aggiungi questo codice:

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 ()
{

}
}

Salva lo script. Torna nell'editor, seleziona il Game Manager nella gerarchia e trascina il tuo cubo prefabbricato dal pannello del progetto alla variabile Cubo nell'Ispettore. Compila anche qui i valori per la tua generazione. Puoi giocherellare con esso per renderlo difficile o facile come preferisci. Nota che vale la pena che i cubi più bassi vengano generati abbastanza in alto da consentire l'inizializzazione di Uniduino: perdere la partita prima che tu sia in grado di muoverti potrebbe essere frustrante!

Il progetto finito

Ora, quando premi play, i cubi appariranno sopra di te e cadranno. Puoi usare il tuo potenziometro per evitarli e il tuo pulsante per rallentare il tempo.

In questo progetto abbiamo creato un controller personalizzato con un Arduino, configurato Unity e Uniduino per comunicare con esso e creato un semplice gioco per testarlo. I concetti qui possono essere applicati a quasi tutti i progetti e ci sono anche jam di gioco specializzate in controller personalizzati .

Con Arduino e Unity puoi creare un controller personalizzato da quasi tutto. Hai creato un impianto hi-fi che controlla un'astronave? Un tostapane che controlla un gioco platform?

Se hai realizzato un progetto come questo mi piacerebbe vederlo! Pubblicalo nei commenti qui sotto!

Condividere Condividere Tweet E-mail 6 alternative udibili: le migliori app per audiolibri gratuite o economiche

Se non ti va di pagare per gli audiolibri, ecco alcune fantastiche app che ti consentono di ascoltarli gratuitamente e legalmente.

Leggi Avanti
Argomenti correlati
  • Fai da te
  • Programmazione
  • Arduino
  • Controller di gioco
  • Sviluppo del gioco
Circa l'autore Ian Buckley(216 articoli pubblicati)

Ian Buckley è un giornalista freelance, musicista, performer e produttore di video che vive a Berlino, in Germania. Quando non scrive o sul palco, armeggia con l'elettronica o il codice fai-da-te nella speranza di diventare uno scienziato pazzo.

Altro da Ian Buckley

Iscriviti alla nostra Newsletter

Iscriviti alla nostra newsletter per consigli tecnici, recensioni, ebook gratuiti e offerte esclusive!

Clicca qui per iscriverti