15
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

gumi Inc.Advent Calendar 2016

Day 17

Unity プロジェクトビューのPrefabの構造を簡易的に全階層表示するエディター拡張

Last updated at Posted at 2016-12-17

#はじめに
Unityのプロジェクトビューでプレファブは2階層までしか表示できないのはちょっとだけ不便なので、
プロジェクトビューのプレファブを選択したときに別のエディターウィンドウに全階層を表示してみるようにしてみました。

ササっとプレファブの3階層以上先の中身のゲームオブジェクト名を確認できるようにしてみました。

image

プロジェクトビューでプレファブを選択し、
Project.png

今回作成したPrefabViewerエディターウィンドウに全階層が自動で表示されているところ
PrefabViewer.png

そもそもプレファブは階層を深くしないように作るのが望ましいですが。。

#環境
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
こちらのメソッドが、インスタンスにせよ、アセットにせよ使用できるため、代わりにこちらを使用することで親が正しく選択されるようになります。

#まとめ

簡易的にプレファブ階層を表示できるようになりました。

以上です。

15
11
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?