1. 程式人生 > >狀態模式C#場景控制

狀態模式C#場景控制

下面是控制場景的類圖,可能會有疑惑,控制場景就簡單的用
        SceneManager.LoadScene()這樣 不就可以了嗎,但是, 每次來了新工程 ,都要這樣複用,很繁瑣,

不如用設計模式,減少重複性的工作,分離,解耦合,這樣一來, 別的工程來了就可以使用了。

場景控制的應用

 

狀態模式的

原型 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class  _01StateDesignMode : MonoBehaviour
{
    private void Start()
    {
        Context context = new Context();

        context.SetState(new ConcreteStateA(context));

        context.Handle(20);
        context.Handle(5);
        context.Handle(11);
        context.Handle(10);
    }
}
public class Context
{
    private  IState m_stateA;

    public void SetState(IState state) //里氏替換原則
    {
        m_stateA = state;
    }

   public void Handle(int arg)
    {
        m_stateA.Handle(arg);
    }
}

public interface IState
{
    void Handle(int arg);
}
public class ConcreteStateA : IState
{
    public ConcreteStateA( Context context)
    {
        m_context = context;
    }
    private Context m_context;
    public void Handle(int arg)
    {
        Debug.Log("ConcreteStateA");

        if (arg>10)
        {
            m_context.SetState(new ConcreteStateB(m_context));
        }
    }
}
public class ConcreteStateB : IState
{
    public ConcreteStateB(Context context)
    {
        m_context = context;
    }
    private Context m_context;
    public void Handle(int arg)
    {
        Debug.Log("ConcreteStateB");
        if (arg<=10)
        {
            m_context.SetState(new ConcreteStateA(m_context));
        }
    }
}

 

狀態 模式在遊戲中算是常用的了,敵人的AI,NPC AI等等,雖然可以用行為樹來控制, 但是用狀態模式,可以很方便控制他們的狀態,行動,死亡 ,發呆,追蹤,受傷等等... 最簡單 暴力是可以用列舉 +swich來實現,但是這樣做的後果就是後面 維護起來,很困難,最好 就 單一的分開。面向物件中的單一職責嘛,最好是就有個抽象類或者介面,來約束他們,提取他們共同的地方,方便後面維護,比如每個活物都有 發呆 ,行動等 狀態,可以把用一個抽象類或者介面,作為他們的繼承物件,這樣一來,就尊重了開放,封閉 原則。