第
探秘Unity游戏开发中的状态设计模式
目录一、状态模式定义二、实现范例三、使用状态模式(state)实现游戏场景的转换四、使用状态模式的优点
一、状态模式定义
状态模式(state)在GoF中的解释:
让一个对象的行为随着内部状态的改变而改变,而该对象也想换了类一样。
二、实现范例
结构图:
Context(状态拥有者)
///summary
///Describe:状态拥有者
///Note:是一个具有“状态”属性的类,可以制定相关的接口,让外界能够得知状态的改变或通过操作让状态改变。
///比如:游戏角色有潜行,攻击、施法等状态;好友上线,脱机、忙碌等状态;
///GoF使用TCP联网为例,有已连接、等待连接、短线等状态;
////summary
publicclassContext
Statestate=null;
publicvoidRequest(intValue)
state.Handle(Value);
publicvoidSetState(Statestate)
this.state=state;
}
State(状态接口类)
///summary
///Describe:状态接口类
///Note:指定状态的接口,负责规范Context(状态拥有者)在特定状态下要表现的行为。
////summary
publicabstractclassState
protectedContextm_Context=null;
publicState(Contextcontext)
m_Context=context;
publicabstractvoidHandle(intValue);
}
ConcreteState(具体状态类)
/*
Describe:具体状态类
Note:
1、继承自State(状态接口类)
2、实现Context(状态拥有者)在特定状态下该有的行为。
//状态A
publicclassConcreteStateA:State
publicConcreteStateA(Contextcontext):base(context)
publicoverridevoidHandle(intValue)
if(Value10)
m_Context.SetState(newConcreteStateB(m_Context));
//状态A
publicclassConcreteStateB:State
publicConcreteStateB(Contextcontext):base(context)
publicoverridevoidHandle(intValue)
if(Value10)
m_Context.SetState(newConcreteStateC(m_Context));
//状态A
publicclassConcreteStateC:State
publicConcreteStateC(Contextcontext):base(context)
publicoverridevoidHandle(intValue)
if(Value10)
m_Context.SetState(newConcreteStateA(m_Context));
}
三、使用状态模式(state)实现游戏场景的转换
场景结构示意图:
ISceneState场景类接口
///summary
///Describe:场景类接口
///Note:定义场景转换和执行时需要调用的方法。
////summary
publicclassISceneState
//状态名称
privatestringm_StateName=ISceneState;
publicstringStateName
get=m_StateName;
set=m_StateName=value;
//控制者
protectedSceneStateControllerm_Contro