Menu
CoddyTech

מכונת מצבים

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

שיטת SetState של המשואה תהיה זהה בכל אובייקט עם מצבים: צריח, אויב, דלת. הקוד הזה יכול להיות במחלקה משלו, מכונת מצבים, שמחזיקה את המצב הנוכחי ומשנה אותו. כל אובייקט יוצר מכונה אחת וקורא לה, במקום לחזור על הקוד:

public class StateMachine
{
    public IState Current { get; private set; }

    public void ChangeState(IState next)
    {
        Current?.Exit();
        Current = next;
        Current.Enter();
    }

    public void Tick()
    {
        Current?.Tick();
    }
}

public class Beacon : MonoBehaviour
{
    public Renderer lamp;
    private StateMachine machine = new StateMachine();
    private IState blink;
    private IState steady;

    void Start()
    {
        blink = new BlinkState(lamp);
        steady = new SteadyState();
        machine.ChangeState(steady);
    }

    void Update()
    {
        if (Keyboard.current.spaceKey.wasPressedThisFrame) machine.ChangeState(machine.Current == steady ? blink : steady);
        machine.Tick();
    }
}

בקריאה הראשונה ל-ChangeState אין מצב שממנו יוצאים: Current הוא null, ו-?. מדלג על הקריאה ל-Exit. יחידה 1 הזהירה ש-?. לא מזהה את ערך ה-null המדומה של Unity; זה נוגע לאובייקטים של Unity שהושמדו, והמצבים הם אובייקטי C# רגילים, לכן ?. בטוח כאן. ל-Current יש private set, כך שאף סקריפט לא יכול להחליף את המצב בלי לעבור דרך ChangeState ודרך Exit ו-Enter שלו.

הסדר בתוך ChangeState חשוב בכל פעם ששני מצבים נוגעים באותו הדבר. Exit מבטל את מה שהמצב הישן שינה, ואז Enter מגדיר את המצב החדש, כך שלמצב החדש יש את המילה האחרונה. אם Enter של DarkState היה מכבה את המנורה ורץ לפני Exit של BlinkState, אותו Exit היה מדליק מחדש את המנורה במצב החשוך. גם StateMachine היא מחלקה רגילה: המשואה, צריח ואויב יוצרים כל אחד מכונה משלו עם new וקוראים ל-Tick שלה מתוך Update שלהם.

challenge icon

אתגר

בינוני

הפעל את המצבים המוכנים של השחקן באמצעות מכונת מצבים.

  1. ב־StateMachine.cs, כתוב public class StateMachine עם public IState Current { get; private set; } ועם Tick() שמפעילה את המצב.
  2. ChangeState(IState next) מתעלמת מהמצב הנוכחי; אחרת, יוצאת ממנו, מציבה את Current ונכנסת אליו.
  3. Player: המתודה Start יוצרת את machine, את walk ואת sneak, ומתחילה בהליכה; המתודה Update מפעילה התגנבות כל עוד מקש הרווח מוחזק, אחרת הליכה, ואז מפעילה את פעימת המצב.

לחץ על "שחק" והחזק את מקש הרווח: Sneak: enter. לאחר מכן לחץ על "בדיקה".

נסו בעצמכם

// StateMachine: Current, ChangeState ו-Tick

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

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