Sunday, February 19, 2012

Unity'de Oyun Programlama - [Ders - 1]

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.

27 comments:

  1. 2.dersi de bekliyoruz :D

    ReplyDelete
    Replies
    1. Zaman buldukça ders eklemeyi düşünüyorum bende.

      Delete
  2. çok sağolll baya dır türkçe unity dersleri aradım bulamadım işl senin sayende öğrenicem devamını beklerim :) çok sağoll :)

    ReplyDelete
  3. sağolasın. gercekten böyle bir şeye ihtiyacım vardı. simdilik yeterli bu bilgiler. devamı olursa cok sevinirim.Allah seninde bir sıkıntını gidersin.

    ReplyDelete
  4. Abi ellerine sağlık çok güzel anlatıyorsun. Msn adresini verebilir misin? Yarın yine buraya bakacağım sana sormak istediğim birkaç konu varda :)

    ReplyDelete
    Replies
    1. Selam Ahmet, yardımcı olduysa ne mutlu. Öncelikle msn kullanmıyorum, lakin sormak istediğim soruları buraya yazabilirsin ya da özelden tanergungor[at]yahoo.com adresine e-mail atabilirsin. Unity ile ilgili değinmemi istediğin konular varsa bunları da bildirebilirsin o konulara daha öncelik tanırım.

      Delete
  5. başka bir 3d çizim programından (örnegin 3ds max) unity ye nasıl export yapabiliriz? birde unity de olusturudugumuz projeyi xcode üzerine nasıl gömüyoruz bir bilginiz varmı acaba?

    ReplyDelete
    Replies
    1. Selam, çok emin olmamakla birlikte aklımda kalanı anlatayım. 3DS MAX'te ya da herhangi bir programda oluşturduğun modelin dosyasını, fare ile Unity'deki project kısmına taşıyorsun ve model otomatik olarak senin scene'in içinde yer alıyor. Projenin Xcode üzerine nasıl gömüleceğini bilmiyorum. Ama projeyi çeşitli platformlar için build etme seçeneğin var.

      Delete
    2. bende başladım taner güngör yani amca oglum :D beni hatırlarsan tabi :Dbi ara ugra bize biraz unity dersi verim sana :D

      Delete
    3. Çalışmaya devam Soner güzel oyunlar yapacaksın. Ayrıca bu yıl düzenlenen GGJ 2013'e de katıl.

      Delete
  6. gerçeten teşekkür ederim çok işime yaradı.

    ReplyDelete
  7. Valla çok iyi anlatmışsınız sorunsuz bir şekilde yapıp çalıştırdım.Lütfen araba yarışı yapmak içinde bir örnek yapın hocam.Most wanted gibi bir oyun yapmayı düşünüyorumda:)

    ReplyDelete
  8. daha fazlasını bekliyoruz

    ReplyDelete
  9. hocam çok saolun ben bu programa yeni başlıyacam size 2 sorum var 1.si oyunu nasıl exe haline getirecem

    2.si kod kullanmadanda oyun yapabilirmiyim(bu programla)

    ReplyDelete
    Replies
    1. Selam, ilk sorunun cevabı için aşağıdaki link yardımcı olacaktır. İkinci soruna gelecek olursak, hiç kod yazmadan da oyun yapman mümkün ancak belli konularda yapay zeka(Artificial Intelligence), ağ programlama(Network Programming) gibi konularda kod yazman zaruri olabilir.


      link -> http://docs.unity3d.com/Documentation/Manual/PublishingBuilds.html

      Delete
  10. Bu programı nerden indirebiliriz?

    ReplyDelete
    Replies
    1. Aşağıdaki linkten en son sürümü indirebilirsiniz.

      link -> http://unity3d.com/unity/download

      Delete
  11. Abicim Allah senden razı olsun , devamlarını bekliyoruz tatillerde oynayacağım oyunları kendim yaparım artık :P

    ReplyDelete
  12. Yandaki extramücade denen şeyi gördüm yorumu geri alıyorum başka sitelerde var size ihtiyaç yok

    ReplyDelete
  13. bu işi çözmem lazım acayip ilgimi çekti kod kısmı kafamı sıkıyor öğrenirsem çok eğlenceli gibi

    ReplyDelete
  14. Teşekkür ederiz. Emeğinize sağlık.
    sorum olacak- sahnedeki objenin mouse hareketleri ile hareket etmesini ve objenin belli bölgesine zoom yapmak istiyorum ama scriptte sürekli hata alıyorum sonradan anladım o kodlarla olmuyor bu olayları gerçekleştirecek unity kod örneği de bulamadım unity sayfasındaki örnekler yardımcı olmuyor örnek kod veya yöntem önerebilirsiniz diye umuyorum.

    ReplyDelete
  15. iyi günler ben unity öğrenmeye yeni başladım.
    kod bilgim var html,css,javascript,jQuery, mysql ,php, c++ dillerini biliyorum ama unity in şu 3 boyutlu uzayını bir türlü kullanmayı öğrenemedim unity öğrenirken bana yardımcı olabilirmisiniz ? sadece sorularıma cevap verirseniz çok sevinirim.

    olumlu yada olumsuz cevapınızı bekliyorum
    teşekkürler.

    ReplyDelete
    Replies
    1. Selam Vehbi, elimden geldiğince yardımcı olmaya çalışırım. Kolay gelsin.

      Delete
  16. Oyunu android de oynayabilir miyiz?

    ReplyDelete
    Replies
    1. Selam Furkan, evet Unity'nin android'e desteği var. Ama ben hiç kullanmadım. Aşağıdaki linkte gerekli tüm bilgileri bulabilirsin.

      LINK -> http://docs.unity3d.com/Manual/android-sdksetup.html

      Delete
  17. Kinect sensorla baglayip basit bir uygulama yapmayida gosterebilirmisiniz..

    ReplyDelete
    Replies
    1. Selam Erman bey,

      Kinect ile ilgili daha detaylı projeleri Şubat ayından sonra yapmayı planlıyorum. Şu an başka işlerin yoğunluğundan vakit ayıramıyorum. Ayrıca yurt dışında olduğum için Kinect bende değil.

      Bloğu takip ettiğiniz için teşekkür ederim.

      Delete