Menu
CoddyTech

Awake ו-Start

חלק מהיחידה יסודות התכנות ב-Unity במסלול ה-Unity של Coddy. שיעור 55 מתוך 67.

Unity מפעילה את Awake() ברגע שאובייקט נטען, לפני Start() שלו. מה שהופך אותה לשימושית הוא הכלל שחל על כל האובייקטים: כשסצנה מתחילה, Awake() של כל אובייקט מופעלת לפני Start() של אובייקט כלשהו. Unity קובעת איזה אובייקט יופעל ראשון בכל סבב, ואי אפשר להסתמך על כך.

הסקריפט Player הזה נמצא אצל שני שחקנים, P1 (startLives 3) ו-P2 (startLives 5), וכל אחד מהם מגדיר את האחר בתור rival:

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

void Awake()
{
    lives = startLives;   // אתחל את האובייקט הזה
}

void Start()
{
    int theirs = rival.GetComponent<Player>().Lives();   // שאל את האחר
    Debug.Log(name + " sees a rival with " + theirs + " lives");
}

public int Lives()
{
    return lives;
}

בגרסה הראשונה, lives הוגדר בתוך Start(). השחקן שהתחיל ראשון שאל את היריב שלו לפני שהיריב הגדיר את מספר החיים שלו, והדפיס 0. כשההגדרה מתבצעת בתוך Awake(), לשני השחקנים כבר יש את מספר החיים שלהם לפני שאחד מהם שואל ב-Start(), ולכן P1 מדפיס 5 ו-P2 מדפיס 3. הכלל שכדאי לאמץ: מגדירים את השדות של האובייקט עצמו בתוך Awake(), ופונים לאובייקטים אחרים בתוך Start().

challenge icon

אתגר

בינוני

שתי כוורות, HiveA ו-HiveB, מריצות את אותו סקריפט Hive. כל כוורת יוצרת את הדבורים שלה (3 ו-5, מתוך beeCount) ומכניסה אותן לרשימה, ואז מדפיסה כמה דבורים יש ליריבה שלה: HiveA counts 5 rival bees ו-HiveB counts 3 rival bees.

לחץ על Play: אחת הכוורות נעצרת עם NullReferenceException, כי היא מבקשת את הרשימה של היריבה שלה לפני שזו יצרה אותה. תקן את הסקריפט כך שלכל כוורת תהיה הרשימה שלה והדבורים שלה לפני שאחת הכוורות סופרת את הדבורים של היריבה שלה. השאר את הספירה במקום שבו היא נמצאת. ואז לחץ על Check.

נסו בעצמכם

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 iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה יסודות התכנות ב-Unity