Unity Yeni Başlayanlar İçin Notlar 11; Başka Önemli Bilgiler

      Unity Yeni Başlayanlar İçin Notlar 11; Başka Önemli Bilgiler

      · BAÅžKA ÖNEMLİ BİLGİLER

      String Olmayan Bir Değişkenin Bir String İçerisinde Kullanımı

      Örneğin bir ‘int’ değişkenini bir yazı içinde direk göstermeye kalkarsanız hata alırsınız. Bunun yerine şöyle bir kullanım yapılırsa problem çözülür:


      var sayi : int = 45;
      var yazi : String = ""+sayi;

      Burada yaptığımız şey ‘yazi=sayi’ demek yerine (Böyle yazarsanız hata alırsınız.) ‘yazi=""+sayi’ demek oldu. Burada dilersek iki tırnak işareti arasına ekstra bir yazı girebiliriz. Mesela ‘yazi="Sayinin Degeri: "+sayi;’ gibi.

      Bir Objede Herhangi Belirli Bir Component Var mı Yok mu Kontrol Etmek


      if(objem.rigidbody){
      …
      }

      Böyle bir kullanımda eğer ‘objem’ objesinin ‘rigidbody’ component’i varsa ‘if’in içindeki yapılacak şeyler çalıştırılır. Eğer biz ‘objem’de ‘rigidbody’ yoksa bir şeyler yapmak istiyorsak en başa bir ‘!’(Ünlem İşareti) koyabiliriz, yani: ‘if(!objem.rigidbody)’ şeklinde.

      Bölme Yerine Çarpma Kullanmak (Garip Bir Åžey)

      Bir değişkenin değerinin yarısını bulmak için "degisken/2" yazılır kısa yoldan ancak gariptir ki "degisken * 0.5" yazarsan Unity (Daha doğrusu bilgisayarın kendisi, yani oyun motoruyla alakalı bir şey değil bu.) sonucu daha az CPU harcayarak buluyor(muş). Çünkü bilgisayar çarpma işlemini bölme işlemine göre daha rahat yapıyor(muş). Sebebini bilmiyorum ama bu bilgiyi birden çok yerde gördüm ve madem öyle biz de çarpma işlemini kullanırız o halde :)

      ‘this’ Komutu

      Bazen bir kullanıcı tanımlı fonksiyonun içerisinde this.birDegiskenAdi şeklinde bir kullanıma rastlayabilirsin. Bu aslında çok basit bir şey, bu yüzden bunu ufak bir örnekle anlatayım:


      var yazi : String = "bir";
      function Start()
      {
      Degistir("iki");
      }
      function Degistir(yazi : String)
      {
      this.yazi = yazi;
      print(yazi); /*Console ekranına "iki" yazdırır.*/
      }

      Burada da gördüğün gibi kullanıcı tanımlı bir fonksiyon olan Degistir’in içinde this.yazi = yazi komutunu kullandım. Peki neden? Çünkü Degistir fonksiyonuna gelen argümanın ismi ne?: yazi – Peki bizde de yazi diye bir değişken zaten var mı? Var. İşte burada biz bu 2 farklı şeyin değer ataması sırasında (Değişken ile argüman) birbirine karışmaması için this.yaziile yazi değişkenini ifade ediyoruz (this böyle durumlarda her zaman değişkeni ifade etmeye yarar.). Ardından this.yazi = yazi diyerek yazi değişkeninin değerini yazi argümanının değerine eşitliyoruz. Eğer orada this kullanmasaydık ortayayazi=yazi gibi saçma bir ifade çıkacaktı ve Unity bize uyarı verecekti ve yapmak istediğimiz şey de gerçekleşemeyecekti. Peki bu işlemi şöyle yapamaz mıydık:


      …
      function Degistir(birYazi : String)
      {
      yazi = birYazi;
      print(yazi); /*Console ekranına "iki" yazdırır.*/
      }

      Yapabilirdik tabi ki. Peki ben bunca satır boyunca niçin this’in ne işe yaradığını anlatmakla uğraştım? Çünkü bunun kullanımı özellikle yabancı kimseler tarafından çok yaygın ve artık böyle bir this kullanımıyla karşılaştığında aslındathis’in orada değişkeni ifade etmek için kullanıldığını bilmiş olacaksın.

      Tek Basamaklı Bir Sayıyı (Yani Bir Rakamı) İki Basamakta Göstermek (Saatlerde Olduğu Gibi)

      Oyununda bir sayaç olduğunu düşün. Eğer ki bu sayacı output edersen (ekranda gösterirsen) ve saniye 10'dan küçükse, yani mesela 6 ise ekranda saniye '06' olarak değil de sadece '6' olarak gözükür. Ama bu güzel durmaz çünkü bir sayaç '2:06 ' şeklinde gözükür normalde, ' 2:6 ' gibi garip bir şekilde değil. Bunu ayarlamak için basit bir komut var:


      saniye.ToString( "D2" );

      Bu sayede Unity 'saniye' değişkeninin değerini her zaman (saniye 3 veya daha çok basamaklı olmadığı sürece) 2 basamaklı olarak gösterir. Bunu mesela "D3" yapsaydım 3 basamakta gösterirdi, ' 2:006 ' gibi. Örnek bir kullanımı:


      guiText.text = "" + dakika + ":" + saniye.ToString( "D2" );

      Son olarak, buradaki ToString() fonksiyonunun işlevi ise 'saniye' değişkeninin değerini o satırdaki komuta hasStringtürüne çevirmektir. Aynı şekilde isteseydim ' dakika.ToString() ' de yazabilirdim ama parantez içine bir parametre girmediğim için buna gerek yok.

      Bu komutun float'lar için olan bir başka güzel versiyonu da mevcut. Örneğin bir virgüllü sayının virgülden sonra sadece 3 basamağını göstermek istiyorsak yazmamız gereken kod şu:


      floatSayi.ToString( "F3" );

      Performans Canavarı Kodlar Oluşturmak

      Burada anlatılan yöntem Unity'nin direkt Unity'nin dökümanından aldığım bir şey ve gerçekten çok ilginç. Eğer büyük bir oyun projesinde çalışıyorsan tavsiye edilen bir yöntem. Åžu örnekten yola çıkayım:


      function Update()
      {
      transform.Translate(0, 0, 5 * Time.deltaTime);
      }


      Bu basit kodun yaptığı şey objeyi her karede 5 metre ileri götürmek. Bu kodu şöyle değiştirirsek biraz daha fazla kod yazmış oluyoruz ancak çok daha fazla performans alıyoruz:


      private var transformComponenti : Transform;
      function Awake()

      {
      transformComponenti = transform;
      }
      function Update()

      {
      transformComponenti.Translate(0, 0, 5 * Time.deltaTime);
      }


      Burada görüldüğü üzere objenin Transform component'ini Awake() fonksiyonunun içinde bir değişkene (Değişkeninprivate olması zorunlu değil. Ancak Inspector'da gözükmesinin hiçbir anlamı olmadığı için privatetavsiye edilir.) atıyoruz (Awake fonksiyonunun Start fonksiyonundan farkları; objedeki scriptin tikli olup olmasına bakmazsızın, Awakefonksiyonunun obje oluşturulduğu anda tek seferlik çalıştırılması ve de ne olursa olsun Awake fonksiyonunun her zamanStart fonksiyonundan önce çalıştırılmasıdır.). Ardından ne zamanTransform componenti ile iş yapacak olsak bu değişkeni kullanıyoruz. Bu sayede Unity her bir karede objenin Transform componentini tekrar ve tekrar aramak yerine bu componentin yerini zaten depolamış olan değişkeni kullanarak büyük bir performans kazancı sağlıyor. Bir başka örnek:


      private var theRigidbody : Rigidbody;
      function Awake()
      {
      theRigidbody = rigidbody;
      }
      function FixedUpdate()
      {
      theRigidbody.AddForce(Vector3.up * Time.deltaTime);
      }
      @script RequireComponent(Rigidbody)

      Inspector'u Debug Modunda Çalıştırmak

      Çok basit ama az bilinen bir özellik. Inspector panelindeki "Inspector" yazısına sağ tıklayıp "Debug"u seçersen Debug moduna geçiş yaparsın. Bu moddayken objelerin rotasyonları EulerAngles cinsinden değil de Quaternioncinsinden gözükür ve scriptlerde yer alan private değişkenlerin değerleri de Inspector'da, gri renkli şekilde görünür (ama değiştirilemez).Ancak static değişkenlerin değerleri ne olursa olsun Inspector'da görünmez.

      Mevcut Andaki Saat, Dakika ve Saniye Değerlerine Ulaşmak

      Çok çeşitli sebeplerden dolayı oyun sırasında saatin kaç olduğuna bakıp ona göre işlem yapmak isteyebilirsiniz (Örneğin saat geceyarısını gösteriyorsa akşam, öğleni gösteriyorsa gündüz atmosferi olan bir yarış oyunu için). Zaman değerlerine ulaşmak için Javascript'te şu kodu kullanabilirsin:


      public static var saat : int;
      public static var dakika : int;
      public static var saniye : int;
      function Update () {
      var zaman : System.DateTime = System.DateTime.Now;
      saat = zaman.Hour;
      dakika = zaman.Minute;
      saniye = zaman.Second;
      }

      Veya C# kullanacağım diyorsan aşağıdaki kodu kullanabilirsin:


      using UnityEngine;
      using System.DateTime;

      public class Zaman : MonoBehaviour {
      public static int saat, dakika, saniye;
      void Update() {
      DateTime zaman = DateTime.Now;
      saat = zaman.Hour;
      dakika = zaman.Minute;
      saniye = zaman.Second;
      }
      }

      Bu kodu "Zaman" adında yeni bir scripte yapıştırıp bu scripti istediğin GameObject'e ata. Ardından herhangi bir scriptte "Zaman.saat", "Zaman.dakika", "Zaman.saniye" değişkenleriyle direkt mevcut zamana ulaşabilirsin. Ancak dikkat et: Eğer C# kodunu kullandıysa bu değişkenlere direkt yoldan sadece C# scriptlerinden, Javascriptkodunu kullandıysan direkt olarak sadece Javascript scriptlerinden ulaşabilirsin. Yani C#'taki bir static değişkeneJavascript'ten direkt ulaşamazsın!