一文足矣:Unity&行为树(三)

简介: 一文足矣:Unity&行为树

行为树的管理&操作


一、操作单颗树


这是我们项目里面,一个敌人绑定了行为树,自动创建的behavior tree 脚本:

cb9a1637c0f3496399085cea522ff313.png将红框放大可以看到:

image.png

行为树组件包含以下几个属性:

ae02c18e3dc6480391dc4b0599ea9ea4.png

那当我们有需要的时候,如何代码操作这些变量呢?

(1)我们必须先找到要操作的树

找树的方法1:定义一个Public的 BehaviorTree tree = new BehaviorTree();,然后面板拖拽赋值。

找树的方法2:定义一个privarte的 BehaviorTree tree = new BehaviorTree();,然后通过GameObject 的Find查找物体,然后获得物体上面的组件来得到的。

(2)代码操作该树

using BehaviorDesigner.Runtime.Tasks;//引用不可少
using BehaviorDesigner.Runtime;
public class Tree : MonoBehaviour {
public BehaviorTree tree = new BehaviorTree();
void Start () {
    tree.enabled = false;
    var a = tree.GetAllVariables();
    tree.StartWhenEnabled = false;
    var b = tree.FindTasksWithName("AI_Daze");
  }
}

上面代码只是简单的演示一下,可以操作行为树的数据。其实 面板截图里面的所有变量都可以操作,除此之外,tree还有很多的属性和方法都可以操作。

二、管理所有树


image.png

当行为树运行时,将会自动创建一个带有行为管理器组件的新游戏对象,并且该对象上面绑有 behavior manager组件。此组件管理你场景中所有的执行的行为树

你可以控制行为树的更新类型,以及更新时间等等

Update Interval:更新频率

Every Frame:每帧都更新行为树

Specify Seconds:定义个一个更新间隔时间

Manual:手动调用更新,选择这个后需要通过脚本来调用行为树的更新

Task Execution Type:任务执行类型

No Duplicates:不重复

Repeater Task:重复任务节点。如果设置成了5,那么每帧被执行5次

BehaviorManager.instance.Tick();

此外,如果你想让不同的行为树都有各自独立的更新间隔的话,可以这样:

BehaviorManager.instance.Tick(BehaviorTree);

更多方法,请查看BehaviorManager类

自定义Task任务


一般复合类和装饰类的Task是够用的,甚至有些根本用不到,而具体的行为类Task和条件类Task从来都不能满足我们的需求,而且自己写这类Task可以很大程度的简化整个行为树结构。

自己写Task的步骤如下:

1.引入命名空间:


using BehaviorDesigner.Runtime;
using BehaviorDesigner.Runtime.Tasks;

2.明确继承的Task类型:


1. public class MyInputMove : Action
2. public class MyIsInput : Conditional

3.知晓Task内部函数的执行流程:


image.png

观察上图就会发现和Unity中编写脚本大同小异,不一样的地方就是这里的Update有返回值,要返回该任务的执行状态,只有在Running状态时才每帧调用:

using UnityEngine;
using BehaviorDesigner.Runtime;
using BehaviorDesigner.Runtime.Tasks;
public class MyInputMove : Action
{
    public SharedFloat speed = 5f;
    public override TaskStatus OnUpdate()
    {
        float inputX = Input.GetAxis("Horizontal");
        float inputZ = Input.GetAxis("Vertical");
        if (inputX != 0 || inputZ != 0)
        {
            Vector3 movement = new Vector3(inputX, 0, inputZ);
            transform.Translate(movement*Time.deltaTime*speed.Value);
            return TaskStatus.Running;
        }
        return TaskStatus.Success;
    }
}

总结


行为树的如下几种优点


> 静态性


越复杂的功能越需要简单的基础,否则最后连自己都玩不过来。

静态是使用行为树需要非常着重的一个要点:即使系统需要某些"动态"性

其实诸如Stimulus这类动态安插的Node看似强大,但却破坏了本来易于理解的静态性,弊大于利。

Halo3相对于Halo2对BT AI的一个改进就是去除Stimulus的动态性。取而代之的做法是使用Behavior Masks,Encounter Attitude,Inhibitions。

原则就是保持全部Node静态,只是根据事件和环境来检查是否启用Node。

静态性直接带来的好处就是整棵树的规划无需再运行时动态调整,为很多优化和预编辑都带来方便。

> 直观性


行为树可以方便地把复杂的AI知识条目组织得非常直观。默认的Composite Node的从begin往end的Child Node迭代方式就像是处理一个预设优先策略队列,也非常符合人类的正常思考模式:先最优再次优。

行为树编辑器对优秀的程序员来说也是唾手可得。

> 复用性


各种Node,包括Leaf Node,可复用性都极高。实现NPC AI的个性区别甚至可以通过在一棵共用的行为树上不同的位置来安插Impulse来达到目的。当然,当NPC需要一个完全不同的大脑,比如100级大BOSS,与其绞尽脑汁在一棵公用BT安插Impulse,不如重头设计一棵专属BT。

> 扩展性


虽然上述Node之间的组合和搭配使用几乎覆盖所有AI需求。

但也可以容易地为项目量身定做新的Composite Node或Decorator Node。

还可以积累一个项目相关的Node Lib,长远来说非常有价值。

目录
相关文章
|
5月前
|
人工智能 定位技术 图形学
【unity实战】制作敌人的AI,使用有限状态机、继承和抽象类多态 定义不同状态的敌人行为
【unity实战】制作敌人的AI,使用有限状态机、继承和抽象类多态 定义不同状态的敌人行为
142 1
|
5月前
|
图形学
【unity小技巧】手戳代码程序化绘制地形Terrain树和预制体物品、动物
【unity小技巧】手戳代码程序化绘制地形Terrain树和预制体物品、动物
52 0
|
5月前
|
图形学
【推荐100个unity插件之17】具有可破坏/砍倒unity地形树木能力的破坏系统,实现unity砍树效果 —— DestroyIt - Destruction System
【推荐100个unity插件之17】具有可破坏/砍倒unity地形树木能力的破坏系统,实现unity砍树效果 —— DestroyIt - Destruction System
142 0
|
5月前
|
人工智能 数据可视化 程序员
【推荐100个unity插件之7】使用BehaviorDesigner插件制作BOSS的AI行为树
【推荐100个unity插件之7】使用BehaviorDesigner插件制作BOSS的AI行为树
211 0
|
人工智能 搜索推荐 图形学
一文足矣:Unity&行为树(一)
一文足矣:Unity&行为树
893 1
一文足矣:Unity&行为树(一)
|
数据库
一文足矣:Unity&行为树(二)
一文足矣:Unity&行为树
152 0
一文足矣:Unity&行为树(二)
|
图形学
Unity Metaverse(二)、Mixamo & Animator 混合树与动画融合
Blend Tree混合树的使用与动画融合的实现
311 1
Unity Metaverse(二)、Mixamo & Animator 混合树与动画融合
|
3月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
178 6
|
2月前
|
测试技术 C# 图形学
掌握Unity调试与测试的终极指南:从内置调试工具到自动化测试框架,全方位保障游戏品质不踩坑,打造流畅游戏体验的必备技能大揭秘!
【9月更文挑战第1天】在开发游戏时,Unity 引擎让创意变为现实。但软件开发中难免遇到 Bug,若不解决,将严重影响用户体验。调试与测试成为确保游戏质量的最后一道防线。本文介绍如何利用 Unity 的调试工具高效排查问题,并通过 Profiler 分析性能瓶颈。此外,Unity Test Framework 支持自动化测试,提高开发效率。结合单元测试与集成测试,确保游戏逻辑正确无误。对于在线游戏,还需进行压力测试以验证服务器稳定性。总之,调试与测试贯穿游戏开发全流程,确保最终作品既好玩又稳定。
106 4
|
3月前
|
图形学 缓存 算法
掌握这五大绝招,让您的Unity游戏瞬间加载完毕,从此告别漫长等待,大幅提升玩家首次体验的满意度与留存率!
【8月更文挑战第31天】游戏的加载时间是影响玩家初次体验的关键因素,特别是在移动设备上。本文介绍了几种常见的Unity游戏加载优化方法,包括资源的预加载与异步加载、使用AssetBundles管理动态资源、纹理和模型优化、合理利用缓存系统以及脚本优化。通过具体示例代码展示了如何实现异步加载场景,并提出了针对不同资源的优化策略。综合运用这些技术可以显著缩短加载时间,提升玩家满意度。
159 5
下一篇
无影云桌面