Unity ile Başka Scripteki Veriye Nasıl Ulaşabiliriz?

Unity ile Başka Scripteki Veriye Nasıl Ulaşabiliriz?

6 Ocak 2020 7 Yazar: Ahmet Güler

Merhaba, yeni bir konu ile öğrenmeye devam ediyoruz.Bir önceki dersimizde, nesneyi Rigidbody kullanarak nasıl hareket ettirebileceğimizi öğrenmiştik.Bu dersimizde ise, aslında her projede karşımıza çıkan ve sıkça araştırılan bir konuyu ele alacağız.Birden çok scriptimiz olduğu senaryolarda, diğer scriptlerden nasıl değişken çekilmesi gerektiğini hemen öğrenmeye başlayalım.Unity‘de istediğimiz veriye ulaşmanın birden çok yolu var.Ben bu yazıda, dinamik olarak nasıl ulaşılabilir onu göstereceğim.

Hazırsanız, başlayalım.

İlk olarak yeni bir proje açıyorum.Burada bir senaryo oluşturdum ve gerekli nesnelerimi sahneye ekledim.Senaryoda iki Cube, bir Material ve iki Script dosyası kullanacağım.Amacımda, bir nesneden diğer nesnesin script dosyasına ulaşarak onun ismini öğrenmek olacak.Bunları sahneye nasıl eklendiğini daha önce görmüştük.Kısaca tekrar ediyorum.Hierarchy penceresinde (yada üst menüden GameObject sekmesini kullanarak) sağ tıklayarak sırasıyla, 3D Object > Cube seçiyoruz.Bu nesnemize bir ad veriyoruz ve Scene penceresinden istediğimiz gibi düzenliyoruz.

Örneğin ben, boyutunu (klavyeden R tuşuna basarak ulaşabilirsiniz) ve konumunu (klavyeden W tuşuna basarak ulaşabilirsiniz) değiştirdim.Daha sonra oluşturduğum bu nesnemin üzerine sağ tıklarak (yada kısayol olarak ctrl+d) Duplicate seçimini yapıyorum.Böylelikle nesnemden bir kopya daha oluşturuyorum.Bununda konumunu ayarladıktan sonra renk vermek için material nesnesine ihtiyacımız var.Project penceremizde sağ tıklayarak sırasıyla, Create > Material seçimini yapıyoruz.Yeni bir isim yazıyoruz ve sağ taraftaki Inspector penceresinden istediğimiz rengi seçiyoruz.Renk seçiminden sonra, daha önce oluşturduğumuz iki nesnemizden birinin üzerine sürükle bırak yapıyoruz.Sahnemizin son hali aşağıdaki gibi oluyor.

Kod yazmaya başlayalım.

Şimdi kod yazmaya geçebiliriz.Öncelikle iki adet C# script dosyasına ihtiyacımız var.Bunları yine, Project penceremizde sağ tıklayarak sırasıyla, Create > C# Script  seçimini yaparak oluşturuyoruz.İsimlerini verdikten sonra sürükle bırak yaparak iki nesnemize de ekliyoruz.Ben resimde görüldüğü gibi, kutu 1 ve kutu 2 olarak isimlendirdim.Şimdi kutu 1 yani benim senaryomda kırmızı olan nesnemin scriptini açıyorum.İlk olarak bu nesneme isim vermek için bir string değişkeni tanımlamam gerekiyor.

public string benimAdim;

Start() fonksiyonumun üzerine değişken kodumu yazıyorum.Değişkenimin başına neden public yazdığımı diğer derslerde anlatmıştım.Özellikle bu derste farkını göreceğiz.Çünkü private yazsaydım yada hiç belirtmeseydim, diğer script dosyamızda bu değişkenimizin adını göremeyecektir.Daha sonra start() fonksiyonumun içine aşağıdaki kodu yazıyorum.

benimAdim = "Kırmızı Kutu";

Bu şekilde projemizi başlattığımız zaman, string değişkenimizi karşısında zaman yazıya eşitlemiş olduk.Ben ayırt etmek için “Kırmızı Kutu” olarak yazdım.Evet ilk script dosyamız artık kullanıma hazır.Gördüğünüz gibi sadece değişkenimi tanımladım ve ona bir değer atadım.Sizin projenize bağlı olarak istediğiniz değişkeni aynı şekilde çekebilirsiniz.Ayriyeten Update() fonksiyonu ile bu projede işim olmadığı için siliyorum.Bu aşamada önemli bir noktaya değineyim.Eğer script dosyalarınızda kullanmadığınız fonksiyonlar var ise bunları silin.Çünkü projenizi başlattığınız zaman fonksiyonlar boş olsa bile bunlar çağırılıyor.Bu da doğal olarak kaynak tüketiminizi olumsuz bir şekilde etkiliyor.

