#はじめに
Unityのプロジェクトビューでプレファブは2階層までしか表示できないのはちょっとだけ不便なので、
プロジェクトビューのプレファブを選択したときに別のエディターウィンドウに全階層を表示してみるようにしてみました。
ササっとプレファブの3階層以上先の中身のゲームオブジェクト名を確認できるようにしてみました。
今回作成したPrefabViewerエディターウィンドウに全階層が自動で表示されているところ
そもそもプレファブは階層を深くしないように作るのが望ましいですが。。
#環境
Unity 5.4.0f3
#コード
using UnityEngine;
using UnityEditor;
public class PrefabViewer : EditorWindow {
[MenuItem ("Window/PrefabViewer")]
static void Show ()
{
EditorWindow.GetWindow<PrefabViewer>();
}
void OnGUI()
{
if( Selection.activeGameObject != null &&
PrefabUtility.GetPrefabType(Selection.activeGameObject) == PrefabType.Prefab )
{
var root = PrefabUtility.FindRootGameObjectWithSameParentPrefab(Selection.activeGameObject);
// Unity2017.2.1以上ではコメントアウトを外して代わりにこちらをご使用ください。
// var root = PrefabUtility.FindPrefabRoot(Selection.activeGameObject);
FoldOutRecursive(root.transform);
}
Repaint();
}
void FoldOutRecursive(Transform t)
{
EditorGUI.indentLevel++;
EditorGUILayout.Foldout(true,t.name);
foreach(Transform c in t)
{
FoldOutRecursive(c);
}
EditorGUI.indentLevel--;
}
}
#プロジェクトビューの中のプレファブだけに限定する
PrefabUtility.GetPrefabType(Selection.activeGameObject) == PrefabType.Prefab
という比較で、PrefabViewerに表示できるものをプロジェクトビューの中のプレファブだけに
限定してます。
PrefabTypeは
https://docs.unity3d.com/ja/current/ScriptReference/PrefabType.html
によるとほかにも
PrefabType.ModelPrefab:3D モデルをインポートして作成されたプレハブです
などがありますが、とりあえず、普通のプレファブだけとします。
#ヒエラルキービューの折り畳みを描画する
EditorGUILayout.Foldout
で三角形とオブジェ名を表示できるので、EditorGUI.indentLevel++でインデントレベルをあげてから
描画しつつ、子のTransformにアクセスして、再帰的に呼び出しています。
子の描画が終わったらインデントレベルを1段階戻しています。(indentLevel--)
あるTransformをforeachでイテレートすると、その子どものTransformたちにアクセスできます。
#PrefabUtility.FindRootGameObjectWithSameParentPrefab
プレファブの親(Root)をとれます。
これで、プレファブの2番目の階層(GameObjectプレファブでいうChild1、Child2、Child3)が
選択されているときも親が選択されていることにして描画しています。
追記です。2018/03/01
Unity2017.2.1以上では
PrefabUtility.FindRootGameObjectWithSameParentPrefab
はプレファブのインスタンスに対してのみ有効な結果が返るため、Unity2017.2.1以上ではPrefabViewerに正しく表示がされていなくなっていました。
##PrefabUtility.FindRootPrefab
こちらのメソッドが、インスタンスにせよ、アセットにせよ使用できるため、代わりにこちらを使用することで親が正しく選択されるようになります。
#まとめ
簡易的にプレファブ階層を表示できるようになりました。
以上です。