19 Mart 2014 Çarşamba

Unity 3D Game Object-Component İlişkisi

GameObject - Component İlişkisi

GameObject

GameObject’ler Unity’nin en önemli parçasıdırlar. Bir GameObject’in ne olduğunu ve nasıl kullanıldığını anlamak çok önemlidir. Bu bölüm size bunu açıklayacaktır.

GameObject Nedir?

Oyununuzda yer alan her bir obje bir GameObject’tir. GameObject’ler tek başlarına hiçbir şey yapamazlar. Bir GameObject; bir karakter, ağaç veya özel efekt olmadan önce üzerinde özel ayarlamalar yapılmalıdır. Ama az önce saydığım şeyler birbirinden oldukça farklı şeylerdi diye düşünebilirsiniz. Örneğin sabit (static) bir oda objesini bir kuş objesinden farklı kılmayı nasıl başarabileceğimizi merak edebilirsiniz. Evet o hâlde bu GameObject’leri birbirinden farklı kılan şey nedir?

Bunun cevabını şöyle verebiliriz: GameObject’ler birer taşıyıcıdırlar. Onlar boş birer kutudurlar ve bizler bu kutunun içine değişik parçalar sokarak bir ada ya da fiziksel bir araba oluştururuz. O yüzden GameObject’leri gerçekten anlamak için bu parçaları da anlamalısınız, biz bu parçalara Unity’de Component (Parça) diyoruz. Nasıl bir obje oluşturacağınıza bağlı olarak, bir GameObject’in içerisine değişik Component’ler atayarak farklı farklı kombinasyonlar kurarsınız. GameObject’i boş bir tencere olarak düşünün ve Component’leri de bu tencereye koyduğunuz farklı farklı içerik olarak düşünün. Unity’nin içerisindeki hazır Component’leri kullanabileceğiniz gibi script yazarak kendi Component’lerinizi de oluşturabilirsiniz.

Konuya ısınmaya başladıysanız biraz daha detaya inmeye hazırız demektir.

1) GameObject - Component İlişkisi

Az önce de söylediğimiz gibi, GameObject’ler çeşitli Component’ler içerirler. Şimdi bu ilişkiyi, GameObject’i ve en yaygın Component’i olan Transform Component’ini inceleyerek daha yakından göreceğiz. Unity’de herhangi bir sahnedeyken yeni bir GameObject oluşturun (Kısayol tuşu CTRL+Shift+N, Mac’deyse Command+Shift+N), oluşturduğunuz bu GameObject’i seçin ve ardından Inspector paneline dikkatinizi verin.
Yukarıda boş bir GameObject’in Inspector’daki görünümü verilmiştir. Bir GameObject’in boş olmasına rağmen yine de bir isme (Name), Tag’a (Etiket) ve Layer’a (Katman) sahip olduğuna dikkat edin. Ayrıca buna ek olarak her GameObject, oluşturulduğu anda bir Transform Component’ine sahip olur.

Transform Component’i

Unity’de Transform Component’ine sahip olmayan bir GameObject oluşturmanız imkansızdır. Transform Component’i en önemli Component’lerden biridir. Bu Component, GameObject’in 3 boyutlu uzaydaki konumunu (position), yaptığı açıları (rotation) ve boyutunu (scale) ifade eder. Eğer bir GameObject’in içerisinde Transform Component’i yoksa o GameObject sadece bilgisayarın hafızasındaki bir bilgidir. O GameObject kesinlikle 3 boyutlu dünyada yer almaz.
Transform Component’i ayrıca Parenting adında bir konsepti de mümkün kılar. Bu işlemi UnityEditor’den yaparsınız. Parent atama işlemi GameObject’lerle çalışırken sık sık kullanacağınız, çok önemli bir işlemdir. Transform Component’i ve Parent atama işlemi hakkında daha detaylı bilgi için Unity’nin kendi kılavuzuna bakabilirsiniz.

Diğer Component’ler

