using System.Collections;using System.Collections.Generic;using UnityEngine;//状态抽象类 -- 由各个状态继承该状态类,衍生出各种状态public abstract class StateBase { //当前状态所对应的的ID号 -- //比如继承自该状态衍生出来的IDLE状态,ID为2,则在判断是否为该状态时提供依据 abstract public int ID { get; } //抽象函数,由继承自该类的其他状态重写 //在第一次进入的时候运行该函数,该函数在改状态第一次运行的时候,只运行一次 abstract public void Enter(StateEventData stateData); //当状态一直停留在该状态的时候,每帧都会运行一次该函数 abstract public void Execute(StateEventData stateData); //当该状态运行完毕,离开之前,运行一次该函数 abstract public void Exit(StateEventData stateData);}//*****************************************************************************************//using System.Collections;using System.Collections.Generic;using UnityEngine;/// <summary>/// 单例/// </summary>/// <typeparam name="T"></typeparam>public class SingleTon<T> where T :class ,new(){ private static T instance; public static T GetT { get { if (instance == null) { instance = new T(); } return instance; } }}//**********************/// <summary>/// 单例/// </summary>/// <typeparam name="T"></typeparam>public class SingleTon<T> where T :class ,new(){ private static T instance; public static T GetT { get { if (instance == null) { instance = new T(); } return instance; } }}//*****************************************************************************************///// <summary>/// 状态执行机/// </summary>public class FsmCore{ //当前状态 public StateBase CurrentState = null; ///上一个状态 public StateBase PrevState = null; //携带的数据体/内容 public StateEventData Data = null; //设置状态机题主运行的标志位 //是否让该状态机停止 public bool IsStop = false; public StateBase GetStateByPlayerBattle(PlayerBattle plBattleIndex) { switch (plBattleIndex) {///让每个状态对应自己的状态类 case PlayerBattle.Idle: return new Stationary_state(); case PlayerBattle.Wath: return new Random_movement_state(); case PlayerBattle.Run: return new Follow_state(); case PlayerBattle.Attack: return new Attack_state(); case PlayerBattle.Death: return new Death_state(); default: return new Stationary_state(); } } //改变当前状态机运行的状态 public void ChangeState( //当前要变成的具体状态 StateBase state, //当前状态所携带的数据 StateEventData paramData, //上一个状态推出时应该携带的数据 StateEventData prevData) { if (paramData == null && state.ID == CurrentState.ID) {//如果数据为空 如果当前状态等于当于当前状态 return; } if (PrevState != null) { PrevState.Exit(paramData);//传进来的上一个数据给上一个数据 } PrevState = CurrentState;//当前状态赋值给上一个状态 CurrentState = state;//当前状态变成当前状态 Data = paramData;//传进来的数据附给现在的数据 CurrentState.Enter(Data); } public void UpdateState() { if (CurrentState == null) { return; } else { CurrentState.Execute(Data); } } public void Start(StateBase state, StateEventData paramData, StateEventData prevData) { ChangeState(state, paramData, prevData); }}public enum PlayerBattle{ Idle, Wath, Run, Attack, Death}