ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Unity - UI などの自動レイアウト

初めに

 Unity では Layout Element や Content Size Fitter など UI など RectTransform がアタッチされたオブジェクトのレイアウトを自動で調整するためのコンポーネントがいくつか存在します。本記事では、それらの使い方をまとめます。

前提

 自動レイアウトシステムは、基本的な Rect Transform レイアウトシステム上に構築されたシステムです。

 Rect Transform コンポーネントは UI の座標やサイズ、アンカー、スケールなどを司るもので、通常のオブジェクトの Transform に代わるものにあたります。UI には、デフォルトで Rect Transform がアタッチされていますが、他のオブジェクトにも Rect Transform をアタッチすることができます。

レイアウト用素について

 自動レイアウトシステムは次の二つの概念に基づいています。

概念 説明
レイアウト要素 Rect Transform を有しているオブジェクトのこと
レイアウトコントローラー 1 つ以上のレイアウト要素 のサイズと、場合によっては位置を制御するコンポーネント
Content Size Fitter とさまざまな Layout Group コンポーネントなど

 レイアウト要素は以下のプロパティを有しています。

  • Min Width (最小幅)
  • Min Height (最小の高さ)
  • Preferred Width (推奨幅)
  • Preferred height (推奨の高さ)
  • Flexible Width (可変幅)
  • Flexible Height (可変の高さ)

 レイアウトコントローラーコンポーネントは次の手順で、レイアウト要素のサイズを決めます。

  1. Min のサイズが割り当てられる
  2. 使用可能な領域が十分にある場合は、推奨 (Preferred) サイズが割り当てられる
  3. さらに余分な使用領域があれば、Flexible のサイズが割り当てられる

 Rect Transform がアタッチされているゲームオブジェクトは レイアウト要素としての動作が可能です。デフォルトで Min、Preferred、Fexible のサイズが 0 に設定されています。コンポーネントの中には、ゲームオブジェクトに加えると、これらのレイアウトプロパティを変更するものもあるようです。

Layout Element コンポーネント

 Min、Preferred、Flexible のサイズを上書きする場合は、Layout Element コンポーネントをゲームオブジェクトに加えます。

docs.unity3d.com

レイアウトコントローラー

 レイアウトコントローラーは、1 つ以上のレイアウト要素 のサイズと、場合によっては位置を制御するコンポーネントです。Content Size Fitter とさまざまな Layout Group コンポーネントなどがレイアウトコントローラーにあたります。

Content Size Fitter

 Content Size Fitter を使うとレイアウト要素に合わせて自身の縦横幅を変えることができます。

プロパティ 機能
Horizontal Fit 幅がどのように制御されるか
Vertical Fit 高さがどのように制御されるか

 どちらも次の3つから選択できます。

  • Unconstrained:レイアウト要素に連動させない
  • Min Size:Min に連動させる
  • Preferred Size:Preferred に連動させる
Aspect Layout Fitter

 Aspect Layout Fitter は、アスペクト比(widthとHeightの比率)を一定に強制的にする機能になります。

 次の項目から、Aspect Mode(アスペクト比率を維持するためにどのようにサイズ変更をするかを指定する)を選んで使用します。

Mode 説明
None アスペクト比率を無視する
Width Controls Height Height は Width にもとづいて自動的に調整されます
Height Controls Width Width は Height にもとづいて自動的に調整されます
Fit In Parent 幅、高さ、位置、アンカーは、アスペクト比率を維持しながら矩形が親矩形の内側に合うように自動的に調整されます。親矩形の内部には、この矩形で覆われていないスペースがある場合もあります。
Envelope Parent 幅、高さ、位置、アンカーは、アスペクト比率を維持しながら親矩形の全体を覆うよう自動的に調整されます。この矩形は親矩形よりも大きくなるかもしれません。

 Aspect Racio Fitter については、過去の記事をご覧ください。
fineworks-fine.hatenablog.com

Layout Group

 Layout Group は、子のレイアウト要素のサイズと位置を制御するレイアウトコントローラーとして機能します。

 Layout Group は以下のような特徴をもちます。

  • 子のレイアウト要素のサイズと位置を制御するレイアウトコントローラーである
  • それ自体(Layout Group がついたオブジェクト自身)のサイズは管理しない
  • それ自体がレイアウト要素として機能する(ほかのレイアウトコントローラーに管理されたり、手動で設定されたりする)

 Layout Group となるコンポーネントは下記の3つあります。

コンポーネント 説明
Horizontal Layout Group 水平方向に一列に子のレイアウト要素を配置する
Vertical Layout Group 垂直方向に一列に子のレイアウト要素を配置する
Grid Layout Group グリッド状(格子状)に子のレイアウト要素を配置する

(イメージ)

Horizontal Layout Group
Vertical Layout Group
Grid Layout Group

Grid Layout Group の推奨される使い方

 Grid Layout Group は Content Size Fitter と併用することが推奨されます。

(幅を可変にし、高さを固定する)

 要素が加えられるにつれて、グリッドが横に広がるように、グリッドを可変の幅と固定の高さで設定するには、以下のようにプロパティを設定します。

Grid Layout Group コンポーネントの Constraint Fixed Row Count
Content Size Fitter コンポーネントの Horizontal Fit Preferred Size
Content Size Fitter コンポーネントの Vertical Fit Preferred Size か Unconstrained

 Vertical Fit で Unconstrained を使用する場合、特定のセルの行数に合うようにグリッドの高さを大きくするかは、ニーズに合わせて判断してください。

(幅を固定し、高さを可変にする)

 要素が加えられるにつれて、グリッドが縦に広がるように、グリッドを固定の幅と可変の高さで設定するには、以下のようにプロパティを設定します。

Grid Layout Group コンポーネントの Constraint Fixed Column Count
Content Size Fitter コンポーネントの Horizontal Fit Preferred Size か Unconstrained
Content Size Fitter コンポーネントの Vertical Fit Preferred Size

 Horizontal Fit で Unconstrained を使用する場合、特定のセルの列数に合うようにグリッドの幅を大きくするかは、ニーズに合わせて判断してください。

(幅と高さを両方とも可変にする)

 グリッドの幅、高さの両方を可変にすることも可能です。しかし、その場合は行、列の数を指定することはできなくなります。グリッドは行、列の数をだいたい同じにしようとするはずです。この場合のプロパティ設定は以下のとおりです。

Grid Layout Group コンポーネントの Constraint Flexible
Content Size Fitter コンポーネントの Horizontal Fit Preferred Size
Content Size Fitter コンポーネントの Vertical Fit Preferred Size