1. 문제 상황
Unity 6으로 업데이트한 뒤 기존에 사용하던 코드가 더 이상 지원하지 않아 오류 발생
int hitCount = Physics2D.OverlapBoxNonAlloc(
owner.Rb.position + owner.Controller.LookDir().Item1 * owner.weaponArea/2f,
owner.weaponArea,
owner.Controller.LookDir().Item2,
hitTargetArray,
owner.targetMask);
2. 원인
- Unity 6에서 2D 물리의 NonAlloc 계열 API가 통합/정리되었다.
- 이제는 ContactFilter2D를 사용해 레이어/트리거 여부 등을 지정하고,
Physics2D.OverlapBox를 호출해야 한다. - results 배열은 그대로 재사용 가능하지만, layerMask를 직접 넘길 수 없고 ContactFilter2D에 설정해야 한다.
3. 해결 방법
코드를 OverlapBoxNonAlloc에서 OverlapBox(ContactFilter2D)로 변경.
private ContactFilter2D hitFilter; //추가
void Awake()
{
hitFilter.useLayerMask = true;
hitFilter.useTriggers = false;
hitFilter.SetLayerMask(owner.targetMask); //필터 세팅
}
public void DrawAttackArea()
{
if (!isAttackable) return;
int hitCount = Physics2D.OverlapBox(
owner.Rb.position + owner.Controller.LookDir().Item1 * (owner.weaponArea / 2f),
owner.weaponArea,
owner.Controller.LookDir().Item2,
hitFilter,
hitTargetArray
);
OnAttack(hitCount);
}
- 기존 layerMask를 통해서 검출하던 기능을 ContactFilter2D가 하게 된다.
- ContactFilter2D를 통해 마스크와 트리거 사용여부를 결정한다.
- useTiggers = true 시 트리거도 검출 오브젝트로 포함한다.
- hitFilter.SetLayerMask(owner.targetMask); 를 통해 사용할 layerMask를 설정한다.
- 기존 코드에서 layerMask를 매개변수로 넣는 대신 생성한 필터를 넣어준다.
4. 정리
- ContactFilter2D를 쓰면서 레이어 마스크 + 트리거 포함 여부를 유연하게 설정할 수 있어, 오히려 관리가 편리해졌다.
- hitTargetArray는 기존과 같이 매번 새로 생성하지 않고 재사용하면 되며, 초기화는 필요 없다.
- 예전 NonAlloc 함수보다 조금 코드가 길어졌지만, 최적화(Non-Alloc) 성질은 그대로 유지된다.