using System; using System.Linq; using Colosseum.Combat; using Unity.Behavior; using Unity.Properties; using UnityEngine; using Condition = Unity.Behavior.Condition; namespace Colosseum.AI.BehaviorActions.Conditions { /// /// 지정 거리 이상 떨어진 적대 대상이 존재하는지 확인합니다. /// 기동(도약) 또는 유틸리티(투척) 패턴의 전제 조건으로 사용됩니다. /// [Serializable, GeneratePropertyBag] [Condition(name: "Target Beyond Distance", story: "[{MinDistance}]m 이상 떨어진 대상이 있는가?", id: "e5f6a7b8-4444-5555-666677778888")] [NodeDescription( name: "Target Beyond Distance", story: "Target beyond [{MinDistance}]m exists", category: "Condition/Pattern")] public partial class IsTargetBeyondDistanceCondition : Condition { [SerializeReference] [Tooltip("이 거리 이상 떨어진 대상이 있는지 확인")] public BlackboardVariable MinDistance = new BlackboardVariable(8f); public override bool IsTrue() { float minDistance = Mathf.Max(0f, MinDistance.Value); IDamageable[] targets = UnityEngine.Object.FindObjectsByType(FindObjectsSortMode.None) .OfType() .ToArray(); for (int i = 0; i < targets.Length; i++) { IDamageable target = targets[i]; if (target == null) continue; Component component = target as Component; if (component == null || !component.gameObject.activeInHierarchy) continue; GameObject candidate = component.gameObject; if (candidate == GameObject) continue; if (Team.IsSameTeam(GameObject, candidate)) continue; if (target.IsDead) continue; float distance = Vector3.Distance(GameObject.transform.position, candidate.transform.position); if (distance >= minDistance) return true; } return false; } } }