腾讯Behaviac Designer 和Unity连调行为树

news/2025/2/20 16:30:01

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(). 可以自己试试。下面截图是我跑出来的效果


http://www.niftyadmin.cn/n/5033954.html

相关文章

应用商店优化之关键词优化指南2

在寻找良好关键词的方法中&#xff0c;分析竞争对手是寻找关键词的最佳且最可靠的方法。查找排名最高的关键词或者是获得最多下载量的关键词&#xff0c;这样就可以准确的瞄准那些带来最大价值的关键词&#xff0c;从而带来更好的优化效果。 1、选择正确的关键词。 搜索分数用…

【用unity实现100个游戏之12】unity制作一个俯视角2DRPG《类星露谷物语》资源收集游戏demo

文章目录 前言加快编辑器运行速度素材(1)场景人物(2)工具 一、人物移动和动画切换二、走路灰尘粒子效果探究实现 三、树木排序设计方法一方法二 四、绘制拿工具的角色动画五、砍树实现六、存储拾取物品引入Unity 的可序列化字典类 七、实现靠近收获物品自动吸附八、树木被砍掉的…

vue 把echarts封装成一个方法 并且从后端读取数据 +转换数据格式 =动态echarts 联动echarts表

1.把echarts 在 methods 封装成一个方法mounted 在中调用 折线图 和柱状图 mounted调用下边两个方法 mounted(){//最早获取DOM元素的生命周期函数 挂载完毕console.log(mounted-id , document.getElementById(charts))this.line()this.pie()},methods里边的方法 line() {// …

vue前端 router路由hash和history模式区别

vue-router路由有两种方式&#xff0c;hash模式和history模式&#xff0c;接下来浅谈一下两者区别 模式通俗解释兼容原理hashurl尾巴后的#号及后面的字符都是hash模式兼容IE8及以上于 hash 值变化不会导致浏览器向服务器发出请求&#xff0c;而且 hash 改变会触发 hashchange …

高斯公式证明

高斯公式&#xff1a; 若空间闭区域 Ω \Omega Ω 由光滑的闭曲面 Σ \Sigma Σ 围成&#xff0c;则 ∫ ∫ ∫ Ω ( ∂ P ∂ x ∂ Q ∂ y ∂ R ∂ z ) d v ∮ ∮ Σ P d y d z Q d z d x R d x d y \int \int \int _{\Omega}(\frac{\partial P}{\partial x} \frac{\p…

Python 字典的定义

视频版教程 Python3零基础7天入门实战视频教程 字典dict 字典也是Python提供的一种常用的数据结构&#xff0c;它用于存放具有映射关系的数据。 字典的定义 比如有成绩表数据——语文:68&#xff0c;数学:98&#xff0c;英语: 76&#xff0c;这组数据看上去像两个列表&…

Jprofiler的使用查看oom

一、安装 idea安装插件 安装客户端 链接 IDEA配置Jprofiler执行文件 二、产生oom import java.util.ArrayList; import java.util.List;//测试代码 public class TestHeap {public static void main(String[] args) {int num 0;List<Heap> list new ArrayList&l…

(JavaEE) 多线程基础3——多线程的代码案例 (单例模式, 阻塞队列,定时器)详解!!!

​​​​​​​ 目录 单例模式 什么是单例模式&#xff1f; —— “饿汉模式” —— “懒汉模式” ——懒汉模式-多线程版 ——懒汉模式-多线程版&#xff08;改进版&#xff09; 总结“懒汉模式”—— 多线程&#xff08;线程安全版&#xff09; 的要点 阻塞队列 什么…