Transisi
Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 38 dari 64.
Siapa yang menentukan kapan state berubah? Menyerahkan keputusan kepada pemiliknya akan mengembalikan semua aturan ke satu Update, seperti yang dilakukan switch. Biasanya, setiap state mengetahui caranya sendiri untuk keluar: di Tick, state memeriksa kondisinya dan meminta machine berpindah ke state berikutnya. Bom ini menunggu sampai pemain mendekat, lalu membakar sumbunya, dan kembali menunggu jika pemain berlari:
public class Bomb : MonoBehaviour
{
public Transform player;
public StateMachine machine = new StateMachine();
public IState idle;
public IState fuse;
void Start()
{
idle = new IdleState(this);
fuse = new FuseState(this);
machine.ChangeState(idle);
}
void Update() { machine.Tick(); }
public bool PlayerNear()
{
return Vector3.Distance(transform.position, player.position) < 3f;
}
}
public class IdleState : IState
{
private Bomb bomb;
public IdleState(Bomb bomb) { this.bomb = bomb; }
public void Enter() { }
public void Exit() { }
public void Tick()
{
if (bomb.PlayerNear()) bomb.machine.ChangeState(bomb.fuse);
}
}
public class FuseState : IState
{
private Bomb bomb;
private float timer;
public FuseState(Bomb bomb) { this.bomb = bomb; }
public void Enter() { timer = 2f; }
public void Exit() { }
public void Tick()
{
if (!bomb.PlayerNear())
{
bomb.machine.ChangeState(bomb.idle);
return;
}
timer -= Time.deltaTime;
if (timer <= 0f)
{
Debug.Log("Boom!");
Object.Destroy(bomb.gameObject);
}
}
}Setiap state menerima bom di konstruktornya, lalu mengakses machine, pemeriksaan pemain, dan state lainnya melalui bom tersebut. Bom membuat setiap state satu kali, di Start, sehingga sebuah state tidak pernah membuat state lain dengan new: dua state yang saling membuat di konstruktornya akan terus berulang sampai stack overflow. Update milik bom hanya menjalankan Tick pada machine, dan aturan berada di state yang sesuai: sumbu selama 2 detik hanya menjadi urusan FuseState.
ChangeState menjalankan Exit milik FuseState dan Enter milik IdleState sekaligus, tetapi bagian lain dari Tick milik FuseState tetap akan berjalan setelah pemanggilan itu. return menghentikannya. Jika tidak, sumbu akan terbakar satu frame lagi meskipun state tersebut sudah berakhir. Destroy ditulis sebagai Object.Destroy: MonoBehaviour mewarisinya dari class Object milik Unity, sedangkan class biasa harus menyebutkan nama class-nya.
Tantangan
SedangTulis transisi perangkap lalat di setiap Tick dalam FlytrapStates.cs.
- Open: saat
trap.PlayerInReach(), panggiltrap.machine.ChangeState(trap.snap);. - Snap: tambahkan
Time.deltaTimeketimer; saat mencapai0.5, beralih ketrap.chewjika pemain masih dalam jangkauan, jika tidak, beralih ketrap.open. - Chew: hitung mundur
timerdari 3; saat mencapai 0, beralih ketrap.open.
Tekan tombol “Main”, berjalanlah ke dalam perangkap, lalu hindari perangkap itu. Lalu tekan tombol “Periksa”.
Coba sendiri
using UnityEngine;
public class OpenState : IState
{
private Flytrap trap;
public OpenState(Flytrap trap)
{
this.trap = trap;
}
public void Enter()
{
trap.Paint(new Color(0.3f, 0.8f, 0.2f));
}
public void Tick()
{
// Menutup saat pemain berada dalam jangkauan
}
public void Exit()
{
}
}
public class SnapState : IState
{
private Flytrap trap;
private float timer;
public SnapState(Flytrap trap)
{
this.trap = trap;
}
public void Enter()
{
timer = 0f;
trap.Paint(new Color(1f, 0.55f, 0.1f));
}
public void Tick()
{
// Setelah 0.5 detik: mengunyah jika pemain masih dalam jangkauan, membuka kembali jika tidak
}
public void Exit()
{
}
}
public class ChewState : IState
{
private Flytrap trap;
private float timer;
public ChewState(Flytrap trap)
{
this.trap = trap;
}
public void Enter()
{
timer = 3f;
trap.Paint(new Color(0.5f, 0.05f, 0.1f));
Debug.Log("Chomp!");
}
public void Tick()
{
// Setelah 3 detik: membuka kembali
}
public void Exit()
{
}
}
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 Loot2Antarmuka 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