news 2026/8/11 3:42:51

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
教程7:行为树的连调-–-behaviac

原文

本文档描述的是3.6及以后版本,对于3.5及以前的老版本请参考分类“3.5”。

对于行为树的调试,behaviac提供了连调和离线调试两大功能。

连调功能是在游戏运行的时候,编辑器可以连上游戏,实时的查看树的运行情况、变量的当前值并可以设置断点等;而离线调试实际上是回放运行时所产生的log。

本教程主要介绍连调的过程和相关的功能说明,离线调试可以参考文章《调试功能的说明》。

连调需要游戏是开发版本(即宏BEHAVIAC_RELEASE没有被定义),发布版本下没有连调的功能,可以参考文章《版本说明》和《开发功能开关》。

打开目录tutorials/tutorial_7/workspace中的工作区,并打开类型信息浏览器,可以看到类FirstAgent有一个成员属性p1和两个成员方法Start和Wait,如下图所示:

点击上图右下方的应用按钮,在生成的FirstAgent.cpp文件中,填写Start和Wait的方法内容如下代码所示:

voidFirstAgent::Start(){///<<< BEGIN WRITING YOUR CODE Startcount=0;///<<< END WRITING YOUR CODE}behaviac::EBTStatusFirstAgent::Wait(){///<<< BEGIN WRITING YOUR CODE Waitcount++;printf("p1 = %i\n",p1);if(count==10000){returnbehaviac::BT_SUCCESS;}returnbehaviac::BT_RUNNING;///<<< END WRITING YOUR CODE}

打开行为树demo,可以看到该行为树如下图所示:

为了在程序启动时,等待编辑器连接上才往后继续执行,需要在tutorial_7.cpp文件中的InitBehaviac方法中,添加如下代码:

behaviac::Config::SetSocketBlocking(true);

如果需要修改端口号,需要添加如下代码:

behaviac::Config::SetSocketPort(60636);

为了在连调时,程序端能够发送消息到编辑器端,需要在游戏循环中执行Workspace::DebugUpdate()方法,如下代码所示:

voidUpdateLoop(){LOGI("UpdateLoop\n");intframes=0;behaviac::EBTStatus status=behaviac::BT_RUNNING;while(status==behaviac::BT_RUNNING){LOGI("frame %d\n",++frames);behaviac::Workspace::GetInstance()->DebugUpdate();status=g_FirstAgent->btexec();}}

另外,如果程序端是通过Workspace::Update()的方式来统一执行所有Agent实例的行为树,则不需要再额外调用Workspace::DebugUpdate()方法,详见文章《运行时端的执行流程》。

启动程序,可以看到如下图所示:

上面表示,程序端已经在开始等待编辑器的连接了。

点击编辑器工具栏中的“连接”按钮,如下图所示:

在弹出的“连接游戏”窗口中,设置相应的IP和端口号后,点击“确认”按钮开始连接游戏,如下图所示:

编辑器成功连接后,在左侧的实例节点列表中,会列出当前的Agent实例,如下图所示:

在“输出”窗口中,可以看到程序端发送过来的所有消息,编辑器也正是根据这些消息来相应的刷新当前的高亮执行路径和处理断点、刷新成员属性的当前值等,如下图所示:

鼠标双击实例节点列表中的节点FirstAgent_0_0,开始跟踪该实例的当前行为树的执行情况,可以看到行为树有了高亮的执行路径效果,表示当前返回Running的所有节点序列,如下图所示:

双击某个节点的左侧可以为该节点添加“进入”断点,双击某个节点的右侧可以为该节点添加“退出”断点,如下图所示:

上图中高亮的断点,表示当前行为树的执行已经停在该处。点击Timeline工具栏中的“继续”按钮或直接按F5快捷键,可以继续执行行为树,如下图所示:

在属性窗口中,可以查看当前实例的所有成员属性及其当前值,如下图所示:

为了方便调试,可以在上图中手工修改属性的值,该值会被发送到程序端,影响行为树的执行。

有关连调的使用还可以参考连调相关常见问题。

本教程相关的工作区和代码工程详见源码包的目录tutorials/tutorial_7。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/10 7:42:26

C语言图论:最短路径算法

本文献给&#xff1a; 已掌握无向图基础&#xff0c;希望理解如何在带权图中找到两点间最短路径的C语言学习者。本文将系统讲解两种经典的最短路径算法。 你将学到&#xff1a; 最短路径问题的定义与核心概念Dijkstra算法&#xff1a;解决单源、非负权图的最短路径Bellman-For…

作者头像 李华
网站建设 2026/8/10 11:58:41

实习面试题-聚合搜索项目面试题

1.你的项目中使用了哪些技术栈?请分别介绍一下 Spring Boot、Elastic Stack 在项目中的作用。 2.你提到自己二次开发了 Spring Boot 初始化模板,这个模板有哪些功能? 3.什么是 HttpClient?如何使用 HttpClient 来抓取外部网站的文章?请简述整个过程。 4.什么是 Jsoup?…

作者头像 李华
网站建设 2026/8/10 16:43:35

JavaScript 处理二进制数据流:从 ArrayBuffer 到 Blob 再到 File 的转换指南

各位同学&#xff0c;大家好。今天我们将深入探讨JavaScript中处理二进制数据流的核心机制。在现代Web应用中&#xff0c;我们不再仅仅局限于文本数据的交互&#xff0c;图片、音频、视频、文件上传下载、网络协议等都离不开对二进制数据的精确操控。理解并掌握JavaScript提供的…

作者头像 李华