개발 중 자식의 자식 오브젝트들의 크기 합에 맞춰서 오브젝트 높이를 맞춰야하는 경우가 생겼다.
위 하이어라키에서 Layout오브젝트를 스크롤 content로 지정하여, Name과 Info 하위 오브젝트들을 동시에 탐색하는 것이 목표이다.
하위 오브젝트는
- PartNameItem(Clone) : fix height(30)
- Name: ContentSizeFitter + Vertical Layout Group
로 구성되어 있는 상태에서, 단순히 Layout 오브젝트에 ContentSizeFitter를 추가해 자식크기로 맞춰주면 될 것이라 생각했었는데 ContentSizeFitter를 추가해도 하위 오브젝트의 크기만큼 변경되지가 않았다.
그래서 테스트로 Layout에 VerticalLayoutGroup을 추가해보니, 자식의 크기를 정상적으로 가져왔지만 하위 Name, Info가 세로로 정렬되어 내가 원하는 UI를 만들지 못했다.
때문에 Layout오브젝트의 높이를 스크립트에서 동적으로 구해서 설정해주기로 하였다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class HeightLayout : MonoBehaviour
{
public RectTransform childObject; // Name
void Start()
{
StartCoroutine(UpdateHeightAfterLayout());
}
IEnumerator UpdateHeightAfterLayout()
{
yield return null;
yield return null;
Canvas.ForceUpdateCanvases();
LayoutRebuilder.ForceRebuildLayoutImmediate(childObject);
gameObject.GetComponent<RectTransform>().sizeDelta = new Vector2(
gameObject.GetComponent<RectTransform>().sizeDelta.x,
childObject.rect.height
);
}
}
Name, Info의 높이가 똑같기 때문에 Name오브젝트를 기준으로 Layout의 높이를 설정해줬다. Start에서 바로 높이를 변경할 경우, 자식의 크기가 결정되기 이전의 높이로 지정이 되는 문제가 발생하여, 코루틴과 UI빌드 함수를 사용하여 자식의 크기를 결정 지은뒤 해당 높이로 Layout크기를 설정해 주었다.
LayoutGroup과 ContentSizeFitter를 이용해 UI를 그리다보면 비슷한 문제가 많이 발생하는데, UI빌드 시점이 거의 주된 원인으로 보인다.