【Unity】行为树与状态机,技能系统做法

状态机

FSM :具有有限数量的状态,任意时刻都处于有限状态集合中的某一状态。
当其有事件(event)或条件发生时,将从 当前状态(cur_state)  转换到 另一个状态(next_state) ,或者仍然保持在当前状态。

State:状态,状态内执行一个或多个动作(action)

Action:动作,执行具体事情,执行时机有Enter、Update、Exit方法。

它的优点:
1.编程快速简单  2.易于调试  3.很少的计算开销  4.直觉性  5.灵活性

缺点:
1.状态机总是在某一状态中,不能执行多个状态的事情,
      解决:设置多层状态机同时运行解决这个问题
2.不易于拓展,新的逻辑需要新的状态。
      解决:在状态运行多个小Action,复用Aciton,但Action会变得细碎

实现

行为树

行为树:是一棵具有层级结构的树,连接树枝的是各种类型的节点,节点决定了 AI 如何从根节点走到某一个叶子节点,树的末端就是实际要去做的事情。

  1. 遍历
    行为树的一个特点就是它会一层一层的对节点依次进行检查,而每一层都要花费一个 Tick 的时间,所以一棵树要花费很多 Tick 的时间才能完成遍历,这和一般代码的实现有很大的区别。这是一个很没有效率的方式,尤其是当树变得很深的时候。我认为行为树的实现最好要在一次 Tick 里面完成整个行为树的逻辑判断,也就是说最好能在一次 Tick 时间里完成整棵树的遍历
  2.   节点
    【Unity】行为树与状态机,技能系统做法_第1张图片【Unity】行为树与状态机,技能系统做法_第2张图片
     

     常用:
    动作(action) 赋值 

    条件(condition)
    选择
    序列 
    条件执行 
    决定项返回
    【Unity】行为树与状态机,技能系统做法_第3张图片

  3. 简单模板

    根节点:                         
    开始→总是运行→(条件idle)总是成功
                             →(条件battle)总是成功
                             →(条件flee)总是成功        

    分支:
    ①总是成功→序列(为了扩展)→系列事情(末端决策)
                                                  →系列事情(末端决策)

  4. 问题
    Q:一般AI行为树是广度遍历?深度遍历?
    A:广
    Q:每帧

    都要从根节点开始

    遍历行为树,如何优化?
    A:单独维护一个保存某些行为的列表(调度器),当正在执行的行为终止时,由其父节点决定接下来的行为。
    Q:gc?
    A:行为树本身---每次运行变量都要申请内存。
          其他---字符串拼接。
     

技能

使用Animator基类 所有怪物都继承
用Animator的打标签作为通用,
特殊的写技能脚本 使用Type.GetConstructors获取实例化构造函数

【Unity】行为树与状态机,技能系统做法_第4张图片

 

你可能感兴趣的:(Unity,unity,游戏引擎)