腾讯Behaviac Designer 和Unity连调行为树

2023-09-18 20:04:13

1. 克隆源码

https://github.com/Tencent/behaviac/

2. 编译生成BehaviacDesigner.exe

3. 找到并打开BehaviacDesigner.exe(先不急着填弹出的路径workspace 设置框)

4. 新建一个Unity 空工程,并在此处下载behaviac unitypackage

5. Unity中导入该Unitypackage

6. 在Unity 工程Assets中创建Resources/behaviac/exported 文件夹

7. 回到第三步,设置工作路径如下

8. 创建一个行为树命名为Agent,创建一个agent的派生类叫Player(之后会生成一个Player.cs脚本里面包含的待实现的行为接口), 仿照下面完善该行为树,在对应节点上右键,添加断点。最后导出

注意,这个行为树中的两个wait()对调试很关键,其中数字是单位是毫秒,可以让整个树在这里等待一定时间,而这个时间内正好可以用来手动连接服务器进行调试。如果没有这个wait,那么一旦在unity中点击运行,行为树逻辑已经跑完,而BehaviaDesigner都没来得及连接到Unity.

9.查看Unity工程中的文件树

10. Unity创建一个空物体,命名为behaviac, 挂载Player.cs脚本

11. 用下面的Player.cs替换你的Player.cs

// -------------------------------------------------------------------------------
// THIS FILE IS ORIGINALLY GENERATED BY THE DESIGNER.
// YOU ARE ONLY ALLOWED TO MODIFY CODE BETWEEN '///<<< BEGIN' AND '///<<< END'.
// PLEASE MODIFY AND REGENERETE IT IN THE DESIGNER FOR CLASS/MEMBERS/METHODS, ETC.
// -------------------------------------------------------------------------------

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

///<<< BEGIN WRITING YOUR CODE FILE_INIT

///<<< END WRITING YOUR CODE

public class Player : behaviac.Agent
///<<< BEGIN WRITING YOUR CODE Player
///<<< END WRITING YOUR CODE
{
#region 格式化的内容,直接拷贝
    behaviac.EBTStatus _status = behaviac.EBTStatus.BT_RUNNING;
    private static string ExportedFilePath
    {
        get
        {
            string relativePath = "/Resources/behaviac/exported";

            if (Application.platform == RuntimePlatform.WindowsEditor)
            {
                return Application.dataPath + relativePath;
            }
            else if (Application.platform == RuntimePlatform.WindowsPlayer)
            {
                return Application.dataPath + relativePath;
            }
            else
            {
                return "Assets" + relativePath;
            }
        }
    }
    private bool InitPlayer()
    {
        behaviac.Debug.LogWarning("InitPlayer");

        bool bRet = this.btload("Agent");
        if (bRet)
        {
            this.btsetcurrent("Agent");
        }

        return bRet;
    }
    private bool InitBehavic()
    {
        behaviac.Debug.LogWarning("InitBehavic");

        behaviac.Workspace.Instance.FilePath = ExportedFilePath;
        behaviac.Workspace.Instance.FileFormat = behaviac.Workspace.EFileFormat.EFF_xml;

        return true;
    }
    void Awake()
    {
        InitBehavic();

        InitPlayer();
    }
    

    void Update()
    {
        if (_status == behaviac.EBTStatus.BT_RUNNING)
        {
            behaviac.Debug.LogWarning("Update");
            behaviac.Workspace.Instance.Update();//要想能调试,这句必须有
            _status = this.btexec();
            
        }
    }
 #endregion
    public void drift()
	{
        ///<<< BEGIN WRITING YOUR CODE drift
        UnityEngine.Debug.Log("drift");
        ///<<< END WRITING YOUR CODE
    }

	public bool IsInCollision()
	{
///<<< BEGIN WRITING YOUR CODE IsInCollision
	return false;
///<<< END WRITING YOUR CODE
	}

	public void moveForward()
	{
        ///<<< BEGIN WRITING YOUR CODE moveForward
        UnityEngine.Debug.Log("moveForward");
///<<< END WRITING YOUR CODE
	}

///<<< BEGIN WRITING YOUR CODE CLASS_PART

///<<< END WRITING YOUR CODE

}

///<<< BEGIN WRITING YOUR CODE FILE_UNINIT

///<<< END WRITING YOUR CODE

12. 点击Unity 运行,紧接着按照下图步骤在BehaviacDesigner端连接Unity(所有操作默认即可)

13. 最多等待20s, 可以看到BehaviacDesigner端断点被击中(断点从紫色变成黄色)

这里让这个断点重复50次,如果想让断点继续执行下一步,就点击左上角蓝色小三角

