Lua Behavior Tree For Unity3D(Lua描述行为树For Unity3D)

简介:

文章目录点击展开[+]

行为树(BTTree)笔记
为什么是Lua版本的行为树

目前国内的手机游戏都标配热更新功能,而游戏AI自然也是MMO游戏的一个标配,比如说挂机的AI,宠物的AI等等。

说起如何用更简单的方式开发AI功能,大家都会想到使用状态机或行为树,它们能很大程度上帮助我们理清思维逻辑,让AI变的更加有趣生动。

目前很多Unity3D项目都是把Lua做为脚本语言,比如我们项目就是Lua做逻辑开发的3DMMOARPG的游戏,本文分享一下我们项目中使用的Lua版本行为树。

behavior3

Behavior3框架提供了一组工具和开放规范,为您创建、设计和使用行为树应用于游戏、模拟、机器人和其他基于代理应用程序。

提供在线可视化地编辑器,并且提供编辑器源代码,你可以下载后部署到本地,并且扩展它功能。
多代理体系结构,遵循一个简单而强大的架构在一个正式的和一致的基础上,优化控制多个代理
使用一个开放的和简单的格式来描述行为树(json),因此您可以很容易地把它加入到自己的库,工具或框架中

behavior3官网:http://behavior3.com/

behavior3的lua版本 :https://github.com/nottvlike/behavior3lua

注:本文部分截图和behavior3官网或github的lua版本有出入,因为我们项目组对lua版本的behavior3的做过修改。

编辑器

浏览器访问:http://editor.behavior3.com/#/dash/projects

选择Project - New Project - 输入Name - 点击 Editor ,网站会对当前浏览器编辑的数据进行保存,无需注册登录就在在线编辑自己的行为树。

image

导入已有的行为树

选择 Project - Import - Tree as Json,粘贴AI.json数据,完成由Json数据导入成行为树

导出行为树

选择 Project - Export - Tree as Json,选择全部内容并复制,粘贴到AI.json,完成由AI树转换成Json数据

行为树基础知识

请提前了解行为树的基础概念,我列几点:

每一帧都会遍历所有的节点 (从性能角度可以每逻辑帧遍历一次)

执行顺序:从上往下,从左往右

Composites(所有可用的类型)
下面以实现一个简单的宠物AI来解释各节点的用法。注:我列出的节点类型解释和使用方法是根据自己的理解所写,并非官方文档的解释。

BTPrioritySelector(优先选择)

如果当前节点的前置条件没有,则置空。

对于最上层的顶节点,可以使用它

BTSequence(序列)

如果并行节点有多个子节点,同级的节点中,上一个返回true,下一个节点才会执行。

示例:与主人距离大于18这个节点为序列节点,有两个叶子节点,当ClearBattleState返回True,TeleportToMaster才会被执行

image

而只有序列节点的所有叶子节点都返回true,这个节点才算执行结束,才会进入下一个节点

BTParalled(并行)

BTParableFlexible(散列)

Actions(动作/执行函数)

放在最末端的叶子节点上,用于执行函数

可以给它添加前置条件(isFarFromMaster()) ,给函数传参数(DoFollowMaster(sqrDistance = 4)),示例:

image

给方法传参数

如果在行为树给方法传递多个参数,在lua端如何接受传递的参数呢?

在lua的方法中:使用p.参数名1,p.参数名2,获取相应位置的参数

在Unity3D中调试行为树
我们目前是在C#端结合Unity开放的编辑器接口,编写了GizmosHelper,便于在运行时对行为树进行调试。

主要原理:

读取AI.jso的数据,获取节点坐标、标题,由点连线,线组成树状,还原成在behavior编辑器的树状

如果某个节点及其子节点的状态为Active,这条线使用绿色画,否则使用白色画。

注意事项

在你还大不熟悉行为树的情况下,最好不要为Sequence或Parallel的子结点加前置条件,而是直接加在Sequence或Parallel结点本身上面。。。

前置条件可以大量用在Priority结点或其子结点上
这样树的逻辑会清晰一点
另外,前置条件支持以“!”开头,表示对紧跟在其后面的条件进行取反再判断

本文出自赵青青,原文链接:http://www.cnblogs.com/zhaoqingqing/p/7258898.html,如需转载请自行联系原作者

相关文章
|
移动开发 前端开发 C#
在Unity3D中实现热力图、风向图、温度图效果(Unity3D)
因一个任务要完成如何在Unity上面实现热力图的效果,所以百度了很久,发现资料很少,现在就把我总结的如何在Unity上面基于Canvas实现热力图效果的实现过程分享出来, 此前转载了一篇主要讲的是如何根据数据值,在Canvas上重新绘制RGBA的值,完成热力图的绘制,不过用的是H5写的,我修改了一下,用C#重写的
|
1月前
|
存储 监控 数据管理
Lua代码解析:实现上网行为监管软件的自定义规则引擎
在当今数字化时代,网络安全和数据隐私保护备受关注。为了确保网络安全和合规性,许多组织和机构需要监管和管理其员工或用户的上网行为。为了实现这一目标,开发一款高效的上网行为监管软件至关重要。本文将介绍如何使用Lua语言开发一种自定义规则引擎,以实现上网行为监管软件的自定义规则引擎。
128 0
|
4月前
|
图形学
【Unity3D开发小游戏】Unity3D零基础一步一步教你制作跑酷类游戏
【Unity3D开发小游戏】Unity3D零基础一步一步教你制作跑酷类游戏
|
4月前
|
设计模式 存储 前端开发
【Unity3D日常开发】Unity3d中使用MVC框架
【Unity3D日常开发】Unity3d中使用MVC框架
|
7月前
|
数据采集 物联网 Linux
Unity3D下实现Linux平台RTMP推流(以采集Unity窗体和声音为例)
随着物联网等行业的崛起,越来越多的传统行业如虚拟仿真、航天工业、工业仿真、城市规划等,对Linux下的生态构建,有了更大的期望,Linux平台下,可选的直播推拉流解决方案相对Windows和移动端,非常少,基于Unity的Linux推送方案,更是几无参考。本文以Unity3d环境下Linux平台推送Unity窗体和Unity采集的音频,然后编码推送到RTMP服务器为例,大概说下实现过程。
135 0
|
Java Android开发 图形学
Unity3D与Android的交互通信(Unity3D)
这篇文章主要讲的是如何使用Android Studio与Unity的交互通信。主要内容有如何在Android Studio创建工程,如何设置,以及如何导出。以及在Unity调用Android的方法。
|
存储 C# 图形学
从零开始做一款Unity3D游戏<一>——亲自上手使用Unity(二)
从零开始做一款Unity3D游戏<一>——亲自上手使用Unity
从零开始做一款Unity3D游戏<一>——亲自上手使用Unity(二)
|
编解码 JavaScript C#
从零开始做一款Unity3D游戏<一>——亲自上手使用Unity(一)
从零开始做一款Unity3D游戏<一>——亲自上手使用Unity
从零开始做一款Unity3D游戏<一>——亲自上手使用Unity(一)
|
小程序 定位技术 API
Unity3D-开发工具选择与Unity安装
本笔记基于windows平台,使用Unity软件ARFoundation开发工具开发安卓系统 开发工具版本: Windows11 Unity Hub 2.5.5 Unity2020.3.25f1c1(LTS)
706 0
Unity3D-开发工具选择与Unity安装
|
C# 图形学 C++
原生实现C#和Lua相互调用-Unity3D可用【下】
1. 编译Windows下使用的DLL文件 使用VS2015创建一个空的动态链接库项目,删除里面默认创建的几个文件(如果想自定义拓展可用保留),然后把Lua的源码拷贝进来,添加到项目工程中,编译宏需要配置LUA_BUILD_AS_DLL和_CRT_SECURE_NO_WARNINGS。然后就可以编译x86和x64的DLL动态库,整体步骤简单易操作。
322 0