はじめに
「ヒエラルキー上で何のスクリプトが使われているかを確認したいなぁ」と思ったので、スクリプトを一覧表示するエディター拡張を作ってみました。
環境
Unity 5.5.0f3
Windows 10
作ったものについて
ヒエラルキー上でオブジェクトにアタッチされている全てのスクリプトの一覧を表示するウィンドウを作ってみました。
ソースコード
以下のスクリプトをプロジェクト内のEditorフォルダ以下へ入れるとEditorWindowが使えるようになります。
HierarchyScriptViewerWindow.cs
namespace HierarchyScriptViewer
{
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
/// <summary>
/// シーン内でアタッチされているすべてのスクリプトを表示するEditorWindow
/// </summary>
public class HierarchyScriptViewerWindow : EditorWindow
{
Vector2 scrollPosition = Vector2.zero;
Type[] componentTypes = new Type[0];
MonoScript[] scripts = new MonoScript[0];
[MenuItem("Tools/Hierarchy Script Viewer")]
static void Open()
{
GetWindow<HierarchyScriptViewerWindow>();
}
void OnGUI()
{
GUILayout.Label("ヒエラルキー上で使用されている全スクリプトを表示します");
GUILayout.Space(2f);
// ボタン表示
if (GUILayout.Button("スクリプト一覧 表示"))
{
this.scripts = this.GetScripts().ToArray();
}
// スクリプト一覧表示
this.scrollPosition = EditorGUILayout.BeginScrollView(this.scrollPosition);
foreach (var script in this.scripts)
{
if (script == null) { continue; } // nullチェック
EditorGUILayout.ObjectField(script, typeof(MonoScript), false);
}
EditorGUILayout.EndScrollView();
}
/// <summary>
/// シーン内でアタッチされているすべての自作スクリプトを取得する
/// </summary>
private IEnumerable<MonoScript> GetScripts()
{
var gameObjects = (GameObject[])UnityEngine.Object.FindObjectsOfType(typeof(GameObject)); // シーン内の全てのGameObject
var monoScripts = Resources.FindObjectsOfTypeAll<MonoScript>(); // プロジェクト内の全てのスクリプト
foreach (var monoScript in monoScripts)
{
var classType = monoScript.GetClass();
if (classType == null) { continue; }
if (classType.Module.Name != "Assembly-CSharp.dll") { continue; } // 自作クラスかどうか
if (!classType.IsSubclassOf(typeof(MonoBehaviour))) { continue; } // MonoBehaviour継承クラスかどうか
if (gameObjects.Any(go => go.GetComponent(classType) != null)) // アタッチされているGameObjectが存在するか
{
yield return monoScript;
}
}
}
}
}