UITable
このコンポーネントがアタッチされたオブジェクトの下にあるUIWidget群をうまいこと被らないように並び替えてくれるいいヤツです。
UITable自体に色々設定がありますが、今回はそれらの説明は省略します。
並び替え
今回の本題はこっち。
Sortingの設定を変更することで並び方を変えることができます。
…が、
- 文章
- 画像
- 文章
みたいな並びにしようとHierarchy上にそうやってUIWidgetを並べても、以下のソート条件の都合で順序が意図通りにならなかったりします。
設定 | ソート条件 |
---|---|
Alphabetic | 名前順( string.Compare( a.name, b.name ) ) |
Horizontal | x座標順( a.localPosition.x.CompareTo(b.localPosition.x ) ) |
Vertical | y座標順 ( b.localPosition.y.CompareTo(a.localPosition.y ) ) |
Custom | 自分で定義する |
Verticalにした上で最初から適当に座標ずらせばいいでしょと思われるかもしれませんが、
今回はそれすらめんどくさがって「なんとか動的にオブジェクト追加した順の並び(Hierarchy上の並び)と同じにしたい」と思って調べた内容をお送りします。
※追記(2016/01/19)
以下の内容ですが、Sorting設定をNoneにすることで同じことが実現できそうです…;
自分でソート条件を定義する
設定がCustomになっている状態の時、スクリプト側からソート条件を指定出来ます。
やり方ですが、UITable
のonCustomSort
にメソッドを渡します。
「Hierarchy上の並びと同じにしたい」場合は以下のように書くと実現できます。
private void Start() {
_table.onCustomSort = ( a, b ) => {
return a.GetSiblingIndex().CompareTo( b.GetSiblingIndex() );
};
}
[SerializeField]
private UITable _table;
大事なのは
a.GetSiblingIndex().CompareTo( b.GetSiblingIndex() );
コレ。
transform.GetSiblingIndex()
で自身の階層内の順番を取得できるのでそれを使って判定することでHierarchy上の並びと同様の形に出来ます。
やってみると案外楽でした。
onCustom~みたいなやつはNGUI内には結構あるので調べてみると色々捗るかも。