using System; using Unity.Behavior; using UnityEngine; using Action = Unity.Behavior.Action; using Unity.Properties; [Serializable, GeneratePropertyBag] [NodeDescription(name: "SetTargetInRange", story: "[거리] 내에 [대상이] 있는지 확인", category: "Action", id: "93b7a5d823a58618d5371c01ef894948")] public partial class SetTargetInRangeAction : Action { [SerializeReference] public BlackboardVariable Target; [SerializeReference] public BlackboardVariable Tag = new BlackboardVariable("Player"); [SerializeReference] public BlackboardVariable Range = new BlackboardVariable(10f); protected override Status OnStart() { if (string.IsNullOrEmpty(Tag.Value)) { return Status.Failure; } // 모든 타겟 태그 오브젝트 찾기 GameObject[] targets = GameObject.FindGameObjectsWithTag(Tag.Value); if (targets == null || targets.Length == 0) { return Status.Failure; } // 가장 가까운 타겟 찾기 GameObject nearestTarget = null; float nearestDistance = Range.Value; // Range 내에서만 검색 foreach (GameObject potentialTarget in targets) { float distance = Vector3.Distance( GameObject.transform.position, potentialTarget.transform.position ); if (distance < nearestDistance) { nearestDistance = distance; nearestTarget = potentialTarget; } } if (nearestTarget == null) { return Status.Failure; } Target.Value = nearestTarget; return Status.Success; } }