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, sebbene tu possa utilizzare una delle molte alternative Guida all'acquisto di Arduino: quale scheda dovresti ottenere? Guida all'acquisto di Arduino: quale scheda si dovrebbe ottenere? Ci sono così tanti diversi tipi di tavole Arduino là fuori, ti verrebbe perdonato per essere stato confuso. Quale dovresti comprare per il tuo progetto? Aiutaci, con questa guida all'acquisto di Arduino! Leggi di più là fuori anche per questo progetto. Creeremo anche un gioco di base in cui utilizzerai il controller per evitare di far cadere oggetti e rallentare i tempi.
Per questo progetto di cui hai bisogno
- Arduino o microcontrollore simile
- 1 resistenza da 10k Ohm
- 1 x interruttore momentaneo
- 1 x potenziometro
- Cavi di collegamento
- Una breadboard
- Unity game engine
- Il plugin Uniduino da Unity Asset Store ($ 30)
- Completa il codice del progetto, se non vuoi scriverlo (non include il plugin Uniduino)
La maggior parte di queste cose sono disponibili in un kit di avvio Arduino. Se non hai uno starter kit consulta la nostra guida per la scelta dei migliori 4 migliori kit di avvio per Arduino Beginners 4 migliori kit di avvio per i principianti di Arduino Ci sono un sacco di ottimi progetti per principianti Arduino che puoi usare per iniziare, ma tu serve prima un Arduino e alcuni componenti. Ecco la nostra selezione di 4 dei migliori kit di avvio per ... Per saperne di più uno per voi.
Puoi rendere il tuo controller il più complicato che desideri, anche se per questo esempio imposteremo un potenziometro e un pulsante - perfetto per controllare un semplice gioco arcade.
Assemblare il 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 configurazione di un controller midi DIY Come creare un controller MIDI con un Arduino Come fare un controller MIDI con un Arduino Come un musicista che ha accumulato una collezione di strumenti musicali e noise boxes, l'umile Arduino è lo strumento perfetto per creare un controller MIDI personalizzato. Leggi di più anche tu!
Preparare il tuo Arduino
Una volta collegato tutto, collega il tuo Arduino via USB. In Arduino Software IDE a Strumenti> Scheda e Strumenti> Porta per selezionare quale microcontrollore e porta si sta utilizzando. L'IDE di 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 sei nuovo ad Arduino e la tua testa si sta sciogliendo leggermente, consulta la nostra Guida per principianti. Guida introduttiva ad Arduino: Guida per principianti Guida introduttiva ad Arduino: Guida per principianti Arduino è una piattaforma di prototipazione elettronica open source basata su flessibile, facile da usare. utilizzare hardware e software. È pensato per artisti, designer, hobbisti e chiunque sia interessato a creare oggetti o ambienti interattivi. Leggi altro per aiutarti a parlare bene con il tuo computer.
Impostazione del tuo progetto Unity
In Unity, aperto Finestra> Negozio di beni per accedere a Asset Store di Unity da Unity Editor. Cerca nel negozio di asset per il plug-in Uniduino. Questo plugin ti consentirà di ricevere e inviare dati da e verso i tuoi pin Arduino all'interno di Unity. Il plug-in al momento della scrittura costa $ 30. È possibile fare questo progetto senza acquistare il plug-in, anche se è un po 'più complicato e potresti trovare il plugin più conveniente a tutto tondo.
Questo video dei creatori del plugin ti porta attraverso il processo di testare tutto ciò che funziona, insieme alla configurazione iniziale. Si noti che potrebbe essere necessario resettare l'editor Unity su Windows.
Possiamo utilizzare questo stesso pannello di test per testare il nostro controller. Impostare il pin D2 su INPUT e Digital. Più in basso, impostare Pin A5 su ANALOG. Il potenziometro e il pulsante dovrebbero visualizzare i valori sullo schermo accanto ai loro numeri di pin ora. Progresso!
Ora per fare qualcosa che possiamo controllare
Quindi abbiamo un controller, ma cosa dobbiamo controllare? Bene, le possibilità sono infinite, ma per oggi dovremo creare un gioco di schivata molto semplice per testare il nostro nuovo sistema di controllo. Ci sposteremo abbastanza velocemente nella configurazione del gioco, quindi se sei totalmente nuovo nel motore di Unity puoi trovare la nostra Guida per principianti di Unity Game Programming Programmazione di un gioco con l'unità: Guida per principianti Programmazione di un gioco con l'unità: una guida per principianti Nell'evolversi panorama dello sviluppo di giochi indie, Unity è emerso come uno standard di fatto: il basso costo, la facilità d'uso e l'ampia gamma di funzionalità lo rendono ideale per lo sviluppo rapido del gioco. Ulteriori informazioni utili per orientarsi.
Costruiremo un gioco molto semplice in cui il tuo obiettivo è quello di schivare la tua sfera a sinistra e a destra per evitare di cadere cubi, che utilizzerà il controller personalizzato appena creato.
Crea una nuova scena e trascina il prefabbricato Uniduino da Attività> Uniduino> Prefabbricati nella tua gerarchia e trascina il prefabbricato Uniduino nella gerarchia. Ne abbiamo bisogno per parlare tra il nostro gioco e il controller.
Nel clic di gerarchia Unity Crea> Sfera e utilizzare la scheda Trasforma in Impostazioni per spostarla nella parte inferiore della schermata di gioco.
È tempo di ottenere il codice
Ora per aggiungere del codice a questa festa. Con la sfera selezionata nella gerarchia, fare clic su Aggiungi componente> Nuovo script in fondo alla finestra di Inspector. Nominalo sphereMover e selezionare C Sharp dal menu a discesa. 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:
usando UnityEngine; usando System.Collections; usando Uniduino; public class sphereMover: MonoBehaviour // Le intestazioni non sono necessariamente superflue, ma rendono l'intera vita più facile nell'Inspector. [Intestazione ("Variabili Arduino")] // è necessario dichiarare l'Arduino come una variabile Arduino arduino pubblico; // dobbiamo dichiarare un numero intero per il numero pin del nostro potenziometro, // rendere pubbliche queste variabili significa che possiamo cambiarle nell'editor in seguito // se cambiamo il layout del nostro arduino public int potPinNumber; // una variabile mobile per contenere il valore del potenziometro (0 - 1023) public float potValue; // rimapparemo in seguito quel potValue alla posizione y della nostra capsula e lo terremo in questa variabile public float mappedPot; // public int per il nostro pulsante pin public int buttonPinNumber; [Header ("Sphere Variables")] // variabili per contenere i valori che abbiamo notato in precedenza per i lati del nostro schermo public float leftEdge; public float rightEdge; // Usa questo per l'inizializzazione void Start () // e inizializziamo, a partire dalla variabile Arduino. // stiamo usando solo un arduino, quindi possiamo usare Arduino.global per afferrarlo. arduino = Arduino.global; arduino.Setup (ConfigurePins); void ConfigurePins () // configura il pin Arduino come analogico per il nostro potenziometro arduino.pinMode (potPinNumber, PinMode.ANALOG); // Dì all'arduino di segnalare eventuali cambiamenti nel valore del nostro potenziometro arduino.reportAnalog (5, 1); // configura il nostro Button pin arduino.pinMode (buttonPinNumber, PinMode.INPUT); arduino.reportDigital ((byte) (buttonPinNumber / 8), 1);
Prenditi un momento per leggere i commenti del codice. Finora, abbiamo dichiarato alcune variabili per il nostro Arduino, i suoi pin e la nostra sfera. Abbiamo anche usato il
Start e ConfigurePins per inizializzare il nostro Arduino in fase di esecuzione. Salviamo il nostro script e torniamo nell'editor Unity per vedere cosa è cambiato.
Ora possiamo vedere le nostre variabili pubbliche nella finestra dell'Inspector. Vediamo cosa possiamo entrare in questa fase per aiutarci più tardi. Sappiamo quali pin stiamo usando su Arduino dalla nostra build in precedenza, possiamo inserirli. Sappiamo anche dal nostro esperimento prima di quanto lontano vogliamo che la nostra sfera sia in grado di viaggiare a sinistra ea destra in modo che non cada dallo schermo. Inseriamo questi valori ora.
Primi segni di vita
È tempo di vedere i valori dal nostro Arduino all'interno di Unity Editor. Per ora, possiamo aggiungere una riga di codice alla nostra funzione di aggiornamento dello script sphereMover e salvare di nuovo lo script.
void Update () // Assegniamo il valore che l'arduino legge dal nostro potentionmeter alla nostra variabile potValue potValue = arduino.analogRead (potPinNumber);
Ora che abbiamo la nostra variabile potValue aggiornata ogni frame, possiamo vedere il suo valore in tempo reale in Unity Inspector. Prima di dargli un test, ora sarebbe un buon momento per verificare che il plug-in Uniduino stia ascoltando sulla porta giusta. Fai clic su Uniduino in the Heirarchy e controlla il suo Port Name nell'Inspector. Se è vuoto, inserisci il numero di porta corretto per Arduino. In questo caso era COM4, anche se potrebbe essere diverso per te. Verifica se usi l'IDE Arduino se non sei sicuro.
Seleziona la sfera nella gerarchia e fai clic sul pulsante Riproduci nella parte superiore dello schermo. Il sistema necessita di alcuni secondi per inizializzarsi, dopodiché dovresti iniziare a vedere la variazione della Variazione del Pot Value nell'ispettore quando muovi il potenziometro.
Adesso stiamo parlando! Bene, in senso stretto Unità e l'Arduino stanno parlando, ma chi sta contando? Se sei arrivato così lontano e non vedi il cambio di valore nell'ispettore, controlla i passaggi di configurazione e assicurati di aver selezionato la porta corretta per il tuo Arduino.
Spostiamo questa sfera
Ora che abbiamo aggiornato la variabile potValue in fase di aggiornamento, vogliamo utilizzare 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 Vector, determinato dai valori di Transform.position. Nell'immagine in basso, dove la sfera si trova nel punto più lontano a sinistra, la vogliamo, puoi vedere che il suo vettore di posizione è 9,5, -4, 0.
Vogliamo influenzare la posizione X della sfera. Sfortunatamente l'uso dei valori dal nostro potenziometro non funzionerà direttamente, poiché quando il potenziometro è completamente a sinistra, fornisce un valore pari a 0, il che metterebbe la nostra sfera proprio nel mezzo dello schermo. All'altro estremo, il valore superiore del potenziometro, 1023, posizionerebbe la via del cubo a destra del nostro schermo. Inutile. Quello di cui abbiamo bisogno qui è un po 'di matematica.
Perché fare la matematica quando l'unità lo farà per te?
Per quelli di voi là fuori che temono fissando un pezzo di carta ricoperto di numeri insensati (anche se ci sono alcuni grandi siti web I 20 siti web che devi imparare passo dopo passo i 20 siti web che devi imparare passo dopo passo la matematica Abbiamo compilato il i migliori siti per ogni livello in modo che possiate imparare sistematicamente, acquisire una conoscenza migliore della matematica un livello alla volta e divertirvi! Per saperne di più che possono aiutarvi ad imparare la matematica), non temete. Abbiamo bisogno di un modo per fare in modo che i nostri valori del potenziometro corrispondano alla posizione X della nostra sfera. Fortunatamente, possiamo usare un Metodo di estensione.
Un metodo di estensione è uno script che fa un lavoro specifico per noi. In questo caso, gli diamo i valori che abbiamo, e li restituisce mappati l'uno con l'altro, pronti per essere usati nel nostro sphereMover script. Nella parte superiore del pannello Progetto, fai clic su Crea> Script C # e chiamarlo ExtensionMethods. Inserisci il codice qui sotto nella sceneggiatura:
usando UnityEngine; usando System.Collections; public static class ExtensionMethods // la nostra pratica funzione di rimappatura dandy public static float Rimappa (questo valore float, float da1, float to1, float from2, float to2) return (valore - from1) / (to1 - from1) * (to2 - da2) + da2;
Salva lo script e torna allo script sphereMover. Ora possiamo usare questa funzione di rimappatura nel nostro script ExtensionMethods nella nostra funzione di aggiornamento per convertire i valori del potenziometro in valori utilizzabili nel nostro gioco. Sotto il punto in cui abbiamo appena assegnato la variabile potValue, digita quanto segue:
Il prompt indica che il nostro Remap prende due serie 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 del vaso mappato cambia quando muovi il potenziometro, per corrispondere ai valori che abbiamo determinato per i nostri bordi sinistro e destro. Prenditi un momento per sederti e ringrazia il tuo script ExtensionMethods. Non una calcolatrice in vista.
Nota: se stai notando che i tuoi valori sono invertiti, così quando il tuo potenziometro è completamente a destra ottieni un valore negativo per la tua variabile del Piatto mappato, potresti avere il potenziometro impostato nel modo sbagliato. Fortunatamente, puoi sistemarlo senza ricablare. Puoi semplicemente cambiare i valori quando li rimappi:
Ora finalmente abbiamo valori utilizzabili. Ora tutto ciò che resta da fare è assegnare quei valori alla posizione X della nostra sfera:
// Assegna il valore del vaso mappato alla posizione x della sfera 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 sfera a sinistra e a destra usando il 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 arriviamo in una posizione ristretta? Useremo il nostro pulsante per rallentare il tempo nel nostro gioco. Apri lo script sphereMover e aggiungi questo codice alla funzione di aggiornamento
// se Unity rileva che il pulsante è premuto, la scala temporale rallenta se (arduino.digitalRead (buttonPinNumber) == 1) Time.timeScale = 0.4f; else Time.timeScale = 1.0f;
Ora abbiamo i meccanismi del nostro gioco, aggiungiamo alcuni ostacoli! Useremo il nemico naturale della sfera, il cubo. Nella gerarchia, fare clic Crea> Oggetto 3d> Cubo. Nell'ispettore del cubo, Aggiungi componente> Fisica> Corpo rigido. Impostare il valore Trascinamento del corpo rigido su 5. Inoltre, sotto il componente Collimatore di caselle nell'ispettore, selezionare Is Trigger. Ciò ci consentirà di rilevare le collisioni con la nostra sfera.
Crea uno script sul cubo e chiamalo collideWithSphere, apri lo script ed elimina le funzioni di avvio e aggiornamento poiché questa volta non avremo bisogno di loro. Inserisci questo codice:
usando UnityEngine; usando System.Collections; collisione di classe pubblicaWithSphere: MonoBehaviour void OnTriggerEnter (Collider other) Destroy (other.gameObject);
OnTriggerEnter invia un messaggio ogni volta che il collisore di trigger colpisce un altro collisore. In questo caso, stiamo dicendo di distruggere tutto ciò che tocca. Salva lo script e torna all'editor 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 salvato nel nostro progetto. Elimina il tuo cubo dalla gerarchia ora.
Tutto ciò di cui abbiamo bisogno ora è uno script per generare i cubi. Nella gerarchia clicca Crea> Crea vuoto, e rinominalo in Game Manager in Inspector e aggiungi uno script chiamato gameManager. Apri lo script e aggiungi questo codice:
usando UnityEngine; usando System.Collections; gioco di classe pubblicaManager: MonoBehaviour // una variabile per contenere il prefabbricato vogliamo generare pubblico GameObject cubo; // vogliamo che alcune variabili decidano come i cubi da generare // e quanto in alto sopra di noi vogliamo che generino public int numberToSpwan; public float lowestSpawnheight; public float highestSpawnheight; // Usa questo per l'inizializzazione 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 ()
Salva lo script. Tornati nell'editor, selezionate il Game Manager nella gerarchia e trascinate il prefabbricato del cubo dal pannello del progetto alla variabile Cube nell'Inspector. Compila anche qui i valori per la tua deposizione delle uova. Puoi giocherellare con esso per renderlo duro o facile come ti piace. Nota che vale la pena di generare i cubi più bassi abbastanza in alto da permettere all'inizializzazione di Uniduino - perdere la partita prima che tu possa muoverti può essere frustrante!
Il progetto finito
Ora quando premi play, i cubi si apriranno sopra di te e cadranno. Puoi usare il 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 persino jam di gioco specializzati in controller personalizzati.
Con Arduino e Unity è possibile creare un controller personalizzato da quasi tutto. Hai creato un hi-fi che controlla un veicolo spaziale? Un tostapane che controlla un gioco platform?
Se hai realizzato un progetto come questo mi piacerebbe vederlo! Pubblicalo nei commenti qui sotto!
Scopri di più su: Arduino, controller di gioco, sviluppo di giochi, programmazione.