Unity - Start ve Awake Kullanımı
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.
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.
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.