本日は昨日に引き続きMRGTに提出予定のエディタツールを作成していきます。
先日はプロジェクト内に含まれるすべてのマテリアルをデバッグログとして出力しました。
今回は任意のシェーダーでフィルタリングしてログを出力します。
〇任意のシェーダーを使用しているマテリアルを出力する
前回は以下の処理で全マテリアルをログに出力していました。
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)); } } } }