안녕하세요.
한동안 UGUI를 쓰면서 LayoutGroup을 강제 갱신이 필요해서 찾아본 내용과 삽질한 것들을 적어볼까 합니다.
- HorizontalLayoutGroup
- VerticalLayoutGroup
- GridLayoutGroup
UGUI에서 제공하는 LayoutGroup 컴포넌트는 이렇게 셋입니다.
자세한 사용은 이 글을 보시는 분들은 이미 알고 계실 거라 생각하고 링크도 있으니 생략하겠습니다.
public interface ILayoutElement
{
void CalculateLayoutInputHorizontal();
void CalculateLayoutInputVertical();
}
LayoutGroup 컴포넌트들은 하위 오브젝트들을 정렬시켜주는 역할을 하는데, 하위 오브젝트들을 검사하여 정렬시켜주는 함수는 ILayoutElement 인터페이스의 CalculateLayoutInputHorizontal, CalculateLayoutInputVertical함수로 정렬시킵니다.
m_GridLayoutGroup.CalculateLayoutInputHorizontal();
m_GridLayoutGroup.CalculateLayoutInputVertical();
실제 사용은 이렇게 강제로 업데이트시켜주면 됩니다.
참 쉽죠?
다만, 한 가지 문제점이 있습니다.
제가 VerticalLayoutGroup을 사용할 당시에 CalculateLayoutInputVertical함수만 호출하면 되겠지 했는데 조금 문제가 있었습니다.
자식 오브젝트들을 못 찾는 문제였는데 LayoutGroup 내부 코드를 보면 왜 그런지 바로 이해할 수 있습니다.
public virtual void CalculateLayoutInputHorizontal()
{
m_RectChildren.Clear();
var toIgnoreList = ListPool<Component>.Get();
for (int i = 0; i < rectTransform.childCount; i++)
{
var rect = rectTransform.GetChild(i) as RectTransform;
if (rect == null || !rect.gameObject.activeInHierarchy)
continue;
rect.GetComponents(typeof(ILayoutIgnorer), toIgnoreList);
if (toIgnoreList.Count == 0)
{
m_RectChildren.Add(rect);
continue;
}
for (int j = 0; j < toIgnoreList.Count; j++)
{
var ignorer = (ILayoutIgnorer)toIgnoreList[j];
if (!ignorer.ignoreLayout)
{
m_RectChildren.Add(rect);
break;
}
}
}
ListPool<Component>.Release(toIgnoreList);
m_Tracker.Clear();
}
public abstract void CalculateLayoutInputVertical();
LayoutGroup 내부 코드 중 CalculateLayoutInputHorizontal, CalculateLayoutInputVertical 함수 구현 부분입니다.
자식 오브젝트들을 리스트에 담아두는 코드인데 CalculateLayoutInputHorizontal에만 구현되어있고 CalculateLayoutInputVertical에는 빠져있습니다.
아마도 저처럼 강제로 계산시키도록 하는 게 아니라 일반적인 상황에서는 CalculateLayoutInputHorizontal, CalculateLayoutInputVertical 순서로 호출되어서 이상이 없었던 게 아닐까... 추측합니다.
m_VerticalLayoutGroup.CalculateLayoutInputHorizontal();
m_VerticalLayoutGroup.CalculateLayoutInputVertical();
VerticalLayoutGorup 역시 이렇게 강제로 갱신시켜주어야 합니다.
모르면 삽질하는 거죠...
'Unity Tips' 카테고리의 다른 글
Unity Entities - System에서 Collections(NativeArray, NativeList ...) Dispose함수를 Job 이후에 실행하는 방법 (0) | 2023.07.04 |
---|---|
Unity UI RectTransform 적정 사이즈로 설정하기 (0) | 2022.10.09 |
Unity에서 패치 다운로드 만들기 4편 - 다른 스레드 이용하여 만들기 (0) | 2022.05.08 |
Unity에서 패치 다운로드 만들기 3편 - 패치 UI 만들기 (0) | 2022.05.07 |
Unity에서 패치 다운로드 만들기 2편 - UnityWebRequest 이용하여 만들기 (0) | 2022.05.07 |