Cocos Creator 行为树可视化编辑插件[20170319更新]

单论上面的问题,能看出 main.js 报错的地方是 Editor.log,你可以尝试把 main.js 中的日志先注释掉跑跑看, 具体是 packages/behaviortree-editor/main.js 中的 Editor.log。其它我不了解 creator 和 creator 3D 的插件是否兼容

main.js 里到处都是Editor。刚才在creator2.3.3里测试了,是正常的。creator3d里不行。

官方现在的 creator 3d 教程没有插件部分。最好能提供一下?包括 creator 的插件怎么适配 creator 3d 之类的。 @放空老师 @JoneLau

刚研究了一下,creator 3d不支持ES5,插件导出是ES5格式。这个插件需要的,逻辑复杂一点的都需要行为树。@panda

这是社区积累的资源,价值很高,不要因升级版本用不了,这样就太可惜了。 @panda

我本人说实话是很想近期去做的,但是编辑器这快目前告知我是对外接口确定是在 1.2,1.2 部分功能开放,3.0 正式全部开放,也就是我现在出教程的话,后期的改动也很大,对你们来说受益也不大,反而还增加了使用成本

2赞

那么问题来了,3,0什么时候出来呢.现在想重头做一个行为树的插件,老是被一些编辑器的接口不全卡住

mark 行为树

哈哈哈,预计 12 月份呢,不过 1.2 就会开放,能说一下你行为树的设计可能涉及到的部分吗,目前我得知是 asset-db 的插件会开放,可以根据你的需求,我问问编辑器同学能否来得及提前开放

首先最大的问题就是文档没有及时更新,很多文档的api在2.4.0不能使用了。而且很多IPC事件也在文档内部也没有体现出来,还有就是比如文档也没有诸如创建文件夹之类的接口,只能走fs的接口创建,然后调用creator刷新。这么做之后每次打开编辑器

都会报之类的错误,虽然不影响运行,但每次报这种错总感觉不舒服。

还有一个问题就是能否提供脚本uuid和路径的对应关系,因为需要在游戏内部动态require脚本,而在运行时我暂时没发现可以通过脚本uuid找到脚本的方式.只能通过自己初始化插件的时候初始化一个脚本和uuid的索引文件,然后插件内部根据文件变更进行维护.来达到动态require脚本的办法.

厉害得不得了

Editor.assetdb.uuidToUrl 你需要的是这个接口吧

因为出了个260rmb的行为树插件所以来挖坟了吗:joy:

是啊 想起了这个贴心行为树

看到别的一些版本的行为树的action 有前置条件和后置条件,请问这个版本的用什么来处理前置后置啊?

很奇怪,节点在tick的过程中基本都会执行 enter open tick close exit,但对于Wait、Limiter这样的行为,在open的时候会进行重置计数,等于每个tick都是新的,根本起不到该有的作用,不知道是没开发完成还是我的用法不对……

mark!

这个有没有平行节点?

并行
var successCount = 0;
for (var i=0; i<treeNode.children.length; i++){
var childrenTreeNode = treeNode.children[i];
var status = childrenTreeNode._execute(tick);
if(status == b3.SUCCESS){
successCount++;
}
}
if(successCount == treeNode.children.length){
return b3.SUCCESS;
}else{
return b3.RUNNING;
}
随机权重节点
open: function(tick,b3,treeNode){
this.random = Math.floor(Math.random() * 100);
tick.blackboard.set(‘runningChild’, 0, tick.tree.id, this.id);
tick.blackboard.set(‘WantLeaveTime’, Math.floor(Math.random()*1));
},
tick: function(tick,b3,treeNode){
let child = tick.blackboard.get(‘runningChild’, tick.tree.id, this.id);
for (var i=child; i<treeNode.children.length; i++){
var childrenTreeNode = treeNode.children[i];
childrenTreeNode.parameter;
var randomA = childrenTreeNode.parameter.randomA;
var randomB = childrenTreeNode.parameter.randomB;
if(randomA <= this.random && this.random < randomB){
var status = childrenTreeNode._execute(tick);
if(status !== b3.FAILURE){
if(status == b3.RUNNING){
tick.blackboard.set(‘runningChild’, i, tick.tree.id, this.id);
}
return status;
}
}
}
return b3.FAILURE;
},