unity3d人工智能学习(7)——游戏状态机FSM

游戏状态机FSM

简述

参考教程:
Unity3D有限状态机(FSM)学习笔记【7】使用实例.
FSM有限状态机学习及Unity3D案例讲解.

在这里插入图片描述
游戏最终结果:
开始游戏的时候,Enemy会沿着设定好的PatrolPoints路径进行巡逻,如果Player与Enemy之间小于4时,Enemy就会追逐Player,当Player距离大于8的时候,Enemy会回去继续进行巡逻。

操作过程

  1. 建立一个简单场景,包括敌人(Enemy),玩家(Player),巡逻点多个(PatrolPoints)。
    在这里插入图片描述

  2. Enemy添加Enemy标签TAG,Player添加Player标签TAG。两个都要添加Character Controller组件。
    在这里插入图片描述
    在这里插入图片描述

  3. 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 + "不存在,请查看该转换条件是否正确");
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值