Unity에서 Material에서 참조하는 shader를 보고 Txt에 인쇄합니다.

4613 단어 Unity
프로젝트에서 어떤 shader가 어떤 material에 연결되었는지 검색하기 위해 프로젝트를 오른쪽 단추로 누르고, shader 파일을 눌렀을 때만 SearchShader가 터치합니다.이 스크립트를 Editor에 배치합니다.
기본적인 사고방식은 먼저 대상을 오른쪽 단추로 눌렀을 때, 대상이 Shader 파일일 때,SearchShader 함수는 응답할 수 있고, 그 다음에 고정된 폴더에서 이 폴더의 모든 Material 대상을 두루 훑어본 다음, 이 Material 대상의 경로를listMaterial에 저장하는 것이다.그런 다음 Unity에서 시각화된 EditorUtility를 호출합니다.Display ProgressBar 방법은 현재 검색된 대상을 보고 이 대상이 인용한 Shder가 우리가 오른쪽 단추를 눌렀는지 비교합니다.만약 그렇다면, 이 대상의 정보를 다른listTargetMaterial에 저장합니다.마지막 인쇄StreamWriter를 통해 원하는 결과를 출력합니다
코드는 다음과 같습니다.
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEditor;
using UnityEngine;

public class SearchShader {

    public static string FilePath = "Assets/Materials";
    // Material 
    public static List listMatrials;
    public static List listTargetMaterial;

    public static string selectedShaderName;

    public static StringBuilder sb;

    [MenuItem("Assets/SearchShader", true)]
    private static bool OptionSelectAvailable()
    {
        if(Selection.activeObject == null)
        {
            return false;
        }
        return Selection.activeObject.GetType() == typeof(Shader);
    }

    [MenuItem("Assets/SearchShader")]
    private static void SearchConstantShader()
    {
        Debug.Log(" Shader :" + Selection.activeObject.name);
        sb = new StringBuilder();

        selectedShaderName = Selection.activeObject.name;

        listMatrials = new List();
        listMatrials.Clear();
        listTargetMaterial = new List();
        listTargetMaterial.Clear();

        //  eg:projectPath = D:Project/Test/Assets
        string projectPath = Application.dataPath;

        //eg:projectPath = D:Project/Test
        projectPath = projectPath.Substring(0, projectPath.IndexOf("Assets"));

        try
        {
            // Matrial Path 
            GetMaterialsPath(projectPath, FilePath, "Material",ref listMatrials);
        }
        catch(System.Exception e)
        {
            Debug.LogError(e);
        }

        for (int i = 0; i < listMatrials.Count; i++)
        {
            EditorUtility.DisplayProgressBar("Check Materials", "Current Material :" 
                + i + "/" + listMatrials.Count,(float)i/ listMatrials.Count);

            try
            {
                // Check
                BegainCheckMaterials(listMatrials[i]);
            }
            catch (System.Exception e)
            {
                EditorUtility.ClearProgressBar();
                Debug.LogError(e);
            }
        }

        PrintToTxt();
        EditorUtility.ClearProgressBar();
        Debug.Log("Check Success");
    }

    // Matrial Path 
    public static void GetMaterialsPath(string projectPath,string targetFilePath,string searchType,ref List array)
    {
        if (Directory.Exists(targetFilePath))
        {
            string[] guids;
            // 
            guids = AssetDatabase.FindAssets("t:" + searchType, new[] { targetFilePath });
            foreach (string guid in guids)
            {
                string source = AssetDatabase.GUIDToAssetPath(guid);
                listMatrials.Add(source);
            }
        }
    }

    // Material
    public static void BegainCheckMaterials(string materialPath)
    {
        Material mat = AssetDatabase.LoadAssetAtPath(materialPath);
        if (mat.shader.name == selectedShaderName)
        {
            listTargetMaterial.Add(materialPath);
        }
    }

    public static void PrintToTxt()
    {
        // shader 
        listTargetMaterial.Add(selectedShaderName);

        FileInfo fi = new FileInfo(Application.dataPath + "/Materials.txt");
        if (!fi.Exists)
        {
            fi.CreateText();
        }
        else
        {
            StreamWriter sw = new StreamWriter(Application.dataPath + "/Materials.txt");
            for (int i = 0; i < listTargetMaterial.Count - 1; i++)
            {
                sb.Append(listTargetMaterial[i] + "
"); } string useNum = string.Format(" {0} Material :{1}", listTargetMaterial.Count - 1, selectedShaderName); sb.Append(useNum + "
"); sb.Append(" shader :" + selectedShaderName); sw.Write(sb.ToString()); sw.Flush(); sw.Close(); sw.Dispose(); } } }

좋은 웹페이지 즐겨찾기