Menu
CoddyTech
flag Ar iconالعربيةdown icon

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.

اضغط على تشغيل: تتوقف إحدى الخليتين بسبب NullReferenceException، لأنها تطلب قائمة الخلية المنافسة قبل أن تنشئها تلك الخلية. أصلح النص البرمجي بحيث تكون لدى كل خلية قائمتها ونحلها قبل أن تحصي أي خلية نحل منافستها. أبقِ عملية الإحصاء في مكانها. ثم اضغط على تحقّق.

جرّب بنفسك

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