Unity - Start ve Awake Kullanımı

Unity - Start ve Awake Kullanımı

2023-01-11    

Unity'de script dosyaları içinde dahili olarak bulunan Start ve Awake olaylarını detaylı inceleyeceğiz.

Unity - Start ve Awake Kullanımı

Unity’de script dosyaları içinde çalışıyorsanız önceden belirlenmiş birkaç özel metod vardır.

Yeni bir script dosyası oluşturduğunuzda otomatik olarak Start ve Update metodları hazır olarak gelir.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyController : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }
}

Bu yazıda en çok kullanılan Start ve Awake metodlarını inceleyeceğiz.

Start ve Awake Arasındaki Fark? Start ve Awake benzer şekilde çalışır. İlk önce Awake daha sonra Start çalışır. Farklı olarak Awake metodu bileşen (component) devre dışı (disable) olsa bile çalışır.

Start ve Awake birlikte kullanmak başlangıç görevlerini iki adıma ayırmak için kullanışlıdır. Örneğin; Bir script dosyasının kullanılacak bileşen referanslarını oluşturması ve değişkenleri tanımlama gibi, farklı bir script dosyasının Start metdounda erişilecek verileri Awake metodunda tanımlanması hataları önlemeye yarar.

Built-in Events

Bu yazıda başlangıç için kullanılan olay metodlarını inceleyeceğiz. Unity belgelerinde olay metodlarının tam listesini buradan ulaşabilirsiniz. Ayrıntılı referansları buradan ulaşabilirisiniz.

Start vs Awake

// Start metodu, ilk çerçeve güncellemesinden önce çağrılır
void Start()
{
    // İlk kullanıma hazırlama işlemleri
}

Bir script dosyası oluşturduğunuzda Start ve Update metodları kullanıma hazır şekilde otomatik olarak yerleştirilir.

void Awake()
{
    // Script devre dışı bırakılsa bile uyanık çağrılır.
}

Script dosyası ilk yüklendiğinde veya eklendiği bir nesne başlatıldığında çağrılır.

Her script dosyasında yalnızca bir kez ve yalnızca diğer nesneler kullanıma hazır (initialize) edilirken çağrılır. Bu, Awake’te diğer nesnelere ve bileşenlerine referans oluşturmanın güvenli olduğu anlamına gelir. Bu oyun nesneleri arasında birbirlerine referans oluşturmanın en iyi yoludur.

Referans oluşturmanın dışında yapılacak işlemler bazen hataya yol açar. Bunun sebebi Awake işlemlerinin rastgele çalışmasıdır.

A Nesnesi

using UnityEngine;

public class PlayerController : MonoBehaviour {
    public Rigidbody rigidboy;

    void Awake() {
        rigidboy = GetComponent<Rigidbody>();
    }
}

B Nesnesi

using UnityEngine;

public class PlayerBehaviour : MonoBehaviour {
    public PlayerController playerController;

    void Awake() {
        playerController = GameObject.FindWithTag("PlayerController").GetComponent<PlayerController>();
    }
}

En doğru yöntemle bu şekilde tanımlamalar yapılabilir. Fakat burayı istismar etmek adına yapılan bazı davranışlar vardır.

using UnityEngine;

public class PlayerBehaviour : MonoBehaviour {
    public PlayerController playerController;

    void Awake() {
        playerController = GameObject.FindWithTag("PlayerController").GetComponent<PlayerController>();
        Debug.Log(playerController.rigidboy.Mass); // An errror occured !!!
    }
}

Burada henüz gerçekleşmemiş bir referansı kullanmaya çalışmak hataya neden olur. Bunun çözümü elbette basittir. Start metodu kullanabiliriz. Start Nasıl Kullanılır? Start metodu Update/FixedUpdate metodlarından önce ve Awake metodundan sonra bir kez çağrılır. Birkaç önemli fark dışında Awake ile hemen hemen aynı çalışır.

  • Awake’den farklı olarak, script bileşeni devre dışı bırakılırsa Start çalışmaz.
  • Start metodu bir eşyordam(coroutine) olarak çalışabilir. Yani Start metodu ile kodu geciktirilmesi sağlanır.
using UnityEngine;

public class PlayerController : MonoBehaviour {
    public Rigidbody rigidboy;

    void Awake() {

    }

    IEnumerator Start()
    {
        yield return new WaitForSeconds(5);
        // 5 saniye sonra burası çalışır
    }
}

Geç Başlangıç

Script dosyaları içinden manual olarak geciktirme işlemleri işe yarasa da, bazen uygun olmayabilir.

Proje Ayarları içinden belirli komut dizilerine öncelik vererek (Script Execution Order) metodların çalışma sırasını düzenleyebiliriz.

Script Execution Order

Start ve Awake Birlikte Kullanma Çoğu durumda tüm başlatma işlemlerinizi Start veya Awake içinde yaparız. Yine de ikisini beraber kullanmak birçok avantaj sağlayacaktır.

Nesneler ve bileşenler arasında referanslar oluşturan kod ile bu referanslar üzerinden metodları çalıştırma işlemlerini ayırabiliriz. Böylelikler null referans hataları almaktan kaçınırız.