using System; using UnityEngine; namespace GAS.Runtime { public enum EffectCenterType { SelfOffset, WorldSpace, TargetOffset } public static class AbilityAreaUtil { [Obsolete("请使用OverlapBox2DNonAlloc方法来避免产生垃圾收集(GC)。")] public static Collider2D[] OverlapBox2D(this AbilitySystemComponent asc, Vector2 offset, Vector2 size, float angle, int layerMask, Transform relativeTransform = null) { relativeTransform ??= asc.GetView().transform; var center = (Vector2)relativeTransform.position; offset.x *= relativeTransform.lossyScale.x > 0 ? 1 : -1; center += offset; angle += asc.GetView().transform.eulerAngles.z; return Physics2D.OverlapBoxAll(center, size, angle, layerMask); } public static int OverlapBox2DNonAlloc(this AbilitySystemComponent asc, Vector2 offset, Vector2 size, float angle, Collider2D[] results, int layerMask, Transform relativeTransform = null) { relativeTransform ??= asc.GetView().transform; var center = (Vector2)relativeTransform.position; offset.x *= relativeTransform.lossyScale.x > 0 ? 1 : -1; center += offset; angle += asc.GetView().transform.eulerAngles.z; var count = Physics2D.OverlapBoxNonAlloc(center, size, angle, results, layerMask); return count; } public static int TimelineAbilityOverlapBox2D(this TimelineAbilitySpec spec, Vector2 offset, Vector2 size, float angle, int layerMask, Collider2D[] results, EffectCenterType centerType, Transform relativeTransform = null) { return centerType switch { EffectCenterType.SelfOffset => spec.Owner.OverlapBox2DNonAlloc(offset, size, angle, results, layerMask, relativeTransform), EffectCenterType.WorldSpace => Physics2D.OverlapBoxNonAlloc(offset, size, angle, results, layerMask), EffectCenterType.TargetOffset => spec.Target.OverlapBox2DNonAlloc(offset, size, angle, results, layerMask, relativeTransform), _ => 0 }; } [Obsolete("请使用OverlapCircle2DNonAlloc方法来避免产生垃圾收集(GC)。")] public static Collider2D[] OverlapCircle2D(this AbilitySystemComponent asc, Vector2 offset, float radius, int layerMask, Transform relativeTransform = null) { relativeTransform ??= asc.GetView().transform; var center = (Vector2)relativeTransform.position; offset.x *= relativeTransform.lossyScale.x > 0 ? 1 : -1; center += offset; return Physics2D.OverlapCircleAll(center, radius, layerMask); } public static int OverlapCircle2DNonAlloc(this AbilitySystemComponent asc, Vector2 offset, float radius, Collider2D[] results, int layerMask, Transform relativeTransform = null) { relativeTransform ??= asc.GetView().transform; var center = (Vector2)relativeTransform.position; offset.x *= relativeTransform.lossyScale.x > 0 ? 1 : -1; center += offset; var count = Physics2D.OverlapCircleNonAlloc(center, radius, results, layerMask); return count; } } }