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 Target; [SerializeReference] public BlackboardVariable Agent; [SerializeReference] public BlackboardVariable 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(); if (!playerController) return Status.Failure; Target.Value = playerController.gameObject; return Status.Success; } protected override void OnEnd() { // deinitialize action here } }