1. 程式人生 > >C#狀態機

C#狀態機

 

public enum PersonState
{
EatMeal, //--->0
Work, //--->1
Sleep, //--->2
Chat //--->3
}


public class StateTest : MonoBehaviour
{
//當前幀的狀態
public PersonState mState = PersonState.EatMeal;
//上一幀的狀態
private PersonState lastState;

A----------------------------------------------------------------------------------------------------------------------
void Start () {

//列舉型別和int直接可以很友好的進行轉換
state = PersonState.Sleep;
Debug.Log((int)state);
int a = 3;
PersonState stateConvert = (PersonState)a;
Debug.Log(stateConvert);
}
此處打印出來2,chat

如圖所示

 


B-------------------------------------------------------------------------------------------------------------------
void Update () {


if (state ==PersonState.EatMeal)
{
//根據當前的狀態 書寫當前狀態下的邏輯

Debug.Log("吃飯中");
}
else if (state == PersonState.Sleep)
{
Debug.Log("睡覺中");
}
else if (state == PersonState.Work)
{
Debug.Log("滾,我在工作");
}
else
{
Debug.Log("我在撩妹,爬一邊去");
}

 

 

 

C---------------------------------------------------------------------------------------------------------------------------

 

if (mState != lastState)
{
//狀態機 狀態機管控者
Context context = new Context();
//一個狀態 sleep狀態
IState state = new Sleep(context);
switch (mState)
{
case PersonState.Sleep:
state = new Sleep(context);
break;
case PersonState.EatMeal:
state = new EatMeal(context);
break;
case PersonState.Work:
state = new Work(context);
break;
case PersonState.Chat:
state = new Chat(context);
break;

default:
break;
}
context.SetState(state);
context.Handle();
lastState = mState;//更新上一狀態為本幀狀態
}
}
}
public interface IState//狀態的介面
{
void Handle();//方法是 當前狀態 應該處理的事情
}
public class Context//狀態機
{
private IState mState;//當前狀態
//設定當前狀態
public void SetState(IState state)
{
mState = state;
}
public void Handle()
{
mState.Handle();//執行當前狀態下的方法
}
}


public class Sleep : IState
{
//成員變數 狀態屬性
//當前狀態 所屬的管控領導
private Context mContext;
public Sleep(Context context)
{
mContext = context;//對當前狀態屬性(狀態機管理者屬性) 進行賦值
}
public void Handle()
{
Debug.Log("你他媽滾蛋,勞資在睡覺");
}
}
public class Work : IState
{
//成員變數 狀態屬性
//當前狀態 所屬的管控領導
private Context mContext;
public Work(Context context)
{
mContext = context;//對當前狀態屬性(狀態機管理者屬性) 進行賦值
}
public void Handle()
{
Debug.Log("加班加班,人生真苦,及時行樂");
}
}
public class EatMeal : IState
{
//成員變數 狀態屬性
//當前狀態 所屬的管控領導
private Context mContext;
public EatMeal(Context context)
{
mContext = context;//對當前狀態屬性(狀態機管理者屬性) 進行賦值
}
public void Handle()
{
Debug.Log("吃吃吃,就知道吃");
}
}
public class Chat : IState
{
//成員變數 狀態屬性
//當前狀態 所屬的管控領導
private Context mContext;
public Chat(Context context)
{
mContext = context;//對當前狀態屬性(狀態機管理者屬性) 進行賦值
}
public void Handle()
{
Debug.Log("不要打擾為父,為父在跟瑤妹聊天");
}
}

 

 

 

 

 

 

 

狀態機