状态机用法
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
}