Transform Component’i her GameObject’te bulunur ve bu yüzden çok önemlidir. Ancak bir GameObject bunun dışında başka Component’lere de sahip olabilir.
Yukarıda, yeni bir sahne oluşturduğunuzda otomatik olarak oluşturulan Main Camera objesinin Component’lerini görüyorsunuz. Bu resme bakarak Main Camera GameObject’inin Camera, GUILayer, Flare Layer ve Audio Listener olmak üzere çeşitli Component’lerden oluştuğunu fark etmişsinizdir. Tüm bu Component’ler o GameObject’e bir takım fonksiyonellik verir. Onlar olmadan, oyuncuya bir görüntü verecek render işlemi gerçekleşmezdi!

2) Component Kullanımı

Component’ler, oyununuzda yer alan objelerin bel kemiğidirler. Onlar GameObject’leri fonksiyonel kılmaya yarar.

Daha önce de bahsettiğimiz gibi; bir GameObject, çeşitli Component’leri barındıran bir taşıyıcıdır. Başlangıçta otomatik olarak tüm GameObject’lerde Transform Component’i bulunur. Bunun sebebi de Transform’un, o objenin konumunu, yaptığı açıları ve boyutunu ifade etmesidir. Transform Component’i olmadan bir GameObject 3 boyutlu uzayda yer alamazdı. Şimdi boş bir GameObject oluşturun. Bunun için menüden GameObject -> Create Empty yolunu izleyebilirsiniz. Oluşturduğunuz GameObject’i seçin ve Inspector paneline bakın.
Inspector panelini bir GameObject’e hangi Component’lerin atandığını görmek için kullanabilirsiniz. Component’ler silindikçe ya da atandıkça bu işlem aynı zamanda Inspector panelinde de gözükür. Inspector panelini kullanarak Component’lerin herhangi bir özelliğini değiştirebilirsiniz. (Buna scriptler de dahildir.)

Yeni Component Eklemek (Atamak)

Bir GameObject’e yeni bir Component eklemek için Components menüsünü kullanırsınız. Az önce oluşturduğumuz GameObject’e bir Rigidbody Component’i (Katı cisim yapmaya yarayan, yerçekimi gibi fizik kurallarını bir objeye uygulamak için gerekli olan Component) ekleyerek bu işlemi öğrenelim. Objenizi seçin ve menüden Component -> Physics -> Rigidbody seçeneğini seçin. Bunu yaptığınızda Inspector panelinde Rigidbody’nin özelliklerinin belireceğini fark edeceksiniz. Eğer şimdi Play butonuyla oyununuzu test ederseniz küçük bir sürprizle karşılaşacaksınız. Bunu deneyin ve bir Component’in GameObject’i nasıl fonksiyonel kıldığını görün. (GameObject’inizin y eksenindeki koordinatı azalacaktır. Bunun sebebi Unity’nin fizik motorunun GameObject’i artık bir yerçekiminin etkisi altına almasıdır.)
Bu resimde Rigidbody Component’i eklenmiş GameObject’i görebilirsiniz. Tek bir GameObject’e dilediğiniz kadar Component ekleyerek değişik kombinasyonlar uygulayabilirsiniz. Bazı Component’ler başka Component’lerle kombine edilince en iyi çalışırlar. Örneğin, Rigidbody ile Collider Component’leri beraber çalışırlar. Rigidbody, NVIDIA PhysX fizik motoru vasıtasıyla objenin Transform Component’ine etki ederken Collider de Rigidbody’nin çeşitli objelerle etkileşime geçmesini sağlar. Başka bir kombinasyon örneği de partikül sistemidir. Bu sistem Particle Emitter, Particle Animator ve Particle Renderer Component’lerini kombine ederek hareketli partiküller oluşturur.

Herhangi bir Component hakkında çok daha detaylı bilgi almak için Unity’nin kendi kılavuzuna göz atabilirsiniz. Ayrıca Inspector’dayken bir Component’in isminin sağındaki soru işaretli simgeye tıklayarak da o Component hakkında yardım alabilirsiniz.

Component’leri Düzenlemek

Component’lerin en güzel özelliklerinden birisi de esneklik sunmalarıdır. Bir GameObject’e Component atadığınızda Inspector panelinde o Component’in çeşitli özellikleri (Properties) belirir ve bu değerleri gerek Inspector’dan, gerek oyun sırasında scriptler vasıtasıyla istediğiniz gibi değiştirebilirsiniz. Burada 2 çeşit özellik bulunmaktadır: Değerler (Value) ve Referanslar.

