Menu
CoddyTech

المكوّنات تعمل معًا

جزء من قسم هندسة الألعاب في Unity في رحلة Unity على Coddy. الدرس 4 من 64.

حتى المكوّنات الصغيرة تحتاج إلى بعضها. يحتاج Jetpack إلى Fuel على الكائن نفسه، لذا يعثر على Fuel مرة واحدة في Awake، ويحفظه في حقل، ويتواصل معه من خلال طريقتين عامتين صغيرتين:

public class Fuel : MonoBehaviour
{
    public float amount = 10f;

    public bool IsEmpty()
    {
        return amount <= 0f;
    }

    public void Burn(float units)
    {
        amount = Mathf.Max(amount - units, 0f);
    }
}
[RequireComponent(typeof(Fuel))]
public class Jetpack : MonoBehaviour
{
    public float lift = 4f;
    private Fuel fuel;

    void Awake()
    {
        fuel = GetComponent<Fuel>();
    }

    void Update()
    {
        if (Keyboard.current.spaceKey.isPressed && !fuel.IsEmpty())
        {
            fuel.Burn(Time.deltaTime);
            transform.position += Vector3.up * lift * Time.deltaTime;
        }
    }
}

تجعل [RequireComponent(typeof(Fuel))] Unity يضيف Fuel كلما أُضيف Jetpack، سواء في المحرر أو باستخدام AddComponent، كما تمنع إزالة Fuel ما دام Jetpack موجودًا. لا يتحقق Unity من ذلك إلا لحظة إضافة Jetpack، لذا فإن Jetpack الموجود بالفعل على كائن قبل كتابة السمة يحتفظ بإعداده السابق. المكان المناسب لجلبه هو Awake: فهو يعمل مرة واحدة، وتكون جميع مكوّنات الكائن نفسه موجودة حينها.

لا يغيّر Jetpack قيمة amount بنفسه أبدًا. يحدد Fuel معنى استهلاك الوقود، مثل عدم النزول أبدًا إلى ما دون 0، بينما يكتفي Jetpack بالاستعلام. وإذا أضاف Fuel لاحقًا مقياسًا أو أعاد تعبئة الوقود من العناصر الملتقطة، فلن يحتاج Jetpack إلى التغيير.

challenge icon

التحدي

سهل

اجعل اندفاعة المتزلج تستهلك القدرة على التحمّل.

  1. في Stamina، أضف public bool TrySpend(float cost): إذا كانت current تساوي cost أو تزيد عليها، اطرح cost منها وأعِد true، وإلا فأعِد false.
  2. ضع [RequireComponent(typeof(Stamina))] فوق public class Dash، واجلبه إلى حقل في Awake().
  3. عند الضغط على Space، اندفع فقط إذا كانت TrySpend(cost) تساوي true؛ وإلا فسجّل Too tired.

اضغط «العب»: بعد اندفاعتين، تعرض وحدة التحكم Too tired. ثم اضغط «تحقق».

جرّب بنفسك

using UnityEngine;
using UnityEngine.InputSystem;

public class Dash : MonoBehaviour
{
    public float distance = 3f;
    public float cost = 40f;

    void Update()
    {
        if (Keyboard.current.spaceKey.wasPressedThisFrame)
        {
            transform.position += Vector3.forward * distance;
        }
    }
}

جميع دروس هندسة الألعاب في Unity

تدرّب بنفسك: Playground لـ Unity