cocos creator中使用行为树(BehaviorTree) 二

cocos creator中使用行为树(BehaviorTree) 二

继续我们的行为树AI,  上一节我们已经实现了一个简单的监视守卫, 接下来我们赋予它一些高级一点的功能

实现一个监视到敌人靠近, 自动攻击, 玩家脱离监视范围, 攻击停止

开始敲.....

开始思考, 那个监视范围很好做, 就是判断位置, 返回一个状态, 但是攻击是一个持续的过程, 无法再一帧内完成, 而且在攻击没有结束的时候, 不能开始一次新的攻击, 那怎么做呢?

打开b3core.0.1.0module.js 其中有一些内置的结点, 我们找到wait结点, 其实wait结点和攻击结点有这相似的功能, 即要持续一段时间

 

cocos creator中使用行为树(BehaviorTree) 二

可以看到, 在open时, 定义一个startTime, 每一次执行tick方法就会把当前时间减去开始时间, 判断其结果是否大于endTime

如果大于, 返回SUCCESS, 否则返回RUNNING, 通过RUNNING我们知道这个表示该结点还没有结束, 但是是怎么实现的呢?

在打开BaseNode, vsCode搜索var BaseNode = b3.Class();

cocos creator中使用行为树(BehaviorTree) 二

我们可以看到, 如果这个结点返回的状态不是RUNNING, 就关闭调用close方法, 不然就退出调用exit方法

根据这两点, 我们就可以实现一个攻击功能.

打开cocos creator

cocos creator中使用行为树(BehaviorTree) 二

添加了一个arms结点, 就是这个蓝色的方块, 所以我预计实现的攻击就是

  1. 显示武器(蓝色方块)
  2. 将武器从上到下移动
  3. 隐藏武器

打开Attack脚本


const {ccclass, property} = cc._decorator;

@ccclass
export default class NewClass extends cc.Component {

    speed = 1; // 移动的速度

    // onLoad () {}

    start () {
        
    }

    enter (tick,b3,treeNode){
        console.log("enter");
    }

    open (tick,b3,treeNode){
        console.log("open");
        this.node.getChildByName("arms").active = true;
    }

    tick (tick,b3,treeNode){
        console.log("tick");
        if(this.node.getChildByName("arms").y <= -40) {
            this.node.getChildByName("arms").y = 40;
            return b3.SUCCESS;
        }else {
            this.node.getChildByName("arms").y -= this.speed;
        }
        return b3.RUNNING;
    }

    close (tick,b3,treeNode){
        console.log("close");
        this.node.getChildByName("arms").active = false;
    }

    exit (tick,b3,treeNode){
        console.log("exit");
    }

    // update (dt) {}
}

在open方法中加入武器显示, close中关闭武器显示, tick中修改武器位置, speed表示武器执行速度

ok, 看看执行效果

cocos creator中使用行为树(BehaviorTree) 二