美工兄弟创建FBX模型带了好几十个贴图,每一个贴图都需要手动设置一下Shader,美工兄弟显然Hold不住了,作为一个程序帮他想想办法把,嘿嘿。我用了一下午的时间帮他写了一小插件。 如下图所示,ChangerShader是插件的代码,shader.txt是配置文件,把它俩都放在Editor文件夹中。
先看看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中找到该资源文件的路径,最后获取这个资源对象并且修改它。
using UnityEngine;
using System.Collections;
using UnityEditor;
public class ChangeShader : EditorWindow {
static TextAsset textAsset;
static string [] lineArray;
[MenuItem ("Window/ChangerShader")]
static void AddWindow ()
{
textAsset = Resources.LoadAssetAtPath("Assets/Editor/shader.txt",typeof(TextAsset))as TextAsset;
lineArray = textAsset.text.Split ("&"[0]);
Rect wr = new Rect (0,0,500,500);
ChangeShader window = (ChangeShader)EditorWindow.GetWindowWithRect (typeof (ChangeShader),wr,true,"widow name");
window.Show();
}
private Shader shader;
void OnGUI ()
{
for(int i =0; i<lineArray.Length; i++)
{
string shaderName = lineArray[i].Trim();
if(GUILayout.Button(shaderName))
{
Change(Shader.Find(shaderName));
}
}
}
void Change(Shader shader)
{
if(Selection.activeGameObject != null)
{
foreach(GameObject g in Selection.gameObjects)
{
Renderer []renders = g.GetComponentsInChildren<Renderer>();
foreach(Renderer r in renders)
{
if(r != null)
{
foreach(Object o in r.sharedMaterials)
{
string path = AssetDatabase.GetAssetPath(o);
Material m = Resources.LoadAssetAtPath(path,typeof(Material)) as Material;
m.shader = shader;
}
}
}
}
this.ShowNotification(new GUIContent("选择的对象批量修改shader成功"));
}else
{
this.ShowNotification(new GUIContent("没有在Hierarchy视图中选择对象"));
}
}
}
批量修改完毕啦。哇咔咔
最后是本文的下载地址 祝大家学习愉快,啦啦啦~~~
http://vdisk.weibo.com/s/An5pr
- 本文固定链接: https://www.xuanyusong.com/archives/2290
- 转载请注明: 雨松MOMO于 雨松MOMO程序研究院 发表






为什么要通过名字查找?不一次性把工程里面存在的所有shader搜索显示出来???
不错不错哈哈哈。
为什么我修改后依然无法双面显示呢
我指的是物体是一个面片,在场景里无法双面显示
MOMO你好,我拷贝了你的代码到Unity中显示问题,for(int i =0; i<lineArray.Length; i )和Renderer []renders = g.GetComponentsInChildren<Renderer>();没看懂是什么意思,难道是代码有错误吗?谢谢!
MOMO你好,我拷贝了你的代码到Unity中显示问题,for(int i =0; i<lineArray.Length; i++)和Renderer []renders = g.GetComponentsInChildren<Renderer>();没看懂是什么意思,难道是代码有错误吗?谢谢!
其实我想说,根本没必要这样做啊。直接选中全部想要改的模型,然后把shader拖过去,很简单的啊
Brilliant post and…
I’ve held it?s place in related scenarios just before. The no effortless a remedy when you considered maybe it?s, it really is a thing that you’ll must create yourself above above time….
我只是想吐槽一下widow name 很好奇这个寡妇到底叫什么 哈哈哈
哈哈。。
松哥,牛人,多出点东西,让咱中国人都成为牛人,则国兴有期矣!加油,松哥!
过奖了呵呵!
每日
momo是这么个事,我…… 这,别问我问你这个干啥啊 只管回答啊。是这样,我们用U3D做项目发布之后,资源文件会变成sharedassets.assets,还有C#活着JS会编译为DLL文件。现在我DLL文件很容易就能反编译,但我想让sharedassets.assets也能重新在工程里用起来。请问这个咋办啊…………………………. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
这个高端了, 我也没研究过。你这个是什么平台的? 我知道不同平台下反编译不太一样。。
MOMO哥 请问从Max或者maya中导出fbx文件到unity3d中做镜面反射,应该主要那些问题。我用一个把从max中导出的fbx文件,做镜面反射,反射的物体总是旋转的状态,比如说,镜面物体在旋转90度才能看到要发射的物体!请指点迷津啊!!!