行为树

unity行为树简介

做~自己de王妃 提交于 2020-01-22 03:35:29
目前在Unity3D游戏中一般复杂的AI都可以看到行为树的身影,简单的AI使用状态机来实现就可以了,所以这里我也是简单的学习下,为以后用到做准备。 行为树的概念出现已经很多年了,总的来说,就是使用各种经典的控制节点+行为节点进行组合,从而实现复杂的AI。 Behavior Designer插件里,主要有四种概念节点,都称之为Task。包括: (1) Composites 组合节点,包括经典的:Sequence,Selector,Parallel (2) Decorator 装饰节点,顾名思义,就是为仅有的一个子节点额外添加一些功能,比如让子task一直运行直到其返回某个运行状态值,或者将task的返回值取反等等 (3) Actions 行为节点,行为节点是真正做事的节点,其为叶节点。Behavior Designer插件中自带了不少Action节点,如果不够用,也可以编写自己的Action。一般来说都要编写自己的Action,除非用户是一个不懂脚本的美术或者策划,只想简单地控制一些物件的属性。 (4) Conditinals 条件节点 ,用于判断某条件是否成立。目前看来,是Behavior Designer为了贯彻职责单一的原则,将判断专门作为一个节点独立处理,比如判断某目标是否在视野内,其实在攻击的Action里面也可以写,但是这样Action就不单一了,不利于视野判断处理的复用

行为树

拜拜、爱过 提交于 2019-12-26 19:10:52
前言   实现游戏AI,可以用有限状态机(FSM)或者分层有限状态机(HFSM),这两个实现都比较简单,只需要实现一个个状态之间的跳转函数即可,你可以用switch或者if实现,都是比较容易实现的。行为树实现可难要难点 ,本文就用行为树来研究小猫的AI实现。 行为树简介   行为树就是一个树结构,只是对树的节点有不同的定义,主要分为行为节点和控制节点。   行为节点就是叶子节点,是游戏主体最终执行的行为。   控制节点就是控制哪些行为节点执行以及怎样执行,又分为:   选择节点:       所有子节点依次执行,任何一个返回true,就停止并返回true,否则返回false。   顺序节点:       所有子节点依次执行,任何一个返回false,就停止并返回false,否则返回false。   并行节点又分为:     并发选择节点:       所有子节点同时执行,有一个节点返回true,就返回true。     并发顺序节点:       所有子节点同时执行,有一个节点返回false,就返回false。 例子   如下图,AINodeDes为树结构的所有节点的描述,后面也将根据这个描述建立真正的树形结构。      如下图,AINodeRegMgr类是一个辅助类,最终将填充AINodeHelper中的type2Create和type2Name变量

关于行为树

烈酒焚心 提交于 2019-12-17 09:55:06
简单介绍构建游戏AI所需要的一些工具:状态机,层次状态机,行为树的区别以及联系 Finite State Machines(有限状态机) 1. 基本节点是状态。他包含了一系列运行在该状态的行为以及离开这个状态的条件。 2. 这是图。状态可以任意跳转,实现简单,但是对于大的状态机很难维护.状态逻辑的重用性低. 3. 每一个状态的逻辑会随着一些新状态的增加而越来越复杂。维持状态的数量和状态逻辑复杂性是一个很大的难点。需要合理的分割以及重用状态。 4. 状态机状态的复用性很差,一旦一些因素变化导致这个环境发生变化。你只能新增一个状态,并且给这个新状态添加连接他以及其他状态的跳转逻辑 5. 状态机的跳转条件一旦不满足,就会一直卡在某一个状态(整个状态机就会卡住) Hierarchical FSM(层次状态机) 1. 基本的概念和状态机一样。 2. 可以将一些状态节点的归结成一个超级状态(Super-States),共享一些状态跳转逻辑(Generalized Transitions)。相对于状态机,它主要提供了可重用得跳转条件。 3. 绝大多数层次状态机设计的时候,每一个子状态通常只包含在一个Super-States里面。(如果A,B两个Super-State都包含相同的子状态,则A,B分别添加两个不同的子状态实例) 4. 超级状态跳转依然需要考虑很多不同的子状态的情况

做游戏长知识------基于行为树与状态机的游戏AI(一)

