Unity3D研究院之自制批量修改Shader插件(五十七)
美工兄弟创建FBX模型带了好几十个贴图,每一个贴图都需要手动设置一下Shader,美工兄弟显然Hold不住了,作为一个程序帮他想想办法把,嘿嘿。我用了一下午的时间帮他写了一小插件。 如下图所示,ChangerShader是插件的代码,shader.txt是配置文件,把它俩都放在Editor文件夹中。
先看看shader.txt的配置文件,它就是配置批量修改Shader的列表,这里可以选择系统自带的Shader,也可以选择你自己创建的Shader,只要名称选择对就可以。配置文件Shader的你也可以继续添加,只要资源中有就可以。记住中间用& 字符隔开就可以,
7 | Mobile/Transparent/Vertex Color& |
Custom/NewShader是我自己创建的Shader。如下图所示,Shader的名称可以由你任意配置。
用法非常的简单,如下图所,在Hierarchy视图中选择需要批量修改的对象,然后在Unity导航菜单栏中选择Window->ChangerShader。你可以放心选择对象,程序会自动检测你选择的对象是否可以修改Shader。
如下图所示,然后点击需要批量修改的Shader吧。在看看模型材质上的Shader,是不是很神奇,哇咔咔。。
目前这个小插件我在我的工程中已经完美测试通过,但是不代表没有一点BUG,MOMO希望大家多多使用给我提点意见。
ChangeShader.cs 插件的源码。 比较简单,我就不注释了。 核心就是根据Hierarchy视图中的游戏对象找到它的材质组件,如果组件中使用过Project视图中的资源文件的Shader文件,然后在Project中找到该资源文件的路径,最后获取这个资源对象并且修改它。
02 | using System.Collections; |
05 | public class ChangeShader : EditorWindow { |
07 | static TextAsset textAsset; |
08 | static string [] lineArray; |
09 | [MenuItem ( "Window/ChangerShader" )] |
10 | static void AddWindow () |
12 | textAsset = Resources.LoadAssetAtPath( "Assets/Editor/shader.txt" , typeof (TextAsset)) as TextAsset; |
14 | lineArray = textAsset.text.Split ( "&" [0]); |
16 | Rect wr = new Rect (0,0,500,500); |
17 | ChangeShader window = (ChangeShader)EditorWindow.GetWindowWithRect ( typeof (ChangeShader),wr, true , "widow name" ); |
22 | private Shader shader; |
26 | for ( int i =0; i<lineArray.Length; i++) |
28 | string shaderName = lineArray[i].Trim(); |
29 | if (GUILayout.Button(shaderName)) |
31 | Change(Shader.Find(shaderName)); |
36 | void Change(Shader shader) |
38 | if (Selection.activeGameObject != null ) |
40 | foreach (GameObject g in Selection.gameObjects) |
42 | Renderer []renders = g.GetComponentsInChildren<Renderer>(); |
43 | foreach (Renderer r in renders) |
47 | foreach (Object o in r.sharedMaterials) |
49 | string path = AssetDatabase.GetAssetPath(o); |
50 | Material m = Resources.LoadAssetAtPath(path, typeof (Material)) as Material; |
56 | this .ShowNotification( new GUIContent( "选择的对象批量修改shader成功" )); |
59 | this .ShowNotification( new GUIContent( "没有在Hierarchy视图中选择对象" )); |
批量修改完毕啦。哇咔咔
最后是本文的下载地址 祝大家学习愉快,啦啦啦~~~
http://vdisk.weibo.com/s/An5pr