夜風のMixedReality

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

Unityプロジェクト内のマテリアルをシェーダー別に取得するツールを作る その③ プロトタイプの完成

本日は昨日に引き続きMRGTに提出予定のエディタツールを作成していきます。

先日はプロジェクト内に含まれるすべてのマテリアルをデバッグログとして出力しました。

redhologerbera.hatenablog.com

今回は任意のシェーダーでフィルタリングしてログを出力します。

〇任意のシェーダーを使用しているマテリアルを出力する

前回は以下の処理で全マテリアルをログに出力していました。

   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)
                {
                    Debug.Log(n.shader.name);
                }
    }

foreach文ないのnにはすべてのマテリアルが取得されn.shader.nameでマテリアルの使用しているシェーダーがstring型で取得できます。

そこでif文を使用して任意のシェーダーを使用しているマテリアルのみログ出力を行うことができます。

                        if (n.shader.name == "Graphics Tools/Standard")
                        {
                            Debug.Log(n.name +" Path=" + AssetDatabase.GetAssetPath(n));
                        }

 またAssetDatabase.GetAssetPath()はUnity内の対象のオブジェクトのパスを返します。

これを実行することで次のようにMRGTシェーダーを使用しているマテリアルのみを抽出することが出来ました。

以上でUnityプロジェクト内のマテリアルをシェーダー別に取得するツールのprototypeはできました。

次回以降使いやすいように改良していきます。

〇ソースコード

//Made by HoloMoto 2023 
//MIT license
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()
    {
        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 == "Graphics Tools/Standard")
                        {
                            Debug.Log(n.name +" Path=" + AssetDatabase.GetAssetPath(n));
                        }
                    }
    }
}