Jak zrobić niestandardowy kontroler gier z Arduino i Unity?

Jak zrobić niestandardowy kontroler gier z Arduino i Unity?

Czy kiedykolwiek chciałeś zaprojektować własny kontroler do gier? To prostsze niż myślisz!





W tym krótkim projekcie zbudujemy prosty niestandardowy kontroler gier do użycia z silnikiem gry Unity. Ten kontroler będzie zasilany przez Arduino Uno, chociaż możesz również użyć jednej z wielu alternatyw dla tego projektu. Stworzymy również podstawową grę, w której użyjesz swojego kontrolera, aby uniknąć spadających przedmiotów i spowolnić czas.





Do tego projektu, którego będziesz potrzebować

  • Arduino lub podobny mikrokontroler
  • Rezystor 1x10 k Ohm
  • 1 x chwilowy przełącznik
  • 1 x potencjometr
  • Przewody przyłączeniowe
  • Deska do krojenia chleba
  • Silnik gry Unity
  • Wtyczka Uniduino ze sklepu Unity Asset Store (30 USD)
  • Kompletny kod projektu, jeśli nie chcesz go pisać (nie zawiera wtyczki Uniduino)

Większość z tych rzeczy jest dostępna w zestawie startowym Arduino. Jeśli nie masz zestawu startowego, zapoznaj się z naszym przewodnikiem, aby wybrać najlepszy dla siebie.





Możesz uczynić swój kontroler tak skomplikowanym, jak tylko chcesz, ale w tym przykładzie skonfigurujemy potencjometr i przycisk - idealne do sterowania prostą grą zręcznościową.

Montaż kontrolera

Skonfiguruj płytkę prototypową i Arduino, jak pokazano na poniższym obrazku. To jest to, czego będziemy używać jako naszego kontrolera gier, chociaż możesz użyć prawie takiej samej konfiguracji, jak DIY kontroler midi także!



Przygotowanie Arduino

Po podłączeniu wszystkiego podłącz Arduino przez USB. W Arduino Software IDE przejdź do Narzędzia > Tablica oraz Narzędzia > Port aby wybrać używany mikrokontroler i port. Arduino IDE jest dostarczane wraz ze szkicem, którego potrzebujemy, i można go znaleźć poniżej Plik> Przykłady> Firmata> StandardFirmata . Kliknij Prześlij i będziesz gotowy do pracy.

Jeśli jesteś nowy w Arduino i twoja głowa lekko się topi, sprawdź nasze Przewodnik dla początkujących aby pomóc Ci ładnie rozmawiać z komputerem.





Konfiguracja projektu Unity

W Jedności otwórz Okno > Magazyn zasobów aby uzyskać dostęp do magazynu zasobów Unity z poziomu edytora Unity. Wyszukaj w Asset Store wtyczkę Uniduino. Ta wtyczka pozwoli ci odbierać i wysyłać dane do iz pinów Arduino w Unity. Wtyczka w momencie pisania kosztuje 30 USD. To jest możliwe zrobić ten projekt bez kupowania wtyczki, chociaż jest to bardziej skomplikowane i może się okazać, że wtyczka jest wygodniejsza przez cały czas.

Ten film od twórców wtyczki przeprowadzi Cię przez proces testowania wszystkiego, co działa, wraz z pierwszą konfiguracją. Pamiętaj, że może być konieczne zresetowanie edytora Unity w systemie Windows.





Możemy użyć tego samego panelu testowego do przetestowania naszego kontrolera. Ustaw Pin D2 na INPUT i Digital. Dalej w dół ustaw Pin A5 na ANALOG. Twój potencjometr i przycisk powinny teraz wyświetlać wartości na ekranie obok numerów pinów. Postęp!

Teraz zrobimy coś, co możemy kontrolować

Więc mamy kontrolera, ale co mamy kontrolować? Cóż, możliwości są nieograniczone, ale na dziś stworzymy bardzo prostą grę w uniki, aby przetestować nasz nowy system sterowania. Dość szybko przejdziemy do konfiguracji gry, więc jeśli jesteś zupełnie nowy w silniku Unity, możesz znaleźć nasz Przewodnik dla początkujących do programowania gier w Unity przydatne, aby się zorientować.

