İlginizi Çekebilir
  1. Ana Sayfa
  2. Üretici Teknolojileri
  3. Unity3D Scriptler Arası Değişken Kontrolü

Unity3D Scriptler Arası Değişken Kontrolü

Unity Scriptler Arası Değişken Kontrolü
JFORCE - Dell Technologies İşbirliği Başlıyor!

Dünya üzerinden sık kullanılan gelişmiş oyun motorlarından birisi olan 3D adlı programda yapılan oyun içindeki birçok özellik Scriptler aracılığıyla oyuna kazandırılmaktadır. Oyuna eklenen bir karakterin hareketinden oyunda sahnelerin değişimine kadar her türlü özelliği oyuna katabilmektedir.

Unity ile gelişmiş oyun projeleri oluşturulurken Scriptler arasında veri aktarımına ihtiyaç duyulabilmektedir. Bir Script’ten başka bir Script’e veri aktarmanın 3 farklı yolu bulunmaktadır. Bu 3 yol sırasıyla şunlardır:

  • Verinin çekileceği Script’i Public bir değişkende tutmak
  • Verinin çekileceği Script’e kodlar vasıtasıyla ulaşmak
  • Değişkeni Static yapmak

Bu 3 maddeyi doğru bir şekilde açıklayabilmek için iki adet örnek Script oluşturalım. Bu Scriptlerden ilkinin ismi Script1 diğerinin ismi ise Script2 olsun.

Resim-1

Biz Script2’de bulunan bir değişkeni Script1’e çekmeye çalışalım. Değişkenimiz de Public bir değişken olsun ve ismi “sayi” olsun.

Scriptlerimizi oluşturup “sayi” değişkenimizi de ürettiğimizde artık yukarıda bahsedilen 3 farklı yolu uygulamaya başlayabiliriz.

Verinin Çekileceği Script’i Public Bir Değişkende Tutmak

Script’i Public bir değişken olarak ayarlayıp o değişken üzerinden veri çekmek en sık tercih edilen ve en kolay yöntem olarak bilinen bir yöntemdir. Bu yöntemi uygulamak için öncelikle Script1’e Public bir “cekilecekVeri” objesi tanımlayalım. Ardından kodumuzu kaydedelim.

Resim-2

Kodumuzu kaydettikten sonra Script1’i ve Script2’yi atabileceğimiz birer obje üretelim. Script1 için obje1, Script2 için ise obje2 adında 2 adet obje üretelim. Ardından Scriptleri objelere atalım. Obje1’e tıklayalım ve Inspector paneline göz atalım.

Resim-3

Görüldüğü üzere “Cekilecek Veri” adından bir Public GameObject değişkenimiz oluşturulmuş. Bu kısma Script2’yi içerisinde barındıran obje2 objesini atalım. Ardından Script1’den Script2’ye GetComponent metodu ile ulaşmaya çalışalım ve kodun hata vermemesi için sayımızı 1 artıralım.

Resim-4

Görüldüğü üzere çekmemiz gereken veri olan “sayi” verisine sorunsuz bir şekilde ulaşıp Start fonksiyonunda onu 1 artırdık. Bu şekilde Scriptler arasında veri çekme işlemini kolaylıkla yapabilirsiniz. Şimdi diğer bir yöntem olan çekilecek Script’e kodlar vasıtası ile ulaşmayı deneyelim.

Verinin Çekileceği Script’e Kodlar Vasıtasıyla Ulaşmak

Bu yöntemi uygulamak için gene obje1 ve obje2 objelerini oluşturalım. Bu objelere de daha önceden hazırladığımız Script1 ve Script2 Scriptlerini Component olarak ekleyelim. Ardından ulaşmak istediğimiz Script’e hangi kodlar ile ulaşabileceğimizi inceleyelim.

  • GameObject obje = GameObject.Find(“Objenin ismi”):
  • GameObject obje = GameObject.FindWithTag(“Objenin etiketi”):
  • Player playerScripti = obje.GetComponent<Player>():
  • Player playerScripti = FindObjectOfType<Player>():

Yukarıdaki maddelerde verilen 4 adet kod çeşidi ile ulaşmanız gereken Script’e ulaşabilirsiniz. Şimdi bu yöntemleri tek tek açıklayalım ve bir tanesi ile bir örnek yaparak ulaşmak istediğimiz veriye ulaşalım.

Obje İsmi ile Script’e Ulaşmak

Bu yöntem en çok tercih edilen yöntemlerdendir. Sahnedeki her objenizin isminin farklı olduğunu düşünürsek bu sayede istediğiniz objenin adını yazarak o objeye kodlarda ulaşabilirsiniz. Bunun için yukarıdaki maddelerde 1. Örnekte verilen kodu yazmanız yeterlidir. GameObject.Find metodu sahnedeki objeleri ismine göre aramaktadır.

Objenin Etiketi ile Script’e Ulaşmak

Çok tercih edilen bir yöntem olmamakla beraber zaman bu yöntem de kullanılmaktadır. Her objeye ayrı ayrı etiket verilmediğinden dolayı bu kod her zaman doğru bir şekilde çalışmaz. Genelde daha önce bir etiket verilmiş objeler için kullanılır. Metodun adından da anlaşılacağı üzere GameObject.FindWithTag metodu objeleri etiketlerine göre arayıp bulmaktadır.

GetComponent ile Script’e Ulaşmak

GetComponent metodu ulaşılan obje üzerinden Component çekmek için kullanılan bir metod olarak bilinir. Bu metod yazılan Script’ten yola çıkarak objede o Component’in bulunup bulunmadığını araştırır. Eğer objede o Component bulunmuyorsa Null değer döndürür.

