摘錄自:設(shè)計模式與游戲完美開發(fā)
十年磨一劍坪郭,作者將設(shè)計模式理論巧妙地融入到實踐中闸翅,以一個游戲的完整實現(xiàn)呈現(xiàn)設(shè)計模式的應(yīng)用及經(jīng)驗的傳承 《軒轅劍》之父——蔡明宏琳拨、資深游戲制作人——李佳澤寸齐、Product Evangelist at Unity Technologies——Kelvin Lo、信仁軟件設(shè)計創(chuàng)辦人—— 賴信仁腮郊、資深3D游戲美術(shù)——劉明愷 聯(lián)合推薦全書采用了整合式的項目教學(xué)摹蘑,即以一個游戲的范例來應(yīng)用23種設(shè)計模式的實現(xiàn)貫穿全書,讓讀者學(xué)習(xí)到整個游戲開發(fā)的全過程和作者想要傳承的經(jīng)驗轧飞,并以淺顯易懂的比喻來解析難以理解的設(shè)計模式衅鹿,讓想深入了解此領(lǐng)域的讀者更加容易上手。
工程GitHub
源碼注釋及命名有所更改过咬,個人感覺會比原版更好理解
-
狀態(tài)模式:狀態(tài)模式允許一個對象在其內(nèi)部狀態(tài)改變的時候改變行為大渤。這個對象看上去象是改變了它的類一樣。狀態(tài)模式把所研究的對象的行為包裝在不同的狀態(tài)對象里掸绞,每一個狀態(tài)對象都屬于一個抽象狀態(tài)類的一個子類泵三。狀態(tài)模式的意圖是讓一個對象在其內(nèi)部狀態(tài)改變的時候,其行為也隨之改變衔掸。狀態(tài)模式需要對每一個系統(tǒng)可能取得的狀態(tài)創(chuàng)立一個狀態(tài)類的子類烫幕。當(dāng)系統(tǒng)的狀態(tài)變化時,系統(tǒng)便改變所選的子類敞映。
- 一般用于場景切換较曼,因為場景數(shù)量有限,而且在場景載入 振愿、運行捷犹、退出相關(guān)操作流程類似
STATE—跟MM交往時,一定要注意她的狀態(tài)哦冕末,在不同的狀態(tài)時她的行為會有不同萍歉,比如你約她今天晚上去看電影,對你沒興趣的MM就會說“有事情啦”栓霜,對你不討厭但還沒喜歡上的MM就會說“好啊翠桦,不過可以帶上我同事么?”胳蛮,已經(jīng)喜歡上你的MM就會說“幾點鐘销凑?看完電影再去泡吧怎么樣?”仅炊,當(dāng)然你看電影過程中表現(xiàn)良好的話斗幼,也可以把MM的狀態(tài)從不討厭不喜歡變成喜歡哦。
using UnityEngine;
using System.Collections;
namespace DesignPattern_State
{
// 內(nèi)涵一種狀態(tài)抚垄,并且對相關(guān)狀態(tài)的操作
public class StateController
{
State m_State = null;
public void Request(int Value)
{
m_State.Handle(Value);
}
public void SetState(State theState )
{
Debug.Log ("StateController.SetState:" + theState);
m_State = theState;
}
}
// 狀態(tài)的抽象類蜕窿,繼承他的子類重寫相關(guān)操作
public abstract class State
{
protected StateController m_Controller = null;
public State(StateController theController)
{
m_Controller = theController;
}
public abstract void Handle(int Value);
}
// 實例狀態(tài) A
public class ConcreteStateA : State
{
public ConcreteStateA( StateController theController):base(theController)
{}
public override void Handle (int Value)
{
Debug.Log ("ConcreteStateA.Handle");
if( Value > 10)
m_Controller.SetState( new ConcreteStateB(m_Controller));
}
}
// 實例狀態(tài) B
public class ConcreteStateB : State
{
public ConcreteStateB( StateController theController):base(theController)
{}
public override void Handle (int Value)
{
Debug.Log ("ConcreteStateB.Handle");
if( Value > 20)
m_Controller.SetState( new ConcreteStateC(m_Controller));
}
}
// 實例狀態(tài) C
public class ConcreteStateC : State
{
public ConcreteStateC( StateController theController):base(theController)
{}
public override void Handle (int Value)
{
Debug.Log ("ConcreteStateC.Handle");
if( Value > 30)
m_Controller.SetState( new ConcreteStateA(m_Controller));
}
}
}
using UnityEngine;
using System.Collections;
using DesignPattern_State;
public class StateTest : MonoBehaviour {
// Use this for initialization
void Start () {
UnitTest();
}
//
void UnitTest ()
{
StateController theController = new StateController();
theController.SetState( new ConcreteStateA( theController ));
theController.Request( 5 );
theController.Request( 15 );
theController.Request( 25 );
theController.Request( 35 );
}
}