Menu
CoddyTech

Duruma Göre Geçiş

Coddy'nin Unity Journey'sinin Gerçek Oyunlar Geliştirmek bölümünün bir parçası. Ders 15 / 60.

Bir oyunun her durumu, her karede farklı işler yapar. Durum alanı üzerindeki bir switch, bu işleri her durum için ayrı bir duruma yerleştirir ve her karede tam olarak bir durum çalışır. Durumu değiştirmek tek bir yöntem üzerinden yapılır, böylece ekran her zaman durumla eşleşir. Bu bölüm sonu canavarı dövüşünde bir giriş, dövüş ve zafer ekranı vardır:

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);
    }
}

Her durum break ile biter, çünkü C# bir durumun sonraki duruma devam etmesine neden olan kodun derlenmesine izin vermez. Giriş zamanlayıcısı dolduğunda, Enter(Phase.Fight) aşamayı değiştirir, ancak Fight durumu ancak sonraki karede çalışır; çünkü bu kare için çalıştırılacak durum zaten seçilmiştir. Art arda ayrı if blokları kullanılsaydı, bir karede dövüş başlayabilir ve aynı karede dövüş kodu çalışabilirdi.

Enter, phase değerinin değiştirildiği tek yerdir. next == Phase.Fight yalnızca dövüş paneli için true olur; bu nedenle tek bir çağrı o paneli gösterip diğer ikisini gizler. Zamanlayıcıyı sıfırlamak gibi bir duruma girerken yapılması gereken işler de Enter içine konur ve her karede değil, bir kez çalışır.

challenge icon

Görev

Kolay

5 saniyelik dokunma yarışını yap.

  1. SetState içinde yalnızca yeni durumun panelini göster. Playing durumuna girildiğinde taps = 0, timeLeft = roundTime ve Taps: 0 değerlerini ayarla; GameOver durumuna girildiğinde resultText içinde Taps: 3 göster.
  2. Update() içinde switch (state) kullan: Space, Ready durumunu Playing durumuna ve GameOver durumunu Ready durumuna geçirir; süre dolana kadar Playing durumunda her Space basışını taps ve tapsText içinde say.

“Oyna” düğmesine bas ve yarışı iki kez yap. Ardından “Kontrol et” düğmesine bas.

Kendin dene

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 değerine göre işlem yap:
        // Ready: Space bir tur başlatır
        // Playing: Space bir dokunuşu sayar; süre dolduğunda oyun biter
        // GameOver: Space, Ready durumuna geri döner
    }

    void SetState(GameState next)
    {
        state = next;
        // yalnızca yeni durumun panelini göster
        // yeni bir tur 0 dokunuş ve roundTime saniye ile başlar; sonunda resultText dokunuş sayısını gösterir
    }
}

Gerçek Oyunlar Geliştirmek bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground