cocos creator中使用行爲樹(BehaviorTree) 二

cocos creator中使用行爲樹(BehaviorTree) 二

繼續我們的行爲樹AI,  上一節我們已經實現了一個簡單的監視守衛, 接下來我們賦予它一些高級一點的功能

實現一個監視到敵人靠近, 自動攻擊, 玩家脫離監視範圍, 攻擊停止

開始敲.....

開始思考, 那個監視範圍很好做, 就是判斷位置, 返回一個狀態, 但是攻擊是一個持續的過程, 無法再一幀內完成, 而且在攻擊沒有結束的時候, 不能開始一次新的攻擊, 那怎麼做呢?

打開b3core.0.1.0module.js 其中有一些內置的結點, 我們找到wait結點, 其實wait結點和攻擊結點有這相似的功能, 即要持續一段時間

 

可以看到, 在open時, 定義一個startTime, 每一次執行tick方法就會把當前時間減去開始時間, 判斷其結果是否大於endTime

如果大於, 返回SUCCESS, 否則返回RUNNING, 通過RUNNING我們知道這個表示該結點還沒有結束, 但是是怎麼實現的呢?

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

我們可以看到, 如果這個結點返回的狀態不是RUNNING, 就關閉調用close方法, 不然就退出調用exit方法

根據這兩點, 我們就可以實現一個攻擊功能.

打開cocos creator

添加了一個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, 看看執行效果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章