[Unity] ヒエラルキー上のGameObjectのソート

ヒエラルキー上に存在するGameObjectをソートする方法のメモ書きです。
これを行うことで、名前順や座標順などさまざまな条件でGameObjectをソートできるようになります。

■方針
GameObjectの順序を指定するメソッドTransform.SetSiblingIndex()を用いることで実現できます。
一つ前の記事に簡単な使い方を書いたので必要ならご一読ください。

このメソッドは処理を返した時点で順序が反映されてしまうので、ソートを行うには一工夫必要です。
今回は、ひとつ下の階層のGameObjectを自力で取得→テンポラリのリストに格納→これに対してソート→ソート結果をTransform.SetSiblingIndex()で反映するというやり方で実現します。

■スクリプト
以下スクリプトをソートしたい対象のオブジェクトにアタッチします。

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;

public class SortGameObject : MonoBehaviour {
    [ContextMenu("Sort game object")]
    private void Sort() {
        List<Transform> objList = new List<Transform>();

        // 子階層のGameObject取得
        var childCount = transform.childCount;
        for ( int i = 0 ; i < childCount ; i++ ) {
            objList.Add(transform.GetChild(i));
        }

        // オブジェクトを名前で昇順ソート
        // ★ここを用途に合わせて変更してください
        objList.Sort((obj1, obj2) => string.Compare(obj1.name, obj2.name));

        // ソート結果順にGameObjectの順序を反映
        foreach ( var obj in objList ) {
            obj.SetSiblingIndex(childCount - 1);
        }
    }
}

今回は名前順でソートするようにしました。
もし、座標順など異なる条件でソートしたい場合は★マーク直下の行を修正してください。

試しに以下ヒエラルキー上の「Stage」にアタッチしてみます。

gameobjsort1

アタッチしたら「Sort Game Object(Script)」のコンテキストメニューから「Sort game object」を選択してソートを実施します。
例では以下のようになります。

gameobjsort2

「Stage」配下のGameObjectが名前順でソートされていることが確認できます。
エディタ拡張にGameObjectソートの機能を持たせられればヒエラルキーの整理がスムーズになるかもしれませんね。