JisolGame/JEX_GAS/Assets/GAS/Runtime/Ability/AbilityAreaUtil.cs
2024-10-18 03:16:09 +08:00

78 lines
3.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.transform;
var center = (Vector2)relativeTransform.position;
offset.x *= relativeTransform.lossyScale.x > 0 ? 1 : -1;
center += offset;
angle += asc.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.transform;
var center = (Vector2)relativeTransform.position;
offset.x *= relativeTransform.lossyScale.x > 0 ? 1 : -1;
center += offset;
angle += asc.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.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.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;
}
}
}