ユニティ高度:動作ツリー

著作権:

  • 次のWebサイトで始まるこの記事オリジナル:
  1. ブログパーク「優れた夢のメイカーズムーブメント」空間にします。https://www.cnblogs.com/raymondking123
  2. 優秀な夢メイカーズムーブメント公式ブログます。https://91make.top
  3. 優れたゲーム夢のメーカー文化講演します。https://91make.ke.qq.com
  4. マイクロチャンネル公衆数の「優秀な夢メイカーズムーブメント」:umaketop
  • あなたは転載は自由ですが、完全な著作権表示を含める必要があります

プラグ行動ツリー

利点:兵士だけでも旅行することができます。また、指定したパスのポイントに沿って他の行為(攻撃、防御力)のプロセスを移動することができ、固定パスアニメーションに沿って移動することはできません

入力割り込み
優先度の低い右の優先順位は、の実装中断する
自己を:だけ時間を遡って、オブジェクトがまっすぐに判断されないシーク開始場合は正常に実行されるが、敵を参照しようと決める見ることができ、その操作、決意、ほんの始まりに割り込みます彼らは決定していないので、敵を追跡することができません見
に実行されます。両方を

MOVEMENT {
カバーは、カバー
イベイドは避ける
逃げる逃げる
群れ集まった
リーダーの移動従う続く
一方向に移動するに向かって移動
パトロールパトロール
追跡追求
により1キュー1を
検索を
求めて検索
散歩ワンダ
}
アクションを{
ログ出力テキスト
しばらくアイドルストップは
タイムタスクを待って待っ
}
複合材料を{
左から右に実行される順序は、成功戻る前にサブタスクの成功した実装は、失敗したタスクが失敗した戻り
セレクタが順次後に行わ正常に実行されていない
}
第一及び第二の数の大きさを決定する:フロートをCoditionals /基本/ Mathf /比較ですが、真、偽に戻り、
動きNC参加モジュール/ PATROL:少しの運動を中心に
運動/シーク:コントロールが目標点に到達した
オブジェクトを見ることができます:物事を見るために

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

距離を決定し、それが視野内にある(半分以下の視野角)

おすすめ

転載: www.cnblogs.com/raymondking123/p/11410729.html