Menu
CoddyTech

מעבר בין מצבים

חלק מהיחידה בניית משחקים אמיתיים במסלול ה-Unity של Coddy. שיעור 15 מתוך 60.

כל מצב במשחק מבצע עבודה שונה בכל פריים. פקודת switch על שדה המצב ממקמת את העבודה הזאת בענף נפרד לכל מצב, ובכל פריים מתבצע ענף אחד בלבד. שינוי המצב מתבצע באמצעות מתודה אחת, כך שהמסך תמיד תואם למצב. בקרב הבוס הזה יש מסך פתיחה, הקרב ומסך ניצחון:

public enum Phase { Intro, Fight, Won }

public class BossFight : MonoBehaviour
{
    public GameObject introPanel;
    public GameObject fightPanel;
    public GameObject winPanel;
    public int bossHp = 10;
    private Phase phase;
    private float timer = 3f;

    void Start()
    {
        Enter(Phase.Intro);
    }

    void Update()
    {
        switch (phase)
        {
            case Phase.Intro:
                timer -= Time.deltaTime;
                if (timer <= 0f) Enter(Phase.Fight);
                break;
            case Phase.Fight:
                if (bossHp <= 0) Enter(Phase.Won);
                break;
            case Phase.Won:
                break;
        }
    }

    void Enter(Phase next)
    {
        phase = next;
        introPanel.SetActive(next == Phase.Intro);
        fightPanel.SetActive(next == Phase.Fight);
        winPanel.SetActive(next == Phase.Won);
    }
}

כל ענף מסתיים ב-break, כי C# לא מאפשרת לקמפל ענף שממשיך אל הענף הבא. כשהטיימר של מסך הפתיחה מסתיים, Enter(Phase.Fight) משנה את השלב, אבל ענף Fight מתבצע לראשונה רק בפריים הבא, כי בפריים הזה כבר נבחר הענף. אם משתמשים בכמה בלוקי if בזה אחר זה, פריים יכול להתחיל את הקרב ולהריץ את הקוד של הקרב באותו פריים.

Enter היא המקום היחיד שבו משתנה phase. הביטוי next == Phase.Fight הוא true רק עבור חלונית הקרב, ולכן קריאה אחת מציגה את החלונית הזאת ומסתירה את שתי האחרות. פעולות ששייכות לכניסה למצב, כמו איפוס טיימר, מתבצעות גם הן בתוך Enter, ורצות פעם אחת במקום בכל פריים.

challenge icon

אתגר

קל

ערוך את מירוץ ההקשות של 5 השניות.

  1. ב־SetState, הצג רק את החלונית של המצב החדש. כניסה ל־Playing מאפסת ל־taps = 0, מגדירה timeLeft = roundTime ומציגה Taps: 0; כניסה ל־GameOver מציגה Taps: 3 בתוך resultText.
  2. ב־Update(), השתמש ב־switch (state): מקש הרווח מעביר מ־Ready ל־Playing ומ־GameOver ל־Ready; במצב Playing, כל לחיצה על מקש הרווח נספרת ב־taps וב־tapsText עד שנגמר הזמן.

לחץ על "שחק" והתחרה פעמיים. לאחר מכן לחץ על "בדיקה".

נסו בעצמכם

using UnityEngine;
using TMPro;

public enum GameState { Ready, Playing, GameOver }

public class GameManager : MonoBehaviour
{
    public GameObject readyPanel;
    public GameObject playPanel;
    public GameObject gameOverPanel;
    public TMP_Text tapsText;
    public TMP_Text resultText;
    public float roundTime = 5f;
    public GameState state;
    private int taps;
    private float timeLeft;

    void Start()
    {
        SetState(GameState.Ready);
    }

    void Update()
    {
        // בחר פעולה לפי state:
        // Ready: לחיצה על Space מתחילה סיבוב
        // Playing: לחיצה על Space נספרת כהקשה; כשהזמן נגמר, המשחק מסתיים
        // GameOver: לחיצה על Space מחזירה למצב Ready
    }

    void SetState(GameState next)
    {
        state = next;
        // הצג רק את הפאנל של המצב החדש
        // סיבוב חדש מתחיל עם 0 הקשות ונמשך roundTime שניות; בסופו, resultText מציג את מספר ההקשות
    }
}

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

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