Flappy Bird Oyununu Yeniden Yazalım.
Beş yıl önce ortaya çıkan Flappy Bird, oyun dünyasını etkisi altına aldı. Bağımsız bir geliştirici tarafından yapılan basit bir 2D oyundu fakat App Store ve Play Store sıralamalarında ilk sıralarda yer aldı. Şimdi bu başarılı oyunun bir benzerini yazalım.
Bu yazıyı okuyup oyunu yazacak olanlar unity hakkında temel bilgileri bilmelidir.
Oyunumuzun mantığı Flappy Bird oyunu ile aynı. Bir balığımız var, denizde yüzüyor ve boruların arasından geçiyor. Eğer yukarı çıkması sağlanmazsa yer çekiminin etkisi ile dibe doğru batıyor. Balık borulara değerse, fazla yukarı çıkar veya fazla aşağı inerse oyun bitiyor. Ben oyunun adını swappy fish olarak belirledim.
Swappy Fish Oyununu Beraber Yazalım:
Oyunun tasarımları çok basit ve bu basitlik oyunu daha eğlenceli hale getiriyor. İlk olarak oyun içi öğelerin tasarımı yaparak başlayalım. Ben bu tasarımları daha önceden yaptım.



Tasarımları tamamlanan oyunu yazarken ilk olarak bir proje açalım. Daha sonra proje açıldıktan sonra sol üste yer alan “File” menüsünden “Build settings” butonuna tıklayalım, açılan pencerede “Platform” seçeneğini “Android” olarak belirleyip “Switch Platform” butonuna tıklayalım.

Bütün bunların ardından ilk olarak arka planı ekleyerek başlayalım:

Daha önceden oyunda kullanmak için hazırladığım uzun ve kısa olmak üzere iki adet boru görselim var, bunları pixel olarak çizmiştim. Bunları 3 farklı şekilde bir araya getirdim. Bu boruları prefab hale getirelim ki bunun sayesinde oyun alanını rastgele bir şekilde oluşturabiliriz. Oyun karakterimiz bir balık, bir kuş değil. Bu yüzden ortamımız deniz. Arka planımızı da prefab yapalım. En son balığımı da yerleştirdikten sonra yazılım kısmına geçebiliriz. Balığımıza “ridigbody2d” ve “box collider 2d” ekleyelim. Ridigbody eklemek balığın ekrana dokunulmadığı zaman yerçekiminin etkisine kapılıp aşağı doğru inmesini sağlıyor, box collider ise balığın bir nesneye dokunup dokunmadığını kontrol etmemizi sağlıyor.

İlk önce ekrana dokunma bilgisini alalım: GetMouseButtonDown komutu ekrana mouse ile tıklandığı zaman çalışır, bu aynı zamanda dokunmatik ekranlarda ekrana dokunmayı da algılamamızı sağlar. Jimp: zıplama kuvveti. Y konumuna yazalım, bu sayede balık bir anda yükselmek yerine bir şey onu yukarı itiyormuş gibi yükselecek. Bu fonksiyon balığın içinde bir script yazılarak yapılır. Ridigbody balığa aittir. Update fonksiyonunun içine yazalım.
if (Input.GetMouseButtonDown(0)){
Rigidbody.velocity += new Vector2(0, jimp);}
Şimdi de balığın ve kameranın aynı anda ilerlemesini sağlayalım. Bunu update metodu içine yazıyoruz bu sayede sürekli olarak kontrol ediliyor ve işleniyor, öncelikle bir hız kuvveti oluşturup kameraya “ridigbody” ekliyoruz. Daha sonrasında balığa, kameranın ridigbody değerini zaman ve hız değişkenleri ile çarparak sağ yönde ilerlemesini sağlayalım. (formül: zaman*hız*ridigbody)
void Update(){
Rigidbody.velocity = Vector2.right * hiz * Time.deltaTime;
Camera_Rigidbody.velocity = Vector2.right * hiz * Time.deltaTime;}

Oluşturduğumuz boru çiftlerine ve balığa collider ekleyelim.

Borular ve balık arasında herhangi bir çarpışma olduğunda skor tablosuna puan eklenmesini sağlayalım. Bunun için ilk olarak skor panelini ekrana yerleştirelim.
Ekranda sürekli görünmesini istediğimiz UI ögelerini eklerken öncelikli olarak “”create>UI>canvas” yolunu izleyerek bir canvas ekleyelim. Daha sonra bu canvasa Skor paneli adında bir gameobject ekleyelim. Panele arkaplan olması için bir görsel ekleyelim ve ardından bir text ekleyelim.
OnCollisionEnter2D adında bir metod yazarak balık ile boruların konumları çakışıyor mu kontrolünü yapalım. Bu kontrol bize çarpışma kontrolü yapmamızı sağlıyor. Burada hızı ve zamanı sıfırlıyoruz, fakat burada sıfırladığımız hız ve zaman daha sonra oyuna başlanıldığı zaman da sıfır olarak kalacaktır. Bunu engellemek adına start metoduna zaman değerini 1.5 olarak yazdım.
private void OnCollisionEnter2D(Collision2D collision){
if (collision.gameObject.tag == “boru” ){
FinishText.text =””+ skor;
FinishPanel.SetActive(true);
Time.timeScale = 0;}}
void Start(){
Time.timeScale = 1.5f;}
Balık borulara çarpmadan ilerledikçe skoru arttırmalıyız. Bunun için AddScore adında bir metot yazalım. Bizim yazdığımız oyunda borular her oyun açılışında oluşmuyor. Bunun yerine borular geçildikçe yeni boru yerleşiyor. Yeni yerleşen boru bir öncekinden beş birim ilerisinde oluşuyor. Puan kazanabilmek için boruların arasından geçmiş olmak ve boruların pozisyonunu geçmiş olması lazım. Boruları her geçişinde 10 puan ekleyelim. Boruları ve arkaplanı oyun süresinde çoğaltıyoruz. Bunun için ilk olarak boru gruplarını ve arkaplanı prefab nesnesine dönüştürmeliyiz. Prefab nesneleri Instantiate fonksiyonu ile istediğimiz pozisyon ve rotasyonda çoğaltılabilir. İlk 3 boruyu ve ilk arkaplanı oyunun başlangıcında ekleyelim. Her boruyu geçtiğimizde yeni bir boru oluşturalım. Balık 5 boruyu geçtikten sonra yeni bir arkaplan ekleyelim. 3 farklı boru çifti var oyunda. Bu borular random olarak seçiliyor. Her oyunda oluşan platform birbirinden farklı olarak oluşuyor.
private void PuanArttır(){
if(this.transform.position.x >= i ){
if (i / 15 == 0){
Instantiate(blackground, new Vector3(b+21, 0, 0), new Quaternion(0, 0, 0, 0));
b = b + 21;}
skor += 10;
i += 5;
Random rand = new Random();
int a = rand.Next(0, 3);
if(a==1)
Instantiate(klon1, new Vector3(i + 10, 0, 0),new Quaternion(0,0,0,0));
else if(a==2)
Instantiate(klon2, new Vector3(i + 10, 0, 0), new Quaternion(0, 0, 0, 0));
else if(a==0)
Instantiate(klon3, new Vector3(i + 10, 0, 0), new Quaternion(0, 0, 0, 0));}

Oyunumuz neredeyse bitti. Oyun kaybedildiğinde skoru ekrana yazdıran UI ekranını tasarlayalım ve çıktı verelim. Bir panel ekleyelim, benimkinin adı finish panel. Bu panel ilk olarak start fonksiyonu içinde SetActive değerini false yapalım. Yani panel o an ekranda ancak aktif bir şekilde kullanılmıyor. Bu ekranı balık ile boru çarpıştıktan sonra ortaya çıkması sağlamak için SetActive değerini true yapıyoruz. Bu sayede finish panel ekranda görünüyor yani skorumuz.

Oyunu tekrar oynayabilmek için finish paneline küçük bir buton ekleyelim. Buton tasarımını da daha önceden hazırladığım bir tasarımı kullanacağım. Butonu ekledikten sonra butonu kullanabilmek için butona bir script yazalım. Bu scriptin içinde Butona tıklandığında oyunun yeniden başlamasını sağlayan kodu yazalım. Butonun içinde yer alan buton script kısmındaki Click alanına bir ekleme yapalım. Scripti eklediğim nesneyi Runtime only altındaki kısma ekledim. Runtime only yanındaki kısımdan önce scripti seçip, ardından çalışması gereken metodu seçelim.
public void Click(){
Application.LoadLevel(0);}
Oyunumuz artık oynanabilir. Tebrikler. İyi eğlenceler…
