Mündəricat:

Arduino Nəzarətçiləri ilə Çox Oyunçu Oyunu Necə Hazırlanır: 6 Addım
Arduino Nəzarətçiləri ilə Çox Oyunçu Oyunu Necə Hazırlanır: 6 Addım

Video: Arduino Nəzarətçiləri ilə Çox Oyunçu Oyunu Necə Hazırlanır: 6 Addım

Video: Arduino Nəzarətçiləri ilə Çox Oyunçu Oyunu Necə Hazırlanır: 6 Addım
Video: Arduino ilə Çox funksiyalı ölçmə qurğusu | Şagird işləri 2024, Iyul
Anonim
Arduino Nəzarətçiləri ilə Çox Oyunçu Oyunu Necə Hazırlanır
Arduino Nəzarətçiləri ilə Çox Oyunçu Oyunu Necə Hazırlanır

Oyun inkişaf etdiricilərinin dünyanın hər yerindən insanların zövq aldığı gözəl oyunlar necə yaratdığını heç düşünmüsünüzmü? Yaxşı, bu gün həm də edəcəyiniz bir Arduino nəzarətçisi tərəfindən idarə ediləcək kiçik bir çox oyunçu oyunu hazırlayaraq bu barədə sizə kiçik bir ipucu verəcəyəm. Beləliklə, başlayaq.

Təchizat

Sizə lazım olacaq:

  • Noutbuk
  • Birlik mühərriki
  • Vizual studiya və ya Atom kimi Unity ilə işləyən C# IDE. (Visual Studio Kodundan istifadə edəcəm)
  • 2X Arduino Nano
  • 2X böyük çörək taxtası
  • 2X Kiçik Çörək Paneli
  • 4X Tack Switch (Push Button)
  • 4X 200Ω rezistor
  • 12X Male - Kişi Jumper Telləri
  • Arduino IDE

Unity -dən istifadə ilə bağlı əsas anlayışa malik olsanız faydalı olacaq, ancaq oyunu inkişaf etdirərkən onunla tanış olacağınız üçün irəliləyişinizə təsir etməyəcək.

Unity Engine yükləmək üçün link:

store.unity.com/download-nuo

Visual Studio Code IDE yükləmək üçün link:

code.visualstudio.com/download

Arduino IDE yükləmək üçün link:

www.arduino.cc/en/Main/Software

Addım 1: Oyunun Sərhədlərini Qurun

Oyunun Sərhədlərini Qurun
Oyunun Sərhədlərini Qurun
Oyunun Sərhədlərini Qurun
Oyunun Sərhədlərini Qurun
Oyunun Sərhədlərini Qurun
Oyunun Sərhədlərini Qurun

Əvvəlcə birliyi yükləməlisiniz

Bunu etdikdən sonra oyunun görünüşünü qurmağa başlaya bilərsiniz.

Yeni Birlik layihəsi açın, adını verin və 2D oyunu seçin.

Layihə açıldıqda 3 əsas bölmənin adlandığına diqqət yetirin

  • İerarxiya (bütün oyun obyektlərinizin və detallarınızın əlavə ediləcəyi yerdir).
  • Səhnə (oyunun görünüşünü qurduğunuz yerdə).
  • Oyun (əsl oyunun necə gedəcəyini sınaya biləcəyiniz yer).

İerarxiyanın altında sizin səhnənizin və səhnənin altında "Əsas Kamera" nın olduğuna diqqət yetirin. Kameranı iyerarxiyadan seçdiyiniz zaman səhnədə seçiləcək

(Bu kameranın hüdudlarında olan hər şey real oyunda göstəriləcək).

Şəkil 1 -ə baxın

Oyunumuz iki lövhədən, ətrafında hərəkət edən bir topdan və lövhələrin və topun hərəkətini məhdudlaşdıran sərhədlərdən ibarətdir.

