Menu
CoddyTech

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

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

גם רכיבים קטנים זקוקים זה לזה. ג׳טפאק זקוק לדלק באותו אובייקט, ולכן הוא מוצא את הדלק פעם אחת ב-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

אתגר

קל

הדאש של המחליקה הוא בחינם: מקש הרווח מזניק אותה 3 יחידות קדימה (+z) בכל פעם שלוחצים עליו. הפוך אותו לפעולה שעולה בסיבולת. החצים מזיזים אותה (Mover.cs, מוכן), ו-Stamina.cs כבר ממלא מחדש את current לפי regen לשנייה, עד max (100).

  • ב-Stamina, הוסף מתודה ציבורית bool TrySpend(float cost). אם current גדול או שווה ל-cost, היא מפחיתה את cost מ-current ומחזירה true; אחרת היא משאירה את current כפי שהוא ומחזירה false.
  • דאג ש-Dash ידרוש רכיב Stamina על האובייקט שלו, כך ש-Unity יוסיף אותו בכל פעם שמוסיפים Dash. אחזר אותו פעם אחת, בתוך Awake, ושמור בשדה.
  • דאש עולה cost (ב-Inspector נקבע הערך 40). מקש הרווח מבצע דאש רק אם TrySpend מסכימה, ואחרת רושם Too tired.

לחץ על Play ובצע דאשים עד שהיא מתעייפת מדי, ואז לחץ על Check.

נסו בעצמכם

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

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

כל השיעורים ביחידה ארכיטקטורת משחקים ב-Unity