IndieGame/client/Assets/ParadoxNotion/NodeCanvas/Tasks/Conditions/GameObject/CheckLOS.cs
DOBEST\zhaoyingjie f242607587 初始化工程
2024-10-11 10:12:15 +08:00

49 lines
1.5 KiB
C#

using NodeCanvas.Framework;
using ParadoxNotion.Design;
using UnityEngine;
namespace NodeCanvas.Tasks.Conditions
{
[Name("Target In Line Of Sight")]
[Category("GameObject")]
[Description("Check of agent is in line of sight with target by doing a linecast and optionaly save the distance")]
public class CheckLOS : ConditionTask<Transform>
{
[RequiredField]
public BBParameter<GameObject> LOSTarget;
public BBParameter<LayerMask> layerMask = (LayerMask)( -1 );
public Vector3 offset;
[BlackboardOnly]
public BBParameter<float> saveDistanceAs;
private RaycastHit hit = new RaycastHit();
protected override string info {
get { return "LOS with " + LOSTarget.ToString(); }
}
protected override bool OnCheck() {
var t = LOSTarget.value.transform;
if ( Physics.Linecast(agent.position + offset, t.position + offset, out hit, layerMask.value) ) {
var targetCollider = t.GetComponent<Collider>();
if ( targetCollider == null || hit.collider != targetCollider ) {
saveDistanceAs.value = hit.distance;
return false;
}
}
return true;
}
public override void OnDrawGizmosSelected() {
if ( agent && LOSTarget.value ) {
Gizmos.DrawLine(agent.position + offset, LOSTarget.value.transform.position + offset);
}
}
}
}