Menu
CoddyTech

Awake ve Start

Coddy'nin Unity Journey'sinin Unity'de Script Yazmanın Temelleri bölümünün bir parçası. Ders 70 / 85.

Unity, bir nesne yüklendiğinde Start() çağrılmadan önce Awake() çağrısını yapar. Bu yöntemi kullanışlı kılan, nesneler genelinde geçerli olan kuraldır: bir sahne başladığında, herhangi bir nesnenin Start() çağrısından önce tüm nesnelerin Awake() çağrıları çalışır. Her turda hangi nesnenin önce çalışacağına Unity karar verir; buna güvenemezsin.

Bu Player betiği iki oyuncuda, P1 (startLives 3) ve P2 (startLives 5), bulunuyor ve her birinin diğer oyuncusu rival olarak ayarlanmış:

public int startLives = 3;
public GameObject rival;
int lives;

void Awake()
{
    lives = startLives;   // bu nesneyi hazırla
}

void Start()
{
    int theirs = rival.GetComponent<Player>().Lives();   // diğerine sor
    Debug.Log(name + " sees a rival with " + theirs + " lives");
}

public int Lives()
{
    return lives;
}

İlk sürümde lives, Start() içinde ayarlanıyordu. Önce başlayan oyuncu, rakibinin canları ayarlanmadan ona sordu ve 0 değerini kaydetti. Kurulum Awake() içine taşındığında, Start() içindeki sorgulardan önce her iki oyuncunun da canı ayarlanmış olur; bu nedenle P1, 5; P2 ise 3 değerini kaydeder. İzlemen gereken alışkanlık şudur: bir nesnenin kendi alanlarını Awake() içinde ayarla, diğer nesnelerle ise Start() içinde iletişim kur.

challenge icon

Görev

Orta

İki kovanın da henüz oluşturulmamış bir listeyi saymaması için kovanları düzelt.

  1. Hive içine void Awake() ekle.
  2. bees = new List<GameObject>(); satırını ve for döngüsünü Start() içinden Awake() içine taşı.
  3. Start() içindeki iki sayma satırını bırak: her Awake(), herhangi bir Start() çalışmadan önce çalışır.

“Oyna” düğmesine bas: her kovan rakibinin arılarını günlüğe yazar; HiveA, rakibin 5 arısını sayar ve hata oluşmaz. Ardından “Kontrol et” düğmesine bas.

Kendin dene

using System.Collections.Generic;
using UnityEngine;

public class Hive : MonoBehaviour
{
    public GameObject beePrefab;
    public GameObject rival;
    public int beeCount = 3;
    List<GameObject> bees;

    void Start()
    {
        bees = new List<GameObject>();
        for (int i = 0; i < beeCount; i++)
        {
            Vector3 spot = transform.position + new Vector3(i * 0.6f - 1.2f, 1.5f, 0);
            bees.Add(Instantiate(beePrefab, spot, Quaternion.identity));
        }

        int theirs = rival.GetComponent<Hive>().BeeCount();
        Debug.Log(name + " counts " + theirs + " rival bees");
    }

    public int BeeCount()
    {
        return bees.Count;
    }
}

Unity'de Script Yazmanın Temelleri bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground