自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(189)
  • 收藏
  • 关注

原创 目录---behaviac

如果网页找不到可以更换为前缀https://behaviac.github.io/language/zh/教程工作区如教程13其他工作区。

2025-12-20 21:06:29 453

转载 等待信号节点-–-behaviac

等待信号(WaitforSignal)节点模拟了等待某个条件的“阻塞”过程。在图1中,该等待信号节点一直“阻塞”直到它上面附加的条件是true的时候才结束“阻塞”,从而继续序列节点中后面的节点:图1 不带子节点的等待信号节点而在图2中,则是在该等待信号节点上附加的条件是true的时候,结束“阻塞”而执行其子节点。图2 带子节点的等待信号节点具体的执行逻辑可以查看。

2025-12-20 20:54:02 10

转载 空操作节点-–-behaviac

具体的执行逻辑可以查看。

2025-12-20 20:49:52 13

转载 共享资源和实例数据-–-behaviac

每个行为树都只有一份单独的数据作为资源被加载。每个使用行为树的对象(Agent)依据这个共享的资源创建独立的实例数据,例如对于Sequence节点,实例数据中只是存储更新到哪个子树,至于Sequence节点的配置信息等则被共享。

2025-12-20 20:45:09 8

转载 运行时端常用类的介绍-–-behaviac

在使用behaviac运行时端(Runtime)的源代码或API时,有几个最常用的类值得注意:如Workspace、Agent、Config等。

2025-12-20 20:36:21 10

转载 关于性能优化的说明-–-behaviac

behaviac作为图形化的脚本,设计上是用来调用代码(c++,c#)提供的方法,在调用这些方法的时候会有些额外消耗,该消耗已经被充分优化,可以参考消耗。实践中,要尽量把需要计算的操作由代码实现,通过方法提供给behaviac,behaviac只是去选择这些方法,behaviac作为选择者,发挥behaviac灵活直观的优势。

2025-12-18 13:50:01 13

转载 状态机-–-behaviac

behaviac组件不仅支持行为树,也支持有限状态机(FSM),并且支持行为树跟状态机的相互嵌套调用。behaviac组件中的状态机主要用到了状态(State)、等待状态(WaitState)和等待帧数状态(WaitFramesState)三种节点,以及条件转换(Transition)和总是转换(AlwaysTransition)两种附件,如下图所示:图1 状态机相关节点和附件。

2025-12-18 00:09:58 15

转载 等待帧数节点-–-behaviac

注意:在C#代码中相应的接口需改为Workspace.Instance.FrameSinceStartup,默认实现方式是返回Unity的当前系统帧数Time.frameCount,一般情况无需自己重新实现,直接使用即可,不用类似以上C++的接口方式每帧更新时再额外调用Workspace.Instance.FrameSinceStartup为其赋值。该总帧数需要通过Workspace::GetInstance()->SetFrameSinceStartup()设置,可以在自己的游戏。

2025-12-18 00:09:24 10

转载 等待节点-–-behaviac

如果勾选了“使用整数值”选项,那么Workspace::GetInstance()->GetUseIntValue()将返回true,并且该总数值需要通过Workspace::GetInstance()->SetIntValueSinceStartup(long long value)设置,可以在自己的游戏更新函数中调用该函数。如果没有勾选“使用整数值”选项,那么Workspace::GetInstance()->GetUseIntValue()将返回false。具体的执行逻辑可以查看。

2025-12-18 00:09:06 11

转载 与节点-–-behaviac

与(And)节点接受两个以上的条件子节点,执行逻辑”与(&&)”操作,如下图所示:图1 与节点只要有一个条件子节点的返回值为失败,与节点则返回失败。所有条件子节点都返回为成功,与节点则返回成功。具体的执行逻辑可以查看。

2025-12-17 23:27:01 12

转载 或节点-–-behaviac

或(Or)节点接受两个以上的条件子节点,执行逻辑”或( )”操作,如下图所示:图1 或节点只要有一个条件子节点的返回值为成功,或节点则返回成功。所有条件子节点都返回为失败,或节点则返回失败。具体的执行逻辑可以查看。

2025-12-17 23:25:07 9

转载 条件执行节点-–-behaviac

比如挂上动作节点时,如果该动作节点返回Running,则条件执行节点也返回Running,并且该条件一直持续执行,直到动作节点返回Success或Failure,则继续相应的执行“真时执行”或“假时执行”分支。条件执行节点必须要有3个子节点,第一个子节点是条件分支,第二个子节点是“真时执行”分支,第三个子节点是“假时执行”分支。如果条件为真,那么执行“真时执行”分支;如果不使用条件执行节点,完全可以用序列(Sequence)和选择(Selector)节点来实现相同的功能,只不过没有条件执行节点简洁。

2025-12-17 23:21:53 10

转载 选择监测节点-–-behaviac

例如,假设上图中上一次执行行为树的时候,ID为13的条件节点返回成功,并且已经执行到ID为9的动作节点(这时ID为4的动作节点已返回成功,而ID为9的动作节点返回正在运行)。那么,当下一次执行该选择检测节点时,如果发现ID为13的条件节点还是返回成功,ID为9的动作节点就会直接得到执行,而不是先执行ID为4的动作节点。简而言之,并行和选择监测节点的工作方式是采用“轮询”的方式,每次执行时需要重新评估所有子节点,而不是像其他节点会保留上一次正在执行的子节点以便在下一次执行时继续执行。具体的执行逻辑可以查看。

2025-12-17 23:10:14 14

转载 子树节点-–-behaviac

通过子树节点,一个行为树可以作为另一个行为树的子树。作为子树的那个行为树被“调用”。如同一个动作节点一样,子树节点根据子树的执行结果也会返回执行结果(成功、失败或运行。),其父节点按照自己的控制逻辑来控制接下来的运行。

2025-12-17 14:02:49 13

转载 任务节点-–-behaviac

任务节点(Task)用于描述一个接口,该接口的入口参数为当前的行为树提供了局部变量,这些局部变量可以根据需要用于该行为树所有子节点,如下图所示:图1 任务节点注意:任务节点只能作为行为树的第一个子节点存在,在任务节点上可以添加其他子节点。在任务节点的任务属性中需要选择在类型信息浏览器中创建的事件,如下图所示:图2 任务节点的属性带有任务节点的行为树主要用于事件的处理,请详看文档《具体的执行逻辑可以查看。

2025-12-17 13:42:15 9

转载 结束节点-–-behaviac

但是如果勾选了子树subtree1中结束节点的“结束外层树”属性,则上述的执行过程会有所变化,也即子树subree1返回Success后,父树maintree1也直接返回Success,上面的“结束状态”可以是一个常量,也可以是成员属性或方法的返回值,表示行为树执行到结束节点时,强制返回“结束状态”所配置的当前值。此外,还有一个属性“结束外层树”,该属性用于表示在子树中的结束节点返回时,是否需要返回该子树所在的父树。如果子树subtree1中结束节点的“结束外层树”属性没有勾选,那么在执行。

2025-12-17 13:32:39 8

转载 扩展使用已有的类型-–-behaviac

在某些情况下,除了运行时库(C++)中提供支持的一些基本类型(bool、short、int、float等)之外,behaviac还支持扩展使用已有的或者用户自定义的类、结构体和枚举类型。

2025-12-17 00:26:19 10

转载 自定义类或结构体-–-behaviac

上面的用法定义出来的TypeTest2_t在导出的元信息中为值类型(也即在导出的元信息中其值IsRefType为false),值类型可以在编辑器中设置其成员属性。与值类型对应的是引用类型,引用类型不会导出其成员属性,在编辑器中也不用配置其成员属性。更多细节可以参考behaviac组件C++源码库中btunittest工程的。文件中TypeTest2_t结构体相关的代码。

2025-12-17 00:16:12 9

转载 自定义枚举-–-behaviac

类似于自定义类,在.h文件中,任意编写一个自定义枚举类型,然后通过宏DECLARE_BEHAVIAC_ENUM声明该枚举类型。需要注意的是,宏DECLARE_BEHAVIAC_ENUM必须定义在全局的namespace里,即放在任何命名空间之外。宏DEFINE_ENUM_VALUE用于注册枚举的值,可以通过.DISPLAYNAME的追加方式为值添加显示名,通过.DESC的追加方式为值添加描述。可选的宏ENUMCLASS_DISPLAY_INFO用于注册枚举自身的显示名和描述。作为某Agent的成员。

2025-12-17 00:12:10 8

转载 类、结构体或枚举的数组-–-behaviac

对于C#版,类型信息不支持[]类型的数组,只支持List<***>类型的数组。更多细节可以参考behaviac组件C++源码中附带的。更多细节可以参考behaviac组件C++源码中附带的。文件中的类EmployeeParTestAgent。类型直接被支持,不需要做什么额外的工作,其任何子类。或是其子类的时候,仅支持其指针类型即。文件中的结构体kEmployee。Agent及其子类的数组。

2025-12-16 13:59:28 9

转载 导出和使用Cplusplus行为树-–-behaviac

【代码】导出和使用Cplusplus行为树-–-behaviac。

2025-12-16 00:34:29 10

转载 Cplusplus运行时端的使用上手-–-behaviac

运行时(游戏)端使用行为树之前,需要确保行为树文件已经成功导出。如何注册和导出类型信息请参考,如何导出行为树请参考。

2025-12-16 00:34:16 11

转载 行为树的基本概念及进阶-–-behaviac

开发游戏AI的目标之一就是要找到一个简单,可扩展的编辑逻辑的方案,从而加速游戏开发的迭代速度。在“行为系统图”中,行为系统(Behavior System)响应游戏中的各种信息,进行决策以挑选接下来将要执行的行动并且监控该行动的执行。知识模型(Knowledge Model)是对游戏世界中各种信息的抽象。在行为系统中,有限状态机(FSM,Finite State Machine)最为经典,FSM模型的优势之一是简单。

2025-12-16 00:34:01 7

转载 如何编译构建-–-behaviac

如果是Unity平台下的C#开发,还可以在Unity编辑器中导入/integration/behaviac.unitypackage包(安装完发布的BehaviacSetup_***.exe后,会在安装目录中的/integration文件夹中找到该behaviac.unitypackage包)。安装目录中的/integration/unity是基于Unity C#的单元测试项目。请使用vs2010或以上打开并构建。

2025-12-16 00:33:20 8

转载 目录结构-–-behaviac

首先说明的是从获取的BehaviacSetup*.exe是安装包,内含可执行的编辑器及示例。如果编辑器不能正常启动,需要下载安装及。可以从下载或从克隆源码,这里介绍的是源码的目录结构。

2025-12-16 00:32:38 7

转载 behaviac到底是什么-–-behaviac

在3.x版本之前的版本中,类型信息必须通过运行时来导出,策划需要新的属性或方法时,必须等待程序员更新代码重现导出类型信息后才能使用。而在3.x版本中,可以直接在编辑器中创建一个类型,并且创建它的属性和方法,而且可以导出类型的c++或c#源码,这极大的加速了迭代的过程,从而把编辑器作为一个原型设计工具。在编辑器内,使用鼠标或快捷键,可以添加、编辑、配置、修改行为树(包括FSM,或HTN),也可以实时或离线调试游戏的行为,既可以设断点,也可以查看或修改变量的值。所有代码,包括编辑器和运行时。

2025-12-16 00:31:47 14

转载 节点类型的简单介绍-–-behaviac

behaviac 有以下节点类型:其中‘附件’有前置和后置,可以添加到任何一个节点作为前置和后置。前置往往是作为前提条件(precondition)来使用,而后置往往是当节点结束的时候施加效果(effects)。其中‘组合’,‘装饰器’ 类都是分支节点,‘动作’ 类,和‘条件’类大都是子节点, 而‘条件’类中的‘或’、‘与’是分支节点。需要指出的是,有些节点类型通过其他更基本类型的节点的组合也可以实现。这里提供的节点类型只是使用起来可能会更方便,更直观些。用户可以根据自己的偏好选择使用与否。

2025-12-15 00:33:37 11

转载 教程13:随机与概率相关节点的使用-–-behaviac

为了方便使用,behaviac组件除了提供传统的序列、选择等组合节点之外,还提供了随机与概率相关的节点类型,主要包括和等节点。这3个节点对于初学者容易混淆,本文将结合行为树中对这3个节点的使用来分别加以说明。

2025-12-15 00:33:26 9

转载 概率选择节点-–-behaviac

概率选择节点的选择算法是基于概率区间的,比如上图中的3个子节点的权值分别是20、30、50,归一化后的概率分别是0.2、0.3、0.5,那么对应的概率区间分别是[0.0, 0.2)、[0.2, 0.5)、[0.5, 1.0)。概率选择节点的子节点只能是“权值”的子节点,在添加子节点时,该权值节点会被系统自动添加。注意:选择节点是按照从上到下的顺序依次执行子节点,一直到第一个返回成功的那个子节点则返回成功,或者如果所有子节点都返回失败则返回失败。具体的执行逻辑可以查看。

2025-12-15 00:33:13 10

转载 随机选择节点-–-behaviac

例如,选择节点和随机选择节点都有A、B、C、D这四个子节点。对于选择节点,每次都是顺序的按A、B、C、D的顺序选择;而对于随机选择节点,有时按A、B、C、D的顺序选择,有时按B、A、D、C的顺序选择,又有时按A、C、D、B的顺序选择,等等。该随机数生成器一般设为空即可,表示采用系统的缺省实现,也可以使用自己提供的函数。具体的执行逻辑可以查看。

2025-12-15 00:33:00 11

转载 随机序列节点-–-behaviac

例如,序列节点和随机序列节点都有A、B、C、D这四个子节点。对于序列节点,每次都是按A、B、C、D的顺序依次执行;而对于随机序列节点,有时按A、B、C、D的顺序执行,有时按B、A、D、C的顺序执行,又有时按A、C、D、B的顺序执行,等等。该随机数生成器一般设为空即可,表示采用系统的缺省实现,也可以使用自己提供的函数。具体的执行逻辑可以查看。

2025-12-15 00:32:41 10

转载 教程12:并行节点的使用-–-behaviac

从上图可以看到,虽然一共循环了3次,但ID为7的动作节点只执行了一次,而ID为0的动作节点由于前两帧执行时返回Running,得到持续执行,直到第三帧返回Success或Failure。Say()方法表示对于isLatent为真的情况,在第三帧后返回成功,前两帧返回正在执行;并行节点容易在其属性配置上产生误用,本文将结合行为树中对并行节点的实际使用来加以说明。并行节点用于一般意义上并行的执行所有子节点,相关的功能和属性说明详见手册《从上图可以看到,一共循环了1次,并行节点的所有子节点也都执行了1次。

2025-12-15 00:32:27 8

转载 附件-–-behaviac

附件(Attachments)类型可以附加到相应的节点上,在编辑器中有两类附件:显式附件和隐式附件。

2025-12-15 00:32:13 8

转载 并行节点-–-behaviac

与序列节点+条件节点方式的不同之处在于,序列节点实现的前提条件只是“进入”其他节点的前提条件,一旦首次进入并开始执行其他节点后,就不再检查该前提条件了。在选择或序列节点中,是顺序的一个接一个的执行其子节点,上一个子节点执行结束后,根据其状态是否执行接下来的子节点。并行节点配置条件节点和其他节点,并且失败条件是缺省的配置FAIL_ON_ONE,那么只有当条件节点成功的时候其他节点才被执行,从而条件节点事实上是其他节点的前提条件。在序列节点中,假设其子节点包括了条件节点和其他节点。具体的执行逻辑可以查看。

2025-12-15 00:31:10 9

转载 教程11:使用Android-Studio编译构建--behaviac

需要参考上面的CMakeLists.txt,用于编译构建behaviac组件。文件的InitBehavic()方法中,调用了Workspace::SetFilePath()接口,设置行为树加载路径,Android Studio是一个为Android平台开发程序的集成开发环境,可供开发者免费使用。下载并安装最新版的Android Studio,然后继续后文的编译构建。1. 新建自己的项目。这里我们直接打开已有的。本教程相关的工作区和代码工程详见源码包的目录。

2025-12-15 00:30:53 14

转载 教程10:定制自己的读取方式来加载行为树-–-behaviac

有的时候,由于自身项目的需要,例如对行为树文件进行加密、打包等处理,behaviac组件默认提供的文件加载机制不再满足需要,因此程序端需要定制自己的读取方式来加载行为树文件。

2025-12-15 00:28:56 10

转载 教程9:枚举的添加和使用-–-behaviac

否则,如果是“不生成代码”的情况,则说明程序端已经有了包含该枚举类型的头文件。实际上,我们将新增枚举,又不自动生成该枚举代码的情况,认为跟扩展使用已有的枚举是一致的,即都是在程序端已经有了该枚举的定义代码(要么手工编写,要么第三方代码已经包含了该枚举的定义),不用再让编辑器自动生成。“不生成代码”**来区分上面所说的各种使用情况,但这里需要注意的是,生成或不生成代码,只是针对枚举本身的定义而言,而枚举相关的“胶水”代码都是会自动生成的,并且必须要整合到自己的项目中一起编译构建。

2025-12-14 17:05:53 9

转载 教程8:结构体的添加和使用-–-behaviac

否则,如果是“不生成代码”的情况,则说明程序端已经有了包含该结构体类型的头文件。实际上,我们将新增结构体,又不自动生成该结构体代码的情况,认为跟扩展使用已有的结构体是一致的,即都是在程序端已经有了该结构体的定义代码(要么手工编写,要么第三方代码已经包含了该结构体的定义),不用再让编辑器自动生成。“不生成代码”**来区分上面所说的各种使用情况,但这里需要注意的是,生成或不生成代码,只是针对结构体本身的定义而言,而结构体相关的“胶水”代码都是会自动生成的,并且必须要整合到自己的项目中一起编译构建。

2025-12-14 17:01:18 12

转载 教程7:行为树的连调-–-behaviac

另外,如果程序端是通过Workspace::Update()的方式来统一执行所有Agent实例的行为树,则不需要再额外调用Workspace::DebugUpdate()方法,详见文章《连调功能是在游戏运行的时候,编辑器可以连上游戏,实时的查看树的运行情况、变量的当前值并可以设置断点等;上图中高亮的断点,表示当前行为树的执行已经停在该处。为了方便调试,可以在上图中手工修改属性的值,该值会被发送到程序端,影响行为树的执行。本教程主要介绍连调的过程和相关的功能说明,离线调试可以参考文章《

2025-12-14 16:50:31 11

转载 运行时端的执行流程-–-behaviac

其中,Workspace::Update()会遍历所有的Agent实例并依次执行btexec(),但在自己的游戏项目中,可能在一帧中需要对某些Agent多次调用btexec(),而另一些Agent只需调用一次,这时候就需要单独调用Agent::btexec(),而不是统一调用Workspace::Update()。Workspace::Update()在调用Agent::btexec()之前,会检查Agent::IsActive()是否为true,如果为false,那么btexec()就不会被调用。

2025-12-14 16:47:45 12

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除