说明:
Context(状态拥有者):是一个具有“状态”属性的类,可以定制相关的接口,让外界能够得知状态的改变或者通过操作让状态改变。
State(状态接口类):制定状态的接口,负责规范Context在特定状态下要表现的行为。
ConcreteState(具体状态类):继承自State,实现Context在特定状态下该有的行为。
示例:
using UnityEngine;
using System.Collections;
namespace Designpattern_State
{
public class Context
{
//持有当前状态,并将有关讯息传给状态
Statem_State = null;
public void Request(int Value)
{
m_State.Handle(Value);
}
public void SetState(State theState )
{
Debug.Log ("Context.SetState:" + theState); m_State = theState;
}
}
//负责封装Context处于特定状态时所改展现的行为
public abstract class State
{
protected Context m_Context = null;
public State(Context theContext)
{
m_Context = theContext;
}
public abstract void Handle(int Value);
}
//状态A
public class ConcreteStateA : State
{
public ConcreteStateA(Context theContext) : base(theContext)
{
}
public override void Handle(int Value)
{
Debug.Log("ConcreteStateA.Handle");
if (Value > 10)
m_Context.SetState(new ConcreteStateB(m_Context));
}
}
//状态B
public class ConcreteStateB : State
{
public ConcreteStateB(Context theContext) : base(theContext)
{
}
public override void Handle(int Value)
{
Debug.Log("ConcreteStateB.Handle");
if (Value > 20) m_Context.SetState(new ConcreteStateC(m_Context));
}
}
public class ConcreteStateC : State
{
public ConcreteStateC(Context theContext) : base(theContext)
{
}
public override void Handle(int Value)
{
Debug.Log("ConcreteStateC.Handle");
if (Value > 30) m_Context.SetState(new ConcreteStateA(m_Context));
}
}
}
//测试
using UnityEngine;
using System.Collections;
using DesignPattern_State;
public class StateTest : MonoBehaviour
{
// Use this for initialization
void Start()
{
UnitTest();
}
void UnitTest()
{
Context theContext = new Context();
theContext.SetState(new ConcreteStateA(theContext));
theContext.Request(5);
theContext.Request(15);
theContext.Request(25);
theContext.Request(35);
}
}
状态模式在游戏实际开发过程中的应用,一边用与游戏场景转换,角色AI状态管理等
1.游戏场景切换
说明:
ISceneState:场景类的接口,定义游戏中场景转换和执行是所需要调用的方法。
StartStart,MainMenuState,BattleState:分别对应游戏的开始场景,主场景,战斗场景,作为场景执行是的操作类
SceneStateController:场景状态的拥有者,保持当前游戏场景状态,并作为与GameLoop类互动的接口,也是执行场景转换的类
GameLoop:游戏主循环类,柏涵游戏初始化以及定期调用更新操作
2. 角色AI
说明:
IAIState:角色的Ai状态,定义游戏中角色AI操作是所需要的接口
AttackAIState、ChaseAIState、IdleAIState、MoveAIState:角色具体状态类,负责实现角色在各个状态下赢该有的游戏行为和判断,这些状态可以设置给游戏的双方阵营角色
ICharacterAI:双方阵营的AI接口,定义游戏所需的AI方法,并实现相关的AI操作
SoldierAI,ENEmyAI:ICharacterAI的自雷,将不同的AI行为表现在不同的子类中实现
实际应用中的优缺点:
优点:
使用状态模式可以清楚的了解某个场景状态执行时所需要配合使用的类对象,并减少因新增状态而需要大量的修改程序代码的维护成本。简而言之,使用状态模式能够减少错误并降低维护难度,并且状态执行环境单一化。
缺点:
如果游戏中有非常多的场景需要进行状态管理,有个能造成类爆炸,导致后期维护难度上升。