GameObject Unity adlı oyun motoru/programı üzerinde yarattığımız sahneler içerisine yerleştirebileceğimiz objelerin genel adıdır. İster 3 boyutlu bir model, isterse ışık kaynağı olsun, sahnedeki her şeyi GameObject olarak adlandırabiliriz. Unity GameObject aslında tek başına işe yarayan objeler değildir. Bu objelere asıl işlev sağlayan yapı bileşenler(Components) adını verdiğimiz yapılardır. Her obje içerisinde bu yapılar eklenebilir ve bu sayede istenilen işlemler gerçekleştirilebilir. Unity GameObject Nedir? sorusunun temel cevabı aslında bu.
Yeni bir GameObject eklemek için yapmamız gerekenler ise gayet basit işlemlerdir. Bu işlem için iki seçeneğimiz bulunuyor. İstersek ana menü kısmından “GameObject” adlı menüye tıklayıp açılan listeden temel olarak Unity’nin sunduğu obje seçeneklerini oluşturabiliriz. Bunun dışında “Hieararchy” panelinde boş bir alana sağ tıklayarak açılan listede yine temel objeleri bulabilir ve tıklayarak yeni objeler ekleyebilirsiniz.
Unity GameObject nesneleri için bir parent-child ( ebeveyn-çocuk) altyapısı da bunar. Bu sayede objeleri birbirinin alt objesi olarak ayarlayabilir ve birbirilerine bağlı olmasını sağlayabilirsiniz. Bir objeyi diğerinin alt objesi haline getirmek için hieararchy panelinde altobje yapmak istediğinizi sürükleyip ebeveyn yapmak istediğiniz obje üzerine bırakmanız yeterlidir. Ayrıca, yeni bir objeyi direkt bir altobje olarak yaratabilirsiniz. Bunun için tek yapmanız gereken ebeveyn yapmak istediğiniz objenin seçili olduğundan emin olmak. Seçili bir objeye Hierarchy panelinde sağ tıklayarak yeni bir obje yarattığınızda veya “GameObject” menüsünde “Create Empty Child” seçeneğini seçtiğinizde işlem tamamlanır . Bu işlem sonrasında artık yeni bir alt objeniz oluşur.
Obje oluştuktan sonra objenin seçili olduğundan emin olup Inspector paneline bakarsanız, burada yaratılan objeye dair çeşitli bilgilerin olduğunu görebilirsiniz.Açılır liste bulunduran bir kutu simgesi, Objenin ismi, hemen solunda bir aç-kapa butonu, Tag ve Layer alanı. Tag ve Layer konularına bu yazıda girmeyeceğiz. Ancak temel olarak bahsetmemiz gerekirse, Tag yapısı objelere etiket atamızı ve bu sayede erişim, kontrol vb işlemleri yapabilmemizi sağlarken. Layer ise objeleri farklı katmanlara atamamızı ve genellikle fizik ve render işlemlerinde filtreleme veya öncelik atama gibi işlemler yapmamızı sağlamaktadır. Aç-kapat butonuna gelecek olursak, adından da anlayabileceğiniz gibi, objemizin açıp kapatmaya, aktif ve deaktif hale getirmeye yarıyor. Eğer üzerinde tik varsa açık, yok ise kapalıdır. İsim alanına gelecek olursak, tahmin edeceğiniz üzere objemize isim vermeye yarar. Bu sayede gerek sahneyi düzenlerken objeleri daha rahat bulup düzenleyebiliriz, gerekse kodlama kısmında isime göre aramalara gerçekleştirebiliriz. Ve gelelim biraz daha karışık olan kutucuk simgesine. Bu simgeye tıkladığımızda objemiz için çeşitli renkler ve şekillerde hazır olarak sunulmuş ikonları görecekseniz. Bu yapının da amacı aslında tamamen sahne kontrolü ve objelerimizi sahne düzenlerken daha rahat seçebilmemiz, görebilmemiz. İsterseniz Unity’nin kendi sunduğu hazır ikonları kullanabilirsiniz, isterseniz de “Other” seçeneğine tıklayarak kendi isteğinize göre projeye eklediğiniz Texture2D formatındaki dosyaları objenize ikon olarak atayabilirsiniz.
Her GameObject’in sahip olması gereken Transform adında bir bileşen(Component) bulunmaktadır. Transform adlı component sayesinde objenin konum, açı vb bilgilerine erişebiliriz. Ayrıca istersek alakalı alanları el ile değiştirerek ya da objenin üzerindeki Transform araçları ile bu özellikleri değiştirebiliriz. Bu sayede sahneyi ve objeleri istediğimiz gibi düzenleyebilir ve oyunumuzun ana hatlarını oluşturabiliriz.
Transform dışında eklenebilecek farklı bileşenler de bulunmaktadır. Bir GameObject’i hierarchy kısmında seçtikten sonra inspector panelinde sahip olduğu bileşenleri görebiliriz. Ve aynı panelin en altında bulunan “Add Component” seçeneği ile farklı seçili objeye/objelere yeni bileşenler ekleyebiliriz. Add Component Butonuna tıklandığınızda bir arama alanı ve çeşitli başlıklar göreceksiniz. Burada isterseniz arama kutusunda arama yaparak isterseniz de başlıklara tıklayıp bileşenleri seçerek ekleme işlemini gerçekleştirebilirsiniz.
Arama kutusuna bir şeyler yazmaya başladığınızda varolan bileşenler içerisinde filtreleme yaparak ekleyebileceğiniz bileşenleri size sunacaktır. Varolan bileşenleri eklemek dışında en altta bulunan “New Script” seçeneğine tıklayarak yeni bir bileşen oluşturabilirsiniz. Oluşturulan scriptler “Monobehaviour” sınıfını temel alır ve yalnızca bu sınıf bileşenlerin temel sınıfıdır.
Unity GameObject İle Kullanılabilecek Kodlar
Her GameObject, sahip olduğu bileşen üzerinde “gameObject” özel komutuyla erişilebilir haldedir. Bu sayede her bileşen, atandığı objeyi kolaylıkl kontrol edebilir. Altbaşlıklara girmeden önce, tam olarak hangi başlık altına yerleştireceğimi bilemediğim 2 tane fonksiyonu başta belirtmek istiyorum.
Destroy(): Verilen objeyi yok etmeyi sağlar. Obje dışında bileşenler de yok edebilir ancak örneği objeler üzerinden vereceğim.
//Objeyi anında yokeder
Destroy (obje)
//Objeyi 3 saniye sonra yokeder
Destroy (obje, 3);
//bu kodun yazılığı olduğu objeyi yokeder. “gameObject” özel komutu kullandığımıza dikkat edin
Destroy (gameObject);
Instantiate(): Verilen objeyi kopyalayıp çoğaltır ve yeni bir obje yaratır. Bu objenin konumu, ebeveyn objesi bu fonksiyona parametre olarak verilebilir.
//verilen kup isimli objeyi çoğaltır
GameObject yeniKup = Instantiate (kup);
//Bir ebeveyn atayarak küp objesi oluşturur
GameObject yeniAltKup = Instantiate (kup, ebeveynObje);
//Objeyi 3,5,7 pozisyonunda rotasyon değerine dokunmadan çoğaltır
GameObject yeniPozisyonluKup = Instantiate (kup, new Vector3 (3, 5, 7, ) Quaternion.Identity);
Özellikler – Erişilebilir Değişkenler
activeInHierarchy : Açık olan, çalışan sahnede objenin aktif olup olmadığı değerini verir.
// Obje aktif ise “Aktif” değil ise “Aktif Değil” yazısı log ekranına yazdırılır
bool aktifMi = object.activeInHierarchy;
if (aktifMi) {
Debug.Log (“Aktif”);
} else {
Debug.Log (“Aktif Değil”);
}
activeSelf : Sadece okunabilir bir değişkendir. Objenin local, yani kendi içerisinde aktif olup olmadığını belirtir. Eğer bir obje ebeveyne sahip ise kendisi aktif olsa bile ebeveyn objesi pasif halde olduğu için sahnede pasif gözükecektir. Ancak bu komut ile objenin kendi aktiflik durumunu elde edebiliriz.
isStatic : Objenin static olup olmadığı bilgisini verir ve yine bu değişken üzerinden static durumunu değiştirmemizi sağlar.
layer : Objenin bulunduğu katman bilgisini tutar ve bu değişken üzerinden değiştirmemizi sağlar.
//Objenin layer değerini 4. indeksteki layer değeri olarak değiştirir.
obje.layer = 4;
scene : Objenin olduğu sahne bilgisine erişimi sağlar. Scene tipinde değişken döndürür.
// Varolan sahnenin adını log ekranına yazdırır
void Start () {
Scene sahne = obje.scene;
Debug.Log (“Objenin bulunduğu sahnenin adı: ”+sahne.name);
}
tag : Objenin tag / etiket değerine erişmemize veya değiştirmemize olanak tanır.
//objenin tag değerini “Oyuncu” yapar.
void Start(){
gameObject.tag= “Oyuncu”;
}
OnTriggerEnter fizik ile alakalı bir fonksiyondur, Detaylar için Rigidbody yazımızı okuyun.
transform : Objenin transform bileşenine (component) erişmemizi sağlar. Bu sayede transform özelliklerini, fonksiyonlarını kolaylıkla çağırabiliriz.
// Objeyi 0,0,0 noktasına hareket ettirir, taşır. Farklı değerler girerek nasıl çalıştığını görün.
gameObject.transform.position = new Vector3 (0, 0, 0);
Kurucu Method
GameObject () : Yeni bir GameObject oluşturur. Hiçbir değişken almadan, sadece string tipinde isim değişkeni alarak ve isim değişkeniyle beraber bileşen değişkenleri alarak kullanılabilir.
//Değişkensiz kullanımı
GameObject temelObje = new GameObject ();
//string değişken verilerek isimli halde oluşturma
GameObject isimliObje = new GameObject (“Yeni Obje”);
//isim ve bileşen ekleyerek obje oluşturma
GameObject fizikKupObje = new GamObject (“Fizikli Küp Objesi”, typeof (Rigidbody), typeof (BoxCollider);
Static Methodlar
CreatePrimitive (): Oyunun çalışması esnasında belirtilen basit 3D modele sahip bir obje oluşturur. PrimitiveType tipinde değişken alır. Kullanılabilecek basit tipler şunlardır ; Sphere (Küre), Capsule (Kapsül), Cylinder (Silindir), Cube (Küp), Plane (Düz Zemin), Quad (Basit Dörtgen)
// Silindir şekline sahip bir obje yaratır ve silindir adlı değişkene atar.
GameObject silindir = GameObject.CreatePrimitive (PrimitiveType.Cylinder);
Find (): Oyun içerisinde bir objeyi bulmayı sağlar. String tipinde bir değişken alır ve objelerin ismine bakarak arama yapar. Update vb çok sık çağırılan fonksiyonlar içerisinde kullanılması performansı etkileyebilir. Eğer hiçbir obje bulunamazsa null değer döndürecektir.
// burun ismine sahip objeyi bulur ve değişkene atar.
GameObject burun = GameObject.Find ("burun");
// Bir ebeveyne sahip "burun" isimli objeyi bulur ve değişkene atar.
GameObject burun = GameObject.Find ("/burun");
//Kafa isimli ebeveyne sahip burun isimli objeyi bulur ve değişkene atar
GameObject burun = GameObject.Find ("Kafa/burun");
FindGameObjectsWithTag(): String tipinde bir değişken alır ve objelerin Tag değerine göre objeleri bulup döndürür. Eğer belirtilen etiket tanımlanmamışsa hata verir. Hiçbir obje bulunamazsa boş bir dizi döndürecektir.
//Verilen Tag değerine sahip objeleri bulup dizi olarak döndürür ve değişkene atar.
GameObject[] dusmanlar = GameObject.FindGameObjectsWithTag ("Düşmanlar");
FindWithTag(): String tipinde verilen tag değerine göre objeleri arar ve tek bir obje geriye döndürür. Eğer obje bulunamazsa null değer döndürecektir. Önceki fonksiyonda belirtildiği gibi etiketin önceden tanımlanmış olması gerekir, yoksa hata verecektir.
//Bitiş noktası etiketine sahip objeyi bulur ve değişkene atar.
GameObject bitisNoktasi = GameObject.FindWithTag ("Bitiş Noktası");
Public Methodlar
AddComponent () : Belirtilen tipteki bileşeni objeye eklemeyi sağlar.
//Objeye CapsuleCollider bileşenini ekler.
gameObject.AddComponent (typeof (CapsuleCollider));
//istenirse ekleme sırasında bu bileşen bir değişkene kaydedilebilir.
CapsuleCollider kapsul = gameObject.AddComponent (typeof (CapsuleCollider)) as CapsuleCollider;
BroadcastMessage (): Objede veya sahip olduğu altobjelerde bulunan diğer bileşenlerdeki fonksiyonları çağırmak için kullanılır.
//Dövüs ve Sağlik 2 ayrı scriptte tutuluyor. Dövüs sırasında sağlık sistemine haber verilerek canın azalması sağlanıyor.HasarAl fonksiyonunun public olduğuna dikkat edin.Ayrıca fonsiyona sahip bileşen aktif değilse o bileşende çalışmayacaktır.
public class Dovus : MonoBehaviour {
void Start () {
gameObject.BroadcastMessage (“HasarAl”, 5.0f)
}
}
public class Saglik : MonoBehaviour {
float saglik = 25f;
public void HasarAl (float hasar) {
saglik -= hasar;
}
}
CompareTag (): String tipinde değişken alır ve objenin tagı ile karşılaştırır. Eğer verilen kelime ve obje tagı aynı ise true, değil ise false değer döndürür.
// Dokunulan obje düşman tagına sahip ise objeyi yok eder. Mermi objelerinize bu kodu ekleyerek kullanabilirsiniz.
void OnTriggerEnter (Collider dokunulanObje) {
if (dokunulanObje.gameObject.CompareTag ("Düşman")) {
Destroy (dokunulanObje.gameObject);
}
}
GetComponent () : Verilen bileşen tipini objede arar, eğer obje bu bileşene sahipse bileşeni, sahip değilse null değeri döndürür.
//Oyun başlangıcında Rigidbody bileşenini alır, eğer null değilse velocity değeri vererek öne doğru ilerlemeye başlamasını sağlar.
void Start () {
Rigidbody rgb = gameObject.GetComponent<Rigidbody> ();
if (rgb != null) {
rgb.velocity = Vector3.forward * 15;
}
}
GetComponentInChildren () : Verilen tipte bileşenleri objede ve altobjelerinde arar. Eğer verilen bileşen objenin kendisinde varsa altobjeleri aramaz. Yani bulabildiği ilk bileşeni geriye döndürür. 2.değer olarak bool tipine değişken alır, eğer true değeri verilirse aktif olmayan objeleri de arayacaktır.
//Sadece aktif objeler
Rigidbody rgb = gameObject.GetComponentInChildren<Rigidbody> ();
//Arama işlemine aktif olmayan objeleri de dahil eder
Rigidbody rgb = gameOBject.GetComponentInChildren<Rigidbody> (true);
GetComponentInParent () Objeyi ve onun ebeveyn objelerinde bileşeni arar. Bulamazsa null değer döndürür.
//Rigidbody bileşenini arar ve useGravity seçeneğini kapatarak yerçekiminden etkilenmesini engeller.
Rigidbody rgb = gameObject.GetComponentInParent<Rigidbody> ();
rgb.useGravity = false;
GetComponents (): Bir obje birden fazla aynı tipte bileşene sahip olabilir. Bunun için GetComponents fonksiyonunu kullanırız.
// bütün Box Collider bileşenlerini bulup trigger hale çevirir.
BoxCollider[] kutular = gameObject.GetComponents<BoxCollider> ();
for (int i = 0; i < kutular.Length; i++) {
kutular[i].isTrigger = true;
}
GetComponentsInChildren: Obje ve altobjelerindeki verilen tipteki bütün bileşenleri bulur ve dizi halinde döndürür.
//Box Collider bileşenlerini bulur ve hepsinin boyutunu 1 birimlik hale getirir
BoxCollider[] kutular = gameObject.GetComponents<BoxCollider> ();
for (int i = 0; i < kutular.Length; i++) {
kutular[i].size = Vector3.one;
}
GetComponenstInParent: Obje ve ebeveyn objelerini arar ve verilen tipteki değişkenleri dizi halinde döndürür.
//CapsuleCollider bileşenlerini bulur ve hepsinin boyunu 2 birim haline getirir.
CapsuleCollider[] kapsuller = gameObject.GetComponents<CapsuleCollider> ();
for (int i = 0; i < kapsuller.Length; i++) {
kapsuller[i].height = 2;
}
SendMessage (): BroadcastMessage fonksiyonuna benzerdir ancak bu fonksiyonda gönderilen mesaj alt objelere iletilmez, yani sadece objenin sahip olduğu bileşenlerde bulunan fonksiyonlar çalışır.
SendMessageUpwards (): BroadcastMessage fonksiyonu gibi çalışır, ancak altobjeler yerine ebeveynlere mesaj yollanır. Obje ve ebeveynlerde belirtilen fonksiyona sahip bileşenler varsa fonksiyonlar çalışacaktır.
SetActive () Objenin aktiflik pasiflik durumunu değiştirmemizi sağlar. Bool tipinde bir değişken alır.
// space tuşuna basıldığında obje aktif ise pasif, pasif ise aktif hale gelir.
void Update () {
if (Input.GetKeyDown (KeyCode.Space) {
gameObject.SetActive (!gameObject.activeSelf);
}
}
TryGetComponent (): Bileşen aramalarında null kontrolü için kolaylık sağlayan bir yapıdır. Verilen tipte bileşen arar ve bulamazsa false döndürür.
//Rigidbody bileşenini arar ve eğer bulabilirse useGravity seçeneğini aktif edip yer çekiminden etkilenmesini sağlar.
void Start () {
if (gameObject.TryGetComponent (out Rigidbody rgb)) {
rgb.useGravity = true;
}
}
Böylelikle Unity GameObject Nedir? sorusunu da geniş kapsamlı şekilde yanıtlamış olduğumuzu düşünüyorum. Eğer orjinal dökümanları incelemek isterseniz Unity GameObject dökümanlarını inceleyebilirsiniz. Sonraki yazılarımızda görüşmek dileğiyle.