news 2026/11/6 1:25:46

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
教程8:结构体的添加和使用-–-behaviac

原文

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

对于结构体类型的使用,包括新增全新的结构体和扩展使用已有的结构体。对于新增的结构体,又包括编辑器是否自动生成该结构体的代码。

实际上,我们将新增结构体,又不自动生成该结构体代码的情况,认为跟扩展使用已有的结构体是一致的,即都是在程序端已经有了该结构体的定义代码(要么手工编写,要么第三方代码已经包含了该结构体的定义),不用再让编辑器自动生成。

进而,后文将只通过**“生成代码”和“不生成代码”**来区分上面所说的各种使用情况,但这里需要注意的是,生成或不生成代码,只是针对结构体本身的定义而言,而结构体相关的“胶水”代码都是会自动生成的,并且必须要整合到自己的项目中一起编译构建。

1. 如果是“生成代码”的情况,则忽略这一步说明。否则,如果是“不生成代码”的情况,这里假定程序端已经有了结构体类型文件FirstStruct.h,该文件中包含了结构体“FirstStruct”的定义,如下代码所示:

structFirstStruct{ints1;floats2;};

2. 在类型信息浏览器中新增跟程序端同名的结构体类型“FirstStruct”,并且根据自己的需要,来决定是否勾选“生成代码”选项(如果只是扩展使用已有的结构体,则不需要勾选),如下图所示:

3. 上图中的“引用类型”选项,一般不用勾选,表示在行为树编辑器中可以为该结构体配置其成员属性,并且在该结构体的两个实例做比较运算时,会比较所有的成员属性。否则,如果勾选了“引用类型”选项,则表示该结构体在行为树中使用时是作为引用类型来使用,在该结构体的两个实例做比较运算时,只会比较两个实例的引用(指针),而不比较其内容(成员属性)。

4. 为结构体“FirstStruct”添加成员属性s1和s2,这跟程序端的定义保持一致,如下图所示:

5. 对于C++版的运行时库,如果是“生成代码”的情况,则忽略这一步操作。否则,如果是“不生成代码”的情况,则说明程序端已经有了包含该结构体类型的头文件。点击上图右上方的“设置头文件”按钮,弹出“C++导出设置”窗口,并添加已有的结构体头文件FirstStruct.h,如下图所示:

6. 点击类型信息浏览器右下方的“应用”按钮,这样会在“代码生成位置”中生成该结构体的定义(如果上面勾选了“生成代码”选项)及相关的“胶水”代码behaviac_customized_types.h等文件,如下代码所示:

BEHAVIAC_EXTEND_EXISTING_TYPE_EX(FirstStruct,false);BEHAVIAC_DECLARE_TYPE_VECTOR_HANDLER(FirstStruct);// 如下结构体的定义代码,会根据是否勾选了上面所说的“生成代码”选项来决定是否生成structFirstStruct{ints1;floats2;};// 如下代码,不管是否勾选了“生成代码”选项,都会自动生成BEHAVIAC_EXTEND_EXISTING_TYPE_EX(FirstStruct,false);BEHAVIAC_DECLARE_TYPE_VECTOR_HANDLER(FirstStruct);template<typenameSWAPPER>inlinevoidSwapByteImplement(FirstStruct&v){SwapByteImplement<SWAPPER>(v.s1);SwapByteImplement<SWAPPER>(v.s2);}namespacebehaviac{namespacePrivateDetails{template<>inlineboolEqual(constFirstStruct&lhs,constFirstStruct&rhs){returnEqual(lhs.s1,rhs.s1)&&Equal(lhs.s2,rhs.s2);}}}

7. 为FirstAgent类新增成员属性p1,其类型是结构体FirstStruct,如下图所示:

8. 点击类型信息浏览器右下方的“应用”按钮,将“代码生成位置”中behaviac_generated/types目录下所有生成的代码文件,添加到自己的项目中一起编译构建。

9. 新增行为树“StrcutBT”,并使用成员属性p1来赋值和做比较运算,如下图所示:

10. 执行该行为树,得到如下执行结果:

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

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

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

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

作者头像 李华
网站建设 2026/11/5 7:33:29

Django 学生成绩管理系统

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

作者头像 李华
网站建设 2026/11/5 2:58:31

13、UNIX用户管理全解析

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

作者头像 李华
网站建设 2026/11/5 3:54:12

动态规划01背包问题

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

作者头像 李华
网站建设 2026/11/5 19:50:36

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

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

作者头像 李华
网站建设 2026/11/4 23:22:37

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

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

作者头像 李华