Unity3D timer ve cooldown işlemleri

Unity3D timer ve cooldown işlemleri

Oyun yaparken sıkça ihtiyaç duyduğumuz işlemlerden birtanesi zamanlayıcılardır. Bir silahın yarım saniyede bir ateş etmesi yada bir düşmanın bir saniyede bir zıplaması, belirli sürelerde bir ışığın yanıp sönmesi vesaire buna güzel bir örnektir. Bunu yapmanın birçok farklı yolu var ama benim en sevdiğim birkaçını oyun programlamaya yeni başlayan arkadaşlara rehber olması için anlatmaya çalışacağım.

İlk yöntem en çok kullanılan yöntemlerden biridir. Sonraki işlem zamanının hesaplanıp bir değişkene kaydederek update fonksiyonunda şuanki zamanla karşılaştırılır.

public class Test : MonoBehaviour {

        //bekleme süresi
        public float coolDown = 1f;

        //sonraki işlem zamanı
        private float nextTime; 

        //timer kur
        private void Start() {
            nextTime = Time.time + coolDown;
        }

        private void Update() {
            if (Time.time > nextTime) {

                //sonraki işlem zamanı
                nextTime = Time.time + coolDown;

                //istenilen işlem buraya...

            }
        }

}


Eğer projede çok sık bu işleme ihtiyaç duyuyorsak bunun için serializable bir sınıf oluşturup ihtiyaç duyduğumuzda bu sınıfı kullanabiliriz.

[System.Serializable]
public class Cooldown {
       
        public float wait = 1f;  //bekleme süresi
        private float next; //sonraki işlem zamanı

        //başlat
        private Cooldown() {
            next = Time.time + wait;
        }

        //update
        public bool isReady() {
            if (Time.time > next) {
                next = Time.time + wait;
                return true;
            }
            return false;
        }

}

//Kullanım örneği
public class Test : MonoBehaviour {

        public Cooldown shootTimer;

        private void Update() {
            if (shootTimer.isReady()) {
                //istenilen işlem buraya...
            }
        }
}


İkinci yöntem Invoke ve InvokeRepeating metodları. Pratik olmasına karşın çok kullanılan bir yöntem değildir. Performans için coroutine kullanmak öneriliyor. Ancak yerine göre kullanırsak oldukça faydalı olduğunu düşünüyorum. Invoke verdiğimiz metod ismini belirttiğimiz süre bekleyerek tek seferlik çağırır. InvokeRepeating ise adından anlaşılacağı gibi tekrarlayarak çağırır.

//tek seferlik
public class OneTime : MonoBehaviour {

        public float coolDown = 1f;

        public void Start() {
            Invoke("Action", coolDown);
        }

        private void Action() {
            //zamanlanmış işlemler
        }

}

//tekrarlamalı
public class Repeating : MonoBehaviour {

        public float coolDown = 1f;

        public void Start() {
            InvokeRepeating("Action", coolDown, coolDown);
        }

        private void Action() {
            //zamanlanmış işlemler
        }

}


Üçüncü yöntem coroutine kullanmak. 

 //tek seferlik
public class OneTime : MonoBehaviour {

        public float coolDown = 1f;

        public void Start() {
            StartCoroutine(Action());
        }

        private IEnumerator Action() {

            //bekle
            yield return new WaitForSeconds(coolDown);

            //zamanlanmış işlem

        }

}

//tekrarlamalı
public class Repeating : MonoBehaviour {

        public float coolDown = 1f;

        public void Start() {
            StartCoroutine(Action());
        }

        private IEnumerator Action() {

            //tekrarla
            while (true) {

                //bekle
                yield return new WaitForSeconds(coolDown);

                //zamanlanmış işlem

            }

        }

 }

 

Yorumlar