版權申明:
- 本文原創首發于以下網站:
- 部落格園『優夢創客』的空間:https://www.cnblogs.com/raymondking123
- 優夢創客的官方部落格:https://91make.top
- 優夢創客的遊戲講堂:https://91make.ke.qq.com
- 『優夢創客』的微信公衆号:umaketop
- 您可以自由轉載,但必須加入完整的版權聲明
行為樹插件
優勢:小兵不僅可以按照該固定動畫路徑行進,也可以按照指定的路點行進,也可以行進過程中其他行為(攻擊,防禦)
中斷類型
Lower Priority:打斷右邊優先級執行
Self:隻能中斷自身的運作,進行判定,隻有一開始can see object判定成功看到敵人執行seek,如果一開始就是直行seek就不進行判定,及時後面看到敵人也不能追蹤因為不判定
Both:都會執行
MOVEMENT{
cover掩護
Evade躲避
Flee逃跑
Flock聚集
Leader follow跟随移動
Move towards向一個方向移動
Patrol 巡邏
Pursue 追逐
Queue 一個一個通過
Search 搜尋
Seek 搜尋
Wander 閑逛
}
ACTIONS{
Log 輸出文本
Idle 停一段時間
Wait 等待時間任務
}
Composites {
Sequence 從左往右執行,子任務執行成功才傳回成功,有一個任務失敗就傳回失敗
Selector 依次執行成功後面不執行
}
Coditionals /Basic/Mathf/Float Comparision:判斷大小第一個和第二個數,傳回true,false
Movement /partol :圍繞點運動
Movement /Seek:控制到達目标點
Can See Object:看到東西
using BehaviorDesigner.Runtime.Tasks;
using BehaviorDesigner.Runtime;
//這個任務腳本的作用就是控制遊戲物體達到目标為止
public class MySeek :Action{//這個任務的調用是behacior designe行為樹控制
public SharedTransform target;//這是我們要達到的目标位置
//public float speed;
public SharedFloat sharedSpeed;
//public float arriveDistance = 0.1f;
public SharedFloat sharedArriveDistance=0.1f;
private float sqrArriveDistance;
public override void OnStart()
{
sqrArriveDistance = sharedArriveDistance.Value * sharedArriveDistance.Value;
}
//當進入到這個人物的時候,會一直調用這個方法,一直到任務結束,你傳回一個成功或者失敗的狀态,那麼任務結束如果傳回一個running狀态,那這個方法會繼續調用
public override TaskStatus OnUpdate()
{
//這個方法的調用頻率,預設是跟unity裡面的幀保持一緻的
if (target == null||target.Value==null)//判斷target是否有值
{
return TaskStatus.Failure;//失敗狀态
}
transform.LookAt(target.Value.position);//直接朝向目标位置
transform.position = Vector3.MoveTowards(transform.position, target.Value.position, sharedSpeed.Value * Time.deltaTime);
if((target.Value.position - transform.position).sqrMagnitude < sqrArriveDistance)
{
return TaskStatus.Success;//如果距離目标位置的距離較小,人未到達了目标位置,直接return成功
}
return TaskStatus.Running;//繼續執行
}
}
定義速度,距離,要到達的位置。判斷是否可以運作,計算目标與自身距離,向目标移動,達到目标點結束。
public Transform[] targets;//判斷是否在視野内的目标
public float fieldOfViewAngle = 90;
public SharedFloat sharedViewDistance;
public SharedTransform target;//共享的變量
public override TaskStatus OnUpdate()
{
if (targets == null) return TaskStatus.Failure;
foreach(var target in targets)//周遊每一個目标是否滿足調用
{
float distance = (target.position - transform.position).magnitude;//求距離目标減去目前自身坐标球的距離
float angle = Vector3.Angle(transform.forward, target.position - transform.position);//求向量夾角,前方向減目标與主角之間的向量
if (distance < sharedViewDistance.Value && angle < fieldOfViewAngle * 0.5f) {//夾角小于視野的一半,距離比視野距離小
this.target.Value = target;//共享變量指派
return TaskStatus.Success;//成功
}
}
return TaskStatus.Failure;//失敗
}
判斷距離,是否在視野内(夾角小于視野的一半)