著作権:
- 次のWebサイトで始まるこの記事オリジナル:
- ブログパーク「優れた夢のメイカーズムーブメント」空間にします。https://www.cnblogs.com/raymondking123
- 優秀な夢メイカーズムーブメント公式ブログます。https://91make.top
- 優れたゲーム夢のメーカー文化講演します。https://91make.ke.qq.com
- マイクロチャンネル公衆数の「優秀な夢メイカーズムーブメント」: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;//失败
}
距離を決定し、それが視野内にある(半分以下の視野角)