角色的有限状态 :
此类表示有限状态系统中的状态。
每个状态都有一个字典,其中有成对的(transition-stateID)显示
如果在此状态下触发转换,则FSM应该处于哪个状态是当前状态。
方法Reason用于确定触发的条件
方法Act具有执行角色在此状态下应执行的操作的代码。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//状态转换条件
public enum CubeTransition
{
NullTansition,
SeeEnemy,
NoEnemy,
CanAttack
}
//状态的ID
public enum CubeStateID
{
NullState,
Idle,
Chase,
Attack
}
/// <summary>
/// 此类表示有限状态系统中的状态。
/// </summary>
public abstract class ICubeState {
protected Dictionary<CubeTransition, CubeStateID> mMap = new Dictionary<CubeTransition, CubeStateID>();
protected CubeStateID mStateID;
protected CubeFSMSystem mFSM;
public CubePlayer mPlayer;
public CubeStateID StateID { get { return mStateID; } }
public ICubeState(CubeFSMSystem fsm,CubePlayer player)
{
mFSM = fsm;
mPlayer = player;
}
public void AddTransition( CubeTransition trans,CubeStateID id)
{
if (trans == CubeTransition.NullTansition)
{
Debug.LogWarning("当前状态CubeTransiton为空 :"+trans);
return;
}
if (id == CubeStateID.NullState)
{
Debug.LogWarning("当前状态ID : CubeStateID为空:" + id);
return;
}
if (mMap.ContainsKey(trans))
{
Debug.LogWarning("当前状态:" + trans +" 已经添加过了");
return;
}
mMap.Add(trans,id);
}
public void DelectTransition(CubeTransition trans)
{
if (mMap.ContainsKey(trans) == false)
{
Debug.LogError("删除转换条件的时候, 转换条件:[" + trans + "]不存在");
return;
}
mMap.Remove(trans);
}
public CubeStateID GetOutPutStateID(CubeTransition