Jak stworzyć niestandardowy kontroler gier z Arduino i Unity

  • Lesley Fowler
  • 0
  • 3235
  • 817
Reklama

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

W tym krótkim projekcie zbudujemy prosty niestandardowy kontroler gier do użytku z silnikiem gry Unity. Ten kontroler będzie zasilany przez Arduino Uno, chociaż możesz skorzystać z jednej z wielu alternatyw Przewodnik po zakupach Arduino: Którą płytę powinieneś dostać? Poradnik kupujący Arduino: Którą deskę powinieneś dostać? Jest tak wiele różnych rodzajów tablic Arduino, że wybaczono by ci, że jesteś zdezorientowany. Który powinieneś kupić dla swojego projektu? Pomóż nam, korzystając z tego przewodnika zakupów Arduino! tam również dla tego projektu. Stworzymy również podstawową grę, w której będziesz używać kontrolera, aby uniknąć spadających przedmiotów i spowolnić czas.

Do tego projektu będziesz potrzebować

  • Arduino lub podobny mikrokontroler
  • Rezystor 1 x 10k Ohm
  • 1 x Przełącznik chwilowy
  • 1 x potencjometr
  • Druty do podwieszania
  • Deska do krojenia
  • Silnik gry Unity
  • Wtyczka Uniduino z Unity Asset Store (30 USD)
  • Uzupełnij kod projektu, jeśli nie chcesz go wypisywać (nie zawiera wtyczki Uniduino)

Większość tych rzeczy jest dostępna w zestawie startowym Arduino. Jeśli nie masz zestawu startowego, zapoznaj się z naszym przewodnikiem wyboru najlepszych 4 zestawów startowych dla początkujących Arduino 4 zestawów startowych dla początkujących Arduino Istnieje wiele świetnych projektów Arduino dla początkujących, z których możesz zacząć, ale będziesz najpierw potrzebuję Arduino i niektórych komponentów. Oto nasz wybór 4 najlepszych zestawów startowych dla… jednego dla Ciebie.

Możesz sprawić, by kontroler był tak skomplikowany, jak chcesz, ale w tym przykładzie ustawimy potencjometr i przycisk - idealny do sterowania prostą grą zręcznościową.

Montaż kontrolera

Skonfiguruj swoją płytkę ścienną i Arduino, jak pokazano na obrazku poniżej. Tego będziemy używać jako naszego kontrolera gier, chociaż możesz użyć prawie takiej samej konfiguracji jak DIY kontroler midi Jak zrobić kontroler MIDI z Arduino Jak zrobić kontroler MIDI z Arduino Jako muzyk, który zgromadził kolekcja instrumentów muzycznych i skrzynek szumowych, skromne Arduino to idealne narzędzie do stworzenia niestandardowego kontrolera MIDI. zbyt!

Przygotowując swoje Arduino

Po skonfigurowaniu połączenia podłącz Arduino przez USB. W Arduino Software IDE przejdź do Narzędzia> Płyta i Narzędzia> Port aby wybrać używany mikrokontroler i port. Arduino IDE jest dostarczane w zestawie ze szkicem, którego potrzebujemy, i można go znaleźć pod Plik> Przykłady> Firmata> StandardFirmata. Kliknij Prześlij i będziesz gotowy do pracy.

Jeśli dopiero zaczynasz przygodę z Arduino, a głowa lekko się topi, zapoznaj się z naszym Przewodnikiem dla początkujących Rozpoczęcie pracy z Arduino: Przewodnik dla początkujących Rozpoczęcie pracy z Arduino: Przewodnik dla początkujących Arduino to platforma prototypowania elektroniki typu open source oparta na elastycznej, łatwej w obsłudze korzystać ze sprzętu i oprogramowania. Jest przeznaczony dla artystów, projektantów, hobbystów i wszystkich zainteresowanych tworzeniem interaktywnych obiektów lub środowisk. aby pomóc ci ładnie rozmawiać z komputerem.

Konfigurowanie projektu Unity

W Unity otwórz Okno> Asset Store aby uzyskać dostęp do Asset Store Unity z poziomu edytora Unity. Wyszukaj w Asset Store wtyczkę Uniduino. Ta wtyczka pozwoli ci odbierać i wysyłać dane do i z twoich pinów Arduino wewnątrz Unity. Wtyczka w momencie pisania kosztuje 30 USD. Możliwe jest wykonanie tego projektu bez kupowania wtyczki, choć jest to bardziej skomplikowane i może okazać się wygodniejsze.