Sərhədləri yaratmaqla başlayaq.

  1. Yeni bir oyun obyekti yaratmaq üçün Aktivlər> Yarat> Sprites> kvadrat seçin (adını "sağ və sol sərhədlər" olaraq təyin edin) Şəkil 2 -yə baxın
  2. Sağ və sol sərhədləri iyerarxiyaya sürükləyin və buraxın və səhnədə bir kvadrat görünəcək.
  3. X ox mövqeyini (5) "sağ və sol sərhədlər"> müfəttiş> çevir> mövqe> X olaraq təyin edin. Şəkil 3 -ə baxın
  4. Sonra ölçüsünü kameranın sərhədlərini örtəcək qədər genişləndirin (onu uzatmaq üçün meydanın yuxarı və aşağı tərəflərini sürükləyin).
  5. Rəngini "sağ və sol sərhədlərdən"> müfəttiş> sprite render> rəngini tənzimləyin. Şəkil 3 -ə baxın
  6. Müfəttişdə aşağıya fırladın və komponent əlavə et seçin, sonra Rigidbody2D yazın və enter düyməsini basın, bu kütləvi, cazibə qüvvəsi və toqquşma aşkarlaması verdiyindən oyun obyektinizə əsasən fizika əlavə edəcək. Ancaq oyunda cazibə qüvvəsinə ehtiyacımız yoxdur, bunun əvəzinə çəkisi 0 olsun. Siz də toqquşduqda sərhəd hərəkət etməməsi üçün mövqeyi və fırlanmanı dondurmalısınız. Şəkil 4 -ə baxın
  7. komponent əlavə et seçin, sonra Box Collider 2D yazın və enter düyməsinə basaraq oyun obyektinin ətrafında toqquşmaların aşkar oluna biləcəyi bir sahə əlavə edin. Şəkil 4 -ə baxın
  8. İndi sağ və sol sərhədləri seçin və kopyalamaq üçün (ctrl+d) basın.
  9. Adını "sol sərhəd" adlandırın və birincisini ("sağ sərhəd") adlandırın.
  10. Sol haşiyəni seçin və 3. addımda eyni şəkildə x ox mövqeyini (-5) olaraq tənzimləyin. İndi sağ və sol sərhədləriniz var.

Əvvəlki 10 addımı yuxarı və aşağı haşiyələrlə təkrarlayın və x mövqeyi yerinə kvadratın y mövqeyini dəyişdirin. Son baxış, şəkildəki kimi olmalıdır.

Şəkil 5 -ə baxın

Addım 2: lövhələr əlavə etmək və nəzarətçilər hazırlamaq

Lövhələrin əlavə edilməsi və nəzarətçilərin hazırlanması
Lövhələrin əlavə edilməsi və nəzarətçilərin hazırlanması
Lövhələrin əlavə edilməsi və nəzarətçilərin hazırlanması
Lövhələrin əlavə edilməsi və nəzarətçilərin hazırlanması
Lövhələrin əlavə edilməsi və nəzarətçilərin hazırlanması
Lövhələrin əlavə edilməsi və nəzarətçilərin hazırlanması

Lövhələrin əlavə edilməsi

Yeni bir oyun obyekti yaradın və oyunçu 1 adlandırın.

Ayarla:

  • Ölçü: X (1.2), Y (0.15), Z (1)
  • Vəzifə: X (0), Y (-3.6), z (0)
  • BoxCollider2D əlavə edin
  • Rigidbody 2D əlavə edin və y və z oxlarını dondurun.

Çoğaltın (ctrl+d) və kopyalama pleyerinin adını dəyişdirin 2.

Ayarla:

  • Ölçü: X (1.2), Y (0.15), Z (1)
  • Vəzifə: X (0), Y (3.6), z (0)
  • BoxCollider artıq orada olacaq.
  • Rigidbody 2D artıq orada olacaq və y və z oxları artıq donacaq.

Şəkil 1 -ə baxın

Nəzarətçilərin hazırlanması

Sizə lazım olacaq:

  • 2X Arduino Nano
  • 2X böyük çörək taxtası
  • 2X Kiçik Çörək Paneli
  • 4X Tack Switch (Push Button)
  • 4X rezistor
  • 12X Male - Kişi Jumper Telləri

