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.
Tantangan
SedangJalankan state siap milik pemain dengan sebuah mesin.
- Di
StateMachine.cs, tulispublic class StateMachinedenganpublic IState Current { get; private set; }danTick()yang menjalankannya. ChangeState(IState next)mengabaikan state saat ini; jika tidak, panggil Exit, aturCurrent, lalu panggil Enter.Player: Start membuatmachine,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
1Komponen, Bukan Hierarki
Komponen KecilSkrip Dasar MusuhKomponen AbstrakKomponen yang Bekerja BersamaRangkuman: Turret ModularRangkuman: Meriam Kembar4Data yang Diserialisasi
Class yang Dapat DiserialisasiList di InspectorEnum di InspectorRangkuman: Tabel LootRangkuman: Acak Loot7Mesin Status
Status sebagai ClassStatus SiagaMesin StatusTransisiOtak MusuhKsatria MenyerangRangkuman: Status Pintu2Antarmuka di Unity
IDamageableAntarmuka dan TryGetComponentGetComponentsRingkasan: Tombol InteractRingkasan: Terdekat dalam Jangkauan5ScriptableObjects
Aset DataStatistik SenjataPengaturan BersamaSelamatkan AnginGelombang sebagai DataRekap: database ItemBeli dari Toko8Kode yang Dapat Digunakan Kembali
Extension methodSingleton GenerikHelper GenerikUlasan: FindNearestLatihan sendiri: Playground Unity