Ten film od twórców wtyczki prowadzi przez proces testowania, czy wszystko 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. W dalszej części ustaw Pin A5 na ANALOG. Twój potencjometr i przycisk powinny teraz wyświetlać wartości na ekranie obok ich numerów pinów. Postęp!

Teraz zrobić coś, co możemy kontrolować

Mamy więc kontrolera, ale co mamy kontrolować? Cóż, możliwości są nieograniczone, ale na dziś stworzymy bardzo prostą grę uników, aby przetestować nasz nowy system sterowania. Szybko przejdziemy do konfiguracji gry, więc jeśli jesteś zupełnie nowy w silniku Unity, możesz znaleźć nasz Unity Programowanie gry Przewodnik dla początkujących Programowanie gry z Unity: Przewodnik dla początkujących Programowanie gry z Unity: Przewodnik dla początkujących W trakcie ewolucji krajobraz niezależnego rozwoju gier, Unity okazał się czymś w rodzaju de facto standardu: jego niski koszt, łatwość użycia i szeroki zestaw funkcji sprawiają, że jest idealny do szybkiego tworzenia gier. przydatne, aby uzyskać orientację.

Zbudujemy bardzo podstawową grę, w której Twoim celem jest uniknięcie kuli w lewo i w prawo, aby uniknąć spadających kostek, która wykorzysta nowo utworzony niestandardowy kontroler.

Utwórz nową scenę i przeciągnij prefabrykat Uniduino Aktywa> Uniduino> Prefabrykaty do swojej hierarchii i przeciągnij prefabrykat 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 Przekształć w Inspektorze, aby przenieść ją na dół ekranu gry.

Czas na kodowanie

Teraz dodaj kod do tej imprezy. Po wybraniu sfery w Hierarchii kliknij Dodaj komponent> Nowy skrypt w dolnej części okna Inspektora. Nazwij to sphereMover i wybierz C Sharp z rozwijanego menu. 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; za pomocą Uniduino; public public sphereMover: MonoBehaviour // Nagłówki nie są konieczne, ale ułatwiają życie Inspektorowi. [Nagłówek („Zmienne Arduino”)] // musimy zadeklarować Arduino jako zmienną publiczną Arduino arduino; // musimy zadeklarować liczbę całkowitą dla numeru pinu naszego potencjometru, // upublicznienie tych zmiennych oznacza, że ​​możemy je zmienić w edytorze później // jeśli zmienimy układ naszej arduino public int potPinNumber; // zmienna zmiennoprzecinkowa do przechowywania wartości potencjometru (0 - 1023) public float potValue; // później zmienimy mapowanie tej potValue do pozycji y naszej kapsuły i utrzymamy ją w tej zmiennej public float mappedPot; // public int dla naszego przycisku przypnij public int buttonPinNumber; [Header („Sphere Variables”)] // zmienne do przechowywania wartości, które zanotowaliśmy wcześniej dla boków naszego publicznego ekranu pływającego leftEdge; public float rightEdge; // Użyj tego do inicjalizacji void Start () // i zainicjuj będziemy, zaczynając od zmiennej Arduino. // używamy tylko jednego arduino, więc możemy użyć Arduino.global, aby go złapać. arduino = Arduino.global; arduino.Setup (ConfigurePins);  void ConfigurePins () // skonfiguruj pin Arduino, aby był analogowy dla naszego potencjometru arduino.pinMode (potPinNumber, PinMode.ANALOG); // Powiedz Arduino, aby zgłosił wszelkie zmiany wartości naszego potencjometru arduino.reportAnalog (5, 1); // skonfiguruj nasz 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 niektóre zmienne dla naszego Arduino, jego pinów i naszej Sfery. Korzystaliśmy również z
Metody Start i ConfigurePins do inicjalizacji naszego Arduino w czasie wykonywania. Zapiszmy nasz skrypt i wróćmy do edytora Unity i zobaczmy, co się zmieniło.

Teraz możemy zobaczyć nasze zmienne publiczne w oknie Inspektora. Zobaczmy, co możemy wprowadzić na tym etapie, aby pomóc nam później. Wiemy, jakich pinów używamy na Arduino z naszej kompilacji wcześniej, możemy do nich wejść. Z naszego eksperymentu wiemy też wcześniej, jak daleko chcemy, aby nasza kula mogła podróżować w lewo i prawo, aby nie spadła z ekranu. Pozwala teraz wprowadzić te wartości.

Pierwsze oznaki życia

Czas zobaczyć wartości z naszego Arduino w edytorze Unity. Na razie możemy dodać jeden wiersz kodu do funkcji aktualizacji skryptu sphereMover i ponownie zapisać skrypt.

void Update () // Przypisujemy wartość, którą arduino odczytuje z naszego potencjometru do naszej zmiennej potValue potValue = arduino.analogRead (potPinNumber);  

Teraz, gdy nasza zmienna potValue jest aktualizowana w każdej ramce, możemy zobaczyć jej wartość w czasie rzeczywistym w Inspektorze Unity. Zanim przetestujemy, nadszedł dobry moment, aby sprawdzić, czy wtyczka Uniduino nasłuchuje na odpowiednim porcie. Kliknij Uniduino w Heirarchy i sprawdź nazwę portu w Inspektorze. Jeśli jest pusty, wpisz poprawny numer portu dla Arduino. W tym przypadku był to COM4, ​​choć może być inny dla Ciebie. Sprawdź, korzystając z Arduino IDE, jeśli nie jesteś pewien.

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

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

Przenieśmy tę sferę

Teraz, gdy mamy aktualizowaną zmienną potValue, chcemy użyć tej wartości do przesunięcia naszej kuli. Kiedy potencjometr jest maksymalnie w lewo, chcemy, aby kula znajdowała się po lewej stronie ekranu i odwrotnie. Obiekty w Jedności są ustawiane w punkcie w przestrzeni Wektorowej, określonym przez wartości jego pozycji Transform.position. Na poniższym zdjęciu, gdzie kula znajduje się w najdalszym punkcie po lewej stronie, chcielibyśmy jej, możesz zobaczyć, że jej wektor pozycji to 9.5, -4, 0.

Chcemy wpływać na pozycję X kuli. Niestety użycie wartości z naszego potencjometru bezpośrednio nie będzie działać, ponieważ gdy potencjometr jest maksymalnie w lewo, daje wartość 0 - co umieściłoby naszą kulę na środku ekranu. Z drugiej strony, najwyższa wartość potencjometru, 1023, umieściłaby sześcian daleko na prawo od naszego ekranu. Nieużyteczny. Potrzebujemy tutaj matematyki.

Po co robić matematykę, gdy jedność zrobi to za was?

Dla tych z was, którzy boją się wpatrywać się w kartkę papieru pokrytą nonsensownymi liczbami (choć istnieją świetne strony internetowe. 20 stron internetowych, których musisz nauczyć się matematyki krok po kroku. 20 stron internetowych, których musisz nauczyć się matematyki, krok po kroku. najlepsze strony dla każdego poziomu, abyś mógł systematycznie uczyć się, lepiej rozumieć matematykę na jednym poziomie na raz i dobrze się bawić !, które pomogą Ci nauczyć się matematyki), nie bój się. Potrzebujemy sposobu, aby nasze wartości potencjometru odpowiadały pozycji X naszej kuli. Na szczęście możemy użyć Metoda przedłużenia.

Metoda rozszerzenia to skrypt, który wykonuje dla nas określone zadanie. W tym przypadku podajemy mu wartości, które mamy, i zwraca je zamapowane względem siebie, gotowe do użycia w naszym sphereMover scenariusz. U góry 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 // nasza przydatna funkcja eleganckiego remapera public public float Remap (ta wartość float, float from1, float to1, float from2, float to2) return (wartość - from1) / (to1 - from1) * (to2 - od 2) + od 2; 

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

Znak zachęty pokazuje nam, że nasze mapowanie pobiera dwa zestawy wartości Od i Do i mapuje je razem. Możemy wprowadzić w to nasze wartości.

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

Zapisz skrypt, wróć do edytora Unity i naciśnij przycisk odtwarzania. Powinieneś teraz zobaczyć, że zmienna Zmapowana doniczka zmienia się, gdy poruszasz potencjometrem, aby odpowiadać wartościom, które ustaliliśmy dla naszych Lewych i Prawych Krawędzi. Poświęć chwilę i usiądź i podziękuj swojemu skryptowi ExtensionMethods. W zasięgu wzroku nie ma kalkulatora.

