İçindekiler:

Arduino Kontrollü Çok Oyunculu Oyun Nasıl Yapılır: 6 Adım
Arduino Kontrollü Çok Oyunculu Oyun Nasıl Yapılır: 6 Adım

Video: Arduino Kontrollü Çok Oyunculu Oyun Nasıl Yapılır: 6 Adım

Video: Arduino Kontrollü Çok Oyunculu Oyun Nasıl Yapılır: 6 Adım
Video: Arduino Nedir? Nasıl Kurulur ve Neler Yapılabilir? #1 2024, Kasım
Anonim
Arduino Kontrol Cihazları ile Çok Oyunculu Oyun Nasıl Yapılır
Arduino Kontrol Cihazları ile Çok Oyunculu Oyun Nasıl Yapılır

Oyun geliştiricilerin, dünya çapındaki insanların oynamaktan keyif aldığı harika oyunları nasıl yarattığını hiç merak ettiniz mi? Pekala, Bugün size, sizin de yapacağınız bir Arduino denetleyicisi tarafından kontrol edilecek küçük bir çok oyunculu oyun yaparak bununla ilgili küçük bir ipucu vereceğim. Öyleyse başlayalım.

Gereçler

İhtiyacın olacak:

  • Dizüstü bilgisayar
  • Birlik Motoru
  • Visual studio veya Atom gibi Unity ile çalışan bir C# IDE. (Visual Studio Code Kullanacağım)
  • 2X Arduino Nano
  • 2X Büyük Ekmek Tahtası
  • 2X Küçük Ekmek Tahtası
  • 4X Tetik Anahtarı (Basmalı Düğme)
  • 4X 200Ω Direnç
  • 12X Erkek - Erkek Jumper Telleri
  • Arduino IDE'si

Unity'yi kullanma konusunda temel bir anlayışa sahipseniz yardımcı olacaktır, ancak oyunu yapmaya devam ederken aşina olacağınız için ilerlemenizi etkilemeyecektir.

Unity Engine'i indirmek için bağlantı:

store.unity.com/download-nuo

Visual Studio Code IDE'yi indirmek için bağlantı:

code.visualstudio.com/download

Arduino IDE'yi indirmek için bağlantı:

www.arduino.cc/en/Main/Software

1. Adım: Oyunun Sınırlarını Ayarlayın

Oyunun Sınırlarını Ayarlayın
Oyunun Sınırlarını Ayarlayın
Oyunun Sınırlarını Ayarlayın
Oyunun Sınırlarını Ayarlayın
Oyunun Sınırlarını Ayarlayın
Oyunun Sınırlarını Ayarlayın

Her şeyden önce, Unity'yi indirmeniz gerekiyor

Bu yapıldıktan sonra oyununuzun görünümünü ayarlamaya başlayabilirsiniz.

Yeni bir Unity projesi açın, adını verin ve 2D oyunu seçin.

Proje açıldığında, adı verilen 3 ana bölüm olduğuna dikkat edin.

  • Hiyerarşi (burası tüm oyun nesnelerinizin ve ayrıntılarınızın ekleneceği yerdir).
  • Sahne (oyunun görünümünü ayarladığınız yer).
  • Oyun (gerçek oyunun nasıl olacağını test edebileceğiniz yer).

Hiyerarşinin altında sahneniz ve sahnenin altında da “Ana Kamera” olduğuna dikkat edin. Hiyerarşiden kamerayı seçtiğinizde, sahnede seçilecektir.

(Bu kameranın sınırları içindeki her şey gerçek oyunda gösterilecektir).

1. resme bak

Oyunumuz iki tahtadan oluşur, hareket eden bir top ve tahtaların ve topun hareketini sınırlayan kenarlıklardan oluşur.

