Menu
CoddyTech

Awake i Start

Część sekcji Podstawy skryptów w Unity ścieżki Unity w Coddy. Lekcja 70 z 85.

Unity wywołuje Awake() zaraz po załadowaniu obiektu, przed jego Start(). Przydatna jest zasada obowiązująca dla wszystkich obiektów: gdy scena się uruchamia, metoda Awake() każdego obiektu wykonuje się przed metodą Start() dowolnego obiektu. To, który obiekt wykona się pierwszy w każdej z tych rund, zależy od Unity i nie możesz na tym polegać.

Ten skrypt Player jest przypisany do dwóch graczy, P1 (startLives 3) i P2 (startLives 5), a każdy z nich ma drugiego jako swojego rival:

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

void Awake()
{
    lives = startLives;   // skonfiguruj ten obiekt
}

void Start()
{
    int theirs = rival.GetComponent<Player>().Lives();   // zapytaj ten drugi obiekt
    Debug.Log(name + " sees a rival with " + theirs + " lives");
}

public int Lives()
{
    return lives;
}

Pierwsza wersja ustawia wartość lives w Start(). Gracz, którego metoda uruchomiła się jako pierwsza, pytał wtedy rywala, zanim ten ustawił liczbę swoich żyć, i wypisywał 0. Gdy ustawiamy ją w Awake(), obaj gracze mają już ustawioną liczbę swoich żyć, zanim metoda Start() któregokolwiek z nich zada pytanie, więc P1 wypisuje 5, a P2 — 3. Zasada, której warto się trzymać: ustawiaj własne pola obiektu w Awake(), a z innymi obiektami komunikuj się w Start().

challenge icon

Wyzwanie

Średni

Napraw ule, aby żaden z nich nie zliczał listy, która nie została jeszcze utworzona.

  1. Dodaj void Awake() do Hive.
  2. Przenieś linię bees = new List<GameObject>(); i pętlę for z Start() do Awake().
  3. Pozostaw dwie linie zliczające w Start(): każde Awake() wykonuje się przed dowolnym Start().

Naciśnij „Graj”: każdy ul rejestruje liczbę pszczół rywala, HiveA zlicza 5 pszczół rywala i nie pojawia się żaden błąd. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

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

Wszystkie lekcje w sekcji Podstawy skryptów w Unity

Poćwicz samodzielnie: Edytor online Unity