Unity/Unity 개발

SpriteRenderer 기준으로 Collider가 부정확하게 설정됨

leedh1211 2025. 5. 14. 02:44

문제점

 

  • SpriteRenderer로 출력되는 스프라이트의 실제 보이는 영역과, spriteRenderer.bounds 혹은 sprite.rect로 계산한 영역이 불일치했다.
  • 유니티에서 Import된 Sprite는 Trim 처리가 되어 있을 수 있고, 이 경우 sprite.rect는 원래 텍스처 크기를 기준으로 하고, sprite.textureRect는 실제 비어있지 않은 부분만 나타낸다.
  • 그래서 sprite.textureRect를 기준으로 BoxCollider2D의 size를 설정해야 시각적으로 정확한 충돌 범위를 맞출 수 있다.
  • 추가로 sprite.pivot 값을 고려하여 offset도 조정해야 실제 스프라이트 중심과 맞는 Collider를 만들 수 있었다.
  • 문제는 여기서 끝나지 않았다. Sprite가 바뀌는 타이밍과 Collider를 갱신하는 타이밍이 달라서, spriteRenderer.sprite가 null이거나, 아직 bounds가 정확히 계산되지 않았을 수 있었다. 이런 경우 Collider 값이 초기화되지 않거나 잘못 세팅되었다.

 

시도한 것

 

  • sprite.textureRect / sprite.pixelsPerUnit을 활용한 width/height 계산
  • pivot / rect.size를 이용한 offset 계산
  • Init()에서 Sprite 세팅 직후 Collider 설정을 호출

 

해결방안

 

  • spriteRenderer.sprite가 null이 아닌지 확인하는 조건 추가
  • Sprite 설정 직후 한 프레임 대기하거나 LateUpdate() 혹은 Coroutine에서 Collider 재계산 시도
  • 최종적으로 Sprite 교체 → Collider size, offset 설정을 한 함수에서 처리

 

아쉬운점

자동화를 진행하여 작업하고 싶었으나, 이미지구조가 자동화를 하기에 어려움이 있었다. 이미지를 모두 Trim을 짜서 잡거나, 연산을 몹시 복잡하게 끌고가야해서 결국 하드코딩으로 값을 넣어준것이 아쉽다.