Unity c# 狀态機的簡單入門
狀态機模式在unity中作用是非常大的,可以實作角色的移動和場景的跳轉,包括一些動畫的播放,在很多unity架構中也是很常見的,發散思維廣闊,下面是簡單的狀态機的實作,有注釋
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum StateType
{
Idle,
Die,
Move,
}
public abstract class StateObject
protected StateManger state;
public StateObject(StateManger _sm)
{
state = _sm;
}
//進入方法
public abstract void EnterState();
//離開方法
public abstract void ExiState();
//持續更新方法
public abstract void UpdateState();
//站着狀态
public class IdleState : StateObject
public IdleState(StateManger state):base(state)
{
}
public override void EnterState()
{
Debug.Log("進入站着狀态");
}
public override void ExiState()
{
Debug.Log("離開站着狀态");
}
public override void UpdateState()
{
Debug.Log("等待站着狀态");
if (Input .GetKey(KeyCode.M))
{
Debug.Log("按下咯");
state.ChangeState("Move");
}
if (Input.GetKey(KeyCode.D))
{
state.ChangeState("Die");
}
}
//移動狀态
public class MoveState : StateObject
public MoveState(StateManger state):base(state)
{
}
public override void EnterState()
{
Debug.Log("進入移動狀态");
}
public override void ExiState()
{
Debug.Log("離開移動狀态");
}
public override void UpdateState()
{
Debug.Log("進入移動更新狀态");
if (Input.GetKey(KeyCode.D))
{
state.ChangeState("Die");
}
if (Input.GetKey(KeyCode.I))
{
state.ChangeState("Idle");
}
}
//死亡狀态
public class DieState : StateObject
public DieState(StateManger state) : base(state)
{
}
public override void EnterState()
{
Debug.Log("進入死亡狀态");
}
public override void ExiState()
{
Debug.Log("離開死亡狀态");
}
public override void UpdateState()
{
Debug.Log("進入死亡更新狀态");
if (Input.GetKey(KeyCode.I))
{
state.ChangeState("Idle");
}
}
public class StateManger {
//字典存儲狀态
Dictionary<string, StateObject> dic = new Dictionary<string, StateObject>();
//目前狀态
StateObject currentstate;
//注冊狀态
public void Region(string statename,StateObject state)
{
//判斷字典中是否存在這個鍵
if (!dic.ContainsKey(statename))
{
dic.Add(statename,state);
}
}
//設定預設狀态
public void SetDefat(string statename)
{
//判斷字典中是否存在這個狀态
if (dic.ContainsKey(statename))
{
//存在就指派給currentstate
currentstate = dic[statename];
//調用目前狀态的進入(EnterState)方法
currentstate.EnterState();
}
}
//改變狀态
public void ChangeState(string statename)
{
//判斷字典中是否存在這個狀态
if (dic.ContainsKey(statename))
{
//目前狀态是否為空
if (currentstate!=null)
{
//調用上一個狀态的離開方法
currentstate.ExiState();
//把取到的狀态指派給currentstate
currentstate = dic[statename];
//調用取到狀态的進入方法
currentstate.EnterState();
}
}
}
//更新狀态
public void UpdateState()
{
Debug.Log("更新狀态");
if (currentstate!=null)
{
//目前狀态的UpdateState方法
currentstate.UpdateState();
}
}
public class FMSC : MonoBehaviour {
StateManger sm = new StateManger();
// Use this for initialization
void Start () {
//注冊站着的方法
sm.Region("Idle",new IdleState(sm));
//注冊死亡的方法
sm.Region("Die",new DieState(sm));
//注冊移動的方法
sm.Region("Move",new MoveState(sm));
//設定預設狀态
sm.SetDefat("Idle");
}
// Update is called once per frame
void Update () {
//持續調用目前狀态的UpdateState方法
sm.UpdateState();
}
每個狀态都是有自己的方法,在每個狀态有不同要做的事情,減少代碼的耦合性
作者:憨豆人生
來源:CSDN
原文:
https://blog.csdn.net/qq_40390815/article/details/90633826版權聲明:本文為部落客原創文章,轉載請附上博文連結!