Geçişler
Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 38 / 64.
Durumun ne zaman değişeceğine kim karar verir? Kararı sahip sınıfa bırakmak, switch örneğinde olduğu gibi tüm kuralları yeniden tek bir Update içinde toplar. Alışılmış yanıt, her durumun kendi çıkış yolunu bilmesidir: Tick metodunda koşulunu denetler ve makineden sonraki duruma geçmesini ister. Bu bomba, oyuncu yaklaşana kadar bekler, sonra fitilini yakar ve oyuncu kaçarsa beklemeye geri döner:
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);
}
}
}Her durum, kurucusunda bombayı alır ve makineye, oyuncu denetimine ve diğer durumlara onun üzerinden erişir. Bomba her durumu Start içinde bir kez oluşturur; bu yüzden bir durum new kullanarak başka bir durum oluşturmaz: kurucularında birbirlerini oluşturan iki durum, yığın taşana kadar döngüye girerdi. Bombanın Update metodu yalnızca makineyi çalıştırır, kurallar da ait oldukları durumlarda bulunur: 2 saniyelik fitil yalnızca FuseState'in sorumluluğundadır.
ChangeState, FuseState'in Exit metodunu ve IdleState'in Enter metodunu hemen çalıştırır; ancak çağrıdan sonra FuseState'in Tick metodunun geri kalanı yine çalışır. return bunu durdurur; aksi takdirde fitil, çoktan sona ermiş bir durum için bir kare daha yanardı. Destroy, Object.Destroy şeklinde yazılır: MonoBehaviour bunu Unity'nin Object sınıfından miras alır; sıradan bir sınıfın ise sınıfın adını belirtmesi gerekir.
Görev
OrtaFlytrapStates.cs dosyasındaki her Tick içinde sinekkapanın geçişlerini yaz.
- Open:
trap.PlayerInReach()olduğundatrap.machine.ChangeState(trap.snap);çağır. - Snap:
timerdeğerineTime.deltaTimeekle;0.5olduğunda oyuncu hâlâ erişim mesafesindeysetrap.chewdurumuna, değilsetrap.opendurumuna geç. - Chew:
timerdeğerini 3'ten geriye say; 0 olduğundatrap.opendurumuna geç.
“Oyna” düğmesine bas, tuzağa doğru yürü, sonra ondan kaçın. Ardından “Kontrol et” düğmesine bas.
Kendin dene
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()
{
// Oyuncu menzildeyken kapan
}
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()
{
// 0.5 saniye sonra: oyuncu hâlâ menzildeyse çiğne, değilse tekrar açıl
}
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()
{
// 3 saniye sonra: tekrar açıl
}
public void Exit()
{
}
}
Unity'de Oyun Mimarisi bölümündeki tüm dersler
1Kalıtım Değil, Bileşenler
Küçük BileşenlerTemel Düşman Script'iSoyut BileşenlerBirlikte Çalışan BileşenlerTekrar: Modüler TaretTekrar: Çift Namlulu Top4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larTekrar: Ganimet TablosuTekrar: Ganimeti At2Unity'de Arayüzler
IDamageableArayüzler ve TryGetComponentGetComponentsÖzet: Etkileşim TuşuÖzet: Erişim Mesafesindeki En Yakın5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriOrtak AyarlarRüzgârı KaydetVeri Olarak DalgalarTekrar: Eşya VeritabanıTekrar: Dükkândan Satın Al8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearestKendi başına pratik yap: Unity playground