Unity의 UGUI 시스템에서 GridLayoutGroup을 활용해 오브젝트를 정렬할 때,
간혹 자식 오브젝트들의 position이 (0, 0, 0)으로 초기화되어 의도한 위치에 배치되지 않는 문제가 발생할 수 있습니다.
이 포스트에서는 2048 퍼즐 게임 개발 중 실제로 겪었던 사례를 바탕으로, 해당 현상의 원인과 해결 방법을 공유합니다.
🧩 문제 상황
개인 프로젝트로 제작 중인 2048 게임에서 Board를 NxN 구조로 생성하고
Block 프리팹을 배치하는 과정에서, 특정 상황에서 블록이 모두 보드의 중앙에 쌓이는 문제가 발생했습니다.
아래는 해당 문제를 캡처한 이미지입니다:
(문제의 경우: 위와 같은 보드에 블록이 모두 한 곳에 쌓임)
🔍 코드 예시
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()를 먼저 고려해보면 해결의 실마리가 될 수 있습니다.
'Devs > Unity' 카테고리의 다른 글
Unity Addressables + AWS CloudFront 적용 삽질 기록 (0) | 2025.07.01 |
---|---|
Unity Addressables + AWS S3 적용 삽질 기록 — BuildPath 에러 해결법 (0) | 2025.06.30 |