LoginSignup
3

More than 3 years have passed since last update.

【Unity】オレオレContentSizeFitter

Last updated at Posted at 2019-04-24

任意のタイミングで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>();
    }
}

エディターサンプル

image.png

image.png

image.png

image.png

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3