任意のタイミングでContentSizeFitter的に親のRectTransformを変更したかったので自作しました。
※ContentSizeFitterを含めuGUIの自動レイアウトについてはこちらの記事が分かりやすいです。
【Unity】uGUIの自動レイアウトが分かりにくいと評判なので解説してみる
なお、
・Fit Preffered Sizeしか対応してません。
・VerticalLayoutGroupのみ対応してます。
コード
MyContentSizeFitter.cs
using UnityEngine;
using UnityEngine.UI;
using System.Linq;
[RequireComponent(typeof(VerticalLayoutGroup))]
[RequireComponent(typeof(RectTransform))]
public class MyContentSizeFitter : MonoBehaviour {
[SerializeField] VerticalLayoutGroup _LayoutGroup;
[SerializeField] RectTransform MyRect;
[SerializeField] RectTransform[] ChildRects;
[ContextMenu("InitSize")]
public void InitSize()
{
float totalHeight = _LayoutGroup.padding.top + _LayoutGroup.padding.bottom;
foreach (var item in ChildRects)
{
totalHeight += item.sizeDelta.y;
totalHeight += _LayoutGroup.spacing;
}
MyRect.sizeDelta = new Vector2(MyRect.sizeDelta.x, totalHeight);
}
private void Reset()
{
MyRect = GetComponentInChildren<RectTransform>();
//自身のRectTransformと子のLayoutElementでignoreLayoutのものは除外する
ChildRects = GetComponentsInChildren<RectTransform>().Where(x=>x != MyRect).Where(x=>x.GetComponent<LayoutElement>() == null ? true : !x.GetComponent<LayoutElement>().ignoreLayout).ToArray();
_LayoutGroup = GetComponent<VerticalLayoutGroup>();
}
}
エディターサンプル
Unity難しすぎて可変長無限スクロールビューをやるだけでとても大変だったよねっていう(やっとできた!!!!!!!) #Unity #indiedev #IndieGame pic.twitter.com/XypFdcm3Vo
— アズマゴロー@モンスター合成ハクスラ開発中 (@azumagoro) April 24, 2019
今日も元気にUnity... pic.twitter.com/MrzorHMGKD
— アズマゴロー@モンスター合成ハクスラ開発中 (@azumagoro) April 24, 2019