亡梦爱人 提交于 2019-12-10 05:28:39
孙广东 2014.6.30 AI。 我们的第一印象可能是机器人,如今主要说在游戏中的应用。   现代的计算机游戏中已经大量融入了AI元素,平时我们进行游戏时产生的交互都是由AI来完毕的。比方在RPG游戏中出现的NPC,实际上就是一个AI的载体。它们有着最常规,以及特定情景的推断能力与数据处理能力。推断。也称为分析。 大量的分析,即逻辑。逻辑,即AI.   最形象的样例应该是游戏中具有攻击能力的怪物,当它们看到玩家时(或者被玩家攻击)的情况下,怪物可能会在指定范围或者指定时间段内尾随玩家并试图反击。 但当玩家离开怪物的视野范围或者超过了怪物的尾随时间。怪物则会自己主动返回原来的地方。而当玩家下次出如今同一个怪物的视野内时,怪物依旧会作出同样的举动。但这并不能代表怪物具有记忆能力,由于它仅仅能依据简单的程序去推断外界发生的特定场景以作出对应的处理。这纯粹是基于数字储存器与状态机的人工智能。假设我们在此基础上再进行优化,让怪物具有记忆能力:再次看到玩家时的怪物将会出现愤慨状态,而且攻击能力变得更强,似乎会更加有趣。由于这接近了人类的情绪特征。 行为树(Behavior Tree)   依据上面所描写叙述的AI载体的特征,假设一个AI载体承载的知识量过于庞大,那就给维护带来了非常大的困扰。 仅仅是假设我们要实现较为智能的AI载体,庞大的知识库和行为特征是必须的。   行为树

Unity Behavior Tree Editor 行为树编辑器初级实现

泪湿孤枕 提交于 2019-12-03 14:56:48
Unity Behavior Tree Editor 行为树编辑器初级实现 编辑效果如下 编辑器脚本最好和行为树脚本分离。 需要存储的信息有:节点类型、子节点数组、(条件节点、行为节点需要特殊编辑) 数据存储在 NodeAsset 中,只需要包存一个根节点即可(从跟节点可以找到所有节点) [System.Serializable] public class NodeAsset : ScriptableObject { [SerializeField] public NodeValue nodeValue = null; } // 节点数据 [Serializable] public class NodeValue { // 根节点 public bool isRootNode = false; // 节点类型 public NodeType NodeType = NodeType.Select; // 子节点集合 public List<NodeValue> childNodeList = new List<NodeValue>(); // 叶节点脚本名 public string componentName = string.Empty; // 条件节点、行为节点描述(辅助查看) public string description = string.Empty; // 节点位置

UE4 行为树资料

匿名 (未验证) 提交于 2019-12-03 00:39:02
Composites 从左往右执行其子节点,直到一个达成,则 Select 达成并返回上层,否则失败并返回上层 从左往右执行其子节点,直到一个失败,则 Sequence 失败并返回上层,否则达成并返回上层 包含一个main task和一个sub tree, main task支持一个 Task 节点,用于执行一个主线行为,sub tree 支持一个行为树,伴随 main task 执行,返回结果是main task的执行结果 Task Task 节点用于执行具体的动作,引擎内置的 Task 常用的有 Wait 、 Move To 、 Is At Location 等等,Task 一般是自行实现的AI具体的行为逻辑,其中的代码与普通蓝图代码一样 Event Receive Execute / Event Receive Execute AI 定义该 Task 的主体逻辑代码,如果没有特殊需求,则必须以 Finish Execute 节点结束,因为只有 Finish Execute 节点才能想上层返回执行结果,否则该 Task 如果不被打断将不会执行完成 如果同时存在 Event Receive Execute 和 Event Receive Execute AI 两个事件,优先执行 Event Receive Execute AI 事件 Event Receive Abort /

lua行为树设计与实现

帅比萌擦擦* 提交于 2019-12-01 22:16:37
项目需要,之前行为树用的是behaviorDesigner,要改成纯lua的 我先做了一版用递归实现,代码可读性高但是中断机制实现起来比较复杂,而且创建自定义action重写方法时需要调用父类的方法, 如果忘了调用就会出现问题, 所以改成了用栈模拟递归。 用栈模拟递归好处在于效率高,并且容易控制,用非递归实现后自定义一个行为树节点,那么该节点不用知道父亲的方法,只要做好自己的事情就OK了 完整测试工程已上传到了github: https://github.com/MCxYY/LuaBT 行为树整体结构 (和BehaviorDesigner很像,因为就是参考BehaviorDesigner设计的,要做的是c#移植成lua,移植成本尽可能低) 如上,base文件夹中是行为树核心逻辑,最好不要修改,其他几个文件夹是自定义节点,如果是Action节点那么继承Base中的Action.lua;如果是Composite节点则继承Composite.lua等 行为树类结构大致如下:(出于篇幅限制,有些方法没写出来) 其中BTManager存储着所有行为树BTree,unity每帧调用BTManager的Update,而BTManager调用所有运行中的BTree的Update,BTree管理着自身的节点Task,根据逻辑执行调用Task的OnAwake()、OnStart等