FindObjectOfType Metodu İle Script’e Ulaşmak

Bu metod ile belirtilen Component’e ait objeleri arar. Eğer birden çok objede bu Component var ise ilk ulaştığını çağırır. Hiçbir objede bu Component bulunmuyorsa Null değer döndürür.

GameObjectFind ve GetComponent’i Birlikte Kullanalım

Şimdi ufak bir çalışma yaparak ulaşmak istediğimiz Script’e ulaşalım. Bunun için objeyi önce sahnede buldurup ardından Script’i GetComponent metodu ile o objeden çekeceğiz. Öncelikle objeyi bulmak için kodumuzu yazalım. Bu kodda ulaşmak istediğimiz objeyi bulup daha önceden oluşturduğumuz cekilecekVeri objesine atayacağız.

Resim-5

Obje2 adındaki objemizi GameObject.Find metodu ile bulduk ve cekilecekVeri objemize atadık. Şimdi GetComponent metodunu kullanarak obje2 objesinin Component’i olan Script2’ye ulaşarak “sayi” değişkenine ulaşalım ve o değişkeni 1 artıralım.

Resim-6

Görüldüğü üzere Update fonksiyonu içerisinde Script2’ye sorunsuz bir şekilde ulaştık ve içerisinde Public olarak belirttiğimiz “sayi” değişkenini artırma işlemini uyguladık. Bu yöntem ile kodlarla direkt olarak istediğiniz objenin istediğiniz Component’ine ulaşabilirsiniz.

Değişkeni Static Yapmak

Bir Script’ten diğer bir Script’teki değişkene ulaşma konusunda kullanacağımız son yöntem değişkeni Static olarak ayarlamaktır. Public Static olan bir değişkene bütün Script’ler üzerinden ulaşılabilmektedir. Bu yöntemi anlayabilmek için öncelikle “sayi” değişkenimizi Static olarak ayarlayalım.

Resim-7

Şimdi bu değişkene Script1 üzerinden erişmeye çalışalım.

Resim-8

Görüldüğü üzere ulaşmak istediğimiz değişkene hiçbir kod fazlalığı yapmadan sorunsuz bir şekilde ulaşabildik. Bu yöntemle de ulaşmak istediğiniz değişkenlere ulaşabilirsiniz.

Fakat bu yöntemin ufak da olsa bir dezavantajı bulunmaktadır. Eğer değişkeni Static olarak ayarlarsanız bu değişken Public bile olsa Inspector panelinde görülmeyecektir. Bu da değere Inspector üzerinden kolayca müdahale etmeyi engelleyen bir unsurdur. Eğer Inspector paneli üzerinden sık sık değiştireceğiniz bir değer değilse çok da büyük sorun teşkil etmeyecektir.

Bu makalede anlatılan 3 adet Script’ten veri çekme yönteminin üçü de Unity’de sorunsuz bir şekilde çalışmaktadır. Bu yöntemleri oyununuzun gidişatına göre değiştirebilir ve optimizasyon konusunda aralarındaki farklara göre farklı yöntemleri tercih edebilirsiniz. Bu yöntemler ileri düzey projelerinde çok sık kullanılan yöntemlerdir.

Bu konuyla ilgili sorularınızı http://forum.mshowto.org/ linkini kullanarak ulaşacağınız forum sayfamızda sorabilirsiniz.

Referanslar:

https://www.mshowto.org

TAGs: Oyun Geliştirme, Unity 3D, C#, Script, Unity Script, Unity Oyun Geliştirme, Unity, C# Script, Unity Game Developing

JFORCE - Dell Technologies İşbirliği Başlıyor!
Yorum Yap

Yazar Hakkında

Bilişim Sistemleri Mühendisliği öğrencisiyim. 2012 yılından bu yana WEB alanında çalışıyorum. 2018 yılında Oyun geliştiriciliği alanında çalışmalara başladım, 2020 yılında ilk oyunumu yayınladım. Şuan oyun geliştiriciliği alanında çalışmalar yaparak VR & AR teknolojileri üzerinde kendimi geliştirmeye çalışıyorum.

Yorum Yap

Yorumlar (16)

  1. zeynelugurlu_avatar
    1 ay önce

    Çok güzel ve etkili bir yazı, ellerine sağlık

  2. ahmetbah_avatar
    1 ay önce

    Faydalı bir yazı olmuş.
    Teşekkürler…

  3. ahmetbah_avatar

    Açıklayıcı anlatım için teşekkür ediyorum.

  4. ahmetbah_avatar

    Oyun yapımına yeni başlayanlar bu yazıyı okuyunca, kolaylıkla Unity oyun motorunun scripting mantığını anlayacaktır. Görsellerle desteklenmesi anlaşılır olmasını sağlamış.

    • ahmetbah_avatar
      1 ay önce

      Yorumunuz için teşekkür ederim, bu makalede scripting mantığının anlaşılabiliyor olmasına sevindim.

  5. aslibozkurt_avatar
    1 ay önce

    Unity’de yeni oyun geliştirmeye başladım. Gerçekten çalışmalarım için yol gösterici ve bilgilendirici bir yazı olmuş. Ellerine sağlık çok keyifle okuduğum bir yazıydı.

  6. yigitaglar_avatar
    1 ay önce

    Çok açık ve bilgilendirici bir yazı olmuş, elinize sağlık.

  7. gokhandogan_avatar
    1 ay önce

    Güzel bir yazı olmuş. Elinize sağlık.

  8. ahmetbah_avatar
    1 ay önce

    Sektörde bilinmesi gereken kritik bir konuya değinmişsiniz. Gayet açıklayıcı bir yazı olmuş, teşekkürler.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir