原文地址:blog.liujunliang.com.cn
在之前有过介绍一个可视化有限状态机编辑器插件PlayerMaker
在这里也可以在我们的代码中实现一个状态机
本文源码地址:点击打开链接
首先创建一个脚本,来管理我们的各个状态
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
/// <summary>
/// 状态ID
/// </summary>
public enum FSMStateID
{
NullFSMStateID,
PatrolFSMStateID,//巡逻状态
ChaseFSMStateID,//追逐状态
}
/// <summary>
/// 状态转化条件
/// </summary>
public enum FSMTransition
{
SeePlayer,//看到主角(目标)
LeavePlayer,//远离敌人(目标)
}
public class FSMSystem
{
private FSMStateID mCurrentStateID;
private FSMBaseState mCurrentState;
private Dictionary<FSMStateID, FSMBaseState> mFSMStateDic = new Dictionary<FSMStateID, FSMBaseState>();
public void AddFSMSate(FSMBaseState state)
{
if (state == null)
{
Debug.Log("角色状态为空,无法添加");
return;
}
if (mCurrentState == null)
{
//第一个添加的状态被作为系统首个运行的状态
mCurrentStateID = state.mStateID;
mCurrentState = state;
mCurrentState.StateStart();
}
if (mFSMStateDic.ContainsValue(state))
{
Debug.Log("容器内存在该状态");
return;
}
mFSMStateDic.Add(state.mStateID, state);
}
public void DeleteFSMSate(FSMBaseState state)
{
if (state == null)
{
Debug.Log("角色状态为空,无法添加");
return;
}
if (!mFSMStateDic.C