Unity’de Alt Nesnelere Erişmek (Parent & Child Object)
Merhaba, bir önceki yazımızda wheel collider kullanımına bakmıştık.Basit bir araba tasarlayarak, bu aracın tekerlerine hareket ve açı kazandırmıştık.Bugünkü dersimizde Hierarchy penceresindeki nesnelerimizin alt nesnelerine (Parent ve Child) ulaşmayı öğreneceğiz.Buna bir ebeveyn ve çocuk ilişkisi diyebiliriz.Buradaki ebeveyn bizim erişmeye çalıştığımız nesnenin ana elemanı görevini görürken, çocuk ise bu ana nesneni alt elemanlarını temsil ediyor.Şimdi yeni bir proje açalım ve yazımıza devam edelim.
Hiyerarşik düzenin oluşturulması.
Evet yazımız için oluşturacağımız senaryoda, bir ana (Parent) nesnemiz olacak.Bu ana nesnenin altına (Child) iki çocuk nesne oluşturacağız.Bu iki çocuk nesnelerin altına da beşer tane da çocuk nesne oluşturacağız.Yani iki sütün ve beş satır olarak özetleyebiliriz.Şimdi nesnelerimiz oluşturmaya başlayalım.Önce Hierarchy penceresinde üç tane boş nesne oluşturuyoruz.Bunun için pencerede sağ tıklayarak, Create Empty seçimini yapıyoruz.Evet bu nesnelerden birisi bizim ana nesnemizi oluşturacak.
Diğer ikisini seçip, bu ana nesnemizin üzerine bırakıyoruz.Artık bunlar alt nesne yani çocuk konumundalar.Şimdi bu iki çocuk nesnemizin üzerine sağ tıklayarak, 3D Object > Sphere seçimini yapıyoruz.Bu kürelerden her bir çocuk nesne için beş tane oluşturuyoruz.Böylelikle Scene ekranımızda toplam 10 tane küre görüyoruz.Tabi ilk aşamada bunlar aynı koordinatta oluşacakları için pozisyon ayarları ile oynayarak istediğimiz konuma taşımamız gerekiyor.
Ben iki sıra şeklinde dizdim.Bunlara daha iyi anlaşılması için bir kaplama atadım.İnternetten tenis topuna benzetmek için bir kaplama seçtim.Siz herhangi bir seçimde bulunabilirsiniz.Daha sonra bu kaplamayı Project pencereme sürükle/bırak yaptım.Ve en son olarak nesnelerimin üstüne bıraktım.Sahnemizin son görüntüsü aşağıdaki gibi oldu.
İstediğim nesneye nasıl erişeceğim?
Evet yeni bir C# Scripti oluşturuyoruz.Bunun için, Project penceresinde sağ tıklayarak sırasıyla, Create > C# Script seçimini yapıyoruz.Daha sonra bu dosyamıza bir isim veriyoruz.Script dosyamızı tutup sürükleyerek ana (Parent) nesnemizin üzerine bırakıyoruz.Burası önemli bir bölüm, zira biz bu nesneye göre alt nesnelerimizi bulacağız.Şimdi C# scriptimizi açalım ve kod yazmaya başlayalım.
public GameObject anaNesne; public int altNesne1; public int altNesne2;
Öncelikle değişkenlerimi oluşturuyorum.Burada ana nesnemi tanımlamak için bir “GameObject” oluşturuyorum.Daha sonra alt nesne bulma işlemini size daha iyi gösterebilmek için, iki tane int türünde değişken oluşturuyorum.Bunları siz oluşturmak zorunda değilsiniz.Ben sahnemi dinamik olarak kullanmak için bu değişkenleri oluşturdum.
anaNesne = this.gameObject;
Daha sonra start() fonksiyonumun içini gelip, ana nesnemizi yani script dosyamızı attığımız nesneyi değişkenimize eşitliyoruz.Böylelikle birazdan değişkenimizi bir referans olarak kullanabileceğiz.
if (anaNesne != null) { GameObject altNesne = anaNesne.transform.GetChild (altNesne1).GetChild (altNesne2).gameObject; altNesne.GetComponent<MeshRenderer> ().material.color = Color.red; Debug.Log ("Hierarchy Penceresindeki konumu: " + anaNesne.name + ">" + altNesne.transform.parent.name + ">" + altNesne.name); }
Şimdi update() fonksiyonunun içine, bir koşul tanımlıyoruz.Eğer ana nesnemiz tanımlı değilse (yani boşsa), koşulumuz gerçekleşmiyor.Tam tersi ise, bir “GameObject” tanımlıyorum. Daha sonra bu nesnemizi GetChild fonksiyonu ile parantez içine yazdığımız index numarasına denk gelen nesneyi eşitliyoruz.Burayı biraz açalım.Öncelikle ana nesnemizin değişkenini yazıyoruz.
Daha sonra bu nesnenin transform’una erişim GetChild fonksiyonu ile bulmak istediğimiz çocuk nesnesine ulaşıyoruz.Az önce iki tane int türünde değişken oluşturmuştuk.İşte bunları parantez içinde kullanıyoruz.Bizim senaryomuzda hiyerarşik olarak iki alt bölüm olduğu için, burada GetChild fonksiyonunu iki kere kullandık.Projelerinizdeki yapıya göre bu sayı artacaktır.
Örneğin, “transform.GetChild (0).GetChild (2).GetChild (1).GetChild (5).gameobject” gibi.GetChild fonksiyonunda parantez içine index değeri girildiğine değinmiştim.Bu nedenle sıfırdan “0” başlıyoruz.Yani beş tane çocuk nesnesinden ilkini seçmek istiyoruz.Eğer parantez içine bir “1” yazarsak, ikinci nesneyi seçmiş oluruz.Bu yüzden ilk nesne için sıfır “0” yazmamız gerekiyor.
Nesneye erişimi sağladıktan sonra.
Daha sonra bulduğum alt nesnenin “MeshRenderer” bileşenine ulaşıyorum ve rengini değiştiriyorum.Ve Console penceresine bulduğum çocuk nesnesinin tam konumu yazdırıyorum.Buradaki kodları açıklayacak olursak, “anaNesne.name” bu kod ile ana nesnemizin ismini çekiyorum.Daha sonra “altNesne.transform.parent.name” bu kod ile bulduğum alt nesnenin ebeveyninin buluyorum ve ismini çekiyorum.
Buraya bir parantez açmalıyım.Kodda bulunan “parent” ile hedef nesnemin bir üst nesnesini bulabiliyorum.Ve en sonda, “altNesne.name” bulduğum çocuk nesnesinin ismini yazdırıyorum.Bunları yazmak zorunda değilsiniz.Ben proje daha iyi anlaşılsın diye yazdım.
Evet umarım nesnelere nasıl erişildiğini anlatabilmişimdir.Böylelikle bu dersimizinde sonuna geldikBir sonraki yazıda görüşmek üzere…