摘录自:设计模式与游戏完美开发
十年磨一剑,作者将设计模式理论巧妙地融入到实践中,以一个游戏的完整实现呈现设计模式的应用及经验的传承 《轩辕剑》之父——蔡明宏、资深游戏制作人——李佳泽、Product Evangelist at Unity Technologies——Kelvin Lo、信仁软件设计创办人—— 赖信仁、资深3D游戏美术——刘明恺 联合推荐全书采用了整合式的项目教学,即以一个游戏的范例来应用23种设计模式的实现贯穿全书,让读者学习到整个游戏开发的全过程和作者想要传承的经验,并以浅显易懂的比喻来解析难以理解的设计模式,让想深入了解此领域的读者更加容易上手。
工程GitHub
源码注释及命名有所更改,个人感觉会比原版更好理解
-
状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。
- 一般用于场景切换,因为场景数量有限,而且在场景载入 、运行、退出相关操作流程类似
STATE—跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上去看电影,对你没兴趣的MM就会说“有事情啦”,对你不讨厌但还没喜欢上的MM就会说“好啊,不过可以带上我同事么?”,已经喜欢上你的MM就会说“几点钟?看完电影再去泡吧怎么样?”,当然你看电影过程中表现良好的话,也可以把MM的状态从不讨厌不喜欢变成喜欢哦。
using UnityEngine;
using System.Collections;
namespace DesignPattern_State
{
// 内涵一种状态,并且对相关状态的操作
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;
}
}
// 状态的抽象类,继承他的子类重写相关操作
public abstract class State
{
protected StateController m_Controller = null;
public State(StateController theController)
{
m_Controller = theController;
}
public abstract void Handle(int Value);
}
// 实例状态 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));
}
}
// 实例状态 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));
}
}
// 实例状态 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 );
}
}