Oyun Motoru Nedir?

Oyun Motoru Nedir?

Oyun geliştirmeye giriş yapmaya karar verdiğiniz andan kısa bir süre sonra, “oyun motoru” türündeki yazılımlardan birini seçerek, ya da kendiniz sıfırdan yazarak oyun geliştirebileceğinizi öğrendiniz. Library, framework ve oyun motoru ne işe yarar? Aralarındaki farklar neler? Peki bu yazılımlar bir oyun geliştirmek için gerekli olan hangi görevleri yerine getiriyorlar ya da getirmenizde yardımcı oluyorlar? Kendi oyun motorunuzu yazabilir misiniz, yazmalı mısınız? Hangi oyun motorunu seçmelisiniz? Bu soruları ayrı ayrı inceleyelim.


Library (Kütüphane) Nedir?


Bir library, (kütüphane) bir ya da birden fazla çeşitli görevleri yerine getirebilmek amacıyla yazılmış bir kod koleksiyonudur. Genellikle “.dll” gibi derlenmiş ikili dosya türlerinden oluşurlar. Oyun geliştirirken ise ihtiyacınız olabilecek çeşitli görevleri/fonksiyonları:

  • Ses dosyası okumak, yürütmek.

  • Fizik işlemleri hesaplama.

  • Collision (çarpışma) algılama, collision’a tepki gösterme vb.

Yerine getirebilirler.

Çeşitli görevlerde kullanılan popüler kütüphaneleri:

Vb. kütüphaneler ile örneklendirebiliriz.

Framework (Yazılım İskeleti) Nedir?


Framework (Yazılım İskeleti) ise, çeşitli araçlar ile bezenmiş kütüphaneler koleksiyonudur. Oyun motoruna oldukça benzer bir yapısı mevcuttur. Ancak bir World/Level Editor (Dünya/Seviye Düzenleyici) ve Scene Graph (Sahne Grafiği) bulundurmaz. Framework’leri, oyun motorlarına kıyasla daha az özellik sunan, oyun geliştirmenize yardımcı kütüphaneler ve araçlar koleksiyonları olarak özetleyebiliriz.

Framework’lerini, oyun geliştirme alanında sıklıkla kullanılan framework’lere örnek verebiliriz.

Oyun Motoru Nedir?


Oyun motoru, çeşitli platformlar üzerinde oyun geliştirmeye yönelik çeşitli araçlar içeren bir yazılım türüdür. Yazılım iskeletlerinden ayırt edici özelliği, içinde bir “World/Level Editor” (Dünya/Seviye Düzenleyici) ve “Scene Graph” (Sahne Grafiği) bileşenleri barındırmasıdır. Bu bileşenleri ve daha fazlasını, ayrı başlıklar altında inceleyelim.


World/Level Editor (Dünya/Seviye Düzenleyici)


Oyununuzda yer alacak objeleri dilediğiniz gibi konumlandırmanızı, ölçeklendirmenizi, döndürmenizi ve ekleyip/çıkarmanızı sağlayan bir araçtır. Bu araç sayesinde oyununuzu geliştirirken ihtiyaç duyduğunuz, çeşitli sahneleri/seviyeleri gerçek zamanlı şekilde tasarlayabilirsiniz. Oyun motorlarını framework’lerden ayıran en büyük farklardan biri, oyun motorlarının bu araca sahip olmasıdır.


“Scene Graph” (Sahne Grafiği)


Scene Graph (Sahne Grafiği), node’lardan (düğüm) oluşan bir ağaç veri yapısıdır. Her node bulundukları 2D ya da 3D ortamda kendi transformasyon matrisine sahiptir. Transformasyon matrisleri de, objelerin bulundukları ortamdaki yerel pozisyonlarını, rotasyonlarını ve ölçeklerini içeren veri yapılarıdır.

