Menu
CoddyTech

Awake und Start

Teil des Abschnitts Unity-Scripting: Grundlagen der Unity-Journey von Coddy. Lektion 70 von 85.

Unity ruft Awake() auf, sobald ein Objekt geladen wird, und zwar vor seinem Start(). Nützlich ist die Regel für alle Objekte: Wenn eine Szene startet, wird das Awake() jedes Objekts ausgeführt, bevor das Start() eines beliebigen Objekts ausgeführt wird. Welches Objekt innerhalb jeder Runde zuerst dran ist, entscheidet Unity, und darauf kannst du dich nicht verlassen.

Dieses Player-Skript ist zwei Spielern zugewiesen, P1 (startLives 3) und P2 (startLives 5), und jeder hat den anderen als rival:

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

void Awake()
{
    lives = startLives;   // dieses Objekt einrichten
}

void Start()
{
    int theirs = rival.GetComponent<Player>().Lives();   // das andere Objekt abfragen
    Debug.Log(name + " sees a rival with " + theirs + " lives");
}

public int Lives()
{
    return lives;
}

In der ersten Version wurde lives in Start() festgelegt. Der Spieler, der zuerst startete, fragte dann seinen Rivalen, bevor dieser seine Leben festgelegt hatte, und gab 0 aus. Mit der Initialisierung in Awake() haben beide Spieler ihre Leben festgelegt, bevor eines der Start() danach fragt; daher gibt P1 5 und P2 3 aus. Daraus ergibt sich folgende Gewohnheit: Initialisiere die eigenen Felder eines Objekts in Awake() und kommuniziere mit anderen Objekten in Start().

challenge icon

Aufgabe

Mittel

Repariere die Bienenstöcke, damit keiner eine Liste zählt, die noch nicht erstellt wurde.

  1. Füge void Awake() zu Hive hinzu.
  2. Verschiebe die Zeile bees = new List<GameObject>(); und die for-Schleife aus Start() nach Awake().
  3. Lass die beiden Zählzeilen in Start(): Jedes Awake() wird ausgeführt, bevor ein Start() ausgeführt wird.

Drücke auf „Spielen“: Jeder Bienenstock protokolliert die Bienen seines Rivalen, HiveA zählt 5 rivalisierende Bienen, und es tritt kein Fehler auf. Drücke dann auf „Prüfen“.

Probier es selbst

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;
    }
}

Alle Lektionen in Unity-Scripting: Grundlagen

Übe selbstständig: Unity-Playground