下面展示 Unity 行為樹節點開發——A*移動控制,
using UnityEngine;
using Pathfinding;
using MR_LBS.Client.Unity3D;
namespace BehaviorDesigner.Runtime.Tasks
{
[TaskCategory("GC_CL")]
public class PathFinding_Test : Action
{
public SharedFloat moveSpeed;
//A* 是否開啟尋路
public SharedBool canMove = true;
public SharedGameObject target;
MonsterControlBase monsterControl;
Monster monster;
//A* 到達距離
public SharedFloat arriveDistance = 2f;
//public SharedVector3 targetPosition;
BehaviorTree tree;
//A* 到達下一個點的距離
//public SharedFloat pickNextWaypointDist = 1f;
AIPath aIPath;
private bool canChangeAStar;
public override void OnAwake()
{
monsterControl = GetComponent<MonsterControlBase>();
tree = (BehaviorTree)base.Owner;
monster = monsterControl.Monster_P;
aIPath = GetComponent<AIPath>();
canChangeAStar = (bool) tree.GetVariable("CanChangeAStar").GetValue();
}
public override void OnStart()
{
canChangeAStar = (bool)tree.GetVariable("CanChangeAStar").GetValue();
if (canChangeAStar)
{
aIPath.maxSpeed = moveSpeed.Value;
//打開尋路
aIPath.canMove = true;
aIPath.endReachedDistance = arriveDistance.Value;
if (target.Value == null)
{
monsterControl.PathFindingCon(null);//null 蟲洞坐標
target.Value = monsterControl.Wormhole.gameObject;
//transform.LookAt(target.Value.transform);
}
else
{
monsterControl.PathFindingCon(target.Value.gameObject);
//transform.LookAt(target.Value.transform);
}
}
else if (!canChangeAStar)
{
aIPath.canMove = false;
}
}
public override TaskStatus OnUpdate()
{
canChangeAStar = (bool)tree.GetVariable("CanChangeAStar").GetValue();
//默認情況下可以第一判斷不會對尋路產生影響
//如果有特殊效果影響尋路則更改第一層判定,暫停行為樹中的尋路效果
if (canChangeAStar)
{
var position = Target();
// Return a task status of success once we've reached the target
if (Vector3.Magnitude(transform.position - position) < arriveDistance.Value)
{
//Debug.Log(Vector3.Magnitude(transform.position - position));
aIPath.canMove = false;
//Debug.Log(Vector3.Magnitude(transform.position - position));
return TaskStatus.Success;
}
if (((SharedGameObject)tree.GetVariable("FireTarget")).Value != null)
{
return TaskStatus.Success;
}
if (target.Value != null)
{
//Debug.Log(4444);
//transform.LookAt(target.Value.transform);
return TaskStatus.Success;
}
else
return TaskStatus.Failure;
}
else
{
if (canChangeAStar==false)
{
//Debug.Log("Worn");
}
//Debug.Log("false");
//這里不能讓行為樹卡在這里 所以應該是判定失敗從新判定
return TaskStatus.Failure;
}
}
private Vector3 Target()
{
if (target == null || target.Value == null)
{
return monsterControl.Wormhole.position;
}
return target.Value.transform.position;
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/240901.html
標籤:其他