Unreal Engine 4 系列教程 Part 9:AI教程

人走茶凉 提交于 2019-12-01 19:10:32
/*--> */ /*--> */ 原文: Unreal Engine 4 Tutorial: Artificial Intelligence 作者:Tommy Tran 译者: Shuchang Liu 在本篇教程中,你将学习如何使用行为树和AI感知来创建一个能四处走动,攻击敌人的简单AI。 在视频游戏中,人工智能(AI)通常指的是拥有自主决策行为的非玩家角色。AI可以是看到玩家然后进行攻击的简单角色,也可以是即时策略(RTS)游戏里的强大对手。 在Unreal引擎里,我们可以通过 行为树 创建AI。行为树是一个决定AI做哪种 行为 的实时决策系统。比如,如果AI有战斗和逃跑两种行为。你可以创建行为树,让AI在高于50%血量时进行战斗,低于50%血量时逃跑。 在本篇教程中,你将学习到: 创建AI实体用于控制角色单位 创建并使用行为树和黑板 使用AI感知让角色单位获得视野 创建行为让角色单位四处走动并攻击敌人 注意: 本篇教程只是Unreal Engine 4系列教程的其中一篇: Part 1: 入门 Part 2: 蓝图 Part 3: 材质 Part 4: UI Part 5: 制作简单游戏 Part 6: 动画 Part 7: 音频 Part 8: 粒子系统 Part 9: AI Part 10: 制作简单FPS游戏 起步入门 下载 示例项目 并解压。进入项目文件夹,双击

游戏AI:行为树

只愿长相守 提交于 2019-11-27 07:18:18
Behavior Tree 行为树通过子Task的返回值决定整棵树的走向 Task 行为树上的每个节点都称为一个Task, 每个Task存在三种状态, success, failure, running。 其中running是临时状态,仅叶子节点才能返回running状态,running结束后也要返回success或者failure。 Task的种类: Composite Behaivor(Action, Conditional) Decorator Composite 组合节点,可以组合其他任意的节点,从而构成一个数,根节点一般为组合节点 Sequence Selector Parallel(这个没有实现) Random Sequence 从左到右遍历Sequence的子Task。 遇到failure则停止继续遍历,则Sequence直接返回failure 遇到success则继续遍历,若Sequence的全部子Task都返回success,则Sequence返回success 遇到running则停止继续遍历,并则等待running的返回值(failure或者success) Selector 遇到failure继续遍历,若Selector中子Task全返回failure,则Selector返回failure 遇到success则停止遍历,并返回success,

AI行为树关键字分析

旧时模样 提交于 2019-11-27 07:18:02
Decotator(装饰)既然作为条件判定分为了三种判定类型, 第一:控制输入的类型,比如BlackBoard 第二:控制输出的类型,比如Force Success 第三:控制执行方式,比如Loop 系统中自定义了很多常用的Decotator,IsAtLocation(判断是不是在某个坐标) ForceSuccess(强制输出成功) CampareBBEntris(比较两个黑板Key) Loop(循环,可以设置次数) ConditionLoop(达成条件在进行循环)(条件通过KeyQuery设定) Composite(混合,将两个装饰放在一起判定)(可以双击打开进行自定义设置条件) Cooldown(冷却)(执行完成后等待时间返回失败) Does path exsit(判断一个点到另一个点是否有导航路径) Is BBEntry value of given Class(判断黑板Key是什么类型) ConeCheck(判断目标点是否在圆锥体中)(伤害) TimeLimit(时间限制)(节点中事件在规定时间内没有完成就返回失败) ConditionalLoop(有问题)() 而且Decotator还可以自己定义,新建一个打开,使用PerformConditionCheckAI的函数进行判断并返回布尔值,来达到条件的判定。 Service Service 用于附着在Compositse