mirror of
https://gitee.com/jisol/jisol-game/
synced 2025-06-26 03:14:47 +00:00
78 lines
3.3 KiB
C#
78 lines
3.3 KiB
C#
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;
|
||
}
|
||
}
|
||
} |