Üstte hareket halindeki bir arabanın sahne grafiğini inceleyebilirsiniz. Ağaçtaki her node, kendi poziyonu, rotasyonu ve ölçeğine sahiptir. “Araba” node’unun transform matrisindeki yapılacak değişiklikler, Her bir alt node’un transform matrisi, üst node’lara bağıntılı olduğu için, üst node’larda yapılacak değişiklikler alttaki node’ları etkiler. Örneğin, “Araba” node’unu hareket ettirdiğinizde, “Sürücü” ve “Tekerlek 1-2-3-4” de “Araba” node’una bağıntılı şekilde, “Araba” node’u ile birlikte hareket eder. Ancak “Sürücü” hareket ettirildiğinde, bir üst node’undaki “Araba” ve aynı seviyede bulunduğu “Tekerlek 1-2-3-4” herhangi bir şekilde etkilenmez.



2D/3D Renderer, (2D/3D Görüntü İşleyici)


Rendering, (“İşleme/Görüntü İşleme”) ekrandaki görüntünün, GPU ve/veya CPU vasıtası ile çizilme/işlenme işlemidir. Ekranda görmüş olduğunuz her görüntü, sabit ya da hareketli olduğu farketmeksizin “renderer” (“İşleyici/Görüntü İşleyici”) olarak adlandırılan bileşen tarafından işlenir. 

Görüntünün dinamik olarak, birim zamanda değiştiği formatlarda, (oyun, 3D tasarım yazılımları, video vb.) görüntü “frame”lerden (“kare”) oluşur. Ölçüm birimi ise “FPS”dir (“Frames Per Second”/”Saniyedeki Kare Sayısı”). İzlediğiniz videonun kaydedilmiş olduğu FPS, ya da oynuyor olduğunuz oyunun cihazınız tarafından anlık olarak işlendiği FPS ne kadar yüksekse, ekranınızın refresh rate’i (yenileme/tazeleme hızı) elverdiğince, FPS’iniz ne kadar yüksekse, görmüş olduğunuz görüntü o kadar akıcı olur. Yani FPS’iniz 60 ise, saniyede 60 farklı kare/görüntü, işleyici tarafından işlenip ekranınızda görüntülenir.

Rendering işlemini “real-time (gerçek zamanlı)” şekilde yapan çeşitli yazılım türlerinden (3D tasarım yazılımları, simülasyonlar, oyunlar) biri de oyun motorlarıdır. Real-time olarak görüntü işleyen yazılımların farkı ise, ışıklandırma, sahne içerisindeki modeller ve efektler gibi faktörleri baz alarak, her kareyi gerçek zamanlı şekilde işler. Bu da diğer işleme türlerine kıyasla çok daha fazla kaynak tüketmesine neden olur.

Physics Engine (Fizik Motoru)


Oyun motorlarında “Fizik Motoru” olarak adlandırılan bir bileşen bulunur. Bu bileşen sayesinde geliştirdiğiniz oyundaki objeler kendi fiziksel özelliklerine sahip olurlar (kütle, sürtünme katsayısı, kütle merkezi vb.) ve çeşitli kuvvetlerden (hız, yer çekimi, sürükleme kuvveti vb.) etkilenirler. Objelerin dünya ile ve birbirleriyle fiziksel olarak etkileşmesi gerektiği bir oyun geliştirdiğinizde oyun motorunuzun bu bileşene sahip olması gerekir. Fizik motorunuzu kullanarak dilerseniz gerçekçi, dilerseniz olabildiğine uçuk kendi fizik kurallarınızın hakim olduğu oyunlar geliştirebilirsiniz. 

Fizik motoru aynı zamanda “Collision Detection & Response” (“Çarpışma Algılayıcı ve Çarpışmaya Tepki Verici”) adı verilen bileşeni içerir. Objelerin oyunda İki objenin çarpışması yani birbirine değmesi olayına ise “collision” (çarpışma) denir. Objelerin fiziksel olarak kapladığı alanı ise, “collider” adı verilen, çeşitli geometrik şekillerde ve boyutlarda olan bileşenler ile belirlenir. Daha önce oynamış olduğunuz oyunlarda  “hitbox” terimini duymuşsunuzdur, bir collider, hitbox’ın şeklini ve boyutunu belirleyen bileşendir. Oyun motorlarında ise, hem collider’ları objelerinize dilediğiniz şekilde ekleyebileceğiniz, ve bu collider’ların birbiri ile çarpıştığında çeşitli fonksiyonlar tetikleyebileceğiniz “collision detection” sistemleri bulunur. Bu sistemler sayesinde örneğin bir dövüş oyunu geliştirdiğinizde, bir yumruk collider’ı, bir düşman collider’ı ile çarpıştığında, düşmanın üzerindeki “Sağlık” betiğinde “Hasar Ver” isimli bir fonksiyonu tetiklemesini sağlayabilirsiniz.


Scripting (Betikleme/Betik Yazımı) Desteği


Oyun motorlarında oyun geliştirirken, objelere mantık ekleyebilmek için çeşitli script’ler (betik) yazmanız gerekir. Bu işleme scripting denir. Geleneksel programlamadan farklı olarak scripting sayesinde:

  • Script’ler, run-time (çalışma-zamanı) sırasında derlenir. Bu sayede oyununuzda yapmış olduğunuz her script değişikliğinde oyunu başından sonuna kadar derlemek zorunda kalmazsınız. Kullanmadığınız takdirde projeniz her yaptığınız değişiklikte oyununuz compile-time (derleme zamanı) sırasında derlenir. Compile-time ise saatler alabilen bir süreç olduğu için, oyununuzu scripting kullanarak run-time sırasında derlemek, üretim hızınızı hatrı sayılır derecede etkileyecektir.

  • Oyun programlama sürecinizi kolaylaşır.(özellikle programlamaya yeni başlayan geliştiriciler için.)

  • Oyunun motorunun kodlarının, oyunun kodlarından bağımsız/ayrı olmasını sağlar., Bu sayede hem motorun aynı bileşenlerini kullanarak, üzerinde değişiklik yapmak zorunda kalmadan çeşitli oyunlar geliştirebilirsiniz.

Oyun objelerine scripting aracılığı ile ekleyebileceğiniz mantıklara:

  • Kullanıcıdan input (girdi) almak ve sonucunda bir fonksiyon tetiklemek,

    • Belirli tuşlar ile çeşitli eksenlerde hareket,

    • Mouse sol tık’ı ile saldırı fonksiyonunu, sağ tıkı ile ise savunma fonksiyonunu tetikleme vb.

  • Animasyon oynatmak,

  • Ses efekti/müzik dosyası yürütmek vb.

Gibi çeşitli eylemleri örnek verebiliriz.Bir oyun motoru birden fazla scripting dili destekleyebilir ve bu diller oyun motorunun yazıldığı dilden bağımsızdır. Örneğin Unity oyun motoru C++ dilinde yazılmış olmasına rağmen, oyun geliştirirken kullandığınız desteklenen scripting dili C#’dır.

Audio Engine (Ses Motoru)



Oyunlarda ses, oyun deneyimini büyük bir ölçüde etkileyen bir faktördür. Bu nedenle geliştirdiğiniz oyunda ses dosyalarını yürütme fonksiyonu kesinlikle gerekir. Oyununuzda yürüteceğiniz, farklı formatlardaki (“.mp4”,”.mp3”,”.ogg”,”.wav” vb.) her ses dosyasının, oyun motorunuza eklenmesi ve compress edildiği/sıkıştırıldığı dosya formatını CPU aracılığı ile decompress edip/ayıklayıp, dilediğiniz zaman yürütebilmenizi sağlayan bileşendir. Bu bileşen olmadan, oyununuz herhangi bir şekilde ses dosyası yürütemez, bu nedenle önemli ve olmazsa olmaz bir bileşendir.


Artificial Intelligence (Yapay Zeka)