İkinci bir script dosyası lazım.

Şimdi sırada ikinci script dosyamızı hazırlamak var.Burada öncelikle hangi script dosyasından veri çekeceksek, o dosyaya bir değişken oluşturuyoruz.

public kutu1 kutuyuGetir;

Benim ilk script dosyamın adı “kutu1” olduğu için onun adını yazdım ve sonrasında bu değişkenime sonrasında kullanmak için bir isim verdim.Yine burada dikkat etmeniz gereken nokta, proje büyüdükçe birden fazla script dosyasında veri alışverişi yapmanız gerekebilir.Haliyle yazdığınız kod satırları da yükseleceği için, bu değişkenlere karışmayacak isimler vermeniz çok önemlidir.Sadece script için değil tüm değişkenlerinizi düzenli bir biçimde isimlendirirseniz, ileride bunun çok yararını göreceksinizdir.Şimdi geri dönecek olursak, bir tane daha değişken oluşturmam gerekiyor.Bunu da, kutu1 scriptimden çektiğim değişkeni eşitlemek için kullanacağım.Yani,

public string AdiniSoyle;

Bu şeklide başka bir string değişkenine atıyorum.Bunu yapmadan da veriyi çekebiliyoruz fakat bir değişkene atayıp, işimiz oldukça oradan almak bana daha makul geliyor.Birazdan bu konuya tekrar geleceğim.Daha sonra artık start() fonksiyonumuzda kutu1 scriptimizin nerede olduğunu belirlememiz gerekiyor.Zira scriptimizi bulamazsak, istediğimiz değişkenide çekemeyiz.

kutuyuGetir = GameObject.Find("kutu1").GetComponent<kutu1>();

Fonksiyonların önemi.

Start() fonkisyonumun içine, az önce yazdığım “kutuyuGetir” değişkenimi yazıyorum ve isimi “kutu1” olan nesneyi bularak, “kutu1” bileşenine (ilk scriptimiz) ulaşıyorum.Burada kafanız karışabilir.Hemen özetliyorum.GameObject.Find kodu, Hierarchy penceresinde olan nesneler arasında (yani sahnede aktif olan) ismini belirttiğimiz nesneyi bulmak için kullanılır.Ben “kutu1” yazdığım için, o nesneyi bulacaktır.Eğer birden fazla aynı isimde nesne varsa, ilk bulduğu nesneyi alır.Ayriyeten bu fonksiyon pek tercih edilmez.Çünkü yavaş çalışır.

Bunun yerine GameObject.FindWithTag fonkisyonu daha iyidir ve genelde bu kullanılır.Bu fonksiyonunun kullanıldığı derslerde detaylarına birlikte bakarız.Şimdi kodun geri kısmına bakalım.GetComponent fonksiyonu ise, o nesnenin bileşenlerini almak için kullanılıyor.Yani biz kutu1 adındaki nesnenin, kutu1 bileşeni bul demiş oluyoruz.Örneğin, seçili nesnenin x  pozisyonunu öğrenmek istiyoruz.Bu sefer Transform bileşenine gidip, x pozisyonuna ulaşmamız gerekiyor.Yani, “GetComponent<Transform>().position.x” olmuş oluyor.Neyse konudan çok fazla uzaklaşmayalım.Daha sonra update() fonksiyonuna aşağıdaki kodları yazıyoruz.

AdiniSoyle = kutuyuGetir.benimAdim;
Debug.Log ("Onun adı <color=red>" + AdiniSoyle + "</color>'uymuş. :)");

Artık kutu2 scriptimizdeki, AdiniSoyle değişkenine ilk scripten veri çekip eşitleyebiliyoruz.Az öncede dediğim gibi, bu değişkene kullanmanız şart değil ama ben bu şekilde kullanmayı uygun görüyorum.Daha sonra Console penceresinde, projenin doğru çalışıp çalışmadığını görmek için yazı yazdırıyoruz.Burada kullandığımız Debug.Log, konsola yazı yazdırmamızı sağlıyor.Bunun yerine Print fonksiyonunu da kullanmak mümkündür.

Evet artık projemizi çalıştırıp sonuçlara bakabiliriz.Bu dersimizde diğer script dosyalarına nasıl erişebileceğimi gördük.Ben senaryo gereği sadece belirlediğim ismi çekmeyi uygun gördüm.Sizde projenizde aynı yöntemi kullanarak istediğiniz değişkene ulaşabilir ve değiştirebilirsiniz.Bu dersimiz bu kadardı.Bir başka derste görüşmek üzere…