9 Şubat 2014 Pazar

Unity Oyun Programlama

Herkese merhaba, yaklaşık bir ay önce Unity ile ilgilenmeye başladım. Bilmeyenler için Unity hakkında ufak bir açıklama yapayım. Unity, 3D oyun motorudur. Daha detaylı bilgi için resmi sayfasına bakabilirsiniz. Bu yıl üniversitede bu oyun motorunu öğrenip, kullanacağımız bir ders açıldı. "SE 350" kodlu bu dersin adı "Oyun Programlama". Derse çok yoğun ilgi oldu. Yaptığım gözlemlere göre, teoriden ziyade, uygulama yapılabilecek dersler öğrenciler tarafında daha fazla ilgi topluyor, diyebilirim. Daha fazla uzatmadan, asıl konuya değinmek istiyorum. Dersten sonra hepimize ufak bir proje verildi. Proje kısaca şöyleydi; Unity'de kontrol edebileceğimiz bir karakter oluşturup, bu karakter ile etrafımızda var olan bir takım objeleri toplamak. Unity hakkında hiçbir fikri olmayanlar için zor bir proje olarak gözükebilir. Fakat tek satır kod dahi yazmadan, istediklerimizi kolayca yapabiliriz. Şimdi hep birlikte bu projeyi yapmaya başlayalım. Öncelikle Unity'i açıp, menüden File > New Project seçeneğini seçip, yeni bir proje oluşturuyoruz.


Karşımıza boş bir "Scene" çıkacak. İlk olarak "Terrain" (Arazi) oluşturmakla işe başlayacağız. "Terrain", oyunumuzda oluşturduğumuz tüm objelerin üzerinde durduğu oyun alanı olarak düşünülebilir. Terrain oluşturmak için menüden, Terrain > Create Terrain seçeneğini seçiyoruz. Şu an "Scene" penceresinde default olarak 2000x2000'lik bir Terrain oluşturduk. Bu boyut bizim için çok büyük.


Terrain boyutunu ayarlamak için, menüden Terrain > Set Resolution seçeneğini seçiyoruz. Çıkan pencerede Terrain Width ve Terrain Lenght özelliklerini 50 olarak değiştirdim. Siz istediğiniz bir değer yapabilirsiniz. Şu an oluşturduğumuz Terrain 50X50'lik boş bir Terrain oldu.



Sıra geldi Terrain'i özelleştirmeye. "Inspector" penceresi altında, O an "Hierarchy" tablosu altında seçmiş olduğumuz objenin özelliklerini görmekteyiz. (İlk defa Unity ile uğraşanlar için bu yazı biraz zorlayıcı olabilir, vaktim olursa Unity ile ilgili başlangıç tutorial hazırlamayı planlıyorum.) Lafı fazla uzatmadan, konumuza dönelim. Inspector penceresi altında, Terrain objemize ait "Terrain (Script)" componenti altındaki "Paint Texture" butonuna tıklıyoruz.


Açılan pencerede aşağıdaki resimde yaptığım gibi, Edit Textures > Add Texture seçeneğini seçiyoruz. Karşımıza "Add Terrain Texture" diye bir pencere çıkacak. Bu pencereden "Splat" seçeneğine tıklıyoruz ve açılan pencereden beğendiğimiz bir Texture seçiyoruz. Atık seçmiş olduğumuz bu Texture, Terrain'imizin sahip olduğu zemindir.



Şimdi sıra oyunumuza ışık eklemeye geldi. Işık eklemek için menüden, "GameObject > Create Other > Point Light" seçeneğini seçiyoruz. Bunu yaptıktan sonra oyunumuza ışık eklemiş oluyoruz.


Eklediğimiz ışık ile ilgili değişiklik yapmak istersek. "Inspector" penceresi altındaki değişkenlerle oynamamız yeterli. Mesela benim örneğimde, ışığın X pozisyonu 25, Y pozisyonu 15, Z pozisyonu 25 ve son olarak ışığın range(etki alanı) 150 olarak belirlenmiş.


Işık ile ilgili sorunumuzuda çözdükten sonra, şimdi sıra yöneteceğimiz karakteri oluşturmaya geldi. Yazının başında dediğim gibi hemen hiç kod yazmamıza gerek yok. Çünkü oluşturmak istediğimiz her şey zaten Unity ile birlikte geliyor. Şimdi yapmamız gereken şey "Project" penceresi altına farenin sağ tuşuna tıklamak ve çıkan menüden, "Import Package > Character Controller" seçeneğini seçip tüm paketleri Unity projemizin içine import etmek. Import ettiğimiz paketler, "Project" penceresi altındaki "Standart Assets" klasörü altına alınır. "Character Controller" paketi import edildikten sonra, "Standart Assets" klasörü altında aynı isimli bir klasör oluştu. Bu klasör altında "3rd Person Controller" scriptini "Hierarchy" penceresine taşıyoruz.



Aşağıdaki resimde de gördüğünüz gibi karakterimizi oluşturduk. "İnspector" penceresi altında karakterimizin pozisyonu ile ilgili ayarlamalar yapabiliriz. Benim örneğimde, karakterin X pozisyonu 10, Y pozisyonu 2.5, Z pozisyonu 10 olarak belirlenmiş.



Şimdi ise sıra, karakterimizin oyun içinde toplayacağı objeleri oluşturmaya geldi. Menüden, "GameObject > Create Other > Sphere" seçeneğiniz seçiyoruz. Toplayacağımız objeleri küre olarak belirledim. Siz isterseniz küp, silindir ya da Autodesk Maya 2010 programı kullanarak istediğiniz objeyi oluşturup, Unity içine import edebilirsiniz.


Daha fazla detaya girmeden devam edelim. Şimdi oluşturduğumuz objenin karakterimiz ile etkileşime girip, girmediğini kontrol etmek için yine Unity ile hazır gelen başka bir paketi import edeceğiz. Karakterimizi oluştururken yaptığımız gibi yine, "Project" penceresi altına farenin sağ tuşuna tıklayıp, çıkan pencereden, "Import Package > Scripts" seçeneğini seçip tüm paketleri Unity projemizin içine import ediyoruz. "Scripts" paketi import edildikten sonra, "Standart Assets" klasörü altında aynı isimli bir klasör oluştu.



Bu klasör altında "General Scripts > ActiveTrigger" scriptini "Sphere" objemizin "Inspector" penceresinde boş bir yere taşıyoruz. Artık "Sphere" objemizin "Active Trigger (Script)" adında bir componenti oldu.



Fakat henüz istediğimiz etkileşimi kontrol edebilecek bir script değil. Şimdi bu scriptin istediğimiz gibi çalışmasını sağlamak için, "Action" seçeneğini "Deactive" işaretlerken, Target seçeneğine ise "Hierarchy" tablomuzdaki "Sphere" objemizi taşıyoruz. Kısaca, bütün bu yaptıklarımızın anlamı şu; "Eğer oluşturduğumuz bu obje, karakterimiz ile etkileşime girerse objeyi ortadan kaldır."


Tüm bunlara ek olarak unutmadan son bir şey daha yapmamız gerekiyor. "Inspector" penceresi altında, "Sphere Collider" componenti içindeki, "Is Trigger" seçeneği seçili olması gerek, aksi takdirde scriptimiz çalışmayacaktır.


Şimdilik yapacağımız tüm işler bitti, ancak ufak bir sorunumuz var aynı objeden tekrar tekrar oluşturmak yerine, bir tane "Prefab" oluşturup, bunu oyun içinde tekrar tekrar kullanmak çok daha mantıklı. ("Prefab", Unity ile birlikte hazır gelen kullanımı ve oluşturması oldukça basit bir yapı). Yine "Project" penceresi altında, faremize sağ tıklayarak, açılan menüden, "Prefab" seçeneğini seçmemiz gerek. Bu işlemi yaptıktan sonra, "Project" sekmesi altında, "New Prefab" adında bir yapı oluştu. Fakat içeriği henüz boş, bu içeriği doldurmak için, "Hierarchy" penceresi altında daha önce oluşturmuş olduğumuz "Sphere" objesini bu "Prefab'in" içine taşıyoruz.



Artık "Sphere" objemizin tüm özellikleri, oluşturmuş olduğumuz "Prefab'in" içeriği ile birebir aynı. Artık oyunumuzdaki "Sphere" objesi yerine, tekrar tekrar "Prefab" objemizi kullanacağız. Fazlalık olmasın diye, "Hierarchy" tablomuzdaki "Sphere" objemizin üzerine faremizin sağ tuşu ile tıklayıp çıkan menüden "Delete" seçeneğini seçip objemizi silebiliriz.


Oluşturduğumuz "Prefab'i" kullanmak için, "Project" penceresinden, "Scene" alanımıza taşımamız yeterli olacaktır. Bunu yaptığımız an, "Hierarchy" tablomuzda, "New Prefab" adında bir obje otomatik olarak oluşacaktır. Bu objeden birden fazla oluşturmak için, objemizin üzerine faremizin sağ tuşu ile tıklayıp çıkan menüden "Duplicate" seçeneğini seçip birden fazla "Prefab" oluşturabiliriz.



Oluşturmuş olduğumuz bu objelerin her biri tamamı ile birbirinin aynısıdır. Her bir "Prefab'in" pozisyonunu değiştirmek için "Inspector" penceresinden, gerekli ayarlamaları yapabilirsiniz, ya da daha kolay bir yol olan fare ile pozisyonu siz belirleyebilirsiniz.


Şimdi sıra geldi, projemizin nasıl çalıştığını test etmeye, Bunun için, en üstte yer alan play tuşuna basıyoruz. Ve oluşturmuş olduğumuz projeyi test ediyoruz.



Oyunumuzu test ettik sorunsuz bir şekilde çalışıyor olması gerek. Eğer herhangi bir sorunla karşılaştıysanız, yazıyı tekrar kontrol edebilirsiniz. Karakterimizi klavyenin yön tuşları ya da "w, a, s, d" tuşları ile yönlendirebilirsiniz. Oluşturmuş olduğumuz objeleri tek tek topluyoruz. Topladığımız objeler, karakter ile etkileşime girince kayboluyor. Yazıya başlarken dediğim gibi, tek satır kod yazmadan basit bir 3D oyun yaptık. Şimdilik bu kadar başka derste görüşmek dileğiyle.
Disqus Yorumları Yükle

0 yorum