さけのさかなのブログ

同人ゲーム開発やってます。Unity使ったりする。

Preferredサイズに上限を設定する

やること

 たとえば文章を表示するウィンドウを作った時。

  • 文章が短いうちは文章に合わせてウィンドウが大きくなる。
  • ある一定サイズ以上にはウィンドウは大きくならず、文章は改行されて表示される

みたいな機能をつくる。

コード

Unity5.3.1p1

    [DisallowMultipleComponent]
    [RequireComponent(typeof(Text))]
    public class LayoutMaxSize : MonoBehaviour, ILayoutElement
    {
        Text text;
        Text Text
        {
            get
            {
                return text ?? (text = GetComponent<Text>());
            }
        }

        [SerializeField]
        float maxWidth = -1;

        [SerializeField]
        float maxHeight = -1;

        public float flexibleHeight { get { return -1f; } }
        public float flexibleWidth { get { return -1f; } }
        public int layoutPriority { get { return 1; } }
        public float minHeight { get { return -1f; } }
        public float minWidth { get { return -1f; } }

        public float preferredHeight
        {
            get
            {
                if (maxHeight < 0f)
                {
                    return Text.preferredHeight;
                }
                return Mathf.Min(Text.preferredHeight, maxHeight);
            }
            set
            {
                maxHeight = value;
                SetDirty();
            }
        }
        public float preferredWidth
        {
            get
            {
                if (maxWidth < 0f)
                {
                    return Text.preferredWidth;
                }
                return Mathf.Min(Text.preferredWidth, maxWidth);
            }
            set
            {
                maxWidth = value;
                SetDirty();
            }
        }
        public void CalculateLayoutInputHorizontal() { }
        public void CalculateLayoutInputVertical() { }

        protected void SetDirty()
        {
            if (!gameObject.activeInHierarchy)
            {
                return;
            }
            LayoutRebuilder.MarkLayoutForRebuild(transform as RectTransform);
        }

#if UNITY_EDITOR
        protected void OnValidate()
        {
            SetDirty();
        }
#endif
    }

アレ

  • 参照するコンポーネントはTextでなくても良いはずで、究極的には他のILayoutElementを参照して云々~という形にできる。面倒なのでやってない。
  • 標準コンポーネントで実装できそうな気もする。