MonoBehaviour.Awake()

Açıklama

Unity, etkin bir script örneği yüklendiğinde Awake çağrısı yapar.

Unity, MonoBehaviour'dan türetilen scriptlerde Awake'i şu senaryolarda çağırır:

  • Ana GameObject aktif olduğunda ve Sahne yüklenirken başlatıldığında
  • Ana GameObject pasif durumdan aktif duruma geçtiğinde
  • Object.Instantiate ile oluşturulan bir ana GameObject'in başlatılmasından sonra

Uygulama başlamadan önce değişkenleri veya durumları başlatmak için Awake kullanın.

Unity, bir script örneğinin ömrü boyunca yalnızca bir kez Awake çağrısı yapar. Bir scriptin ömrü, onu içeren Sahne boşaltılana kadar sürer. Sahne yeniden yüklendiğinde, Unity script örneğini yeniden yükler ve Awake'i tekrar çağırır. Sahne birden fazla kez eklenerek yüklendiyse, Unity birden fazla script örneği yükler ve her örnek için bir kez Awake çağrısı yapılır.

Sahneye yerleştirilen aktif GameObject'ler için, Unity, Sahnedeki tüm aktif GameObject'ler başlatıldıktan sonra Awake çağrısı yapar, böylece diğer GameObject'leri sorgulamak için GameObject.FindWithTag gibi metodları güvenle kullanabilirsiniz.

Unity'nin her GameObject'in Awake'ini hangi sırayla çağırdığı belirli değildir. Bu nedenle, bir GameObject'in Awake'inin başka bir GameObject'in Awake'inden önce veya sonra çağrılmasına güvenmemelisiniz. Örneğin, bir GameObject'in Awake'i tarafından ayarlanan bir referansın başka bir GameObject'in Awake'inde kullanılabilir olacağını varsaymamalısınız. Bunun yerine, Awake'i scriptler arasında referanslar ayarlamak için kullanmalı ve tüm Awake çağrıları tamamlandıktan sonra bilgileri geri ve ileri iletmek için Start'ı kullanmalısınız.

Awake, herhangi bir Start fonksiyonundan önce her zaman çağrılır. Bu, scriptlerin başlatılmasını sıralamanıza olanak tanır. Awake, script aktif bir GameObject'in devre dışı bir bileşeni olsa bile çağrılır. Bir script bileşeninin Awake'i bir istisna atarsa, Unity bileşeni devre dışı bırakır. Awake bir coroutine olarak çalışamaz.

Başlatma için yapıcı yerine Awake kullanın, çünkü bileşenin serileştirilmiş durumu yapım aşamasında tanımsızdır. Awake, yapıcı gibi yalnızca bir kez çağrılır.

using UnityEngine;

public class ExampleClass : MonoBehaviour
{
    private GameObject target;

    void Awake()
    {
        target = GameObject.FindWithTag("Player");
    }
}


Pasif bir GameObject, GameObject.SetActive çağrıldığında etkinleştirilebilir.

Aşağıdaki iki örnek script, Example1 ve Example2, Awake'in ne zaman çağrıldığını gösterir. Örneği yeniden oluşturmak için, Cube1 ve Cube2 adlı iki GameObject içeren bir sahne oluşturun. Example1'i Cube1'e bir script bileşeni olarak atayın ve Cube1'i pasif olarak ayarlayın, Inspector'un sol üst köşesindeki onay kutusunu kaldırarak (Cube1 görünmez hale gelecektir). Example2'yi Cube2'ye bir script bileşeni olarak atayın ve Cube1'i GO değişkeni olarak ayarlayın. Oyun moduna girin: boşluk tuşuna basmak, Cube1'i etkinleştiren ve Example1.Awake()'in çağrılmasına neden olan Example2.Update'deki kodu çalıştıracaktır.

using UnityEngine;

// Cube1'in bu scripti aldığından ve oyunun başında pasif olduğundan emin olun.
public class Example1 : MonoBehaviour
{
    void Awake()
    {
        // İlk olarak yazdırır
        Debug.Log("Example1.Awake() was called");
    }

    void Start()
    {
        // İkinci olarak yazdırır
        Debug.Log("Example1.Start() was called");
    }

    void Update()
    {
        if (Input.GetKeyDown("b"))
        {
            // "b" tuşuna basıldığında son olarak yazdırır
            Debug.Log("b key was pressed");
        }
    }
}


Example2. Bu, Example1.Awake()'in çağrılmasına neden olur. Bunu gerçekleştirmek için Boşluk tuşu kullanılır:

using UnityEngine;

public class Example2 : MonoBehaviour
{
    // Örneği çalıştırmadan önce Cube1'i bu değişken GO'ya atayın
    public GameObject GO;

    void Awake()
    {
        Debug.Log("Example2.Awake() was called");
    }

    void Start()
    {
        Debug.Log("Example2.Start() was called");
    }

    // Cube1'in zaten etkinleştirildiğini izleyin
    private bool activateGO = true;

    void Update()
    {
        if (activateGO == true)
        {
            if (Input.GetKeyDown("space"))
            {
                Debug.Log("space key was pressed");
                GO.SetActive(true);
                activateGO = false;
            }
        }
    }
}


Bu blog Unity Docs'un Türkçeye çevrilmiş halidir.

Yorumlar

Bu blogdaki popüler yayınlar

Important Classes - Vectors

RequireComponent

Important Classes - GameObject