夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Unityプロジェクト内のマテリアルをシェーダー別に取得するツールを作る その④ UI表示の作成

本日は昨日に引き続きUnityプロジェクト内のマテリアルをシェーダー別に取得するツールを作ります。

 昨日はプロトタイプが完成しデバッグログにシェーダー別のマテリアルが出力されるようになりました。

redhologerbera.hatenablog.com

今回はUIを作成します。

〇UIの作成

エディタウィンドウのUIはOnGUI()内に記述します。

昨日時点ではif (GUILayout.Button("Search")){}でボタンを表示されていました。

文字を表示するためにはEditorGUILayout.LabelField()を使用します。

    void OnGUI()
    {
        using (new EditorGUILayout.HorizontalScope())
        {
            EditorGUILayout.LabelField("Type SearchMaterial Shader Name");
        }
        if (GUILayout.Button("Search"))
        {
            ProcessComponentsInAllScenes();
        }
    }

using (new EditorGUILayout.HorizontalScope()){}は水平(横)方向のレイアウトを示しています。

EditorGUILayout.LabelField("表示名")でエディタウィンドウ上に表示されるラベルを記述できます。

〇検索するシェーダー名をテキストフィールドで表示

次に検索するシェーダー名を任意にテキストフィールドに表示させられるようにします。

String型の_ShaderNameを作成しShaderName = EditorGUILayout.TextField(ShaderName)と処理を記述することでテキストフィールドを配置できます。

  private string _ShaderName;
    void OnGUI()
    {
        using (new EditorGUILayout.HorizontalScope())
        {
            EditorGUILayout.LabelField("Type SearchMaterial Shader Name");
        }
        using (new EditorGUILayout.HorizontalScope())
        {
            _ShaderName = EditorGUILayout.TextField(_ShaderName);
        }
        if (GUILayout.Button("Search"))
        {
            ProcessComponentsInAllScenes();
        }
    }

最後にテキストフィールドで記述したシェーダー名を使用してマテリアルを検索するためにマテリアルを処理する際のif文を_ShaderNameと紐づけます。

  private void ProcessComponentsInAllScenes()
    {
        var list = AssetDatabase.FindAssets("t:Material")
                .Select(AssetDatabase.GUIDToAssetPath).Select(c => AssetDatabase.LoadAssetAtPath<Material>(c))
                .Where(c => c != null);
        
                foreach (var n in list)
                    {
                        if (n.shader.name == _ShaderName)
                        {
                            Debug.Log(n.name +" Path=" + AssetDatabase.GetAssetPath(n));
                        }
                    }
    }

これによってテキストフィールドで入力したシェーダー名で検索を行うことができるようになりました。

本日は以上です。

〇ソースコード

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>();
    }

    private string _ShaderName;
    void OnGUI()
    {
        using (new EditorGUILayout.HorizontalScope())
        {
            EditorGUILayout.LabelField("Type SearchMaterial Shader Name");
        }
        using (new EditorGUILayout.HorizontalScope())
        {
            _ShaderName = EditorGUILayout.TextField(_ShaderName);
        }
        if (GUILayout.Button("Search"))
        {
            ProcessComponentsInAllScenes();
        }
    }
    
    private void ProcessComponentsInAllScenes()
    {
        var list = AssetDatabase.FindAssets("t:Material")
                .Select(AssetDatabase.GUIDToAssetPath).Select(c => AssetDatabase.LoadAssetAtPath<Material>(c))
                .Where(c => c != null);
        
                foreach (var n in list)
                    {
                        if (n.shader.name == _ShaderName)//"Graphics Tools/Standard"
                        {
                            Debug.Log(n.name +" Path=" + AssetDatabase.GetAssetPath(n));
                        }
                    }
    }
}