using System.Collections.Generic;
using System.Linq;
using System.Text;
public enum StateType:byte
{
Follow, //追踪
Attack, //攻击
Partrol,//巡逻
Death //死亡
}
/// <summary>
/// 所有的具体状态都实现这个接口
/// </summary>
public interface IState
{
FSM fsm { get; set; } //所属的状态机
StateType stateType { get; } /// 状态类型。
void EnterState(); //状态进入
void StateUpdate(float deltaTime); ///状态更新
void StateLateUpdate(float deltaTime);
void ExitState(); //状态退出
}
**************************************************************************************************************
using System;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 状态机类,管理各个状态实例。
/// 作用
/// 1.把能够切换管理的各个状态注册到状态机里。
/// 2.移除状态
/// 3.在各个状态间切换的逻辑
/// 4.不断的更新当前状态
///
///
///
/// 通俗点讲,
/// 1.有限状态机是:将对象的状态(攻击、闲置、晕眩)的实现代码,提取出来,封装成状态。
/// 由状态机负责在各个状态之间调度。
// 2 .对象(AI对象)持有状态管理类(状态机)的引用,与具体的状态解耦
/// </summary>
public class FSM
{
private Dictionary<StateType, IState> stateDic;
//当前状态
private IState currentState;
private GameObject role; //关联一个游戏兑现(AI对象)
public GameObject Role
{
get { return role; }
}
public FSM(GameObject role)
{
this.role = role;
stateDic = new Dictionary<StateType, IState>();
}
//注册状态
/// <summary>
/// 只有注册过的状态才可以被切换
/// </summary>
/// <param name="state"></param>
public void registerState(IState state)
{
IState s;
stateDic.TryGetValue(state.stateType, out s);
if (s == null)
{
state.fsm = this;
stateDic.Add(state.stateType, state);
}
else
{
Debug.Log("已经有" + state.stateType + "了,不可以重复注册");
}
}
/// <summary>
///
/// </summary>
/// <param name="stateType"></param>
public void removeState(StateType stateType)
{
if (currentState.stateType != stateType)
{
IState s;
stateDic.Tr