Kenarlıkları oluşturarak başlayalım.

  1. Yeni bir oyun nesnesi oluşturmak için Varlıklar>Oluştur>Sprites>kare'yi seçin (“sağ ve sol kenarlıklar” olarak adlandırın) 2. resme bakın
  2. Sağ ve sol kenarlıkları hiyerarşiye sürükleyip bırakın, sahnede bir kare görünecektir.
  3. X ekseni konumunu (5) “sağ ve sol kenarlıklar”>denetçi>dönüştür>konum>X olarak ayarlayın. 3. resme bak
  4. Ardından ölçeğini, kameranın sınırlarını kaplayacak kadar büyük olacak şekilde ayarlayın (gerdirmek için karenin üst ve alt kenarlarını sürükleyin).
  5. Rengini “sağ ve sol kenarlıklardan”>denetçi>sprite render>color'dan ayarlayın. 3. resme bak
  6. Denetçide aşağı kaydırın ve bileşen ekle'yi seçin, ardından Rigidbody2D yazın ve enter tuşuna basın, bu temel olarak oyun nesnenize kütle, yerçekimi ve çarpışma algılaması sağladığı için fizik ekleyecektir. Ancak oyunumuzda yerçekimine ihtiyacımız yok, bu yüzden yerçekimini 1 yerine 0 yapın. Ayrıca, çarpıştığında sınırın hareket etmemesi için konumu ve dönüşü dondurmanız gerekecek. 4. resme bak
  7. bileşen ekle'yi seçin, ardından Box Collider 2D yazın ve enter tuşuna basın, bu, oyun nesnesinin etrafına çarpışmaların algılanabileceği bir alan ekleyecektir. 4. resme bak
  8. Şimdi sağ ve sol kenarlıkları seçin ve kopyalamak için (ctrl+d) tuşlarına basın.
  9. "Sol kenarlık" olarak yeniden adlandırın ve ilkini ("sağ kenarlık") yeniden adlandırın.
  10. Sol kenarlığı seçin ve x ekseni konumunu 3. adımdaki gibi (-5) olarak ayarlayın. Artık sağ ve sol kenarlıklarınız var.

Önceki 10 adımı yukarı ve aşağı kenarlıklar ile tekrarlayın ve karenin x konumu yerine y konumunu değiştirin. Son önizleme, resimdekine benzer bir şey olmalıdır.

5. resme bak

Adım 2: Pano Ekleme ve Denetleyici Yapma

Pano Ekleme ve Denetleyici Yapma
Pano Ekleme ve Denetleyici Yapma
Pano Ekleme ve Denetleyici Yapma
Pano Ekleme ve Denetleyici Yapma
Pano Ekleme ve Denetleyici Yapma
Pano Ekleme ve Denetleyici Yapma

Pano Ekleme

Yeni bir oyun nesnesi yapın ve ona oyuncu 1 adını verin.

Ayarlamak:

  • Ölçek: X(1.2), Y(0.15), Z(1)
  • Konum: X(0), Y(-3.6), z(0)
  • BoxCollider2D Ekle
  • Rigidbody 2D ekleyin ve y ve z eksenlerini dondurun.

Çoğalt(ctrl+d) ve kopya oynatıcı 2'yi yeniden adlandırın.

Ayarlamak:

  • Ölçek: X(1.2), Y(0.15), Z(1)
  • Konum: X(0), Y(3.6), z(0)
  • Bir BoxCollider zaten orada olacak.
  • Bir Rigidbody 2D zaten orada olacak ve y ve z eksenleri zaten donmuş olacak.

1. resme bak

Kontrolör Yapmak

İhtiyacın olacak:

  • 2X Arduino Nano
  • 2X Büyük Ekmek Tahtası
  • 2X Küçük Ekmek Tahtası
  • 4X Tetik Anahtarı (Basmalı Düğme)
  • 4X Direnç
  • 12X Erkek - Erkek Jumper Telleri

Şimdi oyun çubuklarını birleştirmek için ekmek tahtası fotoğraflarına ve haritaya bakın.

  1. Küçük bir ekmek tahtası ile bir Arduino Nano çipi takın.
  2. Büyük breadboard üzerine resimde gösterildiği gibi 2 Tack anahtarı takın. Breadboard'un sağ tarafını sol tarafa simetrik tutmaya çalışın, bu joystick'in daha iyi görünmesini sağlayacaktır (30. sütunu simetri olarak kullanabilirsiniz) hat)
  3. Küçük breadboard üzerinde Arduino'da bulunan 5V pin ile sol butonun sol üst pinini bağlayın(Breadboard'da aynı kolon ile bağlanan şeyler birbirine bağlanır).
  4. Sağ düğmenin sağ üst pinini Arduino'daki 5V pinine bağlayın.
  5. Sol düğmenin sağ alt pimini bir direnç kullanarak 31. sütundaki bir noktaya bağlayın.
  6. Sağ düğmenin sol alt pimini bir direnç kullanarak 29. sütundaki bir noktaya bağlayın.
  7. Dirençleri Arduino'daki GND pinine bağlayın.
  8. Sol düğmenin sağ üst pimini Arduino'daki D3 pimine bağlayın.
  9. Sağ düğmenin sol üst pimini Arduino'daki D9 pimine bağlayın.
  10. Şimdi bu adımları tekrarlayın ve ikinci denetleyiciyi yapın.

Adım 3: Arduino'yu Seri Bağlantı Noktasına Bağlama

Arduino'yu Seri Porta Bağlama
Arduino'yu Seri Porta Bağlama
Arduino'yu Seri Porta Bağlama
Arduino'yu Seri Porta Bağlama
Arduino'yu Seri Porta Bağlama
Arduino'yu Seri Porta Bağlama
Arduino'yu Seri Porta Bağlama
Arduino'yu Seri Porta Bağlama

Öncelikle Arduino IDE'yi kurmanız gerekecek.

Kurulduktan sonra, butonlardan girdi alan ve bunları bir Seri portta (COM portu) saklayan bir Arduino programı yaparak başlayabilirsiniz. Dizüstü bilgisayarınıza bir Arduino kartı bağlandığında, işletim sistemi kartı programların yüklenebileceği bir seri bağlantı noktası olarak otomatik olarak tanır. Seri portta saklanan değerler, Unity Engine'i seri porta bağladığımızda sonraki adımda kullanılabilir.

Şimdi Arduino'yu Seri bağlantı noktasına bağlayalım.

