Sayın okuyucu (Oooo ),
Öncelikle bu eğitim dosyasını indirdiğin için teşekkürler. (Bak sen şu işe :O )
Bu eğitim dosyası, Unity’nin orijinal 2 başlangıç tutorialinin birleştirilmesi ve ardından
Türkçe’ye çevrilmesiyle oluşturulmuştur. İlk kısımda Unity’nin arayüzü tanıtılmaktadır. İkinci
kısımdaysa Unity’de script yazmaya giriş yapılması sağlanmaktadır.
İki tutorialde de “Önceden herhangi bir bilgi birikiminizin olması gerekmez.” yazmaktadır
ancak bu ifade bana göre 2. tutorial için geçerli değil. Çünkü 2. tutorille script yazmaya
sıfırdan başlamak isteyen birinin aklı karışabilir, çok ayrıntılı anlatım söz konusu değil.
Bu yüzden bu eğitim dosyasının 2. kısmına başlamadan önce, yine benim İngilizce’den
çevirdiğim ancak Unity’nin orijinal tutoriali olmayan, 101 sayfalık “Çaylaklar İçin UnityScript’e
Başlangıç Kılavuzu”nu okumanızı öneririm. Kılavuza ulaşmak için tıklayın:
http://wp.me/p116Cp-dV
Umarım bu kılavuz Unity’e başlarken sizlere yardımcı olur. Bu ve bunun gibi başka Unity
tutorialleri, Game Maker dersleri için her zaman siteme beklerim:
http://yasirkula.wordpress.com/
Daha sonra görüşmek üzere, hepiniz esen kalın,
Süleyman Yasir KULA
--- yasirkula.wordpress.com ---
1. Bölüm - Arayüz Tutoriali
--- yasirkula.wordpress.com ---
Unity’nin Arayüzünü Tanıyalım
Bu tutorial Unity’nin arayüzünü
(GUI)(Graphical User Interface)
tanıtacaktır.
Daha önceden herhangi bir bilgi
birikiminizin olması gerekmez.
Yazar: Graham McAllister
Çeviri: Süleyman Yasir KULA
İçerik
1. Tutorialin amacı
Eğer Unity’e yeni başlıyorsanız bu, ilk
okuduğunuz tutorial olmalı. Bu tutorial Unity
1. Tutorialin amacı
arayüzünün önemli parçalarını anlatacak ve
2. Arayüz düzeni (Layout)
nasıl bir GameObject oluşturup onu 3 boyutlu
3. GameObject’lerin bulunması
uzayda konumlandıracağınızı gösterecek.
4. GameObject oluşturmak
Unity’nin arayüzünü tanımak için basit bir
5. Scene panelinde gezinmek
sahne (scene) oluşturacağız ve içerisinde bir
6. GameObject’leri oynatmak
karakterin yürüyebilmesini sağlayacağız.
7. Game (Oyun) paneli
Not: Kullanıcının eylem yapmasının isteneceği
8. GameObject’leri boyutlandırmak
satırlar ‘-‘ işaretiyle başlayacaktır.
9. Asset’lerin kullanımı
10. Component (Parça) eklemek
11. Klonlama (Duplicate)
2. Arayüz düzeni (Layout)
Başlamadan önce arayüzümüzün 2+3’lü (2 by
3) düzende olduğundan emin olalım.
- Bunun için Window->Layouts->2 by 3 yolunu
izleyin.
Artık arayüzünüz 5 ana bölmeye ayrıldı:
1. Scene (Sahne) Paneli - GameObject’leri (oyun
objeleri) konumlandırmak için kullanılır.
2. Game (Oyun) Paneli - oyunun çalıştırıldığında
nasıl görüneceğine buradan bakılır.
3. Hierarchy (Hiyerarşi) Paneli - o anki sahnede
yer alan tüm objelerin listesini tutar.
4. Project (Proje) Paneli- Kullanıma hazır tüm
assetleri barındırır. (tıpkı bir palet gibi)
5. Inspector Paneli - O an seçili olan
GameObject’in özelliklerini gösterir.
--- yasirkula.wordpress.com ---
3. GameObject’lerin bulunması
- Unity’i başlatın. İlk önce yeni bir proje oluşturalım.
- Bunun için File->New Project yolunu izleyin ve projenize “GUI Eğitimi” gibi bir isim verip
Create Project butonuna tıklayın (Ancak bu butona basmadan önce alttaki hazır paketlerden
Character Controller’in seçili olduğundan emin olun, ileride kullanacağız çünkü. (Çevirmen
Eklemesi)). Unity şimdi seçtiğiniz assetleri (ses dosyaları, kaplamalar (texture), 3 boyutlu
modeller vb.) import edecek (içeri aktaracak.) ve böylece o assetler kullanıma hazır olacak.
Import işlemi tamamlandıktan sonra kendi tasarlayacağınız dünyanızla baş başa
kalacaksınız. Şu an için bu dünya sadece Main Camera (bu varsayılan olarak her projede
bulunur.) objesini içermektedir, bu objenin Hiyerarşi panelindeki tek parça olduğunu da
görebilirsiniz.
- Eğer Scene (sahne) panelinde (view) Main Camera (Ana Kamera) objesini göremiyorsanız
kamerayı Hiyerarşi Paneli’nden seçin, fare imlecini Scene Paneli içerisine getirin ve
ardından F tuşuna basın (frame select). Scene paneli, Main Camera objesini ortalayacak
şekilde ayarlanacaktır. Bu tekniği herhangi bir GameObject’i bulmak için kullanabilirsiniz.
- Herhangi bir objeyi ister Scene Paneli’nden üzerine tıklayarak ister Hiyerarşi Paneli’nden
seçebilirsiniz (select). Scene Paneli’nden bir objeyi seçtikten sonra seçtiğiniz obje ayrıca
Hiyerarşi Paneli’nde de seçili hâle gelecektir (vurgulanacaktır.)
4. GameObject oluşturmak
Şimdi dünyamıza birkaç GameObject ekleyelim.
- Game Object->Create Other->Plane yolunu izleyin, böylece sahnenizde bir plane objesi (2
boyutlu yüzey) oluşacak. Bu yüzeyin üzerinde karakterinizi yürütebilirsiniz.
- Game Object->Create Other->Cube yolunu izleyerek bir küp oluşturun.
- Game Object->Create Other->Point Light yolunu izleyerek noktasal bir ışık kaynağı
oluşturun.
5. Scene panelinde gezinmek
3 boyutlu objelerinize istediğiniz bir açıdan şu yöntemlerle bakabilirsiniz:
1. Rotating (Kamerayı Döndürmek) (ALT+Sol Mouse Tuşu)
2. Panning (Sahnede Gezinmek)(ALT+Orta Mouse Tuşu (Basılı tutun, yuvarlamayın.))
3. Zooming (Yakınlaştırmak)(ALT+Sağ Mouse Tuşu)
Not: Eğer Apple bilgisayarlarda çalışıyorsanız ALT tuşu yerine Command tuşuna (üzerinde
Apple logosu olan) basmalısınız. Ayrıca bu işlemleri en rahat ve hızlı şekilde yapmak için 3
butonlu bir mousenizin olması çok iyi olur.
Eğer tek butonlu mouseniz varsa veya dizüstü bilgisayarınızın faresini kullanıyorsanız yine de
bu işlemleri kolayca yapabilirsiniz. Bunun için önce sol üst taraftaki el şeklindeki butona
tıklayın (Kısayol Tuşu: Q), sonra alttaki kombinasyonları uygulayın:
1. Rotating (ALT+Sol Mouse Tuşu)
2. Panning (Sol Mouse Tuşu)
3. Zooming (Command+Sol Mouse Tuşu)(Windows için çalışan bir kombinasyon yok.)
--- yasirkula.wordpress.com ---
6. GameObject’leri oynatmak (Translate) (Move) + (Rotate)
3 boyutlu uzayda objelerinizi hareket ettirmek için şu yolları
kullanabilirsiniz:
1. Move (Hareket Ettirme) aracı (Kısayol: W). Bir GameObject
seçip sonra W tuşuna basmak, obje üzerinde her birisi bir
ekseni ifade eden 3 okun belirmesini sağlar. Kırmızı x, yeşil y,
mavi de z eksenlerini temsil etmektedir. Bir objeyi oynatmak için
ilgili eksenin okuna farenin sol tuşuyla basılı tutun ve objeyi
oynatın. Bu işlem esnasında objenin Inspector panelindeki
koordinat değerlerinin de değiştiğini görebilirsiniz. Kesin sonuç
almak için bu kutucuklara elle koordinat değeri girebilirsiniz.
Ayrıca bir GameObject’i konumlandırmanın bir başka yolu da o objeyi seçip ardından
sahnenizde gezdiğiniz kameranızı objenin yeni konumuna ayarlamak ve sonra da
Game Object->Align with View yolunu izlemektir. Seçili GameObject kameranın bulunduğu
konuma ışınlanacaktır.
2. Rotate (Döndürme) aracı (Kısayol: E). Bir GameObject’i
seçip ardından E’ye basmak rotate aracını seçecektir. Seçili
objeyi bir eksen etrafında döndürmek için bir ilgili eksenin işareti
üzerine tıklayıp mousenizi sürükleyin. Bu işlem esnasında
Inspector panelindeki eğim değerlerinin de değiştiğini
göreceksiniz. Kesin sonuç için bu kutucuklara elle değer
girebilirsiniz.
(Siz Rotate işlemi yaparken kübün etrafında
belirecek olan Rotate gizmosu farklı olacaktır, dert etmeyin.
Bunun sebebi bu tutorialin Unity’nin eski bir versiyonu için
yazılmış olması ve güncellenmemesidir. (Çevirmen Eklemesi)).
-Basit bir egzersiz yapalım. Küp objesini move aracı ile Scene
panelinin dışına taşıyın ardından objeyi Hiyerarşi Paneli’nden
seçip F tuşuna basarak kübü tekrar bulun. Sonra kübü ilk
konumuna geri döndürün, böylece plane (zemin) objesine yakın
bir konumda kalsın.
- Point light objesini küp ve zemin objelerinin üzerine taşıyın.
7. Game (Oyun) paneli
Game Paneli oyununuzun çalıştırıldığında nasıl görüneceğini görmenizi sağlar (tüm
kaplamalar, ışıklar vb. gösterilir.). Eğer oyun dünyanızı Game panelinde göremiyorsanız
bunun sebebi kameranızın doğru yöne bakmıyor oluşudur.
- Main Camera objesine tıklayın, sarı bir tel piramit şeklinin kameradan çıktığını fark
edeceksiniz. Bu, kameranın görüş alanı (viewport) olarak bilinir. Eğer bu görüş alanı
GameObject’lerinizi kapsamıyorsa Scene panelinde tüm objelerinizi görecek şekilde
görüntüyü ayarlayın ve ardından Main Camera objesini seçip Game Object->Align With
View yolunu izleyin. Şimdi Game panelinizle Scene paneliniz aynı yeri gösteriyor olmalıdır.
Ayrıca kamera objenizin konumunu move ve rotate araçlarını kullanarak veya Inspector
panelinde bu değerlerle oynayarak da değiştirebilirsiniz.
Ayrıca Game panelinde daha güzel bir görünüm için ışığınızın konumunu değiştirebilirsiniz.
--- yasirkula.wordpress.com ---
8. GameObject’leri boyutlandırmak (Scale)
Bir GameObject’in boyutunu değiştirmek için önce o objeyi seçin
ve sonra R tuşuna basın. Diğer araçlarda olduğu gibi bu işlem için
de objenin üzerindeki ilgili eksenlere tıklayabilir ya da Inspector
panelinden çeşitli değerler girebilirsiniz.
Şimdi oyun dünyamızdaki bazı objeleri boyutlandıralım.
- Plane objesini seçip Inspector panelinden x ve z eksenleri için
scale değerlerini 10 girin. (Birinci ve üçüncü kutucuklar.)
- Küp objesini seçip göz kararı ile objeyi y ekseninde boyutlandırın (yeşil küp’e tıklayıp
sürükleyin.). Şimdi küp objeniz bir sütun gibi gözükecektir.
- Küp objesinin adını Sütun olarak değiştirin. Bunun için objeyi Hiyerarşi panelinden seçin ve
ardından F2 tuşuna basın (MAC bilgisayarlarda Enter tuşu.). GameObject’lerin isimlerini
büyük harfle başlayarak yazmanın oldukça mantıklı olabileceğini unutmayın.
9. Asset’lerin kullanımı
Bilgisayar oyunları 3 boyutlu modeller, kaplamalar, ses dosyaları, oyun kodları gibi pek çok
parçadan oluşurlar ve Unity’de bunlara oyunun asset’leri denir. Unity pek çok hazır standart
asset barındırmaktadır. (Pro versiyonunda daha fazlasını da barındırır.)
Şimdi Unity’nin hazır assetlerini kullanarak oyunumuza karakterimizi ekleyelim. Bunun için
Proje panelinden Standard Assets klasörünü genişletin, ardından içerisindeki Character
Controllers klasörünü genişletin. Bir prefab, belli bir düzene göre bir araya getirilmiş olan ve
tekrar tekrar kullanılabilen objeler koleksiyonuna denir. Örneğin bir mermi objesini FPS
oyunlarında bolca kullanacağınız için onu bir prefab olarak ayarlamanız oldukça mantıklıdır.
Böylece o kurşun objesini defalarca kullanabilirsiniz. Konumuza geri dönelim, şimdi Prefabs
klasörünün içerisinde First Person Controller (FPS Controller) prefabını görüyor olmalısınız.
- FPS Controller prefabını Scene paneline sürükleyip bırakın. Game panelindeki görünümün
değiştiğini fark edeceksiniz. Bunun sebebi FPS Controller prefabının kendi içerisinde bir
kamerayla beraber gelmesi ve bu kameranın sahnede varsayılan olarak bulunan kameranın
yerine geçmesidir. FPS Controller objesinin yüzey (plane) objesinin bir miktar yukarısında
kalmasını sağlayın, zemin ile temas etmemeli.
- Önceki kamera olan Main Camera objesini silin, ona artık ihtiyacımız yok nasıl olsa. Silmek
için Delete tuşuna basın (MAC’de Command+Delete kombinasyonunu uygulayın.).
- Play (Oynat) butonuna basarak oyunu başlatın (Start). Bu buton, Unity arayüzünün üst orta
kısmında yer alan 3 bitişik butondan en soldakidir.
Şimdi fareyle etrafınıza bakabilir, ok tuşlarıyla (Veya W,S,A,D tuşlarıyla) zemin üzerinde
gezinebilir, Space tuşuyla zıplayabilirsiniz.
- Oyun modunu sonlandırmak (Stop) için Play butonuna tekrar basın.
Not: Mouse imleci herhangi bir Unity arayüz parçasının (Game paneli, Scene paneli, Proje
paneli vb.) üzerindeyken space bar tuşuna basmanız hâlinde ilgili panel tam ekran olarak
gözükecektir. Bu, Scene panelinde bir takım ayarlamalar yapmak ya da oyunu tam ekran
olarak oynamak için biçilmiş kaftandır. Mouse imleci tam ekran hâlindeki panelin
üzerindeyken tekrar Space tuşuna basarsanız da normal arayüz düzenine geri dönersiniz. Bu
özelliğin oyunu oynayıp test ederken çalışmadığını unutmayın, bu yüzden eğer Play
Mode’deyseniz önce oyunu sonlandırın (stop) ya da duraklatın (pause).
--- yasirkula.wordpress.com ---
10. Component (Parça) eklemek
GameObject’leriniz birden çok component’e sahip olabilirler. Herhangi bir GameObject’e
tıkladığınızda o GameObject’in sahip olduğu Component’ler sağ taraftaki Inspector panelinde
görüntülenir. (Örneğin Transform, Box Collider vb.)
- Hiyerarşi panelinden veya Scene (Sahne) panelinden Sütun objesini seçin. Inspector paneli
şimdi Sütun objesinin component’lerini gösterecektir.
Şimdi yeni bir küp oluşturalım ve ona bazı ekstra component’ler ekleyelim.
- Game Object->Create Other->Cube yolunu izleyerek sahnede yeni bir küp oluşturun. Bu
kübü Hiyerarşi paneli vasıtasıyla FizikselKup olarak adlandırın. (F2 tuşunu kullanın.)
Şimdi bu küp objesine bir Rigidbody component’i ekleyeceğiz. RigidBody component’i,
atandığı objenin tıpkı yerçekimli bir dünyadaymış gibi hareket etmesini sağlar. Yani; objenin
collider (Temascı) component’ine sahip başka bir objeyle temasa geçene kadar aşağı doğru
düşmesini sağlar.
- Önce FizikselKup objesinin seçili olduğundan emin
olun. Ardından Component->Physics-> Rigidbody
yolunu izleyerek o an seçili olan objeye Rigidbody
Component’i ekleyin. Inspector panelinde Rigidbody
component’inin belirdiğine dikkat edin.
- FizikselKup objesini zemin objesinden biraz
yukarıda olacak ve ona temas etmeyecek şekilde
yukarı kaldırın. Ayrıca isterseniz Sütun objesinin de
yukarısına taşıyabilir, düşerken ona çarpacak şekilde
konumlandırabilirsiniz.
Figür 1 - Rigidbody uygulanması.
- Play butonuna basın, FizikselKup objesi Sütun
objesiyle temasa geçip zemine düşecektir.
11. Klonlama (Duplicate)
Bir GameObject’i klonlamak Unity’nin en güçlü özelliklerinden biridir. Bir obje klonlanırken
aynı zamanda sahip olduğu tüm component’lerde kopyalanır. Oldukça karmaşık sahneleri
çok hızlı bir şekilde oluştururken bu yöntem vazgeçilmezdir. Şimdi sahnemize daha fazla
FizikselKup objesi ekleyeceğiz.
- FizikselKup objesine tıklayın ve CTRL+D kombinasyonunu
uygulayın. Bu işlemi ayrıca Edit (Düzen) menüsünden de
yapabilirsiniz. Hiyerarşi panelinde yeni bir FizikselKup
objesinin belirdiğini görebilirsiniz, ancak yeni objeyi sahnede
göremezsiniz. Çünkü yeni FizikselKup objesi, orijinal
FizikselKup objesinin tıpatıp aynı konumunda, yani orijinal
objenin içinde oluşturuldu.
- Yeni FizikselKup objesini move tool ile (W) bir miktar
yukarıya taşıyın. (Önce onu Hiyerarşi panelinden seçin.)
- Bu işlemi 1 kere daha tekrarlayın. Böylece sahnede 3
FizikselKup objesi olmuş oldu. (Figür 2’ye bakın.)
- Oyunu çalıştırın, 3 FizikselKup objesi de birbiriyle temasa
Figür 2 - Duplicate uygulamak.
geçip doğal davranışlar sergileyecektir.
--- yasirkula.wordpress.com ---
2. Bölüm - Script Tutoriali
--- yasirkula.wordpress.com ---
Unity’de Scriptlemeye Giriş
Script yazmak (Scriptleme) Unity’nin en
önemli parçalarından biridir çünkü
oyununuzu şekillenmesinde doğrudan
etkilidir. Bu eğitim dosyası Unity’de
JavaScript kullanarak (UnityScript)
scriptlemenin temellerini gösterecektir.
Daha önceden herhangi bir bilgi birikiminizin
olması gerekmez.
Yazar: Graham McAllister
Çeviri: Süleyman Yasir KULA
İçerik
1. Tutorialin amacı
Scriptlemek, Unity’de oyun sırasında olayların nasıl
gelişeceğini ayarlamayı sağlar. Unity için tavsiye edilen
1. Tutorialin amacı
scriptleme dili Javascript olmasına rağmen isterseniz C#
2. Gerekli şeyler
veya Boo dillerini de kullanabilirsiniz. Bu tutorial Unity’de
3. İsimlerdeki gramer kuralları
scriptlemenin temellerini öğretecek ve Unity’nin Uygulama
Programlama Arabirimi (Application Programming
4. Girdi almak (Input)
Interface - API) hakkında önemli bilgiler verecek.
5. Değişkenlere (Variable) değer
atamak
API’yı daha önceden yazılmış olup kullanmanız için
6. Component’lere erişmek
bekleyen kodlar olarak düşünebilirsiniz. Böylece oyun
7. Obje oluşturmak (Instantiate)
tasarımınıza konsantre olabilir ve oyun tasarım hızınızı
artırabilirsiniz. (API = Unity’nin Script Referans Dosyası)
8. Debug işlemi (Hata ayıklama)
9. Yaygın Olarak Kullanılan
Bu basit prensipleri iyice anlamak Unity’nin tüm
Fonksiyonlar
nimetlerinden tam güç faydalanmak için önemlidir.
2. Gerekli şeyler
Bu tutorial Unity’de scriptlemeye yoğunlaşacaktır, bu
yüzden Unity’nin arayüzünü tanıyor olduğunuzu
varsayıyorum.
Script yazarken işinizin kolay olması için syntax
yapılarını renkli olarak kümelere ayıran bir script
editörüne sahip olmanız iyi olacaktır. Buna örnek
olarak SubEthaEdit editörü verilebilir.
Not: Kullanıcının eylem yapmasının isteneceği
satırlar ‘-‘ işaretiyle başlayacaktır.
--- yasirkula.wordpress.com ---
3. İsimlerdeki gramer kuralları
Başlamadan önce, Unity’de script yazarken uyulması gereken bazı gramer kurallarına
değinmek iyi olacaktır.
Değişkenler (Variable) - küçük harfle başlarlar. Değişkenler oyun sırasında herhangi bir
veriyi depolamak için kullanılırlar.
Fonksiyonlar (Function) - büyük harfle başlarlar. Fonksiyonlar birer kod kümeleridirler ve
bir kere yazıldıktan sonra defalarca kullanılabilirler.
Sınıflar (Class) - büyük harfle başlarlar. Birden fazla fonksiyonun bir araya gelmiş hâli olarak
tanımlanabilir.
İpucu: Örnek bir kod veya Unity API okurken kelimelerin ilk harflerine dikkat edin. Böylece
objeler arası ilişkilerde neyin nasıl kullanıldığını daha iyi anlayabilirsiniz.
4. Girdi Almak (Input)
Şimdi beraber yazacağımız ilk program, basit bir oyun dünyasında gezmemize olanak
tanıyan bir program olacak.
Sahneyi (Scene) ayarlamak
- Unity’i başlatın.
Önce oyuncunun üzerinde yürüyeceği zemini
oluşturalım. Bizim kullanacağımız zemin
boyutlarıyla oynanmış bir küp olacak.
- Bir küp oluşturun ve Inspector panelinden
boyut ayarlarını (Scale) sırayla 5 - 0.1 - 5
yapın. Artık küpümüz bir zemin gibi duracaktır.
Şimdi küpün adını Hiyerarşi panelinden ‘Zemin
olarak değiştirin.
- İkinci bir küp oluşturup onu zeminin ortasına taşıyın. Eğer objelerinizi Game panelinde
göremiyorsanız Main Camera objesini objelerinizi görecek şekilde konumlandırın. Yeni
oluşturduğumuz küpü ‘Kup1’ olarak adlandırın.
- Bir point light oluşturup diğer objelerin biraz üzerine taşıyın, böylece objeleriniz daha rahat
gözükecek.
- Sahneyi kaydedin. (Save) (CTRL+S)
İlk scriptimiz
Şimdi oyunumuzu programlamaya hazırız. Main Camera objesinin konumunun oyuncudan
gelen girdilere göre değişerek oyuncunun mekanda gezinmesini sağlayacağız. Bunun için
önce girdiyi okuyan bir script yazacağız ve bu scripti Main Camera objesine atayacağız.
- Önce boş bir script oluşturun. Bunun için Assets->Create->Javascript yolunu izleyin ve
ardından script dosyasını Proje panelinden HareketEt1 olarak adlandırın.
- Scripte çift tıklayın, böylece içerisinde varsayılan olarak Update() fonksiyonu bulunan
scriptimiz açılacaktır, şimdi bu fonksiyonun içerisine bir takım kodlar yazacağız. Update()
fonksiyonunun içerisine yazılan kodlar her bir karede (frame) otomatik olarak çalıştırılırlar.
--- yasirkula.wordpress.com ---
Unity’de bir GameObject’i hareket ettirmek için onun transform’unun (konumunun) mevcut
pozisyonunu ayarlamalıyız. Bunu ise transform sınıfından Translate fonksiyonuyla yaparız.
Translate fonksiyonu 3 parametreye sahiptir; x,y ve z eksenlerinde hareket miktarı. Biz de
Main Camera objesinin ok tuşlarıyla hareket etmesini istediğimiz için yapmamız gereken şey
ilgili eksenlerin olduğu yere o yönle ilgili ok tuşunun basılıp basılmadığını kontrol eden bir kod
yazmaktır:
function Update ()
{
transform.Translate(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
}
Buradaki Input.GetAxis() fonksiyonu klavyenin sol ok tuşuna basılınca -1, sağ ok tuşuna
basılınca 1 değerini döndürür. Herhangi birine basılmamışsı 0 değerini döndürür. (Buradaki
“Horizontal”ın anlamı “Yatay”dır, yani yatay -sol ve sağ- ok tuşları (Veya A-D tuşları) hesaba
alınır bu fonksiyonda. “Vertical” ise “Dikey”dir ve onda da sadece yukarı ve aşağı ok tuşları
(Veya W-S tuşları) hesaba alınır. (Çevirmen Eklemesi))
Fonksiyonun y ekseni için olan 2. parametresinin değerinin 0 olduğuna dikkat edin, bunun
sebebi kamerayı dikey eksende oynatmayacağımızdır. (x: Sağ-Sol , y: Yukarı-Aşağı , z: İleri-
Geri hareket yönlerini temsil eder. (Çevirmen Eklemesi)) Horizontal ve Vertical butonların
neler olduğu Input Settings’de (Girdi Özellikleri) önceden belirlenmiştir ve Edit->Project
Settings->Input yolunu izleyerek kolayca değiştirilebilir.
- HareketEt1 JavaScript’ini açın ve yukarıdaki kodu içine yapıştırın, koddaki büyük ve küçük
harfle başlayan kelimelere dikkat edin.
Scriptin objeye atanması
Şimdi ilk scriptimiz hazır olduğuna göre Unity’e hangi objenin bu scripte göre davranış
göstereceğini söylemeliyiz. Bunun için bu scripti istediğimiz GameObject’e atamamız yeterli.
- Bunu yapmak için önce scriptin atanacağı objeyi seçili hâle getirin. Şimdiki durumda bu obje
Main Camera ve bu objeyi ister Hiyerarşi panelinden ister Scene panelinden seçebilirsiniz.
- Ardından menüden Components->Scripts->HareketEt1 yolunu izleyin. Bu, ilgili scripti
kamera objemize atamaya yarar. Inspector panelinde kamera objemiz için HareketEt1
component’inin belirdiğini görebilirsiniz.
İpucu: Ayrıca bir scripti Proje panelinden tutup Scene veya Hiyerarşi panelindeki bir objenin
üzerine sürükleyerek de o scripti sürüklediğiniz objeye atayabilirsiniz.
- Oyunu çalıştırın, kamerayı W,S,A,D butonlarıyla oynatabiliyor olmalısınız.
Kameranın biraz hızlı hareket ettiğini fark etmiş olmalısınız, kamera hızını kontrol edebilmek
için iyi bir yol düşünelim.
Delta time (Türkçe’sini boşverin)
Önceki kodumuz Update() fonksiyonunun içinde olduğundan dolayı kameramız herhangi bir
yönde bir karede (frame) bir metre gidiyordu. Ancak biz her bir saniyede bir metre gitmesini
istiyoruz. Bunun için Input.GetAxis() fonksiyonundan döndürülen değeri (1,0 veya -1)
Time.deltaTime ve saniyede gitmek istediğimiz metre miktarıyla çarpıyoruz:
--- yasirkula.wordpress.com ---
var hiz = 5.0;
function Update ()
{
var x = Input.GetAxis("Horizontal") * Time.deltaTime * hiz;
var z = Input.GetAxis("Vertical") * Time.deltaTime * hiz;
transform.Translate(x, 0, z);
}
- HareketEt1 scriptinin içerisindeki kodu üstteki kodla değiştirin.
hiz” değişkeninin (variable) Update() fonksiyonu dışarısında tanımlandığına (declare) dikkat
edin, böyle değişkenlere görünür değişken (exposed variable) denir, çünkü bu değişkenlerin
değerleri scriptin atandığı objenin Inspector panelinde gözükür.
Bu tip değişkenlerin değerleri Inspector panelinden değiştirilebilir ve bu sırada orijinal script
herhangi bir değişikliğe uğramaz. Bu işlem oldukça kullanışlı ve hızlıdır.
5. Değişkenlere (Variable) değer atamak
Değişkenlerin değerlerini Unity’nin arayüzünü
kullanarak değiştirmek Unity’nin en güçlü özelliklerinden
biridir. Bu, değişkenlerin değerlerinin scriptlerin
içerisinde atanması yerine sürükle-bırak yöntemiyle
Unity’nin arayüzünden atanmasını sağlar. Böylece
oldukça hızlı bir şekilde çalışabiliriz. Bunu yaparken tek
bilmemiz gereken, değerinin arayüzden değiştirileceği
değişkenlerin birer Görünür Değişken olmasıdır.
Şimdi bu yönteme, oyun boyunca karaktere (Main
Camera) doğru bakacak bir spot ışık oluşturarak daha
yakından bakalım.
- Sahnede bir spotlight oluşturun. Işığı diğer GameObject’lere yakın olacak şekilde konumlandırın.
- Yeni bir Javascript oluşturun ve adını TakipEt koyun.
Şimdi ne yapacağımıza bakalım. Yapmak istediğimiz şey spot ışığın kamera neredeyse
oraya doğru bakması. Bunu yapmak içinse Unity’nin kendi içerisinde hazır bir fonksiyon
mevcut; transform.LookAt(). Eğer bu fonksiyonu duymadan önce ‘Bunu nasıl yapacağız?’
diye düşünüp karmaşık bir kod bekliyorduysanız size sürekli Unity API’yı kontrol etmenizi
öneririm. Böylece yapmak istediğiniz bir şeyi yapan hâlihazırda mevcut bir fonksiyon varsa
onu bulabilirsiniz. Spotlight objesinin konumuyla ilgili bir eylem yapacağımızdan dolayı da
Unity API’nın ‘transform’ sekmesine bakmamız, bu fonksiyonu kolayca bulmamızı sağladı.
Şimdi değişkene değer atama kısmına geldik; LookAt() fonksiyonunun parametresi için ne
kullanacağız? Kodlar vasıtasıyla biraz uğraşarak bir GameObject atayabilirdik ancak bu
işlemi arayüz vasıtasıyla yapmak daha pratik olur. Bu yüzden Transform türünde bir Görünür
Değişken kullanmamız yeterli. TakipEt.js scriptiniz şöyle durmalıdır:
var hedef : Transform;
function Update ()
{
transform.LookAt(hedef);
}
--- yasirkula.wordpress.com ---
- Script dosyasını spotlight objesine atayın, spot ışığın Inspector panelinde TakipEt
Component’inin olduğu yerde “hedef” değişkeninin görünür olduğuna dikkat edin.
- Spot ışık hâlâ seçiliyken Hiyerarşi panelinden Main Camera objesini tutup Inspector
panelindeki “hedef” değişkeninin üzerine sürükleyin. Bu, “hedef” değişkenine Main Camera
objesini atamamıza (assign) yarayacaktır. Yani artık spot ışık Main Camera objesini takip
edecektir. Eğer spotlight’ın başka bir objeyi takip etmesini isteseydik ilgili objeyi
sürüklememiz yeterli olurdu.
- Oyunu oynayın. Scene paneline bakarsanız spot ışığın Main Camera’yı takip ettiğini
görebilirsiniz. İsterseniz spot ışığın konumunu değiştirerek daha iyi bir görüntü alabilirsiniz.
6. Component’lere erişmek
Bir GameObject birden çok script veya component’e sahip olabileceği için genellikle bu
component’lerin birbirlerinin fonksiyonlarına ve değişkenlerine erişmesi söz konusu olur.
Bunun için Unity’nin GetComponent() adında bir fonksiyonu bulunmaktadır.
Şimdi spot ışığı objesine, ne zaman zıplama tuşuna basılırsa (Spacebar) Kup1 objesine
bakmasını sağlayan yeni bir script atayacağız. Yani yapmak istediğimiz şey şu:
1. Zıplama tuşuna basılıp basılmadığını kontrol et.
2. Zıplama tuşuna basıldığında spotlight’ın Kup1 objesine bakmasını sağla.
TakipEt scripti “hedef” adında, takip edilecek objenin depolandığı bir değişkene sahipti. Şimdi
bu değişkene, zıplama tuşuna basıldığında yeni bir obje (Kup1) atamalıyız. Bunu kodlarla
uzun yoldan yapabiliriz (Bir sonraki ‘Bu işlemi kodlarla yapmak’ kısmına bakın.), ancak
biliyoruz ki bir değişkene arayüz vasıtasıyla değer atamak bunu yapmak için daha ideal.
- Degistir adında yeni bir Javascript oluşturun. Scriptin içerisine şu kodu yazın:
var degisecekHedef : Transform;
function Update ()
{
if (Input.GetButtonDown("Jump"))
GetComponent(TakipEt).hedef = degisecekHedef;
}
Buradaki GetComponent() fonksiyonunda TakipEt scriptini parametre olarak kullandığımız
için artık onun içerisindeki “hedef” değişkenine ulaşabiliriz.
- Degistir scriptini spotlight’a ekleyin ve Kup1 objesini degisecekHedef değişkenine, Inspector
paneli vasıtasıyla atayın.
- Oyunu çalıştırın. Etrafta gezinin ve ardından spacebar tuşuna basın. Spotlight artık Kup1
objesine bakıyor olmalı.
Bu işlemi kodlarla yapmak
Tutorialin önceki bölümlerinde değişkene değer atamanın kodlarla da yapılabileceğinden
bahsetmiştik, şimdi bu işlemi nasıl yapabileceğimize bakalım.
--- yasirkula.wordpress.com ---
Şimdi yapacağımız şeyin sadece bu işlemin nasıl
olduğunu görmeniz için olduğunu unutmayın.
Normalde her zaman bu işlem için arayüzü
kullanmanızı öneriyorum.
Az önceki problemimiz spotlight’ı zıplama tuşuna
basıldığında nasıl Kup1 objesine doğru
baktıracağımızdı. Buna çözümümüz ise Degistir
adındaki script içerisinde bir Görünür Değişken
oluşturup o değişkene Kup1 objesini arayüz
vasıtasıyla atamaktı. Ancak bu son işlem kodlar
vasıtasıyla 2 farklı yolla da yapılabilir.
1. İlgili objenin adı (name) kullanılabilir.
2. İlgili objenin etiketi (tag) kullanılabilir.
1. GameObject’in ismini kullanmak
Bir GameObject’in ismi Hiyerarşi panelinden görülebilir. Bu ismi kodlarda kullanmak içinse
GameObject.Find() fonksiyonunda bir parametre olarak kullanırız. Yani eğer zıplama
butonuna basılınca spotlight’ın hedefinin Main Camera’dan Kup1’e değişmesini istiyorsak
yazacağımız Degistir scripti şöyle durmalıdır:
function Update ()
{
if (Input.GetButtonDown("Jump"))
{
var yeniHedef = GameObject.Find("Kup1").transform;
GetComponent(TakipEt).hedef = yeniHedef;
}
}
Göreceğiniz üzere bu kodda Update() fonksiyonunun dışarısında bir Görünür Değişken
tanımlamamıza gerek yoktu. Find() fonksiyonuyla ilgili Unity API’da detaylı bilgi bulabilirsiniz.
2. GameObject’in etiketini (tag) kullanmak
Objelerinize etiketler eklemek onların bulunmasını kolaylaştırır. Unity’nin kendi içindeki hazır
etiketleri görmek için Inspector panelinin tepesindeki Tag butonuna tıklayın, ayrıca buradan
kendi etiketinizi de oluşturabilirsiniz. Belli bir etikete sahip bir GameObject’i bulmak için
gerekli fonksiyon GameObject.FindWithTag()’dır. Kup1 objesine “Kup” adında bir etiket
atadıktan sonra Degistir scriptimizi şöyle değiştirebiliriz:
function Update ()
{
if (Input.GetButtonDown("Jump"))
{
var yeniHedef = GameObject.FindWithTag("Kup").transform;
GetComponent(TakipEt).hedef = yeniHedef;
}
}
--- yasirkula.wordpress.com ---
7. Obje oluşturmak (Instantiate)
Oyun sırasında sık sık yeni yeni objeler oluşturmak (create) zorunda kalırsınız. Bunun için
Instantiate() fonksiyonu bulunmaktadır.
Şimdi oyuncunun ateş etme tuşuna (Sol mouse tuşu veya sol CTRL tuşu) her bastığında yeni
bir objenin oluşmasını sağlayan bir kod yazarak bu konuyu anlayalım.
Yani ne yapmak istiyoruz? Oyuncunun etrafta normal bir şekilde dolanmasını, ateş etme
tuşuna basınca da yeni bir obje oluşmasını (instantiate) istiyoruz. Önemli olan hususlar:
1. Hangi objeyi oluşturmak istiyoruz?
2. Nerede oluşturmak istiyoruz?
Hangi objeyi oluşturacağımız hususunda, yapılabilecek en iyi şey Görünür bir değişken
oluşturmaktır. Bu sayede oluşturulacak objeyi arayüz vasıtasıyla her an değiştirebiliriz.
Nerede oluşturacağımıza gelince, şimdilik sadece kamera objesinin olduğu konumda
oluşturacağız.
Instantiate() fonksiyonunda 3 parametre vardır; (1) oluşturacağımız obje, (2) objenin
oluşacağı 3 boyutlu konum ve (3) objenin oluşunca sahip olacağı eğim (rotation).
Olustur adında bir Javascript oluşturup içine şu kodu yazın:
var olusturulacakObje : Transform;
function Update ()
{
if (Input.GetButtonDown("Fire1"))
{
Instantiate(olusturulacakObje, transform.position, transform.rotation);
}
}
Buradaki transform.position ve transform.rotation ikilisi, scriptin atandığı objenin o anki
konumunu ve eğimini ifade etmek için kullanılır. Bizim durumumuzda bu obje Main Camera
objesi olmakta. Genelde bir obje oluştururken oluşturulacak obje bir prefab olur. Bunun için
şimdi Kup1 objesini bir prefab’a çevireceğiz.
- Önce Assets->Create->Prefab yolunu izleyerek boş bir prefab oluşturun ve onu Kup olarak
adlandırın.
- Hiyerarşi panelinden Kup1 objesini tutup Proje panelindeki Kup prefabının üzerine
sürükleyin. Prefab’ın ikonunun değiştiğini göreceksiniz.
Şimdi Javascript kodumuzu oluşturabiliriz:
- Üstteki oluşturduğumuz Olustur.js scriptini Main Camera objesine sürükleyerek atayın ve
olusturulacakObje değişkeninin değerini Kup prefabı olarak atayın.
- Oyunu oynayın ve etrafta gezinin. Her ateş etme tuşuna bastığınız anda yeni bir küpün tam
bulunduğunuz konumda oluştuğunu gözlemleyebilirsiniz.
--- yasirkula.wordpress.com ---
8. Debug işlemi (Hata ayıklama)
Debug işlemi, kodlardaki insansı hataları bulup gidermeye denir. Unity, Debug sınıfıyla
(class) bize epey yardımcı olmaktadır. Şimdi beraber Debug.Log() fonksiyonuna bakacağız.
Log (Çıktı)
Log() fonksiyonu Unity’nin Console (Konsol) paneline bir mesaj çıktısı yollamaya yarar. Bunu
yapmayı istememiz için olası sebepler:
1. Bir kodun belli bir kısmının tamamlandığından emin olmak.
2. Bir değişkenin durumundan sürekli haberdar olmak.
Şimdi Log() fonksiyonunu kullanarak oyuncu ateş etme tuşuna her bastığında Unity’nin
konsol ekranına mesaj yollayacağız.
- Olustur scriptini açın ve ‘if’ bloğunun içerisinde, ‘Instantiate’ fonksiyonundan hemen sonraki
satıra şu kodu ekleyin:
Debug.Log("Kup olusturuldu!");
- Oyunu çalıştırın ve ateş etme tuşuna basın. Unity’nin arayüzünün en sol altındaki çubukta
“Kup olusturuldu!” yazısı yazacaktır, bu yazıya tıklayarak Unity konsol ekranına erişebilirsiniz.
(Veya Window->Console yolunu izleyebilirsiniz. (Kısayol: CTRL+Shift+C) (Çevirmen
Eklemesi))
İzlemek
Debug işleminin bir diğer güzel yanı da private (özel, Inspector’da normal şartlarda
gözükmeyen) bir değişkenin değerini takip edebilmektir. Bu sayede o değişkenin değeri
Debug modunda çalışırken Inspector panelinde görüntülenir ancak değeri değiştirilemez.
Bunu yapmak için önce, oluşturduğumuz (instantiate) küplerin sayısını depolayan bir private
değişken oluşturacağız.
- Olustur scriptini tekrar açın ve şu işlemleri uygulayın:
(1) kupSayisi adında yeni bir private değişken oluşturun.
(2) Yeni bir küp oluşturulduğunda bu değeri 1 artırın.
Olustur.js scriptinin tamamı şöyle gözükmelidir:
var olusturulacakObje : Transform;
private var kupSayisi = 0;
function Update ()
{
if (Input.GetButtonDown("Fire1"))
{
Instantiate(olusturulacakObje, transform.position, transform.rotation);
Debug.Log("Kup olusturuldu!");
kupSayisi++;
}
}
--- yasirkula.wordpress.com ---
- Şimdi oyunu çalıştırın ve ateş tuşuna basarak birkaç küp oluşturun. Inspector panelinde
yeni bir küp oluşturulduğunda kupSayisi değişkeninin nasıl arttığını gözlemleyin. Ayrıca bu
değişkenin değerinin biraz grimsi olduğuna dikkat edin, bunun anlamı o değişkenin değerinin
elle değiştirilemeyeceğidir. (Çünkü bir private değişken.) (Ben yazarın aksine değişkenimin
değerini grimsi bir şekilde de olsa Inspector panelinde göremedim. Sorun belki bendedir,
belki Unity’nin yeni sürümlerindedir belki de yazar arada bazı şeyleri yazmayı unutmuşturD
Yani kupSayisi’nin değerini siz de göremezseniz şaşırmayın. (Çevirmen Eklemesi))
9. Yaygın olarak kullanılan fonksiyonlar
Her yeni Javascript dosyası varsayılan olarak bir Update() fonksiyonuyla gelir. Bu bölümde
diğer yaygın olarak kullanılan fonksiyonlar listelenecek, yapmanız gereken Update() ismini
alttakilerden biriyle değiştirmekW
FixedUpdate()
Bu fonksiyona yazılan kodlar belli aralıklarla (düzenlenmiş framerate) gerçekleştirilir. Bu
fonksiyon genelde Rigidbody’e güç (force) uygularken kullanılır. (Bunun Update()’den tam
olarak farkını inanın ben de tam anlamıyorum. (Çevirmen Eklemesi))
// Rigidbody’e her bir karede yukarı yönde bir güç uygular.
function FixedUpdate ()
{
rigidbody.AddForce (Vector3.up);
}
Awake()
Buraya yazılan kod, script çalıştırılmadan hemen önce gerçekleştirilir.
Start()
Buraya yazılan kodlar Update()’den önce ama Awake()’den sonra çalıştırılır. Start() ve
Awake() fonksiyonlarının birbirinden farkı; Start() fonksiyonu sadece eğer ki script açıksa
(enabled) çalıştırılırken (Yani Inspector panelinde scriptin solundaki kutucuk işaretliyse)
Awake() fonksiyonunda bu zorunlu değildir.
OnCollisionEnter()
Buraya yazılan kod, kodun yazıldığı GameObject başka bir GameObject’le temasa geçince
gerçekleştirilir.
OnMouseDown()
Buraya yazılan kod, GUIElement veya Collider component’lerinden herhangi birine sahip bir
objeye mouse ile sol tıklandığında gerçekleştirilir.
// Oyuncunun scripntin yazıldığı objeye tıklaması sonucu
// BirBolum adındaki bölümü (scene) yükleme yarar.
function OnMouseDown ()
{
Application.LoadLevel ("BirBolum");
}
--- yasirkula.wordpress.com ---
OnMouseOver()
Buraya yazılan kod, GUIElement veya Collider component’lerinden herhangi birine sahip bir
objenin üzerinde mouse bekletilince gerçekleştirilir.
// Fare, kodun yazıldığı objenin üzerinde olduğu sürece
// objenin materyalinin kırmızı renginin değeri gitgide 0’a yaklaşır.
function OnMouseOver ()
{
renderer.material.color.r -= 0.1 * Time.deltaTime;
}
Unity API’da (Script Referans Dosyası) (En azından ben öyle anladım. (Çevirmen
Eklemesi)) bu fonksiyonlar ve başka fonksiyonlar hakkında daha detaylı bilgi bulabilirsiniz.
Unity API’ya ulaşmak için Help menüsünden Scripting Reference’ye tıklayın.
Böylece bir başka tutorialin daha sonuna geldik, umarım bu eğitim dosyası faydalı olmuştur.
Bu ve bunun gibi daha başka Unity tutorialleri için siteme göz atmanızı tavsiye ederim:
http://yasirkula.wordpress.com/
Bu tutoriali herhangi bir yerde alıntı yapıldığını belirterek paylaşabilirsiniz. Lütfen bu tip eğitim
dosyalarını kendi üzerinize sahiplenmeyin çünkü böyle tutorialleri oluşturmak/çevirmek
gerçekten uzun emekler istiyor. Anlayışla karşılayacağınızı düşünüyorum.
Başka tutoriallerde görüşmek üzere, hepiniz hoşçakalın!
--- yasirkula.wordpress.com ---