Unity 3D Temple Run Tarzı (Infinite Runner) Oyun Örneği

Yayınlandı: 15 Ocak 2015 yasirkula tarafından Oyun Tasarımı, UNITY 3D içinde

GÜNCELLEME (28.09.2019): Örnekteki kodların bir kısmı güncellendi.

Hepinize merhabalar,

Yeni bir Unity 3D örneğiyle karşınızdayım. İsminden de anlaşılacağı üzere bu bir infinite runner oyunu örneği. Örnekteki tüm kodlar C# dili ile yazıldı ve olabildiğince comment’lendi. Örnek hem PC hem de mobil platformlarda sorunsuz çalışmakta (bende sıkıntı çıkmadı). Kontroller tasarlanırken Temple Run oyunu baz alındı.

Buyurun size örnekten bir resim:

temple run

Linkler ve açıklamalar için yazının devamını okuyabilirsiniz…

Bu örnek aslında Klonluyoruz serisinin ikinci dersi olacaktı ancak sonradan vazgeçtim. İyiki de vazgeçmişim zira oyunun yapımını adım adım anlatmak aylarımı alırdı. Klonluyoruz’un ikinci dersi ne hakkında olacak; işte o henüz belli değil.

Bu örnekle birlikte UI sistemini ilk kez kullanmış oldum. Unity’nin yeni UI sistemi gerçekten de çok ilgi çekici olmuş ve hâlâ denemediyseniz şiddetle tavsiye ederim. Oyunda yer alan menüler ve 3D skor yazısı tamamen UI sistemi ile yapıldı.

Onun haricinde ilk defa bir projemde pool (havuz) pattern kullanmış oldum. Bu pattern’in ne işe yaradığıyla ilgili, scriptlerden birinde yazdığım ufak bir comment’i burada da paylaşmak isterim:

Bu örnekte pooling adı verilen bir teknikten (pattern) faydalanıyoruz. Bu pattern’in hedefi oldukça basit: eğer ki bir objeyi oyun boyunca defalarca kez Instantiate ve Destroy ediyorsak bunun yerine o objeyi Destroy etmiyor ama havuz adı verilen bir yerde depoluyoruz ve o objeye tekrar ihtiyacımız olduğunda objeyi direkt havuzdan çekiyoruz, yani Instantiate ile uğraşmıyoruz.

Bu pattern bir infinite runner oyunu için kritik öneme sahip çünkü bu tür oyunlarda yol prosedürel olarak oluşturuluyor, sonsuza kadar gidiyor ama genel olarak aynı obje oyun boyunca defalarca kez kullanılıyor. Eğer ki yeni yol oluşturma işlemini Instantiate ve Destroy’lar ile yapsaydık tek bir seferde belki onlarca, belki yüzlerce objenin Instantiate ve(ya) Destroy edilmesi gerekecekti ve bu da FPS’te o an ciddi bir düşüşe, belki de bir iki saniyelik ciddi takılmalara sebep olacaktı.

Örnekteki tüm kodları ben yazdım; hepsinden dilediğinizce faydalanabilirsiniz. Kodların haricinde o “harika” low-poly karakter modeli ile “muhteşem” animasyonlar da benim eserim 😀 Sadece tuğla ve çimen texture’leri ile ses dosyaları bana ait değil ve onları ticari oyunlarınızda kullanmanızı tavsiye etmem (copyright yememek için).

Bu örneğin eksik (geliştirmeye açık) yönleri neler diyebilirsiniz. Öncelikle şunu söyleyebilirim ki şu anda rastgele yol oluşturma algoritması “çok” basit. Rastgele seçilen zemin objeleri uç uca diziliyorlar sadece. Arada herhangi bir koşul söz konusu değil. Buna ek olarak karakterin hareket etme kodları da mükemmel sayılmaz. Mesela karakterin yuvarlanması gibi birşey bu örnekte söz konusu değil (ama elbette ki zıplama var).

Ben en iyisi sizi daha da sabırsızlandırmayayım ve örneğin linklerini paylaşayım:

Projeyi WebGL ile tarayıcınızda test etmek için tıklayın: http://yasirkula.freeiz.com/Projects/YasirRun/

Projeyi indirmek için (Unity3D projesi) tıklayın: https://www.dropbox.com/s/ckzkzr6a5pn0vgo/TempleRunKlon.rar?dl=0

NOT: PC’de oynarken dönemeçlerden sağa sola dönmek için A ve D tuşlarını kullanabilirsiniz.

Örneğin faydalı olmasını diliyor, sonraki derste görüşmek üzere diyerek yazımı noktalıyorum.

yorum
  1. Furkan Cansız dedi ki:

    Hocam merhaba unity editörde a ve d ile karakteri hareket ettiremiyorum sadece yol sonunda dönmek için işe yarıyor ve mouse dan çok az bir hareket alıyor bu konu hakkında yardımcı olabilir misiniz?

    • yasirkula dedi ki:

      Evet InputManager’ın YatayInputAl fonksiyonu sadece mouse’dan ve telefonun sağa-sola yatırılmasından input alıyor. O fonksiyonun içerisinde döndürülen değeri istediğiniz gibi çarparak veya Player’ın “Yatay Hiz”ını Inspector’dan değiştirerek hareket hızını değiştirebilirsiniz. A-D ile karakteri sağa sola hareket ettirmek için YatayInputAl fonksiyonunda düzenleme yapabilirsiniz (Input.GetAxis(“Horizontal”)’dan da input alabilirsiniz orda).

  2. Gençdevelop dedi ki:

    https://play.google.com/store/apps/details?id=com.gameking.labyrinth
    Hocam oyunumu yayınladım.Sizin büyük yardımınız oldu.Çok teşekkür ederim:)

  3. Yunus Emre dedi ki:

    Uzun zaman olmuş projenin üzerine ama şöyle bi hata alıyorum çözümünü bulamadım belki yardımcı olabilirsiniz
    NullReferenceException: Object reference not set to an instance of an object
    YolContainer.YolaPuanObjeleriDiz (ObjeHavuzu havuz, System.Int32 birDizidekiPuanObjesiSayisi) (at Assets/Scripts/YolContainer.cs:99)
    SonsuzYolScript.YolOlustur (YolContainer c, UnityEngine.Vector3 baslangicNoktasi, UnityEngine.Vector3 ileriYon) (at Assets/Scripts/SonsuzYolScript.cs:114)

    • yasirkula dedi ki:

      Yol prefab’larının içinde PuanSpawnPointSol ve PuanSpawnPointSag adında, puan dizilebilecek noktaları tutan iki adet GameObject olur (hazır yol prefab’larına bakabilirsiniz). Bu objeler yoksa bu hatayı alırsınız.

Cevap Yazın

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.