Resimlere bakmak

  1. Dizüstü bilgisayarınıza bir Arduino bağlayın
  2. Araçlar>Pano>Arduino Nano
  3. Arduino çipiniz yeni ise(2018-2020) Araçlar>İşlemci>ATmega328P(Eski Önyükleyici).
  4. Arduino çipiniz yeni değilse (2018'den önce) Araçlar>İşlemci>ATmega328P
  5. Araçlar>Bağlantı Noktası>COM(hangi numara görünüyorsa, benim durumumda 10'dur). * Değerlerin saklanacağı seri porttur.
  6. Kodu kopyalayıp Arduino IDE'ye yapıştırın ve programı yüklemek için ctrl+u tuşlarına basın.
  7. İkinci Arduino ile tekrarlayın. (5. adımı yaparken, her iki denetleyicinin de aynı seri bağlantı noktasına bağlanmaması için başka bir COM bağlantı noktası seçtiğinizden emin olun).

Kod:

geçersiz kurulum() {

Seri.başla(9600); pinMode(3, GİRİŞ); //Arduino'ya pin D3 pinMode(9, INPUT)'dan bir giriş almasını söylemek; //Arduino'ya pin D9'dan giriş almasını söylemek } void loop() { if(digitalRead(3)==1){ /* Arduino 1 Serial.write(1) girişi alırsa; pin 3'ten Serial.flush() seri portuna 1 değeri çıktısı alın; */ gecikme(2); } if(digitalRead(9)==1){ /* Arduino 1 Serial.write(2) girdisi alırsa; pin 9'dan Serial.flush() seri portuna 2 değeri çıktısı alın; */ gecikme(2); } }

Programın açıklaması:

Bu kod, Arduino'daki düğmelere bağlı olan D3 pininden ve D9 pininden bir girdi alır. Düğmelere basılır veya basılmaz; bu, onlardan alınan okumaların 1(basılı) veya 0(basılmamış) olduğu anlamına gelir. Sağ düğmeden (D9'dan) gelen giriş 1 (basılı) ise, Seri bağlantı noktasında 1 değerini kaydedin. Sol düğmeden (D3'ten) gelen giriş 1 (basılı) ise, Seri bağlantı noktasına 2 değerini kaydedin.

Adım 4: Unity'yi Seri Bağlantı Noktasıyla Bağlama

Unity'yi Seri Port ile Bağlama
Unity'yi Seri Port ile Bağlama
Unity'yi Seri Port ile Bağlama
Unity'yi Seri Port ile Bağlama

Bu adım için, Unity'deki seri portu tanımlayacağız, böylece düğmelere basıldığında Arduino'dan girişleri alabilir. Dizüstü bilgisayarınıza Visual Studio Code yükleyin. Ardından Unity'ye gidin, hiyerarşiden oyuncu 1'i seçin, aşağı kaydırın ve bileşen ekle'yi seçin ve player1_motion yazın ve ardından enter tuşuna basın. 1. resme bak

Denetçide bir C# betiği oluşturulacak, üzerine sağ tıklayın ve betiği düzenle'yi seçin, görsel stüdyo kodu açılmalı ve resim 2'ye benzeyen varsayılan bir kod gösterecektir.

Aşağıdaki kodu kopyalayın ve ardından "SerialPort sp = new SerialPort("COM10", 9600);" öğesini değiştirin. SerialPort sp ile = new SerialPort("Arduino'nuzun bağlı olduğu COM bağlantı noktası", 9600); Arduino kodunuza geri dönüp Araçlar> Bağlantı Noktası> COM'a (hangi numara görünüyorsa) giderek onu bulabilirsiniz.

Kod:

System. Collections'ı kullanarak;

System. Collections. Generic kullanarak; UnityEngine'i kullanarak; System. IO. Port'ları kullanarak; public class player1_motion: MonoBehaviour { float hızı = 8; özel şamandıra miktarı hareket; SerialPort sp = new SerialPort("COM10", 9600); // Start, ilk çerçeve güncellemesinden önce çağrılır void Start() { sp. Open(); sp. ReadTimeout = 1; } // Güncelleme, çerçeve başına bir kez çağrılır void Update() { miktartomove = hız*0.01f; if(sp. IsOpen){ deneyin { moveObject(sp. ReadByte()); print(sp. ReadByte()); } catch(System. Exception){ } } } void moveObject(int Direction) { if(Direction == 1){ transform. Translate(Vector3.left*amounttomove, Space. World); } if(Yön == 2){ transform. Translate(Vector3.right*amounttomove, Space. World); } } }

Kodun Açıklaması:

Bu kod, birliğe seri porttan (COM 10) girişler almasını söyler. Sol tuşa basıldığında Arduino seri porta 1 değerini gönderir, unit seri porttan 1 alırsa oyun nesnesi "oyuncu 1"e sol yönde bir hız eklenir. Sağ tuşa basıldığında, Arduino seri porta 2 değerini gönderir, eğer birlik seri porttan 2 alırsa, oyun nesnesine "oyuncu 1" doğru yönde bir hız eklenir. seri port, seri porttan bir değer almazsa, her iki yönde de hız eklenmez, bu nedenle kart sabit kalır.

Kodu kopyaladıktan sonra kodu oluşturmak ve çalıştırmak için F5 tuşuna basın. Birliğe geri dönün ve oynat düğmesine basın, oyuncu 1, sağa bastığınızda sağa, sola bastığınızda sola hareket etmelidir.

Şimdi, aynı adımları bir kez daha ama oyuncu 2 ile yapın ve player1_motion yerine 'Add component' player2_motion yazdığından ve aynı seri portu değil, ikinci kontrol cihazının bağlı olduğu ikinci COM portunu tanımladığınızdan emin olun.

Ayrıca kodun kendisinde "public class player1_motion: MonoBehaviour"u "public class player2_motion: MonoBehaviour" olarak değiştirmeniz gerekecektir.

Adım 5: Topu Ekleme

Top Eklemek
Top Eklemek
Top Eklemek
Top Eklemek
Top Eklemek
Top Eklemek
  1. Yeni bir oyun nesnesi ekleyin, ancak bu sefer kare yerine bir daire seçin.
  2. "Top" olarak yeniden adlandırın.
  3. Hiyerarşide sürükleyip bırakın.
  4. Ölçeği ayarlayın (X:0.2 - Y:0.2 - Z: 0.2).
  5. Bir Rigidbody 2D ekleyin ve yalnızca Z eksenini dondurun.
  6. Kütleyi 0.0001 olarak değiştirin
  7. Yerçekimi Ölçeğini 0 olarak değiştirin.
  8. Bir Kutu Çarpıştırıcısı 2D ekleyin.
  9. Varlıklar>Oluştur>Fizik materyali 2D'ye gidin Resim 1'e bakın
  10. adını "sıçrama" olarak değiştirin
  11. Müfettişten sürtünmeyi sıfıra değiştirin
  12. Müfettişten zıplamayı 1 olarak değiştirin
  13. "Sıçramayı" sürükleyip Rigidbody 2D'ye bırakın>Malzeme Resim 2'ye bakın
  14. Hiyerarşiden tekrar "top"u seçin ve bileşen eklemeye gidin ve Ball_movement yazın ve enter tuşuna basın.
  15. Komut dosyasına sağ tıklayın ve komut dosyasını düzenle'yi seçin.
  16. Aşağıdaki kodu kopyalayın ve oluşturmak ve çalıştırmak için F5 tuşuna basın.

Kod:

System. Collections'ı kullanarak;

System. Collections. Generic kullanarak; UnityEngine'i kullanarak; public class Ball_movement: MonoBehaviour { // Başlangıç, ilk çerçeve güncellemesinden önce çağrılır özel kayan nokta kuvveti = 2; void Start() { StartCoroutine(move()); } IEnumerator move() { verim return new WaitForSeconds(2); GetComponent(). AddForce(new Vector2(1f, 0.5f)*0.02f*force); } }

Kod açıklaması

Bu kod, topa her iki yönde X yönünde ve Y yönünde aynı büyüklükte bir hız verir, bu da topun 45° açıyla hareket etmesini sağlar. 8. adımda topa bir fizik malzemesi ekledik ve zıplamasını değiştirdik, bu topun oyun boyunca hareketini koruyor.

Adım 6: Oyunu Sonlandırma

Oyunu Sonlandırmak
Oyunu Sonlandırmak
Oyunu Sonlandırmak
Oyunu Sonlandırmak
Oyunu Sonlandırmak
Oyunu Sonlandırmak
Oyunu Sonlandırmak
Oyunu Sonlandırmak

Şimdi kaybetmeyi mümkün kılmalıyız, eğer oyunu çalıştırırsanız, topun 1. veya 2. oyuncunun üzerinden geçtiğinde, sınırdan sektiğini ve oyunumuzda tam olarak ihtiyacımız olan şeyin bu olmadığını fark edeceksiniz. Bunun yerine, top yukarı veya aşağı sınırlarla her çarpıştığında puanı sayan ve topun konumunu sıfırlayan bir sayı sayacı yapmak istiyoruz.

  1. Topu Hiyerarşiden Projeye sürükleyip bırakın, Daha sonra kullanabilmeniz için topun bir ön yapısını yaptınız.
  2. Hiyerarşiye sağ tıklayın ve Boş Oluştur'u seçin. boş bir Nesne görünecek, topun yeniden doğması için yeniden adlandırılacak ve konumunu topun konumuyla aynı olacak şekilde değiştirecektir.
  3. Hiyerarşiye sağ tıklayın ve UI>>Metin'i seçin. Metnin bir tuvale eşlik ettiğine dikkat edin, metnin oyundaki konumu, oyunumuzun sınırları içinde değil, metnin tuval içindeki konumuna bağlıdır. (1. resme bakın).
  4. Metnin konumunu, olmasını istediğiniz yere değiştirin.
  5. İkinci oyuncunun puanı için 3. ve 4. adımları tekrarlayın.
  6. İlk metni "Oyuncu 1 Puanı: 0" yazın ve ikinci metni "Oyuncu 2 Puanı: 0" yazın. (2. resme bakın).
  7. Üst sınırda p1wins adlı bir komut dosyası oluşturun ve aşağıdaki kodu kopyalayın.

Kod:

System. Collections'ı kullanarak;

System. Collections. Generic kullanarak; UnityEngine'i kullanarak; UnityEngine. SceneManagement'ı kullanarak; UnityEngine. UI'yi kullanarak; public class p1wins: MonoBehaviour { public Text puanı; public Transform ball_respawn; halka açık GameObject topu; özel int p1 = 0; // Başlangıç, ilk çerçeve güncellemesinden önce çağrılır void Start() { } // Güncelleme, çerçeve başına bir kez çağrılır void Update() { score.text = "Oyuncu 1 Puanı:" + p1; } void OnCollisionEnter2D (Collision2D diğer) { if(other.gameObject.tag == "Top") { Destroy(other.gameObject); p1++; Instantiate(top, ball_respawn.position, ball_respawn.rotation); } } }

8. 1. adımdaki projeden bilye prefabrikini Ball parametresine sürükleyip bırakın. (3. resme bakın)

9. Topun yeniden doğmasını hiyerarşiden Top yeniden doğma parametresine sürükleyip bırakın. (3. resme bakın)

10. oyuncu 1 puanını hiyerarşiden Puan parametresine sürükleyip bırakın. (3. resme bakın)

Kodun Açıklaması:

Top üst sınırla çarpıştığında yok eder ve 2. adımda belirlediğimiz ball_respawn konumunda yeniden doğar. Topu hazır hale getirmenin amacı, topu tüm özellikleriyle yeniden canlandırabilmektir, aksi takdirde topu kullandıysak. hiyerarşiden yeniden doğacak ama hareket etmeyecek. Ayrıca top üst kenarlıkla çarpıştığında, başlangıçta 0'a eşit olan ve p1 olarak adlandırılan bir değer 1 artar. Bu değer metin olarak görüntülenir, böylece top üst kenarlıkla çarpıştığında 1. oyuncunun puanı 1 artar.

Şimdi alt sınır için 7, 8, 9 ve 10. adımları uygulayın

7. adım için p2wins adlı bir komut dosyası oluşturun ve bunun yerine aşağıdaki kodu kopyalayın.

10. adım için, 2. oyuncu puanını hiyerarşiden Puan parametresine sürükleyip bırakın.

Kod:

System. Collections'ı kullanarak;

System. Collections. Generic kullanarak; UnityEngine'i kullanarak; UnityEngine. SceneManagement'ı kullanarak; UnityEngine. UI'yi kullanarak; public class p2wins: MonoBehaviour { public Text puanı; public Transform ball_respawn; halka açık GameObject topu; özel int p2 = 0; // Başlangıç, ilk çerçeve güncellemesinden önce çağrılır void Start() { } // Güncelleme, çerçeve başına bir kez çağrılır void Update() { score.text = "Oyuncu 2 Puanı:" + p2; } void OnCollisionEnter2D (Collision2D diğer) { if(other.gameObject.tag == "Top") { Destroy(other.gameObject); p2++; Instantiate(top, ball_respawn.position, ball_respawn.rotation); } } }

Önerilen: