Unity implémente un modèle de conception - modèle d'état
L'idée principale de conception du modèle d'état est d'abstraire l'état d'un objet dans une interface, puis d'encapsuler son comportement en fonction de ses différents états. De cette façon, la liaison de l'état et du comportement peut être réalisée, et finalement le un découplage efficace des objets et des états peut être obtenu.
Dans le développement réel, la mise en œuvre de la machine à états finis FSM est généralement utilisée.Le FSM et le contrôle de processus dans le cadre GF sont implémentés sur la base de ce principe.
1.State (classe d'état de base abstraite)
public abstract class State
{
protected Context m_Context = null;
public State(Context theContext)
{
m_Context = theContext;
}
public abstract void Handle(int Value);
}
2.ConcreteStateA, ConcreteStateB, ConcreteStateC
Sous-classes d'état
/// <summary>
/// 状态A
/// </summary>
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));
}
}
/// <summary>
/// 状态B
/// </summary>
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));
}
}
/// <summary>
/// 状态C
/// </summary>
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));
}
}
3.Contexte
Classe de contexte - contient l'état actuel et transmet les informations pertinentes à l'état
public class Context
{
State m_State = null;
public void Request(int Value)
{
m_State.Handle(Value);
}
public void SetState(State theState)
{
Debug.Log("Context.SetState:" + theState);
m_State = theState;
}
}
4. Testez le code
public class StatePatternExample5 : MonoBehaviour
{
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);
}
}