news 2026/4/18 21:47:28

教程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/4/18 14:03:35

有关C语言中自加和自减与计算机底层硬件的关糸

C语言中的i和i--,i --i两种形式都指向了计算机硬件底层的计数器&#xff0c;当然减法还多了一个步骤就是取反和加补码&#xff0c;自加的两种方式本质是先做自加还是先做运算的问题

作者头像 李华
网站建设 2026/4/18 9:44:16

Django 学生成绩管理系统

项目概况 这是一个基于Django框架开发的学生成绩管理系统,旨在提供简单高效的成绩管理解决方案,适用于学校、培训机构等教育场景。 技术栈 - 后端 : Django 5.0.6 + SQLite - 前端 : Bootstrap 5 + Django Template Language - 核心依赖 : django-widget-tweaks 核心功能模…

作者头像 李华
网站建设 2026/4/18 14:26:36

13、UNIX用户管理全解析

UNIX用户管理全解析 1. 用户管理概述 用户管理几乎涉及系统管理各个领域的技能,工作核心围绕机器用户展开。理想的用户管理是不被用户察觉的,因为用户间接为系统运行付费,所以与系统的深入交互才得以实现。用户管理主要涉及用户ID的管理操作,包括添加、删除、修改、移动、…

作者头像 李华
网站建设 2026/4/16 21:10:02

动态规划01背包问题

动态规划:01背包问题 情景 现在有一个容量有限的背包(比如能装10公斤的东西)&#xff0c;现在有价值不同&#xff0c;重量也不同的几件物品&#xff0c;我们要怎样装才能让这个背包尽可能的装的价值最高 这就是为什么这个问题叫01背包问题&#xff0c;每个物品只有两种状态,放入…

作者头像 李华
网站建设 2026/4/16 13:24:03

WinForm DataGridView:单元格类型与高频绘制案例

目录 一、前置准备 二、DataGridView 常用单元格类型&#xff08;基础必掌握&#xff09; 1. 文本框单元格&#xff08;DataGridViewTextBoxColumn&#xff09; 2. 复选框单元格&#xff08;DataGridViewCheckBoxColumn&#xff09; 3. 下拉框单元格&#xff08;DataGridV…

作者头像 李华
网站建设 2026/4/18 7:13:08

java计算机毕业设计社区志愿者服务系统 智慧社区公益志愿协同平台 基层志愿者数字化运营管理系统

计算机毕业设计社区志愿者服务系统38q2o9 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。当“志愿红”成为社区里最温暖的底色&#xff0c;传统的人工登记、微信群接龙、纸质工时…

作者头像 李华