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:將節點的結果反轉