先看看shader.txt的配置文件,它就是配置批量修改Shader的列表,这里可以选择系统自带的Shader,也可以选择你自己创建的Shader,只要名称选择对就可以。配置文件Shader的你也可以继续添加,只要资源中有就可以。记住中间用& 字符隔开就可以,



Diffuse&
Mobile/Diffuse&
Transparent/Diffuse&
Mobile/Transparent/Vertex Color&
Custom/NewShader

Custom/NewShader是我自己创建的Shader。如下图所示,Shader的名称可以由你任意配置。


用法非常的简单,如下图所,在Hierarchy视图中选择需要批量修改的对象,然后在Unity导航菜单栏中选择Window->ChangerShader。你可以放心选择对象,程序会自动检测你选择的对象是否可以修改Shader。


如下图所示,然后点击需要批量修改的Shader吧。在看看模型材质上的Shader,是不是很神奇,哇咔咔。。


目前这个小插件我在我的工程中已经完美测试通过,但是不代表没有一点BUG,MOMO希望大家多多使用给我提点意见。
ChangeShader.cs 插件的源码。 比较简单,我就不注释了。 核心就是根据Hierarchy视图中的游戏对象找到它的材质组件,如果组件中使用过Project视图中的资源文件的Shader文件,然后在 Project中找到该资源文件的路径,最后获取这个资源对象并且修改它。
  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEditor;
  4. public class ChangeShader :  EditorWindow {
  5.   static TextAsset textAsset;
  6.   static  string [] lineArray;
  7.    [MenuItem ("Window/ChangerShader")]
  8.     static void AddWindow ()
  9. {      
  10.   textAsset = Resources.LoadAssetAtPath("Assets/Editor/shader.txt",typeof(TextAsset))as TextAsset;
  11.   lineArray = textAsset.text.Split ("&"[0]);
  12.   Rect  wr = new Rect (0,0,500,500);
  13.         ChangeShader window = (ChangeShader)EditorWindow.GetWindowWithRect (typeof (ChangeShader),wr,true,"widow name");
  14.   window.Show();
  15.     }
  16. private Shader shader;
  17. void OnGUI ()
  18. {
  19.   for(int i =0; i<lineArray.Length; i++)
  20.   {
  21.    string shaderName = lineArray.Trim();
  22.    if(GUILayout.Button(shaderName))
  23.    {
  24.     Change(Shader.Find(shaderName));  
  25.    }
  26.   }
  27. }
  28. void Change(Shader shader)
  29. {
  30.   if(Selection.activeGameObject != null)
  31.   {
  32.    foreach(GameObject g in Selection.gameObjects)
  33.    {
  34.     Renderer []renders = g.GetComponentsInChildren<Renderer>();
  35.     foreach(Renderer r in renders)
  36.     {
  37.      if(r  !=  null)
  38.      {
  39.       foreach(Object o in r.sharedMaterials)
  40.       {
  41.         string path = AssetDatabase.GetAssetPath(o);
  42.         Material m = Resources.LoadAssetAtPath(path,typeof(Material)) as Material;
  43.         m.shader = shader;   
  44.       }
  45.      }
  46.     }
  47.    }
  48.    this.ShowNotification(new GUIContent("选择的对象批量修改shader成功"));
  49.   }else
  50.   {
  51.    this.ShowNotification(new GUIContent("没有在Hierarchy视图中选择对象"));
  52.   }
  53. }
  54. }
复制代码