狀態模式C#場景控制
阿新 • • 發佈:2018-11-27
下面是控制場景的類圖,可能會有疑惑,控制場景就簡單的用
SceneManager.LoadScene()這樣 不就可以了嗎,但是, 每次來了新工程 ,都要這樣複用,很繁瑣,
不如用設計模式,減少重複性的工作,分離,解耦合,這樣一來, 別的工程來了就可以使用了。
場景控制的應用
狀態模式的
原型
using System.Collections; using System.Collections.Generic; using UnityEngine; public class _01StateDesignMode : MonoBehaviour { private void Start() { Context context = new Context(); context.SetState(new ConcreteStateA(context)); context.Handle(20); context.Handle(5); context.Handle(11); context.Handle(10); } } public class Context { private IState m_stateA; public void SetState(IState state) //里氏替換原則 { m_stateA = state; } public void Handle(int arg) { m_stateA.Handle(arg); } } public interface IState { void Handle(int arg); } public class ConcreteStateA : IState { public ConcreteStateA( Context context) { m_context = context; } private Context m_context; public void Handle(int arg) { Debug.Log("ConcreteStateA"); if (arg>10) { m_context.SetState(new ConcreteStateB(m_context)); } } } public class ConcreteStateB : IState { public ConcreteStateB(Context context) { m_context = context; } private Context m_context; public void Handle(int arg) { Debug.Log("ConcreteStateB"); if (arg<=10) { m_context.SetState(new ConcreteStateA(m_context)); } } }
狀態 模式在遊戲中算是常用的了,敵人的AI,NPC AI等等,雖然可以用行為樹來控制, 但是用狀態模式,可以很方便控制他們的狀態,行動,死亡 ,發呆,追蹤,受傷等等... 最簡單 暴力是可以用列舉 +swich來實現,但是這樣做的後果就是後面 維護起來,很困難,最好 就 單一的分開。面向物件中的單一職責嘛,最好是就有個抽象類或者介面,來約束他們,提取他們共同的地方,方便後面維護,比如每個活物都有 發呆 ,行動等 狀態,可以把用一個抽象類或者介面,作為他們的繼承物件,這樣一來,就尊重了開放,封閉 原則。