50 lines
1.4 KiB
C#
50 lines
1.4 KiB
C#
using System;
|
|
using AI.FSM;
|
|
using Unity.Behavior;
|
|
using UnityEngine;
|
|
using Action = Unity.Behavior.Action;
|
|
using Unity.Properties;
|
|
|
|
[Serializable, GeneratePropertyBag]
|
|
[NodeDescription(name: "Find By Raycast", story: "Find [Target] by Raycast from [Agent]", category: "Action/Find", id: "4485803bf98219ce319c3000d6f8e6bf")]
|
|
public partial class FindByRaycastAction : Action
|
|
{
|
|
[SerializeReference] public BlackboardVariable<GameObject> Target;
|
|
[SerializeReference] public BlackboardVariable<GameObject> Agent;
|
|
[SerializeReference] public BlackboardVariable<float> MaxDistance = new(10.0f);
|
|
|
|
protected override Status OnStart()
|
|
{
|
|
// initialize action here
|
|
|
|
// test for valid variables
|
|
if (Agent.Value == null) return Status.Failure;
|
|
|
|
return Status.Running;
|
|
}
|
|
|
|
protected override Status OnUpdate()
|
|
{
|
|
Target.Value = null;
|
|
|
|
RaycastHit hit;
|
|
if (!Physics.Raycast(Agent.Value.transform.position, Agent.Value.transform.forward, out hit,
|
|
MaxDistance))
|
|
{
|
|
return Status.Failure;
|
|
}
|
|
|
|
PlayerController playerController = hit.collider.GetComponent<PlayerController>();
|
|
if (!playerController) return Status.Failure;
|
|
|
|
Target.Value = playerController.gameObject;
|
|
return Status.Success;
|
|
}
|
|
|
|
protected override void OnEnd()
|
|
{
|
|
// deinitialize action here
|
|
}
|
|
}
|
|
|