Oyununuzda çoğu oyunda yer aldığı gibi eğer “Artificial Intelligence” (Yapay Zeka) tarafından yönetilen objeler yer alacaksa, bu objelerin nasıl davranması gerektiğini script’lerken, çoğu oyun motorunun yapay zeka için kullanabileceğiniz halihazırda programlamış olduğu modüllerden faydalanabilirsiniz. Yapay zekanız:

  • Behavior Trees, (Davranış Ağaçları)

  • Pathfinding, (Yol bulma/Yollama)

  • Goal-Orientated Action Planning vb. (Hedef Odaklı Eylem Planlaması)

Çeşitli modüllere ihtiyaç duyar. Bu modüller sayesinde yapay zeka tabanlı objeleriniz bir sonraki eylemlerini dilediğiniz gibi yerine getirebilirler. Örneğin Unity içinde yapay zekanızın yol bulmasını, “NavMesh” sistemini kullanarak dakikalar içinde sağlayabilirsiniz.

Kendi Oyun Motorumu Yazabilir Miyim? Yazmalı Mıyım?


Kendi oyun motorunuzu yazmak, oldukça karmaşık ve uzun bir süreçtir. Bu sürece girişmenin olası sebepleri:

  • Geliştirmek istediğiniz oyun için, piyasadaki herhangi bir motorun uygun veya yeterli olmaması -düşük ihtimal, neredeyse imkansız-,

  • Bir programcı olarak kendinizi sadece scripting ile sınırlandırmayarak, sıfırdan kendi motorunuzu yazmak için gerekli olan teknik bilgiyi edinip, uygulayarak kendinizi geliştirmek,

  • Oyun motoru yazmayı merak etmek,

Gibi sebepler olarak örneklendirilebilir. Ancak bu sebepler, geliştiricilerin çoğu tarafından mantıklı ya da tercih edilebilir sebepler değil. Oyun geliştirmek, ciddi bir miktarda zaman, para ve iş gücü gibi kaynaklar isteyen, zorlu bir süreç. Bu süreci kendi oyun motorunuzu yazarak daha fazla kaynak tüketmesini sağlayarak zorlaştırmak, geliştiricilerin genellikle tercih ettiği bir yol değil. Bu nedenlerden dolayı, kendi oyun motorunuzu yazma kararını, en azından piyasadaki popüler oyun motorlarına göz atıp, denemeden önce vermemenizi öneririm.

Hangi Oyun Motorunu Seçmeliyim? 


Hangi motorun, diğerinden daha iyi olduğu ile ilgili bir kıyasa girmektense, hangi motorun özelliklerinin sizin geliştirmeyi düşündüğünüz oyun için uygun olduğunu araştırmalısınız. Popüler oyun motorlarının hepsinin güçlü ve zayıf olduğu noktalar mevcut. Geliştiriciler bu noktaları göz önüne alarak, kendi oyunlarının ihtiyaçlarına ve ekiplerinin gereksinimlerine uyacak şekilde kullanacakları oyun motorunun hangisi olacağına karar verirler. Örneğin, Unity oyun motoru, Unreal Engine 4’e kıyasla, performansının ve sunduğu grafik kalitesinin daha düşük olduğu gibi sebeplerden dolayı büyük ölçekli 3D projeler için tercih edilen bir motor olmamasına rağmen:

  • Kolay öğrenilen arayüzü ve kullanımı,

  • Unreal Engine 4’ün kullandığı scripting dili olan C++’a nazaran, Unity’nin kullanmış olduğu scripting dili olan C#’ın daha kolay anlaşılır olması,

  • Diğer çoğu oyun motorundan (UE4 dahil) daha büyük ve aktif bir geliştirici topluluğunun olması,

  • Hatrı sayılır derecede daha fazla kaynak sunması vb.

Nedenlerinden dolayı Unity, oyun motorları arasında popülerite sıralamasında Unreal Engine 4’ün üstünde yer alıyor. Siz de oyun motorunuzu seçerken, bu avantajları ve dezavantajları detaylı şekilde araştırıp, seçiminizi yapmadan önce iyice düşünmelisiniz. Halihazırda geliştirilmekte olan bir oyunun motorunu değiştirmek bir oyunu neredeyse sıfırdan yapmak kadar zor ve uzun bir süreç haline gelebilir. 

Yorumlar