using System; using Colosseum.Combat; using Colosseum.Player; using Unity.Behavior; using Unity.Properties; using UnityEngine; using Condition = Unity.Behavior.Condition; namespace Colosseum.AI.BehaviorActions.Conditions { /// /// 다운된 적대 대상이 지정 반경 이내에 존재하는지 확인합니다. /// 징벌(Punish) 패턴의 전제 조건으로 사용됩니다. /// [Serializable, GeneratePropertyBag] [Condition(name: "Downed Target In Range", story: "다운된 대상이 [{SearchRadius}]m 이내에 있는가?", id: "d4e5f6a7-3333-4444-555566667777")] [NodeDescription( name: "Downed Target In Range", story: "Downed target within [{SearchRadius}]m", category: "Condition/Pattern")] public partial class IsDownedTargetInRangeCondition : Condition { [SerializeReference] [Tooltip("다운된 대상을 탐색할 최대 반경")] public BlackboardVariable SearchRadius = new BlackboardVariable(6f); public override bool IsTrue() { float searchRadius = Mathf.Max(0f, SearchRadius.Value); HitReactionController[] controllers = UnityEngine.Object.FindObjectsByType(FindObjectsSortMode.None); for (int i = 0; i < controllers.Length; i++) { HitReactionController controller = controllers[i]; if (controller == null || !controller.IsDowned) continue; GameObject candidate = controller.gameObject; if (candidate == null || !candidate.activeInHierarchy) continue; if (candidate == GameObject) continue; if (Team.IsSameTeam(GameObject, candidate)) continue; IDamageable damageable = candidate.GetComponent(); if (damageable != null && damageable.IsDead) continue; float distance = Vector3.Distance(GameObject.transform.position, candidate.transform.position); if (distance <= searchRadius) return true; } return false; } } }