Alttaki resme bakın. Bu, Audio Source Component’i eklenmiş boş bir GameObject’tir. Resimde gördüğünüz değerler varsayılan değerlerdir.
Bu Component tek bir Referans özelliği ve yedi adet Değer özelliği içermektedir. Audio Clip (Ses Klibi) özelliği referanstır. Bu Audio Source Component’i çalıştığında, Audio Clip’te referans olarak gösterilen klibi çalacaktır. Eğer referans belirtilmemişse hata verecektir. Buraya bir referans atama işlemini Inspector’dan yapmalısınız. Bunu yapmak içinse Proje panelinden bir ses dosyasını referans kısmına sürüklemek ya da Object Selector’u (Obje Seçici) kullanmak yeterlidir.
Gördüğünüz gibi, şimdi bu Component’imize bir ses klibi (Audio Clip) referans olarak atanmış durumdadır. Component’ler daha farklı türlerde referanslar da içerebilirler, başka Component, GameObject ya da Asset’ler gibi.

Buradaki Audio Clip’in diğer tüm özellikleri birer Value’dir (Değer). Değerleri direk Inspector  üzerinden değiştirilebilir. Audio Clip’in Value özellikleri işaretlenebilir kutucuklardan, nümerik değerlerden, açılabilir kutucuklardan oluşuyor ancak bir değer ayrıca string (yazı), renk, eğri veya başka türde de olabilir. Bunlar hakkında daha detaylı bilgi Unity kılavuzunda mevcuttur.

Değerlerin Test Edilmesi

Play Mode’deyken (Oynatma Modu) bir GameObject’in herhangi bir değerini Inspector’dan dilediğinizce değiştirebilirsiniz. Mesela farklı yüksekliklerde zıplayabilmenin nasıl olacağını test edebilirsiniz. Eğer bir scriptte Ziplama Yuksekligi adında bir değişken oluşturursanız, Oynatma Modundayken bunun değerini değiştirebilirsiniz ve zıplama tuşuna basıp yaptığınız değişikliğin etkilerini test edebilirsiniz. Ardından Oynatma Modundan çıkmadan bu değeri tekrar değiştirebilir, farkı saliseler içerisinde oyununuzda test edebilirsiniz. Unutmayın, Oynatma Modundan çıktığınızda, Oynatma Modundayken yaptığınız değişiklikler resetlenerek eski değerlerine dönerler. Oynatma Modunda bir özelliğin değerini değiştirerek anlık testler yapabilir, çeşitli ayarlamalar ve kalibrasyonlar uygulayabilirsiniz. Bunu kendiniz de deneyin. Bu özelliği kullandıktan sonra etkileneceğinizi düşünüyorum.

Component’leri Silmek

Eğer bir Component’i silmek istiyorsanız, Component’in ismine sağ tıklayın ve Remove Component
seçeneğini seçin. Ya da alternatif olarak ? işaretinin sağındaki küçük dişli simgesine tıklayabilirsiniz. Bu Component’e ait tüm özellikler de onunla beraber gidecektir ve unutmayın; bu işlemi geri alamazsınız! Bu yüzden o Component’i silmek istediğinizden iyice emin olun.

3) Component - Script İlişkisi

Bir script oluşturduğunuzda ve bu scripti bir GameObject’e atadığınızda script, tıpkı Component’lerde olduğu gibi GameObject’in Inspector panelinde belirir. Bunun sebebi scriptlerin atandıkları zaman birer Component’e dönüşmeleridir, çünkü scriptler de birer özelleştirilebilir Component çeşididirler. Yani anlayacağınız; scriptler, kendi oluşturabileceğiniz Component’lerdirler. Scriptlerin içerisinde, Inspector’da gözükecek özellikleri girersiniz ve script içerisine ne yazdıysanız oyun sırasında bu kod aynen çalıştırılır.

Scriptler hakkında daha detaylı bilgi için Unity’nin kılavuzuna başvurabilirsiniz. Böylece bu bölümün de sonuna geldik. Hazırsanız sonraki bölüme geçebilirsiniz.

1 yorum: