本日はUnity枠です。
筆者が開発に参加しているMixedRealityGraphicsToolsにはUnityエディタ上で使用可能な多くのツールが提供されています。
今回はEditor拡張を使用してUnityプロジェクト内のマテリアルをシェーダー別に取得するEditor拡張を紹介します。
こちらは近日中にMRGTにPRを提出するつもりです。
〇動機
Unityにはマテリアルやテクスチャを検索するという機能はありますが、デフォルトでシェーダー別にマテリアルを取得するといった使い方はできません。
筆者はUntiy開発中においてマテリアル数が増えることによってシェーダーを変更することによって影響を受ける可能性があるマテリアルを知りたいというケースやそのものデフォルトのシェーダーからMRGTシェーダーへ移植できていないものなどの検索を行いたいという場面がありました。
〇Editorウィンドウの作成
Unityのエディタ拡張の機能を使用してウィンドウを作成する方法は以下になります。
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.Linq;
public class MaterialSearcher : EditorWindow
{
[MenuItem("Window/Graphics Tools/Material Search by Shader")]
static void MaterialSearch()
{
// OpenEditorWindow
GetWindow<MaterialSearcher>();
}
void OnGUI()
{
・・・
}
}
エディタ拡張を行うためにはEditorWindowクラスを継承する必要があります。
〇メニューの表示とウィンドウの展開
[MenuItem("メニューの場所")]の属性を関数につけることでUnityのメニューとして追加され、選択することで関数内を発火させることができます。
[MenuItem("Window/Graphics Tools/Material Search by Shader")]
static void MaterialSearch()
{
GetWindow<MaterialSearcher>();
}
今回の場合はWindow/Graphics ToolsにMaterial Search by Shaderという名前でメニューが追加されるようになりました。

GetWindow
〇GUI
OnGUI関数は開いたエディタウィンドウの表示を行う関数です。
void OnGUI()
{
・・・
}
これによって基本的なエディタウィンドウの基本設定が完了しました。