Menu
CoddyTech

Awake und Start

Teil des Abschnitts Grundlagen des Scripting in Unity der Unity-Journey von Coddy. Lektion 55 von 67.

Unity ruft Awake() auf, sobald ein Objekt geladen wird, noch vor seinem Start(). Nützlich ist dabei die Regel für alle Objekte: Wenn eine Szene startet, wird das Awake() jedes Objekts ausgeführt, bevor das Start() irgendeines Objekts ausgeführt wird. Welches Objekt innerhalb jeder Runde zuerst an der Reihe 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 seinen 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 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, dessen Start zuerst ausgeführt wurde, 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 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

Zwei Bienenstöcke, HiveA und HiveB, verwenden dasselbe Hive-Skript. Jeder Bienenstock erzeugt seine Bienen (3 und 5, aus beeCount) und fügt sie einer Liste hinzu. Anschließend protokolliert er, wie viele Bienen sein Rivale hat: HiveA counts 5 rival bees und HiveB counts 3 rival bees.

Drücke Spielen: Einer der Bienenstöcke wird mit einer NullReferenceException angehalten, weil er die Liste seines Rivalen abfragt, bevor dieser sie erstellt hat. Korrigiere das Skript so, dass jeder Bienenstock seine Liste und seine Bienen hat, bevor ein Bienenstock die seines Rivalen zählt. Lass die Zählung an ihrer bisherigen Stelle. Klicke 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;
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Grundlagen des Scripting in Unity