tips:

  • F9可以直接在节点上打断点,多次按F9就是取消断点
  • 代码中IsInCollision() 中return false;换成return true; 行为树逻辑就走了上面drfit() 而不是moveForward(). 可以自己试试。下面截图是我跑出来的效果

更多推荐

Docker 一键安装Confluence(已支持最新版本)

Docker一键安装Confluence(已支持最新版本)本文用于Confluence在Docker的安装,仅用于记录安装方式Jira也可以参考这种方式安装,只有细微差别转载请注明来源Linux安装可参考链接Windows安装可查考链接条件允许时,请优先选择CentOS7原生安装一、查找想要的版本跟着文档走,不想换版本

23个销量最高的3D扫描仪【2023】

如果你可以3D扫描它,你就可以3D打印它。市场上3D扫描仪的种类和质量非常丰富,机器尺寸、功能和价格各异。这样的选择虽然本身是一件很棒的事情,但也会让从无用的东西中挑选出宝石成为一件苦差事。推荐:用NSDT编辑器快速搭建可编程3D场景无论你是在寻找适合学生或业余爱好者的完美入门级扫描仪、具有更好软件和工作流程的更强大的

Talk | ICCV’23 清华赵天辰:Ada3D-基于动态推理的3D感知模型压缩及软硬件协同优化

​本期为TechBeat人工智能社区第533期线上Talk!北京时间9月21日(周四)20:00,清华大学博士生—赵天辰的Talk已准时在TechBeat人工智能社区开播!他与大家分享的主题是:“Ada3D-基于动态推理的3D感知模型压缩及软硬件协同优化”,他介绍了他们提出的动态推理框架Ada3D,并进一步介绍了在硬件

Nginx服务配置及相关模块

目录一.Nginx配置文件1.1.主配置文件解析1.2.子配置文件启用二.子配置文件使用2.1.创建虚拟主机实验2.2.基于端口虚拟主机实验三.Nginx模块3.1.access模块3.2.自定义错误页面3.3.状态页开启一.Nginx配置文件1.1.主配置文件解析①yum安装主配置文件位置:/etc/nginx/ng

vue+express、gitee pm2部署轻量服务器

一、代码配置前后端接口都保持127.0.0.1:3000vue创建文件pm2.config.cjsmodule.exports={apps:[{name:'xin-web',//应用程序的名称script:'npm',//启动脚本args:'rundev',//启动脚本的参数cwd:'/home/vue/xin_web

vue基础知识十三:Vue中的$nextTick有什么作用?

一、NextTick是什么官方对其的定义在下次DOM更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的DOM什么意思呢?我们可以理解成,Vue在更新DOM时是异步执行的。当数据发生变化,Vue将开启一个异步更新队列,视图需要等队列中所有数据变化完成之后,再统一进行更新举例一下Html结构{{me

深信服安全GPT 2.0升级,开启安全运营“智能驾驶”旅程

9月22日,深信服对外展示安全GPT落地成果与2.0升级能力。来自各行业权威嘉宾代表:美的集团首席信息安全官(CISO)兼软件工程院院长、欧洲科学院院士(MAE)、IEEEFellow、IETFellow、ACM杰出科学家、AAIAFellow刘向阳、北汽福田汽车股份有限公司集团信息安全部高级经理兼欧辉新能源网络安全部

C++&QT day9

完善登录框点击登录按钮后,判断账号(admin)和密码(123456)是否一致,如果匹配失败,则弹出错误对话框,文本内容“账号密码不匹配,是否重新登录”,给定两个按钮ok和cancel,点击ok后,会清除密码框中的内容,继续进行登录;如果点击cancel按钮,则关闭界面。如果账号和密码匹配,则弹出信息对话框,给出提示信

IM即时通讯系统[SpringBoot+Netty]——梳理(总)

文章目录一、为什么要自研一套即时通讯系统1、实现一个即时通讯系统有哪些方式1.1、使用开源产品做二次开发或直接使用1.2、使用付费的云服务商1.3、自研2、如何自研一套即时通讯系统2.1、早期即时通讯系统是如何实现2.2、一套即时通讯系统的基本组成2.3、当下的即时通讯系统常用架构2.4、总结二、基础数据的开发1、导入

springboot班级综合测评管理系统springboot005

大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路,向着优秀程序员前行!🍅更多优质项目👇🏻👇🏻可点击下方获取🍅文章底部或评论区获取🍅Java项目精品实

【Docker】华为云服务器安装 Docker 容器

简介Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似iPhone的app),更重要的是容器性能开销

热文推荐