Quick Reference
Layout Group은 자식, Content Size Fitter는 자기 RectTransform 크기를 제어하므로 같은 축에서 함께 쓰지 말고, 고정 HUD는 수동 배치를 우선합니다.
- 기준 버전은 Unity 6.5 (6000.5), Unity UI (UGUI) 2.0.0입니다.
Layout Group은 자식의 위치와 크기를 배치하고,Content Size Fitter는 자기 자신의 RectTransform 크기를 content의 최소·선호 크기로 맞춥니다. - 같은 축에서 부모 Layout Group과 자식 Content Size Fitter가 같은 RectTransform 크기를 동시에 제어하면 충돌합니다.
- 고정 HUD는 수동 RectTransform이 단순하고, 아이템 수나 문장 길이가 바뀌는 목록·툴팁은 자동 레이아웃이 맞습니다.
Inspector 설정
Horizontal과 Vertical Layout Group
- Padding은 기본
0인 그룹 테두리 안쪽 여백이며 왼쪽·오른쪽·위·아래 픽셀 값입니다. Panel Image의 테두리 여백과 맞추려면 여기서 조정합니다. 자식 좌표를 수동으로 보정하면 다음 rebuild 때 다시 덮어써집니다. - Spacing은 기본
0인 자식 사이 간격입니다. 목록 행 간격처럼 모든 항목에 같은 간격이 필요할 때 씁니다. 아이템마다 다른 간격이 필요하면 spacer나 개별 Layout Element를 검토합니다. - Child Alignment는 남은 공간 안에서 자식 묶음의 기준점입니다. 높이가 부족한 목록의 top 정렬과 버튼 묶음의 middle-center 정렬은 의도가 다릅니다.
- **Control Child Size (Width/Height)**가 켜진 축은 Group이 자식 RectTransform의 해당 크기를 씁니다. 자식이 고정 너비·높이를 유지해야 한다면 끄고 Layout Element 값을 함께 확인합니다.
- **Child Force Expand (Width/Height)**는 남는 공간을 자식에게 강제로 나눕니다. 콘텐츠 크기만큼인 버튼이나 채팅 행이 뜻밖에 늘어나면 먼저 이 값을 끕니다. 일부 항목만 늘려야 할 때는 그 항목에
Layout Element의 Flexible Width/Height를 줍니다.
Grid Layout Group과 Content Size Fitter
- Grid Layout Group의 Cell Size는 기본
100 x 100인 각 자식의 고정 너비와 높이입니다. Grid는 자식의 minimum, preferred, flexible 크기를 무시하므로 텍스트 길이별 크기가 다른 카드 목록에는 맞지 않습니다. - Start Corner / Start Axis는 첫 요소의 시작 모서리와 채우는 방향을 정합니다. 인벤토리처럼 왼쪽에서 오른쪽, 위에서 아래로 채우는지 명시할 때 씁니다.
- Constraint는
Flexible,Fixed Column Count,Fixed Row Count입니다. ScrollView의 세로 목록형 grid는 보통 열 수를 고정해 폭 변동을 줄입니다. 가로·세로 모두 콘텐츠에 맞춰 늘어나게 하면 화면 크기 변화에서 행열 수가 흔들릴 수 있습니다. - Content Size Fitter의 Horizontal Fit / Vertical Fit 기본은 모두
Unconstrained이며, 선택지는Unconstrained,Minimum Size,Preferred Size입니다.Preferred Size는 Text, Image, Layout Group, Layout Element가 제공한 선호 크기로 자기 RectTransform을 구동합니다.Unconstrained는 그 축을 건드리지 않습니다. Content Size Fitter가 커질 방향은 RectTransform Pivot을 따릅니다. 툴팁이 오른쪽 아래로 늘어나야 하면 pivot도 좌상단처럼 의도한 기준으로 맞춥니다.
Layout Element
Layout Element의 Min, Preferred, Flexible Width/Height는 자식이 Group에 제시하는 크기 정보입니다. Text나 Image가 제시하는 기본 크기를 덮어써야 할 때만 넣습니다. 실제로 늘어나야 할 항목에만 Flexible 값을 주고, 모든 자식에 습관처럼 붙이지 않습니다.
스크립트 연결
텍스트 변경이나 아이템 추가 뒤에는 Unity가 다음 layout pass에서 다시 계산하게 두는 것이 기본입니다. 같은 프레임에 계산된 크기를 반드시 읽거나 스크롤 위치를 즉시 맞춰야 할 때만 강제 rebuild를 씁니다.
using UnityEngine;
using UnityEngine.UI;
public sealed class FeedLayoutRefresh : MonoBehaviour
{
[SerializeField] private RectTransform content;
[SerializeField] private ScrollRect scrollRect;
public void QueueRefresh()
{
LayoutRebuilder.MarkLayoutForRebuild(content);
}
public void RebuildBeforeMeasuring()
{
LayoutRebuilder.ForceRebuildLayoutImmediate(content);
scrollRect.verticalNormalizedPosition = 0f;
}
}LayoutRebuilder.MarkLayoutForRebuild(RectTransform)는 다음 layout pass에 다시 계산하도록 예약합니다. 콘텐츠가 변한 root RectTransform을 전달합니다.ForceRebuildLayoutImmediate(RectTransform)는 현재 호출에서 바로 계산합니다.Update나 각 아이템 생성마다 부르면 layout 비용을 같은 프레임에 몰아넣으므로, 즉시 측정이 필요한 좁은 지점에만 둡니다.- Layout Group이 제어하는
RectTransform을 코드에서anchoredPosition이나sizeDelta로 움직여도 다음 rebuild에서 덮어써집니다. 수동 배치로 바꾸거나 Group의 제어 축을 바꿔야 합니다.
자주 틀리는 부분
부모가 자식 크기를 제어하는 축에 자식 Content Size Fitter를 붙이지 마세요. 예를 들어 Vertical Layout Group이 Child Control Height를 켠 상태에서 각 행이 Vertical Fit을 통해 자기 높이를 쓰려 하면 둘이 같은 height를 경쟁합니다. 부모 Group의 Force Expand를 끄고 Layout Element의 preferred height를 쓰는 편이 안전합니다.
GridLayoutGroup은 자식의 텍스트 선호 크기를 존중하지 않습니다. 긴 제목을 가진 카드가 잘리면 TextMeshPro 설정부터 만지기보다 Grid의 Cell Size가 고정 크기를 강제하고 있는지 확인하세요.
참고 링크
2 sources