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;//失敗
    }

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


免責聲明!

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



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