Uwaga: jeśli zauważysz, że twoje wartości są odwrócone, więc kiedy potencjometr jest całkowicie w prawo, otrzymujesz wartość ujemną dla zmiennej Zmapowanego Potu, możesz mieć potencjometr ustawiony nieprawidłowo. Na szczęście możesz to naprawić bez konieczności ponownego instalowania. Możesz po prostu zmienić wartości podczas ich ponownego mapowania:

Teraz w końcu mamy użyteczne wartości. Teraz pozostaje tylko przypisać te wartości do pozycji X naszej kuli:

// Przypisz mapowaną wartość puli do pozycji x kuli transform.position = new Vector3 (mappedPot, transform.position.y, transform.position.z);

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

Uruchomienie przycisku

Teraz, kiedy poruszamy naszą kulą, czy nie byłoby miło mieć sposób na spowolnienie rzeczy, gdy znajdziemy się w trudnej sytuacji? Będziemy używać naszego przycisku, aby spowolnić czas w naszej grze. Otwórz skrypt sphereMover i dodaj ten kod do funkcji aktualizacji

// jeśli Unity wykryje, że przycisk jest wciśnięty, skala czasu zwalnia, jeśli (arduino.digitalRead (buttonPinNumber) == 1) Time.timeScale = 0.4f;  else Time.timeScale = 1.0f;

Teraz mamy mechanikę naszej gry, dodajmy przeszkody! Użyjemy naturalnego wroga kuli, sześcianu. W hierarchii kliknij Utwórz> Obiekt 3d> Kostka. W inspektorze kostki, Dodaj komponent> Fizyka> Sztywne ciało. Ustaw wartość Przeciągnięcia sztywnego nadwozia na 5. Ponadto w obszarze komponentu Zderzak skrzynek w inspektorze wybierz Is Trigger. Umożliwi nam to wykrycie kolizji z naszą Kulą.

Utwórz skrypt na kostce i wywołaj go collideWithSphere, otwórz skrypt i usuń funkcje Start i Update, ponieważ tym razem nie będziemy ich potrzebować. Wpisz ten kod:

using UnityEngine; using System.Collections; klasa publiczna collideWithSphere: MonoBehaviour void OnTriggerEnter (Collider other) Destroy (other.gameObject); 

OnTriggerEnter wysyła komunikat za każdym razem, gdy zderzacz wyzwalacza trafi w inny zderzacz. W tym przypadku mówimy, 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. Jest tak, ponieważ stworzyliśmy prefabrykat i zapisaliśmy go w naszym projekcie. Usuń teraz swoją kostkę z hierarchii.

Teraz potrzebujemy tylko skryptu do odradzania kostek. W hierarchii kliknij Utwórz> Utwórz pusty, i zmień jego nazwę na Game Managera 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 // zmienna do przechowywania prefabrykatu, którą chcemy odrodzić publiczną kostkę GameObject; // chcemy, aby niektóre zmienne decydowały o tym, w jaki sposób odradzają się dowolne kostki // i jak wysoko nad nami chcemy, aby odradzały się publicznie int numberToSpwan; public float najniższąSpawnheight; public float najwyższySpawnheight; // Użyj tego do inicjalizacji 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 ()   

Zapisz skrypt. W edytorze wybierz Menedżera gier w hierarchii i przeciągnij prefabrykat kostki z panelu projektu do zmiennej Cube w Inspektorze. Tutaj również podaj wartości swojego spawnu. Możesz nim manipulować, aby uczynić to tak trudnym lub łatwym, jak chcesz. Pamiętaj, że warto, aby najniższe kostki odradzały się wystarczająco wysoko, aby umożliwić zainicjowanie Uniduino - utrata gry zanim będziesz mogła się ruszyć, może być frustrująca!

Gotowy projekt

Teraz, gdy naciśniesz grę, kostki odrodzą się nad tobą i spadną. Możesz użyć potencjometru, aby ich ominąć, i 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 nawet zacięcia się gier specjalizują się w niestandardowych kontrolerach.

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

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




Jeszcze bez komentarzy

O nowoczesnej technologii, prostej i niedrogiej.
Twój przewodnik w świecie nowoczesnych technologii. Dowiedz się, jak korzystać z technologii i gadżetów, które nas otaczają każdego dnia i dowiedz się, jak odkrywać ciekawe rzeczy w Internecie.