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.
Görev
Kolay5 saniyelik dokunma yarışını yap.
SetStateiçinde yalnızca yeni durumun panelini göster. Playing durumuna girildiğindetaps = 0,timeLeft = roundTimeveTaps: 0değerlerini ayarla; GameOver durumuna girildiğinderesultTextiçindeTaps: 3göster.Update()içindeswitch (state)kullan: Space, Ready durumunu Playing durumuna ve GameOver durumunu Ready durumuna geçirir; süre dolana kadar Playing durumunda her Space basışınıtapsvetapsTextiç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
1Ekrandaki Metinler
Canvas ve MetinSkoru GösterSayıları BiçimlendirGeri Sayım ZamanlayıcısıTekrar: Hız Göstergesi2Düğmeler ve Ekranlar
Düğmeler ve onClickLambda İfadeleriInspector'da Bağlantı KurmaPanelleri Açma ve KapamaCan ÇubuklarıTekrar: Yükseltme Mağazası5PlayerPrefs ile Kaydetme
Bir Sayı KaydetmeVarsayılan Değerle YüklemeEn Yüksek SkorAyarları KaydetmeTekrar: Bankadaki Paralar3Oyun Yöneticisi
Oyunu Tek Bir Betik YönetiyorSingletonOyun DurumlarıDuruma Göre GeçişÖzet: Tur YöneticisiKendi başına pratik yap: Unity playground