Unity6/변경점

[Unity6] NonAlloc 변경점

turbulence93 2025. 9. 8. 18:49

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) 성질은 그대로 유지된다.