Unity (六) BehaviorDesignerc行為樹插件的一些運用


Behavior Designer行為樹

行為樹就是將所有可能發生的狀態進行模塊化,將狀態抽象成一個個的行為,然后在每個行為之間可以增加一些節點

 

復合節點(Composites Node)進行每個節點之間邏輯控制,

裝飾節點(Decorator Node)進行子節點狀態的控制,

行為節點(Action Node)進行具體行為的處理,

條件節點(Conditionals Node)用於判斷該條件是否成立等。

 

 

 

Composites

常用的復合節點有:

 

1)sequence:

序列節點

子節點順序執行,當其中一個失敗,返回失敗

子任務其中有一個執行失敗了,則不會往下執行了

所有任務執行成功,才返回成功

idle:一直返回running

wait: 等待一段時間后返回成功

Restart When cor 當結束后重啟

 

2)selector

並發選擇節點,子節點並行,

只要其中一個子節點成功了,就返回成功,

其他子節點不再執行

 

 

 

常用節點:

Flee: 遠離

 

TargetTransform:目標

 

Fleed Distance: 逃跑到離目標多少距離為成功(如果目標的視野是7,則需要跑到8為成功)

LookAheadDistance:先跑多少米再做判斷

 

 

 

Patrol :

巡邏

添加 Behavior Designer Movement 擴展包

 

 

1)創建,設置速度speed,角速度,距離多少Distance(默認0.1)為到達了點 

 

2)場景靜態,烘焙,給選中的對象添加NavMeshAgent組件

 

 

Seek

尋找某個點 ,使用Unity NavMesh

  

 

移動到這個點

 

Variables : 變量

 

變量可以直接給節點傳值,也可以通過節點給變量賦值

 

 

Can See Object :

是否看到某個對象

 

 

 

 

 

Object LayerMask 指定層的目標

Filed of view Anle 視野角度

View Ditance 視野距離

Object In Sight : 將看到的Object位置給變量Target賦值

 

                                                                           

 

Abort Type

中止類型

1 ) Onoe 子節點的條件判定,只判定一次

 

2 ) Self 條件判斷不成功,中止條件自身同父類的子節點

  當子節點判定條件不滿足時,打斷自身的任務

  當執行優先級別低的節點時,會持續判斷子節點設置的條件

  ( 當不再看到主角時,打斷自身seek,開始執行右邊的任務seek)

 

3 ) LowerPriorty,條件判斷成功,中止優先級低的

  當條件滿足時,打斷右邊的節點,執行子節點

  當看到主角時,打斷Sequence右邊節點,

  開始執行追的節點,直到追到為止,並不會從 新判斷)

 

4)Both 兩者都會中斷

 

 

手寫一個Seek

SharedFloat:共享的變量

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using BehaviorDesigner.Runtime;
    using BehaviorDesigner.Runtime.Tasks; //引入命名空間
    public class MySeek : Action
    {
    public SharedFloat Speed = 0;  //按照Seek格式定義公開的變量,速度

    public SharedFloat ArriveDistance = 0.1f;  //距離,判定多少為到達目標  
    public SharedTransform tagert;  //目標位置
    public override void OnAwake()
    {
      
    }
    public override TaskStatus OnUpdate()
    {
        if (tagert == null||tagert.Value==null)  //如果目標為空
        {
            return TaskStatus.Failure;  //返回失敗
        }
        transform.LookAt(tagert.Value.position);  //看向目標
        //向目標移動
        transform.position = Vector3.MoveTowards(transform.position, tagert.Value.position, Speed.Value * Time.deltaTime);
        //如果與目標距離的平方,小於設定值的距離
        if (Vector3.Distance(tagert.Value.position, transform.position) < ArriveDistance.Value)
        {
            return TaskStatus.Success;
            //則到達目標,返回成功
        }
        return TaskStatus.Running;
        //否者反正運行,繼續執行方法
    }
}

手寫一個Can See Object 腳本:

 

 public SharedTransform target; //共享目標

 

 

 using BehaviorDesigner.Runtime.Tasks; //命名空間
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using BehaviorDesigner.Runtime; //命名空間
    public class MyCanSeeObject : Conditional {
    public Transform[] Objects; //看到的目標
    public  SharedFloat FiedOfViewAngle = 90; //視野角度
    public SharedFloat ViewDistance = 7; //視野長度
    public SharedTransform target; //共享目標
    public override TaskStatus OnUpdate()  
    {
        if (Objects==null)
        {
            return TaskStatus.Failure;  //數組為空,返回失敗
        }
        foreach (var item in Objects)   //遍歷數組
        {
            float distance = Vector3.Distance(transform.position, item.position); //計算目標與自身的距離,
            float angle = Vector3.Angle(transform.forward, item.position - transform.position); //計算目標與自身正前方的角度
            this.target.Value = item;   //共享這個目標
                
            if (distance<ViewDistance.Value&&angle<FiedOfViewAngle.Value/2) //如果距離小於視野距離,並且角度小於視野角度的一半
            {
                return TaskStatus.Success; //返回成功
            }
        }
        return TaskStatus.Failure; //否者返回失敗
    }
}

Decorator節點:

針對單個節點做操作

Inverter:將節點的結果反轉

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM