天天看點

Unity進階:行為樹 01版權申明:行為樹插件

版權申明:

  • 本文原創首發于以下網站:
  1. 部落格園『優夢創客』的空間:https://www.cnblogs.com/raymondking123
  2. 優夢創客的官方部落格:https://91make.top
  3. 優夢創客的遊戲講堂:https://91make.ke.qq.com
  4. 『優夢創客』的微信公衆号: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;//失敗
    }
           

判斷距離,是否在視野内(夾角小于視野的一半)