1. 程式人生 > >編輯器拓展七——不實例化的情況下修改Assets下面的文件

編輯器拓展七——不實例化的情況下修改Assets下面的文件

如果 ica 文件 () pan 通過 個數 material spec

描述

1.今天接了個任務,因為公司的項目展示界面的人物與武器都用了standard與standard(specular steup),這個兩個自帶的材質球是帶霧效的,然後收到場景的影響

在ui界面 角色跟槍械都受到霧效的影響 ,需要將它換成不受霧效影響的shader。於是將這兩個shader的源碼改了一下,新加在項目中,接下來問題就來了,美術一個一個

去替換?那麽多角色槍械如何貼換?如何能做到完全替換?只能靠工具才能完美解決

2.方案

1.要把所有用了這兩個shader的材質球路徑找出來 通過AssetDatabase.LoadAssetAtPath<Material>(path);load出來

2.將load出來的mateial 按照材質球用的shader分組 分別遍歷兩個組,就可以直接替換他的shader

總結:AssetDatabase.LoadAssetAtPath<Material>(path);load出來的東西都是可以直接操作的 不需要實例化,比如有預設體 以及它的組件腳本修改都可以用這個方法

3.代碼

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;

public
class ChangeShader : Editor { [MenuItem("MyTool/changeShader")] static void chang() { //路徑數組 List<string> MaterialPathFile = new List<string>(); //用了Standard (Specular setup)的材質球數組 List<Material> material01 = new List<Material>();
//用了Standard的材質球數組 List<Material> material02 = new List<Material>(); string path = Application.dataPath; //返回mat的文件名(D:/TA/standard/Assets\ball.mat),後面要用到Assets後面的來load 所以要把前面的部分去掉 MaterialPathFile = new List<string>( Directory.GetFiles(path, "*.mat", SearchOption.AllDirectories)); //根據文件名 將材質球load出來 將用了Standard的材質球加到數組裏 for (int i = 0; i < MaterialPathFile.Count; i++) { //去掉數組了的全部文件名Assets之前的部分 string st = MaterialPathFile[i]; //用/將字符串隔開 分成4個數組 string[] sArray = st.Split(/); string path01 = sArray[4]; Material[] m_material = new Material[MaterialPathFile.Count]; //通過包含路徑的文件名 將所有的材質球load出來 m_material[i] = AssetDatabase.LoadAssetAtPath<Material>(path01); //如果材質球用了Standard的shader 將其加到material數組 if (m_material[i].shader == Shader.Find("Standard (Specular setup)"))//這裏一定要註意空格 { material01.Add(m_material[i]); } if (m_material[i].shader == Shader.Find("Standard")) { material02.Add(m_material[i]); } } //遍歷用了standard的材質球,將它的材質換成game_XXX/Standard for(int i = 0; i < material01.Count; i++) { Debug.Log(material01[i].name); material01[i].shader = Shader.Find("Game_XXX/Standard (Specular setup_NoFog)"); } for (int i = 0; i < material02.Count; i++) { material02[i].shader = Shader.Find("Game_XXX/Standard_NoFog"); } } }

都已經註釋的很清楚了 有問題留言

編輯器拓展七——不實例化的情況下修改Assets下面的文件