Zbudujemy bardzo podstawową grę, w której Twoim celem jest unikanie swojej kuli w lewo i w prawo, aby uniknąć spadających kostek, które wykorzystają Twój nowo wykonany niestandardowy kontroler.

Utwórz nową scenę i przeciągnij prefabrykat Uniduino z Zasoby > Uniduino > Prefabrykaty do swojej hierarchii i przeciągnij prefabrykaty Uniduino do hierarchii. Potrzebujemy go tam, aby rozmawiać między naszą grą a kontrolerem.

W hierarchii Unity kliknij Utwórz > Kula i użyj zakładki Transform w Inspektorze, aby przenieść ją na dół ekranu gry.

Czas zacząć kodować

Teraz dodam trochę kodu do tej imprezy. Po wybraniu sfery w hierarchii kliknij Dodaj komponent > Nowy skrypt na dole okna Inspektora. Nazwij to sferaMover i wybierz C Ostry z menu rozwijanego. Kliknij Utwórz i dodaj a skrypt zostanie dodany do GameObject. Kliknij go dwukrotnie, aby otworzyć skrypt i wprowadź ten kod:

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

Poświęć chwilę na przeczytanie komentarzy do kodu. Do tej pory zadeklarowaliśmy kilka zmiennych dla naszego Arduino, jego pinów i naszej Sfery. Wykorzystaliśmy również

Metody Start i ConfigurePins do inicjalizacji naszego Arduino w czasie wykonywania. Zapiszmy nasz skrypt, wróćmy do edytora Unity i zobaczmy, co się zmieniło.

Możemy teraz zobaczyć nasze zmienne publiczne w oknie Inspektora. Zobaczmy, w co możemy wejść na tym etapie, aby później nam pomóc. Wiemy, jakiego pinu używamy w Arduino z naszej kompilacji wcześniej, możemy je wprowadzić. Wiemy również z naszego wcześniejszego eksperymentu, jak daleko chcemy, aby nasza kula mogła się przemieszczać w lewo iw prawo, aby nie spadła z ekranu. Wprowadźmy teraz te wartości.

Pierwsze oznaki życia

Czas zobaczyć wartości z naszego Arduino w edytorze Unity. Na razie możemy dodać jedną linię kodu do funkcji Update naszego skryptu sphereMover i ponownie zapisać skrypt.

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

Teraz, gdy nasza zmienna potValue jest aktualizowana w każdej klatce, możemy zobaczyć jej wartość w czasie rzeczywistym w Unity Inspector. Zanim go przetestujemy, teraz jest dobry moment, aby sprawdzić, czy wtyczka Uniduino nasłuchuje na właściwym porcie. Kliknij Uniduino w Heirarchy i sprawdź nazwę portu w Inspektorze. Jeśli jest puste, wpisz poprawny numer portu dla swojego Arduino. W tym przypadku był to COM4, ​​choć dla Ciebie może być inaczej. Sprawdź za pomocą Arduino IDE, jeśli nie masz pewności.

Wybierz swoją sferę w hierarchii i kliknij przycisk Odtwórz u góry ekranu. System potrzebuje kilku sekund na inicjalizację, po czym powinieneś zacząć widzieć zmianę zmiennej Pot Value w inspektorze, gdy poruszasz potencjometrem.

Teraz rozmawiamy! Cóż, ściśle mówiąc Unity i Arduino rozmawiają, ale kto to liczy? Jeśli dotarłeś tak daleko i nie widzisz zmiany wartości w inspektorze, sprawdź kroki konfiguracji i upewnij się, że masz wybrany właściwy port dla swojego Arduino.

Przenieśmy tę sferę

