Arduino ve Unity ile Özel Oyun Denetleyicisi Nasıl Yapılır?

Arduino ve Unity ile Özel Oyun Denetleyicisi Nasıl Yapılır?

Hiç kendi oyun kumandanızı tasarlamak istediniz mi? Düşündüğünden daha kolay!





Bu kısa projede Unity oyun motoruyla kullanmak için basit bir özel oyun denetleyicisi oluşturacağız. Bu kontrolör bir Arduino Uno tarafından desteklenecek, ancak bu proje için birçok alternatiften birini de kullanabilirsiniz. Ayrıca düşen nesnelerden kaçınmak ve zamanı yavaşlatmak için kumandanızı kullanacağınız temel bir oyun oluşturacağız.





Bu Proje İçin İhtiyacınız Olacak

  • Arduino veya benzeri mikrodenetleyici
  • 1 x 10k Ohm direnç
  • 1 x Anlık anahtar
  • 1 x Potansiyometre
  • Bağlantı telleri
  • bir ekmek tahtası
  • Birlik oyun motoru
  • Unity Asset Store'dan Uniduino eklentisi (30 $)
  • Yazmak istememeniz durumunda proje kodunu tamamlayın (Uniduino eklentisini içermez)

Bunların çoğu bir Arduino başlangıç ​​setinde mevcuttur. Başlangıç ​​kitiniz yoksa, sizin için en iyisini seçmek için kılavuzumuza göz atın.





Kontrol cihazınızı istediğiniz kadar karmaşık hale getirebilirsiniz, ancak bu örnek için bir potansiyometre ve bir düğme ayarlayacağız - basit bir arcade oyununu kontrol etmek için mükemmel.

Denetleyicinizin Montajı

Aşağıdaki resimde gösterildiği gibi breadboard ve Arduino'nuzu kurun. Oyun kumandamız olarak kullanacağımız şey bu olsa da, oyun kumandası ile neredeyse aynı kurulumu kullanabilirsiniz. DIY midi denetleyici fazla!



Arduino'nuzu Hazırlamak

Her şeyi bağladıktan sonra Arduino'nuzu USB üzerinden bağlayın. Arduino Yazılım IDE'sinde Araçlar > Pano ve Araçlar > Bağlantı Noktası hangi mikrodenetleyiciyi ve bağlantı noktasını kullandığınızı seçmek için. Arduino IDE, ihtiyacımız olan taslakla birlikte gelir ve bunu altında bulabilirsiniz. Dosya> Örnekler> Firmata> StandardFirmata . Yükle'ye tıklayın ve gitmeye hazır olacaksınız.

Arduino'da yeniyseniz ve kafanız biraz eriyorsa, şuraya göz atın: Yeni başlayanların rehberi Bilgisayarınızla güzel bir şekilde konuşmanıza yardımcı olmak için.





Unity Projenizi Kurma

Unity'de açık Pencere > Varlık Deposu Unity Düzenleyici içinden Unity'nin Varlık Mağazasına erişmek için. Uniduino eklentisi için Varlık Mağazasında arama yapın. Bu eklenti, Unity içindeki Arduino pinlerinize veri alıp göndermenize izin verecektir. Yazma sırasındaki eklentinin maliyeti 30 ABD dolarıdır. Bu mümkün Bu projeyi eklentiyi satın almadan yapmak oldukça karmaşık olsa da ve eklentiyi her yönden daha uygun bulabilirsiniz.

Eklentinin yaratıcılarından gelen bu video, ilk kurulumla birlikte her şeyin çalıştığını test etme sürecinde sizi yönlendirir. Windows'ta Unity düzenleyicisini de sıfırlamanız gerekebileceğini unutmayın.





Kontrolörümüzü test etmek için aynı test panelini kullanabiliriz. Pin D2'yi GİRİŞ ve Dijital olarak ayarlayın. Daha aşağıda, Pin A5'i ANALOG olarak ayarlayın. Potansiyometreniz ve düğmeniz artık pin numaralarının yanında değerleri göstermelidir. İlerlemek!

Şimdi Kontrol Edebileceğimiz Bir Şey Yapmak İçin

Yani bir kontrolörümüz var ama neyi kontrol edeceğiz? Olasılıklar sonsuz ama bugün için yeni kontrol sistemimizi test etmek için çok basit bir kaçma oyunu oluşturacağız. Oyun kurulumunu oldukça hızlı bir şekilde ele alacağız, bu nedenle Unity motorunda tamamen yeniyseniz, Unity Oyun Programlama Başlangıç ​​Kılavuzu yataklarınızı almak için yararlıdır.

Düşen küplerden kaçınmak için kürenizi sola ve sağa atlatmak olan, yeni yapılmış özel kontrol cihazınızı kullanacak olan çok basit bir oyun yapacağız.

Yeni bir sahne oluşturun ve Uniduino hazır yapısını Varlıklar > Uniduino > Hazır Yapılar hiyerarşinize ve Uniduino prefabrikini hiyerarşiye sürükleyin. Oyunumuz ve denetleyicimiz arasındaki konuşmayı yapmak için ona ihtiyacımız var.

Birlik hiyerarşisinde tıklayın Oluştur > Küre ve oyun ekranının en altına taşımak için Müfettiş'teki Dönüştür sekmesini kullanın.

Kodlama Alma Zamanı

Şimdi bu partiye bazı kodlar eklemek için. Hiyerarşide küre seçiliyken, Bileşen Ekle > Yeni Komut Dosyası Müfettiş penceresinin altında. Adını sen koy küreMover ve seçin C Keskin açılır menüden. Tıklamak Oluştur ve Ekle ve komut dosyası GameObject'e eklenecektir. Komut dosyasını açmak için üzerine çift tıklayın ve şu kodu girin:

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

Kod yorumlarını okumak için bir dakikanızı ayırın. Şimdiye kadar Arduino'muz, pinleri ve Sphere'imiz için bazı değişkenler tanımladık. Biz de kullandık

Arduino'muzu çalışma zamanında başlatmak için Pins yöntemlerini başlatın ve yapılandırın. Komut dosyamızı kaydedelim ve Unity editörüne geri dönelim ve nelerin değiştiğini görelim.

Artık genel değişkenlerimizi Inspector penceresinde görebiliriz. Bakalım daha sonra bize yardımcı olması için bu aşamada neler girebiliriz. Arduino'da hangi pinleri kullandığımızı daha önceki yapımızdan biliyoruz, onları girebiliriz. Ayrıca, küremizin ekrandan düşmemesi için sola ve sağa ne kadar uzağa gidebilmesini istediğimizi daha önceki deneyimimizden de biliyoruz. Şimdi bu değerleri girelim.

Yaşamın İlk Belirtileri

Unity Editor içinde Arduino'muzdan değerleri görmenin zamanı geldi. Şimdilik, küreMover betiğimizin Güncelleme işlevine bir satır kod ekleyebilir ve betiği tekrar kaydedebiliriz.

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

Artık potValue değişkenimiz her karede güncellendiğine göre, Unity Inspector'da değerini gerçek zamanlı olarak görebiliriz. Test etmeden önce, Uniduino eklentisinin doğru bağlantı noktasını dinlediğini kontrol etmek için iyi bir zaman olabilir. Heirarchy'de Uniduino'ya tıklayın ve Inspector'da Port Name'i kontrol edin. Boşsa, Arduino'nuz için doğru port numarasını girin. Bu durumda COM4 idi, ancak sizin için farklı olabilir. Emin değilseniz Arduino IDE'yi kullanmayı kontrol edin.

Hiyerarşide kürenizi seçin ve ekranın üst kısmındaki Oynat düğmesini tıklayın. Sistemin başlatılması için birkaç saniyeye ihtiyacı vardır, bundan sonra potansiyometreyi hareket ettirdiğinizde denetçide Pot Value değişkeninin değiştiğini görmeye başlamalısınız.

Şimdi konuşuyoruz! Pekala, kesinlikle Unity ve Arduino konuşuyor, ama kim sayıyor? Buraya kadar geldiyseniz ve denetçide değer değişikliğini göremiyorsanız, kurulum adımlarını kontrol edin ve Arduino'nuz için doğru Portun seçili olduğundan emin olun.

Bu Küreyi Taşıyalım

Artık potValue değişkeni güncellendiğine göre, küremizi hareket ettirmek için bu değeri kullanmak istiyoruz. Potansiyometre tamamen sola gittiğinde, kürenin ekranın sol tarafında olmasını isteriz ve bunun tersi de geçerlidir. Unity'deki nesneler, vektör uzayındaki değerleri tarafından belirlenen bir noktada konumlandırılır. Transform.position . Aşağıdaki resimde, kürenin en solda olmasını istediğimiz yerde konum vektörünün 9.5, -4, 0 olduğunu görebilirsiniz.

Kürenin X konumunu etkilemek istiyoruz. Ne yazık ki potansiyometremizdeki değerleri doğrudan kullanmak işe yaramaz, çünkü potansiyometre tamamen sola geldiğinde 0 değeri verir - bu da küremizi ekranın tam ortasına yerleştirir. Diğer uçta, potansiyometrenin en yüksek değeri olan 1023, küpü ekranımızın sağ tarafına yerleştirir. Yararlı değil. Burada ihtiyacımız olan şey biraz matematik.

Unity Sizin İçin Yaparken Neden Matematik Yapıyorsunuz?

Dışarıda, saçma sapan sayılarla kaplı bir kağıda bakmaktan korkanlar için (bazıları harika web siteleri Bu, Matematik öğrenmenize yardımcı olabilir), korkmayın. Potansiyometre değerlerimizi küremizin X pozisyonuna uygun hale getirmenin bir yoluna ihtiyacımız var. Neyse ki, bir kullanabiliriz Uzatma Yöntemi .

Uzantı Yöntemi, bizim için belirli bir iş yapan bir komut dosyasıdır. Bu durumda, biz ona sahip olduğumuz değerleri veririz ve bu onları birbirimizle eşlenmiş olarak, bizim programımızda kullanılmaya hazır olarak döndürür. küreMover senaryo. Proje panelinin üst kısmındaki Oluştur > C# Komut Dosyası ve ExtensionMethods olarak adlandırın. Aşağıdaki kodu komut dosyasına girin:

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

Komut dosyasını kaydedin ve küreMover komut dosyanıza geri dönün. Potansiyometre değerlerimizi oyunumuzda kullanılabilir değerlere dönüştürmek için Update fonksiyonumuzdaki ExtensionMethods betiğimizdeki bu Remap fonksiyonunu artık kullanabiliriz. potValue değişkenini az önce atadığımız yerin altına aşağıdakini yazın:

Komut istemi bize Yeniden Eşlememizin iki Başlangıç ​​ve Bitiş değeri kümesi aldığını ve bunları birlikte eşlediğini gösterir. Değerlerimizi buna girebiliriz.

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

Komut dosyanızı kaydedin, Unity editörüne geri dönün ve oynat düğmesine basın. Şimdi, potansiyometreyi hareket ettirdiğinizde, Sol ve Sağ Kenarlarımız için belirlediğimiz değerlere karşılık gelecek şekilde Mapped Pot değişkeninin değiştiğini görmelisiniz. Arkanıza yaslanın ve ExtensionMethods betiğinize teşekkür edin. Görünürde bir hesap makinesi değil.

Not: Değerlerinizin tersine döndüğünü fark ediyorsanız, potansiyometreniz tamamen sağa geldiğinde Mapped Pot değişkeniniz için negatif bir değer alıyorsanız, potansiyometrenizi yanlış şekilde ayarlamış olabilirsiniz. Neyse ki, herhangi bir yeniden kablolama yapmadan bunu düzeltebilirsiniz. Değerleri yeniden eşlediğinizde basitçe değiştirebilirsiniz:

Artık nihayet kullanılabilir değerlerimiz var. Şimdi geriye kalan tek şey bu değerleri küremizin X konumuna atamak:

televizyonda bilgisayar oyunları nasıl oynanır
//Assign the mapped pot value to the sphere's x position
transform.position = new Vector3(mappedPot, transform.position.y, transform.position.z);

Komut dosyanızı kaydedin, Unity düzenleyicisine geri dönün ve oynat'a basın. Artık potansiyometrenizi kullanarak Kürenizi sola ve sağa hareket ettirebilmelisiniz!

Düğmeyi Çalıştırmak

Artık küremiz hareket ettiğine göre, dar bir noktaya geldiğimizde işleri biraz yavaşlatmanın bir yolu olsa iyi olmaz mıydı? Oyunumuzda zamanı yavaşlatmak için butonumuzu kullanacağız. küreMover komut dosyanızı açın ve bu kodu Güncelleme işlevinize ekleyin

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

Artık oyunumuzun mekaniği elimizde, biraz engel ekleyelim! Kürenin doğal düşmanı olan küpü kullanacağız. Hiyerarşide, tıklayın Oluştur > 3B Nesne > Küp . Küp müfettişinde, Bileşen Ekle > Fizik > Sert Gövde . Katı cismin Sürükleme değerini 5'e ayarlayın. Ayrıca denetçideki Kutu Çarpıştırıcı bileşeninin altında Tetikleyici'yi seçin. Bu, Küremiz ile çarpışmaları tespit etmemizi sağlayacaktır.

Küpte bir komut dosyası oluşturun ve onu çağırın ÇarpışmaSphere ile , komut dosyasını açın ve bu sefer onlara ihtiyacımız olmayacağından Başlat ve Güncelle işlevlerini silin. Bu kodu girin:

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

OnTriggerEnter, tetikleyici çarpıştırıcı başka bir çarpıştırıcıya çarptığında bir mesaj gönderir. Bu durumda ona dokunduğu her şeyi yok etmesini söylüyoruz. Komut dosyasını kaydedin ve Unity düzenleyicisine geri dönün. Küpü hiyerarşiden Proje paneline sürükleyin. Hiyerarşideki küp metninin maviye döndüğünü fark edeceksiniz. Bunun nedeni bir prefabrik oluşturup projemize kaydetmiş olmamızdır. Küpünüzü şimdi hiyerarşiden silin.

Şimdi tek ihtiyacımız olan, küpleri oluşturmak için bir komut dosyası. Hiyerarşide tıklayın Oluştur > Boş Oluştur ve Müfettiş'te Oyun Yöneticisi olarak yeniden adlandırın ve buna gameManager adlı bir komut dosyası ekleyin. Komut dosyasını açın ve şu kodu ekleyin:

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

}
}

Komut dosyasını kaydedin. Düzenleyiciye geri dönün, hiyerarşide Oyun Yöneticisini seçin ve küp hazır yapınızı proje panelinden Müfettiş'teki Küp değişkenine sürükleyin. Burada da yumurtlamanız için değerleri doldurun. İstediğiniz kadar zor veya kolay hale getirmek için onunla oynayabilirsiniz. Uniduino'nun başlamasına izin vermek için en düşük küplerinizin yeterince yüksek doğmasına değer olduğunu unutmayın - oyunu hareket edemeden kaybetmek sinir bozucu olabilir!

Biten Proje

Şimdi play'e bastığınızda, küpler üstünüzde doğacak ve düşecek. Onlardan kaçınmak için potansiyometrenizi ve zamanı yavaşlatmak için düğmenizi kullanabilirsiniz.

Bu projede Arduino ile özel bir kontrolör yarattık, Unity ve Uniduino'yu onunla iletişim kuracak şekilde yapılandırdık ve test etmek için basit bir oyun yarattık. Buradaki kavramlar hemen hemen her projeye uygulanabilir ve hatta özel denetleyicilerde uzmanlaşmış oyun sıkışmaları .

Arduino ve Unity ile hemen hemen her şeyden özel bir denetleyici oluşturabilirsiniz. Bir uzay aracını kontrol eden bir hi-fi yarattınız mı? Bir platform oyununu kontrol eden bir ekmek kızartma makinesi mi?

Böyle bir proje yaptıysanız, görmek isterim! Aşağıdaki yorumlarda yayınlayın!

Paylaş Paylaş Cıvıldamak E-posta 6 Sesli Alternatif: En İyi Ücretsiz veya Ucuz Sesli Kitap Uygulamaları

Sesli kitaplar için ödeme yapmaktan hoşlanmıyorsanız, onları ücretsiz ve yasal olarak dinlemenize izin veren bazı harika uygulamalar burada.

Sonrakini Oku
İlgili konular
  • kendin yap
  • Programlama
  • Arduino
  • Oyun Denetleyicisi
  • Oyun Geliştirme
Yazar hakkında Ian Buckley(216 Makale Yayınlandı)

Ian Buckley, Berlin, Almanya'da yaşayan serbest gazeteci, müzisyen, sanatçı ve video yapımcısıdır. Yazmadığı veya sahnede olmadığı zamanlarda çılgın bir bilim insanı olma umuduyla kendin yap elektroniği veya koduyla uğraşıyor.

Ian Buckley'dan Daha Fazla

Haber bültenimize abone ol

Teknik ipuçları, incelemeler, ücretsiz e-kitaplar ve özel fırsatlar için bültenimize katılın!

Abone olmak için buraya tıklayın