大変処理がダサいので、だれか添削してください。
コード
GetOrder.cs
using UnityEngine;
using UnityEditor;
using System;
using System.Collections.Generic;
public class GetOrder: Editor
{
[MenuItem("Tools/GetOrder")]
static void Create()
{
if(Selection.activeGameObject == null)
return;
var objlist = Selection.gameObjects;
int numlen = 0; //ヒエラルキー順IDの最大桁数
List<string> orderstr = new List<string>();
List<int> orderint = new List<int>();
Dictionary<int, GameObject> intdct = new Dictionary<int, GameObject>();
for(var i = 0; i < objlist.Length; ++i){
var numstr = GetHierarchyOrder(objlist[i].transform);
orderstr.Add(numstr);
if(numstr.Length > numlen){
numlen = numstr.Length;
}
}
for (var i = 0; i < orderstr.Count; ++i){
var temp = orderstr[i];
if(orderstr[i].Length < numlen){
for (var j = 0; j < (numlen - orderstr[i].Length); ++j){
temp += "0";
}
}
int num_var;
var result = Int32.TryParse(temp, out num_var);
//orderが何らかの理由でParse出来なかったら追加されません
if(result)
orderint.Add(num_var);
intdct.Add(num_var,objlist[i]);
}
orderint.Sort();
foreach(var oint in orderint){
Debug.Log(intdct[oint]);
}
}
static string GetHierarchyOrder(Transform trans)
{
var translist = trans.GetComponentsInParent<Transform>();
string numstr= "";
for (var i = 0; i < translist.Length; ++i)
{
var p = translist[translist.Length - i - 1];
//+1しているのは0を出さないため ケタ数を揃えるとき0を追加するのでここで0が来ないように
var temp = p.GetSiblingIndex() + 1;
numstr += temp.ToString();
}
return numstr;
}
}
解説
GetSiblingIndex()だと、兄弟間での順番しか返ってこないので全体の比較ができない。
なんで、一旦Stringにしてネストされた順に変数に追記していく。つまりネストが深くなるだけ桁数が増える。(GetHierarchyOrderの部分)
ネストの状態によっては桁数が違うので、あとで桁数を揃える必要があるが、揃えるために0を追加すると被るオブジェクトが出てきてしまう。
なんで、GetSiblingIndex()した時点で+1しておいて被らないようにする。
あとは、取得した番号のStringをSelection.gameObjectsで取得したゲームオブジェクトリストの順にリストに格納して、桁数を揃えて、Intにパースして、Intをキーにしてオブジェクトをディクショナリに突っ込んで、Intをソートして、順番に取り出すだけ。
もっといい感じに書けそうな気もする・・・。
参考
https://qiita.com/naoK/items/22b58c5b14a8406f538b
参考にさせて頂きました。