Unıty : Arduino İle Oyun Yapma

0
Unıty : Arduino İle Oyun Yapma

Herkese merhabalar bu yazıda önceden öğrendiğimz herşeyi birleştirip basit bir oyun yapacağız. Oyunun senaryosu şu şekilde bir ejderhamız var bu ejderha kendi sağa sola gidip geliyor biz ise uzaklık sensörü ile bu ejderhanın hızını arttırabiliyoruz ve ısı sensörü yardımıylada ejderhadan ateş çıkmasını sağlıyoruz.Ben iki tane arduino kullandım projeyi yaparken çünkü seriden veri gönderdiğim için veriler ardışık olarak gidiyor ben ayrı ayrı portlardan veri almak istedim ama tek arduino ile yapmakta mümkün ama rahatlık açısından ben bu yolu tercih ettim.Videoda ne demek istediğime bakabilirsiniz.

Şimdi ilk öncelikle ısıyı okuyacağımız arduinoya bakalım;


void setup()
{
pinMode(A2,INPUT);//sensörden bilgi aldığımız pin
Serial.begin(9600); //seri portu başlattık
}
void loop()
{

isi();

}
int sicaklik;
void isi()
{
int hesap=(1023*0.01)/5;//burada gerekli hesaplamayı yatık lm35 dahasheetine bakarak
sicaklik=analogRead(A2)/hesap;//elde ettiğimiz değeri sicaklik değişkenine aktardık

Serial.println(sicaklik);//ve değeri seriden gönderdik

delay(50);//burada ki delay önemli veriler çok hızlı aktığı için biraz yavaşlatmakta fayda var

}

Burada kodların üzerine yazdım açıklamaları kullandığım ısı sensörü LM35.

Şimdi mesafe ölçeceğimiz arduinoya bakalım;


void setup() {
pinMode(6,OUTPUT);
pinMode(7,INPUT);
Serial.begin(9600);
}

void loop() {
mesafe();
}
int sure,uzaklik;
void mesafe()
{

digitalWrite(6, LOW); // sensör pasif hale getirildi
delayMicroseconds(5);
digitalWrite(6, HIGH); // Sensore ses dalgasının üretmesi için emir verildi
delayMicroseconds(10);
digitalWrite(6, LOW); // Yeni dalgaların üretilmemesi için trig pini LOW konumuna getirildi
sure = pulseIn(7, HIGH); //ses dalgasının geri dönmesi için geçen sure ölçülüyor */
uzaklik= (sure /58); // ölçülen sure uzaklığa çevriliyor

Serial.println(uzaklik);
delay(50);
}

Burada kodların üzerine yazdım açıklamaları kullandığım mesafe sensörü HC-SR04.

Şimdi unity tarafına bakalım;

Burada 5 ayrı sınıf kullanacağız bunlardan ilki ejderhanın hareket sınıfı bu sınıf biraz uzun gibi ama aynı şeyler yazıyor inceleyince göreceksiniz.


using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class pionner10 : MonoBehaviour {

GameObject mermi;//burada ateşi objesini bulacağız

void Start ()
{
mermi = GameObject.Find ("mermi");//sahnede ateşi bulduk
}
int kont=2;
public int seriIsi,seriMesafe;//seri porttan gelen değerleri burada saklayacağız

void Update ()
{

float hiz = 0.1f;//eğer sensörden değer gelmiyorsa default değeri olarak belirlediğimiz değer
int ates = 0;
if (seriMesafe==1 && seriMesafe = 10) //eğer uzaklık sensöründen gelen değer 1 cm ve 10 cm arası ise hızımız artacak
{
hiz = 0.5f;
}

if (seriIsi == 50 && seriIsi == 60) //burada da ısı sensöründen gelen değerimiz 50 derece ve 60 derece arasında ise ejderha ateş püskürtecek
{
ates=1;
}

if (this.gameObject.name =="1" ) //burada ejderha nın sağa ve sola kendiliğinden gitmesi yapıldı ve sahnede ejderha objesini buldu
{
if (kont == 2)//sadece bir kere çalışmasını istediğim için ilk başta 2 verdim bir daha hiç 2 olmayacak
{
transform.Translate(new Vector3(0.1f, 0, 0));
}
if (transform.position.x == 27) {//koordinatlara göre x değeri 27 ye eriştiği zaman sola doğru gitmesi için kont değeri 1 yapıldı
kont = 1;
}

if (kont == 1) {
transform.Translate (new Vector3 (-hiz, 0, 0)); //kont değeri 1 olunca sola doğru gidiyor

}
if (transform.position.x == 5) {//eğer 5 e küçük eşitse bu sefer değer 0 oluyor ve sağa doğru gidiyor//yani 0 olunca sağa gidiyor 1 olunca sola gidiyor gemi
kont = 0;
}

if (kont == 0) {//değeri sıfır olunca sağa doğru gidiyor
transform.Translate (new Vector3 (hiz, 0, 0));
}


if (ates==1)//istediğimiz dereceye ulaştıysak ejderha ateş püskürtüyor
{
Instantiate(mermi, transform.position, Quaternion.identity);
}

}
if (this.gameObject.name == "1") //burada sahnede düşmanların çıkacağı gameobject in otomatik sağa sola gitmesi sağlanıyor aynı şekilde
{
if(kont==2)//sadece bir kere çalışmasını istediğim için ilk başta 2 verdim bir daha hiç 2 olmayacak
transform.Translate (new Vector3 (0.5f, 0, 0));
if (transform.position.x == 27)//koordinatlara göre x değeri 27 ye eriştiği zaman sola doğru gitmesi için kont değeri 1 yapıldı
{
kont = 1;
}

if (kont == 1)
{
transform.Translate (new Vector3(-0.5f,0,0)); //kont değeri 1 olunca sola doğru gidiyor

}
if (transform.position.x == 5)//eğer 5 e küçük eşitse bu sefer değer 0 oluyor ve sağa doğru gidiyor
{ //yani 0 olunca sağa gidiyor 1 olunca sola gidiyor gemi
kont = 0;
}

if (kont == 0)
{
transform.Translate (new Vector3(0.5f,0,0));
}


}

}
}

Bu sınıfta ejderhanın hareketi ve seriden gelen bilgilere göre neler yapması gerektiği belirtiliyor. Ejderhanın ve düşmanların çıkacağı nokta hep sağa ve sola gidecekleri için ikisininde bu sınıfı ortak kullanmalarını istedim ve gameobject ismine göre aynı işlemleri tekrarladım.

Ejderhanın ateşinin hareket edeceği küçük sınıfa bakalım;


using UnityEngine;
using System.Collections;

public class mermi : MonoBehaviour {


void Update ()
{
transform.Translate (new Vector3(0,0.2f,0));//merminin çıkar çıkmaz yukarı doğru gitmesi için
}
}

Uzay gemilerinin çıkacağı yani düşmanların çıkacağı sınıfa bakalım;


using UnityEngine;
using System.Collections;

public class gemiCik : MonoBehaviour {

GameObject yer,dusman,yer2;
void Start ()
{
dusman = GameObject.Find ("enemy");//sahneden düşman objesini buluyor
yer = GameObject.Find ("cikis1");// aynı zamanda hangi noktadan çıkacağınıda buluyor
}

void cik()
{
Instantiate (dusman,yer.transform.position,Quaternion.identity);//burada artık gerekli kontrol sinyali geldiği zaman düşma objesi çıkıyor

}

int sayac=0;
void Update ()
{

if (Random.Range (1, 50) == 4)//burada düşaman obejelerinin biraz daha yavaş çıkması için böyle bir kod yazdım
{ //sayac değeri artırılarak daha yavaş çıkması sağlanabilir
sayac++;
if (sayac == 1)
{
Invoke (cik,1); //instantiate fonksiyonu tetikleniyor
sayac = 0;
}

}
}
}

Burada kodları tekrar tekrar açıklamayacağım önceki derslerde hepsini ayrıntılı anlattık.

Şimdi de seri porttan veri okuyacağımız sınıfa bakalım;


using UnityEngine;
using System.Collections;
using System.IO.Ports; //*****seri iletişim için bu kütüphaneyi eklemeliyiz
public class seriVeri : MonoBehaviour {
pionner10 kontrol;
SerialPort seriIsi = new SerialPort(COM5,9600);//burada hangi seri portu kullancağımızı ve yine saniyede veri hızını belirtiyoruz
SerialPort seriMesafe = new SerialPort(COM4, 9600);//burada hangi seri portu kullancağımızı ve yine saniyede veri hızını belirtiyoruz

void Start ()
{
seriIsi.Open();//seri portu kullanıma açıyorum
seriMesafe.Open();//seri portu kullanıma açıyorum
kontrol = GameObject.Find().GetComponent<pionner10>();
}

void Update ()
{

kontrol.seriIsi = int.Parse(seriIsi.ReadLine());//seri porttan veriyi okuduk ve gönderdik
kontrol.seriMesafe = int.Parse(seriMesafe.ReadLine());//seri porttan veriyi okuduk ve gönderdik

}
}

Son sınıfımızda ise ateşin değdiği düşmanları yok edeceğimiz fonksiyon;


using UnityEngine;
using System.Collections;

public class yokEt : MonoBehaviour {


void OnTriggerEnter(Collider other)
{
if(other.tag=="dead")//gameobjectin tagine göre buluyoruz
{
Destroy(other.gameObject);//burada ateşin değdiği düşmanları yok ediyoruz
}
}

}

Burada farklı bir fonksiyon var OnTriggerEnter adında bu fonksiyon bize farklı objelerin çarpışmalarını veya birbirlerine değmeleri olaylarında yardımcı olur.Kullanımı görüldüğü üzere son derece basit burada önemli olan etkileşime girecek gameobjectlerin collider ve rigidbodyleri olmalı ki çarpışmaları ve değmeleri hesaplıyabilsin oyun motoru.

Sonuç;
Bilgisayar ile fiziksel dünyayı biraz daha birbiriyle etkileşimli hale getirmeye çalıştık burada kullandığım sönsörler arduinolar vs. çok performanslı olmadıklarından çok stabil çalışmıyorlar yani anlık tepki almak biraz güç.Tabi hiç kimse elinde çakmakla vs. ile oyun oynamaz 🙂 sadece fikir vermek açısından böyle bir uygulama yapmak istedim unity ile sadece oyun değil daha bir çok şeyin yapılabileceğini göstermek istedim.

LEAVE A REPLY