1. 程式人生 > >【Unity與23種設計模式】狀態模式(State)

【Unity與23種設計模式】狀態模式(State)

unity public text 開始 sys 狀態模式 改變 val 繼承

定義:

“讓一個對象的行為隨著內部狀態的改變而變化,而該對象也像是換了類一樣”

應用場景:

角色AI:控制角色在不同狀態下的AI行為

服務器連接狀態:開始連線、連線中、斷線等狀態

關卡進行狀態:不同關卡

using System;
using UnityEngine;

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;
}
}

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("ConcreteStateA.Handle");
if (Value > 20)
m_Context.SetState(new ConcreteStateC(m_Context));
}
}

//狀態C
public class ConcreteStateC : State
{
public ConcreteStateC(Context theContext) : base(theContext) { }

public override void Handle(int Value)
{
Debug.Log("ConcreteStateA.Handle");
if (Value > 30)
m_Context.SetState(new ConcreteStateA(m_Context));
}
}

Context(狀態擁有者)

一個具有狀態屬性的類,可以制定相關的接口,讓外界能夠得知狀態的改變或通過操作讓狀態改變

State(狀態接口類)

制定狀態的接口,負責規範Context在特定狀態下要表現的行為。

ConcreteState(具體狀態類)

繼承自State,實現Context在特定狀態下該有的行為。

文章整理自書籍《設計模式與遊戲完美開發》 菜升達 著

【Unity與23種設計模式】狀態模式(State)