Help us understand the problem. What is going on with this article?

UITableのソート条件を自分で決める

More than 3 years have passed since last update.

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になっている状態の時、スクリプト側からソート条件を指定出来ます。
やり方ですが、UITableonCustomSortにメソッドを渡します。

「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内には結構あるので調べてみると色々捗るかも。

unity-game-dev-guild
趣味・仕事問わずUnityでゲームを作っている開発者のみで構成されるオンラインコミュニティです。Unityでゲームを開発・運用するにあたって必要なあらゆる知見を共有することを目的とします。
https://unity-game-dev-guild.github.io/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away