Menu
CoddyTech

Mesin Status

Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 37 dari 64.

Method SetState milik Beacon akan sama pada setiap object yang memiliki state: turret, enemy, atau door. Kode itu bisa ditempatkan di class tersendiri, yaitu mesin status, yang menyimpan status saat ini dan mengubahnya. Setiap object membuat satu mesin dan memanggilnya, alih-alih mengulang kode:

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

Pemanggilan ChangeState pertama tidak memiliki status untuk ditinggalkan: Current bernilai null, dan ?. melewatkan pemanggilan Exit. Bagian 1 mengingatkan bahwa ?. tidak menangani null palsu milik Unity; itu berlaku untuk Unity Objects yang sudah dihancurkan, sedangkan status di sini adalah object C# biasa, jadi ?. aman digunakan. Current memiliki private set, jadi tidak ada script yang bisa mengganti status tanpa melalui ChangeState dan Exit serta Enter miliknya.

Urutan di dalam ChangeState penting setiap kali dua status menyentuh hal yang sama. Exit membatalkan perubahan yang dibuat status lama, lalu Enter menyiapkan status baru, sehingga status baru menjadi yang terakhir mengubahnya. Jika Enter milik DarkState mematikan lampu dan dijalankan sebelum Exit milik BlinkState, Exit itu akan menyalakan kembali lampu dalam status gelap. StateMachine juga merupakan class biasa: beacon, turret, dan enemy masing-masing membuat mesinnya sendiri dengan new dan memanggil Tick dari Update.

challenge icon

Tantangan

Sedang

Jalankan state siap milik pemain dengan sebuah mesin.

  1. Di StateMachine.cs, tulis public class StateMachine dengan public IState Current { get; private set; } dan Tick() yang menjalankannya.
  2. ChangeState(IState next) mengabaikan state saat ini; jika tidak, panggil Exit, atur Current, lalu panggil Enter.
  3. Player: Start membuat machine, walk, sneak, lalu berjalan; Update menyelinap selama Space ditekan, jika tidak berjalan, lalu menjalankan Tick.

Tekan tombol “Main” dan tahan Space: Sneak: enter. Lalu tekan tombol “Periksa”.

Coba sendiri

// StateMachine: Current, ChangeState, dan Tick

Semua pelajaran di Arsitektur Game di Unity

Latihan sendiri: Playground Unity