简述
参考教程:
Unity3D有限状态机(FSM)学习笔记【7】使用实例.
FSM有限状态机学习及Unity3D案例讲解.
游戏最终结果:
开始游戏的时候,Enemy会沿着设定好的PatrolPoints路径进行巡逻,如果Player与Enemy之间小于4时,Enemy就会追逐Player,当Player距离大于8的时候,Enemy会回去继续进行巡逻。
操作过程
-
建立一个简单场景,包括敌人(Enemy),玩家(Player),巡逻点多个(PatrolPoints)。
-
Enemy添加Enemy标签TAG,Player添加Player标签TAG。两个都要添加Character Controller组件。
-
Enemy添加Enemy脚本,Player添加Player脚本(用这2个脚本之前还有多个基本脚本)
定义枚举类型
public enum StateID
{
NullStateID,
PatrolState,
ChaseState
}
public enum Transition
{
NullTransition,
FindPlayer,
LosePlayer
}
FSMState基类
public abstract class FSMState
{
protected StateID stateID;
public StateID ID {
get {
return this.stateID; } }
protected Dictionary<Transition, StateID> map = new Dictionary<Transition, StateID>();
protected FSMSystem fsm;
public FSMState(FSMSystem fsm)
{
this.fsm = fsm;
}
/// <summary>
/// 添加转换条件
/// </summary>
/// <param name="trans">转换条件</param>
/// <param name="stateID">转换的目标状态</param>
public void AddTransition(Transition trans, StateID stateID)
{
if (trans == Transition.NullTransition)
{
Debug.LogError(trans + "为空,转换条件不允许为空"); return;
}
if (stateID == StateID.NullStateID)
{
Debug.LogError(stateID + "为空,状态ID不允许为空"); return;
}
if (map.ContainsKey(trans))
{
Debug.LogError(trans + "已经存在,请查看该转换条件是否正确");
}
else
{
map.Add(trans, stateID);
}
}
/// <summary>
/// 删除转换条件
/// </summary>
/// <param name="trans">需删除的转换条件</param>
public void DeleteTransition(Transition trans)
{
if (trans == Transition.NullTransition)
{
Debug.LogError(trans + "为空,转换条件不允许为空"); return;
}
if (map.ContainsKey(trans) == false)
{
Debug.LogError(trans + "不存在,请查看该转换条件是否正确");