Menu
CoddyTech

רכיבים שפועלים יחד

חלק מהיחידה ארכיטקטורת משחקים ב-Unity במסלול ה-Unity של Coddy. שיעור 4 מתוך 64.

גם רכיבים קטנים עדיין זקוקים זה לזה. ג׳טפק זקוק לדלק באותו אובייקט, ולכן הוא מוצא את הדלק פעם אחת ב-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, הפחיתו את הערך הזה והחזירו true, אחרת החזירו false.
  2. הוסיפו את [RequireComponent(typeof(Stamina))] מעל public class Dash, ושלפו את הרכיב אל שדה בתוך Awake().
  3. בלחיצה על מקש הרווח, בצעו זינוק רק אם 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

תרגלו בעצמכם: Unity אונליין