Devs/Unity

[UGUI] GridLayoutGroup 정렬 후 하위 게임 오브젝트 position 0인 현상

whawoo 2025. 5. 28. 11:43
반응형

Unity의 UGUI 시스템에서 GridLayoutGroup을 활용해 오브젝트를 정렬할 때,
간혹 자식 오브젝트들의 position이 (0, 0, 0)으로 초기화되어 의도한 위치에 배치되지 않는 문제가 발생할 수 있습니다.
이 포스트에서는 2048 퍼즐 게임 개발 중 실제로 겪었던 사례를 바탕으로, 해당 현상의 원인과 해결 방법을 공유합니다.


🧩 문제 상황

개인 프로젝트로 제작 중인 2048 게임에서 Board를 NxN 구조로 생성하고
Block 프리팹을 배치하는 과정에서, 특정 상황에서 블록이 모두 보드의 중앙에 쌓이는 문제가 발생했습니다.

아래는 해당 문제를 캡처한 이미지입니다:

(문제의 경우: 위와 같은 보드에 블록이 모두 한 곳에 쌓임)

 

GridLayoutGroup 사용 시 블록이 모두 중앙에 몰려 생성되는 문제 상황 캡처
위 이미지는 GridLayoutGroup을 적용했을 때 모든 블록이 position (0,0,0)에 배치된 문제를 보여준다.


🔍 코드 예시

for (int i = 0; i < size; i++) {
    for (int j = 0; j < size; j++) {
        GameObject block = Instantiate(blockPrefab, board);
        block.transform.localPosition = new Vector3((j - size / 2) * blockSize, (i - size / 2) * blockSize, 0f);
    }
}
예상한 위치가 아닌 보드 중앙에 모든 오브젝트가 생성됨

❗ 문제 원인

해당 현상은 GridLayoutGroup이 적용된 상태에서 RectTransform이 올바르게 초기화되지 않았기 때문에 발생했습니다.
즉, GridLayoutGroup이 내부적으로 위치 계산을 완료하기 전에 오브젝트를 수동 배치하려다 보니 충돌이 발생한 것입니다.


✅ 해결 방법: Canvas.ForceUpdateCanvases()

이 문제는 다음 코드를 통해 해결할 수 있었습니다

Canvas.ForceUpdateCanvases();

 

Canvas.ForceUpdateCanvases()는 Unity에서 Canvas의 레이아웃 계산을 즉시 강제로 수행하는 함수입니다.
이를 호출함으로써 내부적으로 LayoutGroup(예: GridLayoutGroup)이 정확한 위치를 계산하고 반영하게 되어
오브젝트들이 올바른 위치에 배치됩니다.


💡 추가 팁

  • GridLayoutGroup 사용 시 오브젝트를 수동으로 위치 지정하려는 시도는 가급적 피해야 하며, 레이아웃 시스템의 계산 흐름을 고려해야 합니다.
  • UGUI는 실제 렌더링 전에 레이아웃 계산을 지연 처리하는 경우가 많기 때문에, 이러한 경우에는 ForceUpdateCanvases() 같은 강제 갱신 함수가 유용할 수 있습니다.
  • 게임 오브젝트가 예상치 못한 위치에 몰려 있을 경우, 레이아웃 관련 컴포넌트들이 제대로 초기화되었는지 의심해볼 필요가 있습니다.

📝 마무리

이번 문제를 통해, Unity의 UGUI에서 레이아웃 컴포넌트가 어떻게 동작하는지 다시금 학습할 수 있었습니다.
GridLayoutGroup은 매우 유용한 도구지만 내부 연산이 지연되거나 초기화 순서에 따라 예기치 못한 문제가 발생할 수 있기에 주의가 필요합니다.

향후에도 유사한 문제가 생길 경우, Canvas.ForceUpdateCanvases()를 먼저 고려해보면 해결의 실마리가 될 수 있습니다.

반응형