İndi çörək taxtasının fotoşəkillərinə və joystickləri yığmaq üçün xəritələrə baxın.

  1. Kiçik bir çörək lövhəsi ilə bir Arduino Nano çipi bağlayın.
  2. Şəkildə göstərildiyi kimi böyük çörək lövhəsinə 2 tack açarını əlavə edin. Çörək taxtasının sağ tərəfini sol tərəfə simmetrik tutmağa çalışın, çünki bu joystickin daha yaxşı görünməsinə səbəb olacaq (30 -cu sütunu simmetriya olaraq istifadə edə bilərsiniz) xətt)
  3. Kiçik çörək lövhəsindəki Arduino-dakı 5V pinlə sol düymənin sol üst pinini bağlayın (çörək taxtasında eyni sütunla bağlanan şeylər bir-birinə bağlıdır).
  4. Sağ düymənin sağ üst pimini Arduino-dakı 5V pinlə bağlayın.
  5. Sol düymənin sağ alt pinini 31. sütundakı bir nöqtə ilə bir rezistor istifadə edərək bağlayın.
  6. Rezistor istifadə edərək sağ düymənin sol alt pinini 29-cu sütunda bir nöqtə ilə bağlayın.
  7. Rezistorları Arduino'daki GND pin ilə bağlayın.
  8. Sol düymənin sağ üst pinini Arduino-dakı D3 pinlə bağlayın.
  9. Sağ düymənin sol üst pimini Arduino-dakı D9 pinlə bağlayın.
  10. İndi bu addımları təkrarlayın və ikinci nəzarətçi edin.

Addım 3: Arduino'yu Serial Porta bağlayın

Arduino Serial Limanına qoşulur
Arduino Serial Limanına qoşulur
Arduino Serial Limanına qoşulur
Arduino Serial Limanına qoşulur
Arduino Serial Limanına qoşulur
Arduino Serial Limanına qoşulur
Arduino Serial Limanına qoşulur
Arduino Serial Limanına qoşulur

Əvvəlcə Arduino IDE -ni quraşdırmalısınız.

Quraşdırıldıqdan sonra düymələrdən daxil olan Arduino proqramı hazırlayaraq Serial portda (COM portu) saxlaya bilərsiniz. Laptopunuza bir Arduino lövhəsi bağlandıqda, əməliyyat sistemi lövhəni avtomatik olaraq proqramların yüklənə biləcəyi serial port olaraq tanıyır. Serial portda saxlanılan dəyərlər, Unity Engine -ni serial porta bağladığımız zaman növbəti addımda istifadə edilə bilər.

İndi Arduino'yu Serial portu ilə bağlayaq.

Şəkillərə baxın

  1. Laptopunuza bir Arduino bağlayın
  2. Alətlər> Kart> Arduino Nano
  3. Arduino çipiniz yenidirsə (2018-2020) Alətlər> Prosessor> ATmega328P (Köhnə Bootloader).
  4. Arduino çipiniz yeni deyilsə (2018 -dən əvvəl) Alətlər> Prosessor> ATmega328P
  5. Alətlər> Liman> COM (nə olursa olsun sayı mənim vəziyyətimdə 10 -dur). * Bu, dəyərlərin saxlanılacağı serial portudur.
  6. Kodu kopyalayın və Arduino IDE -ə yapışdırın və proqramı yükləmək üçün ctrl+u düymələrini basın.
  7. İkinci Arduino ilə təkrarlayın. (5 -ci addımı atarkən başqa bir COM portu seçdiyinizə əmin olun ki, hər iki nəzarətçi eyni serial porta qoşulmasın).

Kod:

boş quraşdırma () {

Serial.begin (9600); pinMode (3, GİRİŞ); // Arduino -ya D3 pinMode pinindən (9, INPUT) bir giriş almasını söyləmək; // Arduinoya D9 pinindən bir giriş almasını söyləmək} void loop () {if (digitalRead (3) == 1) { /* Arduino 1 Serial.write (1) girişi alarsa; pin 3 -dən Serial.flush () serial portuna 1 dəyərini çıxarın; */ gecikmə (2); } if (digitalRead (9) == 1) { /* Arduino 1 Serial.write (2) girişi alırsa; pin 9 -dan Serial.flush () serial portuna 2 dəyərini çıxarın; */ gecikmə (2); }}

Proqramın izahı:

Bu kod, sadəcə düymələrə bağlı olan D3 pinindən və Arduino D9 pinindən bir giriş alır. Düymələr ya basıldı, ya da sıxılmadı, yəni onlardan alınan oxunuşlar ya 1 (basıldı) ya da 0 (sıxılmadı) deməkdir. Sağ düymədən giriş (D9 -dan) 1 -dirsə (basıldıqda) Serial portda 1 dəyərini saxlayır. Sol düymədən giriş (D3 -dən) 1 -dirsə (basıldıqda) Serial portda 2 dəyərini saxlayır.

Addım 4: Birliyi Serial Port ilə bağlayın

Birliyi Serial Limanı ilə birləşdirmək
Birliyi Serial Limanı ilə birləşdirmək
Birliyi Serial Limanı ilə birləşdirmək
Birliyi Serial Limanı ilə birləşdirmək

Bu addım üçün, düymələrə basıldıqda Arduinodan girişləri ala bilməsi üçün Unity -də serial portunu təyin edəcəyik. Dizüstü kompüterinizə Visual Studio Kodunu quraşdırın. Sonra Birliyə gedin, iyerarxiyadan 1 -ci oyunçunu seçin, aşağıya fırladın və komponent əlavə et seçin və player1_motion yazın və enter düyməsini basın. Şəkil 1 -ə baxın

Müfəttişdə bir C# skripti yaradılacaq, üzərinə sağ vurun və redaktə skriptini seçin, vizual studiya kodu açılmalı və şəkil 2 kimi görünən standart kodu göstərəcəkdir.

Aşağıdakı kodu kopyalayın və sonra dəyişdirin "SerialPort sp = new SerialPort (" COM10 ", 9600);" SerialPort sp = yeni SerialPort ilə ("Arduino -nun qoşulduğu COM portu", 9600); Arduino kodunuza qayıdıb Alətlər> Liman> COM -a gedərək tapa bilərsiniz.

Kod:

System. Collections istifadə;

System. Collections. Generic istifadə edərək; UnityEngine istifadə edərək; System. IO. Ports istifadə etmək; public class player1_motion: MonoBehaviour {float speed = 8; şəxsi üzmə miqdarı; SerialPort sp = yeni SerialPort ("COM10", 9600); // Başlat ilk çərçivə yeniləməsinin boşluğundan əvvəl çağırılır Start () {sp. Open (); sp. ReadTimeout = 1; } // Yeniləmə hər çərçivədə bir dəfə çağırılır void Update () {amounttomove = speed*0.01f; if (sp. IsOpen) {try {moveObject (sp. ReadByte ()); çap (sp. ReadByte ()); } catch (System. Exception) {}}} void moveObject (int Direction) {if (Direction == 1) {transform. Translate (Vector3.left*amounttomove, Space. World); } əgər (İstiqamət == 2) {transform. Translate (Vector3.right*amounttomove, Space. World); }}}

Kodun izahı:

Bu kod, birliyə serial portundan (COM 10) daxil olmaq üçün məlumat verir. Sol düyməyə basıldığında, Arduino serial portuna 1 dəyərini göndərir, əgər birlik serial portdan 1 alarsa, oyunçu obyekti "player 1" ə sol istiqamətdə bir sürət əlavə olunur. Doğru düyməyə basıldığında, Arduino serial portuna 2 dəyər göndərir, birlik birlik portundan 2 alarsa, oyunçu "oyunçu 1" ə doğru istiqamətdə bir sürət əlavə olunur. serial port seriyalı portdan bir dəyər almazsa, heç bir istiqamətə heç bir sürət əlavə edilmir, buna görə lövhə sabit qalır.

Kodu kopyaladıqdan sonra kodu qurmaq və işə salmaq üçün F5 düyməsini basın. Birliyə qayıdın və oyun düyməsini basın, 1 -ci oyunçu sağa, sola basdığınızda sola doğru hərəkət etməlidir.

İndi eyni addımları bir daha ancaq oyunçu 2 ilə edin və player1_motion əvəzinə 'Komponent əlavə et' player2_motion -a yazdığınızdan və eyni serial portu deyil, ikinci nəzarətçinin qoşulduğu ikinci COM portunu təyin etdiyinizdən əmin olun.

Kodun özündə "ictimai sinif oyunçusu1_motion: MonoBehaviour" u "ictimai sinif oyunçusu2_motion: MonoBehaviour" olaraq dəyişdirməlisiniz.

Addım 5: Topu əlavə edin

Topun əlavə edilməsi
Topun əlavə edilməsi
Topun əlavə edilməsi
Topun əlavə edilməsi
Topun əlavə edilməsi
Topun əlavə edilməsi
  1. Yeni bir oyun obyekti əlavə edin, ancaq bu dəfə kvadrat yerinə bir dairə seçin.
  2. Adını "top" olaraq dəyişdirin.
  3. Hiyerarşiyə sürükləyin və buraxın.
  4. Ölçüyü tənzimləyin (X: 0.2 - Y: 0.2 - Z: 0.2).
  5. Rigidbody 2D əlavə edin və yalnız Z oxunu dondurun.
  6. Kütləni 0.0001 olaraq dəyişdirin
  7. Cazibə Ölçüsünü 0 olaraq dəyişdirin.
  8. Box Collider 2D əlavə edin.
  9. Aktivlər> Yarat> Fizika materialı 2D Şəkil 1 -ə baxın
  10. adını "sıçrama" olaraq dəyişdirin
  11. Müfəttişdən sürtünməni sıfıra dəyişdirin
  12. Müfəttişdən sıçrayışı 1 olaraq dəyişdirin
  13. "Sıçrayış" ı Rigidbody 2D> Material -a sürükləyin və buraxın Şəkil 2 -ə baxın
  14. Hiyerarşidən yenidən "top" seçin və komponent əlavə etmək üçün gedin və Ball_movement yazın, sonra enter düyməsini basın.
  15. Skriptə sağ vurun və skript redaktəsini seçin.
  16. Aşağıdakı kodu kopyalayın və qurmaq və işə salmaq üçün F5 düyməsini basın.

Kod:

System. Collections istifadə;

System. Collections. Generic istifadə edərək; UnityEngine istifadə edərək; ictimai sinif Ball_movement: MonoBehaviour {// Başlanğıc ilk çərçivə yeniləməsindən əvvəl çağırılır xüsusi float force = 2; void Start () {StartCoroutine (move ()); } IEnumerator hərəkət () {verim yeni WaitForSeconds (2) qaytarır; GetComponent (). AddForce (yeni Vector2 (1f, 0.5f)*0.02f*güc); }}

Kodun izahı

Bu kod, topu 45 ° bir açı ilə hərəkət etdirən eyni böyüklükdə X istiqamətinə və Y istiqamətinə hər iki istiqamətdə bir sürət verir. 8 -ci addımda topa bir fizika materialı əlavə etdik və sıçrayışını dəyişdirdik, bu da topun oyun boyunca hərəkətini təmin edir.

Addım 6: Oyunun yekunlaşdırılması

Oyunun yekunlaşdırılması
Oyunun yekunlaşdırılması
Oyunun yekunlaşdırılması
Oyunun yekunlaşdırılması
Oyunun yekunlaşdırılması
Oyunun yekunlaşdırılması
Oyunun yekunlaşdırılması
Oyunun yekunlaşdırılması

İndi məğlubiyyəti mümkün hala gətirməliyik, oyunu idarə etsəniz, topun 1 -ci və ya 2 -ci oyunçunun yanından keçdiyi zaman sərhəddən kənara çıxdığını və oyunda ehtiyacımızın tam olmadığını görürsünüz. Əksinə, topun yuxarı və ya aşağı sərhədlərlə toqquşması və topun mövqeyini sıfırlamaq üçün hər dəfə hesabı sayan bir hesab sayğacı etmək istəyirik.

  1. Topu Hiyerarşidən Layihəyə sürükləyin və buraxın, daha sonra istifadə etmək üçün topdan bir prefabrik hazırladınız.
  2. Hiyerarşiyə sağ vurun və Boş Yarat seçin. boş bir cisim görünəcək, topu yenidən doğuş adlandırın və topun mövqeyi ilə eyni olmaq üçün mövqeyini dəyişdirin.
  3. Hiyerarşiyə sağ vurun və UI >> Mətn seçin. Mətnin bir kətan ilə müşayiət olunduğuna diqqət yetirin ki, oyundakı mətnin mövqeyi oyunun sərhədlərində deyil, kətandakı mətnin mövqeyindən asılıdır. (Şəkil 1 -ə baxın).
  4. Mətnin yerini istədiyiniz yerə dəyişdirin.
  5. İkinci oyunçunun hesabı üçün 3 və 4 -cü addımları təkrarlayın.
  6. Birinci mətnə "Oyunçu 1 Hesab: 0" yazın və ikinci mətnə "Oyunçu 2 Sayı: 0" yazın. (Şəkil 2 -ə baxın).
  7. P1wins adlı yuxarı sərhəddə bir skript yaradın və aşağıdakı kodu kopyalayın.

Kod:

System. Collections istifadə;

System. Collections. Generic istifadə edərək; UnityEngine istifadə edərək; UnityEngine. SceneManagement istifadə edərək; UnityEngine. UI istifadə edərək; ictimai sinif p1wins: MonoBehaviour {ictimai mətn hesabı; ictimai transformasiya top_respawn; ictimai GameObject topu; xüsusi int p1 = 0; // Başlanğıc ilk çərçivə yeniləməsindən əvvəl çağrılır void Start () {} // Yeniləmə hər çərçivədə bir dəfə çağırılır void Update () {score.text = "Oyunçu 1 Hesab:" + p1; } etibarsız OnCollisionEnter2D (Collision2D other) {if (other.gameObject.tag == "Ball") {Destroy (other.gameObject); p1 ++; Dərhal (top, top_respawn. mövqe, ball_respawn.rotation); }}}

8. 1 -ci addımdakı proyektdən top prefabrikini Top parametrinə sürükləyin. (Şəkil 3 -ə baxın)

9. Topu yenidən hiyerarşidən Ball-rerspawn parametrinə sürükləyin və buraxın. (Şəkil 3 -ə baxın)

10. oyunçuya 1 balı iyerarxiyadan Score parametrinə sürükləyin və buraxın. (Şəkil 3 -ə baxın)

Kodun izahı:

Top üst sərhədlə toqquşduqda, 2 -ci addımda təyin etdiyimiz ball_respawn mövqeyində yenidən məhv olur və yenidən doğulur, topu prefabrik hala gətirməyin məqsədi, bütün xüsusiyyətləri ilə onu yenidən biçə bilməkdir, əks halda topu istifadə etsək iyerarxiyadan yenidən canlanacaq, amma hərəkət etməyəcək. Top üst haşiyə ilə toqquşduqda əvvəlcə 0 -a bərabər olan p1 adlanan dəyər 1 artır.

İndi aşağı sərhəd üçün 7, 8, 9 və 10 -cu addımları edin

addım 7 üçün p2wins adlı bir skript yaradın və bunun əvəzinə aşağıdakı kodu kopyalayın.

10 -cu addım üçün, oyunçu 2 hesabını iyerarxiyadan Score parametrinə sürükləyin.

Kod:

System. Collections istifadə;

System. Collections. Generic istifadə edərək; UnityEngine istifadə edərək; UnityEngine. SceneManagement istifadə edərək; UnityEngine. UI istifadə edərək; ictimai sinif p2wins: MonoBehaviour {ictimai mətn hesabı; ictimai transformasiya top_respawn; ictimai GameObject topu; xüsusi int p2 = 0; // Başlanğıc ilk çərçivə yeniləməsindən əvvəl çağırılır void Start () {} // Yeniləmə hər çərçivədə bir dəfə çağırılır void Update () {score.text = "Oyunçu 2 Hesab:" + p2; } etibarsız OnCollisionEnter2D (Collision2D other) {if (other.gameObject.tag == "Ball") {Destroy (other.gameObject); p2 ++; Dərhal (top, top_respawn. mövqe, ball_respawn.rotation); }}}

Tövsiyə: