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 / 56.

Bir oyunun her durumu, her karede farklı işler yapar. Durum alanı üzerinde kullanılan bir switch, bu işleri her durum için birer case içine yerleştirir ve her karede tam olarak bir case çalışır. Durumu değiştirmek tek bir metot üzerinden yapılır; böylece ekran her zaman durumla eşleşir. Bu boss 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 case break ile biter; çünkü C# bir case'in sonraki case'e devam ederek çalışmasına izin vermez ve bu durumda kodu derlemez. Giriş aşamasının zamanlayıcısı bittiğinde Enter(Phase.Fight) aşamayı değiştirir; ancak bu karede çalıştırılacak case zaten seçilmiş olduğundan Fight case'i ancak sonraki karede çalışır. Art arda ayrı if blokları kullanılsaydı, bir kare dövüşü başlatıp dövüş kodunu aynı karede çalıştırabilirdi.

phase değerini değiştiren tek yer Enter metodudur. next == Phase.Fight yalnızca dövüş paneli için true olur; bu nedenle tek bir çağrı bu 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 yazılır ve her karede değil, yalnızca bir kez çalışır.

challenge icon

Görev

Kolay

Bir dokunma yarışı: 5 saniyede Space tuşuna kaç kez basabilirsin? GameManager sınıfında GameState enum'u (Ready, Playing, GameOver), her durum için bir panel bulunur ve Start, SetState(GameState.Ready) çağrısı yapar. Update ve SetState yöntemlerini yaz.

Update içinde state üzerinde switch kullan:

  • Ready: Space yeni bir tur başlatır. Bu basış bir dokunma sayılmaz.
  • Playing: Space tuşuna her basış taps değerini 1 artırır ve tapsText içinde Taps: 3 biçiminde gösterir. roundTime saniye (5) sonra oyun sona erer.
  • GameOver: Space, Ready durumuna geri döner.

SetState(GameState next), state değerini ayarlar ve yalnızca yeni durumun panelini gösterir. Playing durumuna girildiğinde 0 dokunmayla, ekranda Taps: 0 göstererek ve kalan süreyi roundTime saniye olarak ayarlayarak bir tur başlatır; GameOver durumuna girildiğinde sonucu resultText içinde Taps: 3 biçiminde gösterir.

Play'e bas, yarışı iki kez oyna, ardından Check'e 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 dallan:
        // Ready: Space bir tur başlatır
        // Playing: Space bir dokunuş 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 saniyelik süreyle başlar; turun sonunda resultText dokunuş sayısını gösterir
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

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