Teraz, gdy mamy aktualizowaną zmienną potValue, chcemy użyć tej wartości do przesunięcia naszej sfery. Gdy potencjometr jest maksymalnie w lewo, chcemy, aby kula znajdowała się po lewej stronie ekranu i na odwrót. Obiekty w Unity są umieszczone w punkcie w przestrzeni Vector, określonym przez wartości tego Pozycja.transformacji . Na poniższym obrazku, gdzie sfera znajduje się najdalej na lewo, chcielibyśmy jej, widać, że jej wektor pozycji to 9,5, -4, 0.

Chcemy wpłynąć na pozycję X kuli. Niestety użycie wartości z naszego potencjometru bezpośrednio nie zadziała, ponieważ gdy potencjometr jest maksymalnie w lewo, daje wartość 0 -- co umieściłoby naszą sferę dokładnie na środku ekranu. Z drugiej strony, najwyższa wartość potencjometru, 1023, umieszcza sześcian daleko po prawej stronie naszego ekranu. Nieużyteczne. Potrzebujemy tu trochę matematyki.

Dlaczego matematyka, kiedy Unity zrobi to za Ciebie?

Dla tych z was, którzy boją się wpatrywać w kartkę papieru pokrytą bezsensownymi liczbami (chociaż są świetne strony internetowe które mogą ci pomóc w nauce matematyki), nie bój się. Potrzebujemy sposobu, aby nasze wartości potencjometru odpowiadały pozycji naszej sfery X. Na szczęście możemy użyć Metoda rozszerzenia .

Metoda rozszerzenia to skrypt, który wykonuje za nas określoną pracę. W tym przypadku nadajemy mu wartości, które posiadamy, a zwraca je zmapowane do siebie, gotowe do użycia w naszym sferaMover scenariusz. W górnej części panelu Projekt kliknij Utwórz > Skrypt C# i nazwij go ExtensionMethods. Wpisz poniższy kod do skryptu:

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

Zapisz skrypt i wróć do skryptu sphereMover. Możemy teraz użyć tej funkcji Remap w naszym skrypcie ExtensionMethods w naszej funkcji Update, aby przekonwertować nasze wartości potencjometrów na wartości użyteczne w naszej grze. W miejscu, w którym właśnie przypisaliśmy zmienną potValue, wpisz:

Monit pokazuje nam, że nasza Remap bierze dwa zestawy wartości Od i Do i mapuje je razem. Możemy w to wpisać nasze wartości.

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

Zapisz swój skrypt, wróć do edytora Unity i naciśnij przycisk odtwarzania. Powinieneś teraz zobaczyć, że zmienna Mapped Pot zmienia się po przesunięciu potencjometru, aby odpowiadała wartościom, które określiliśmy dla naszych lewej i prawej krawędzi. Poświęć chwilę, aby usiąść wygodnie i podziękować skryptowi ExtensionMethods. Nie widać kalkulatora.

Uwaga: jeśli zauważysz, że twoje wartości są odwrócone, więc gdy twój potencjometr znajduje się całkowicie w prawo, otrzymujesz ujemną wartość zmiennej mapowanej puli, możesz mieć ustawiony potencjometr w niewłaściwy sposób. Na szczęście możesz to naprawić bez konieczności zmiany okablowania. Możesz po prostu zmienić wartości, gdy je zmienisz:

Teraz w końcu mamy wartości użytkowe. Teraz wystarczy tylko przypisać te wartości do pozycji X naszej sfery:

najlepsza stacja ładowania jabłek 3 w 1
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

Zapisz swój skrypt, wróć do edytora Unity i naciśnij play. Powinieneś teraz być w stanie przesuwać Sferę w lewo i prawo za pomocą potencjometru!

Wprowadzenie przycisku do pracy

Teraz, kiedy nasza sfera się porusza, czy nie byłoby miło mieć sposób, aby trochę zwolnić, gdy znajdziemy się w ciasnej sytuacji? Użyjemy naszego przycisku, aby spowolnić czas w naszej grze. Otwórz skrypt sphereMover i dodaj ten kod do funkcji aktualizacji

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

Teraz mamy mechanikę naszej gry, dodajmy kilka przeszkód! Użyjemy naturalnego wroga kuli, sześcianu. W hierarchii kliknij Utwórz > Obiekt 3D > Kostka . W inspektorze kostki Dodaj komponent > Fizyka > Rigidbody . Ustaw wartość przeciągania korpusu sztywnego na 5. Ponadto w komponencie Box Collider w inspektorze wybierz opcję Jest wyzwalaczem. To pozwoli nam wykryć kolizje z naszą Sferą.

Utwórz skrypt na kostce i nazwij go zderzyć się ze sferą , otwórz skrypt i usuń funkcje Start i Update, ponieważ tym razem nie będą nam potrzebne. Wpisz ten kod:

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

OnTriggerEnter wysyła komunikat, gdy zderzacz wyzwalacza uderza w inny zderzacz. W tym przypadku mówimy mu, aby zniszczył wszystko, czego dotknie. Zapisz skrypt i wróć do edytora Unity. Przeciągnij kostkę z hierarchii do panelu Projekt. Zauważysz, że tekst kostki w hierarchii zmienił kolor na niebieski. To dlatego, że stworzyliśmy prefabrykat i zapisaliśmy go w naszym projekcie. Usuń teraz swoją kostkę z hierarchii.

Wszystko, czego teraz potrzebujemy, to skrypt do odrodzenia kostek. W hierarchii kliknij Utwórz > Utwórz puste i zmień jego nazwę na Game Manager w Inspektorze i dodaj do niego skrypt o nazwie gameManager. Otwórz skrypt i dodaj ten kod:

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

}
}

Zapisz skrypt. Wróć do edytora, wybierz Menedżera gier w hierarchii i przeciągnij prefabrykat kostki z panelu projektu do zmiennej Cube w Inspektorze. Wypełnij tutaj również wartości dla twojego odradzania. Możesz się z nim bawić, aby było to tak trudne lub łatwe, jak chcesz. Pamiętaj, że warto, aby najniższe kostki były wystarczająco wysokie, aby umożliwić inicjalizację Uniduino – przegranie gry, zanim będziesz mógł się poruszyć, może być frustrujące!

Gotowy projekt

Teraz, gdy naciśniesz przycisk odtwarzania, kostki pojawią się nad tobą i spadną. Możesz użyć potencjometru, aby ich uniknąć, a przycisku, aby spowolnić czas.

W tym projekcie stworzyliśmy niestandardowy kontroler z Arduino, skonfigurowaliśmy Unity i Uniduino do komunikacji z nim oraz stworzyliśmy prostą grę do przetestowania. Koncepcje tutaj można zastosować do prawie każdego projektu, a są nawet game jam, które specjalizują się w niestandardowych kontrolerach .

Dzięki Arduino i Unity możesz stworzyć niestandardowy kontroler z prawie wszystkiego. Czy stworzyłeś system hi-fi, który steruje statkiem kosmicznym? Toster, który steruje grą platformową?

Jeśli stworzyłeś taki projekt, chciałbym go zobaczyć! Opublikuj to w komentarzach poniżej!

Udział Udział Ćwierkać E-mail 6 dźwiękowych alternatyw: najlepsze darmowe lub tanie aplikacje do audiobooków

Jeśli nie masz ochoty płacić za audiobooki, oto kilka świetnych aplikacji, które pozwolą Ci ich słuchać bezpłatnie i legalnie.

Czytaj dalej
Powiązane tematy
  • majsterkowanie
  • Programowanie
  • Arduino
  • Kontroler gry
  • Produkcja gier
O autorze Ian Buckley(216 opublikowanych artykułów)

Ian Buckley jest niezależnym dziennikarzem, muzykiem, performerem i producentem wideo mieszkającym w Berlinie w Niemczech. Kiedy nie pisze ani nie występuje na scenie, majstruje przy elektronice DIY lub kodowaniu w nadziei, że zostanie szalonym naukowcem.

Więcej od Iana Buckleya

Zapisz się do naszego newslettera

Dołącz do naszego newslettera, aby otrzymywać porady techniczne, recenzje, bezpłatne e-booki i ekskluzywne oferty!

Kliknij tutaj, aby zasubskrybować