美工兄弟创建FBX模型带了好几十个贴图,每一个贴图都需要手动设置一下Shader,美工兄弟显然Hold不住了,作为一个程序帮他想想办法把,嘿嘿。我用了一下午的时间帮他写了一小插件。 如下图所示,ChangerShader是插件的代码,shader.txt是配置文件,把它俩都放在Editor文件夹中。
先看看shader.txt的配置文件,它就是配置批量修改Shader的列表,这里可以选择系统自带的Shader,也可以选择你自己创建的Shader,只要名称选择对就可以。配置文件Shader的你也可以继续添加,只要资源中有就可以。记住中间用& 字符隔开就可以,
C#
1
2
3
4
5
6
7
8
9
|
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中找到该资源文件的路径,最后获取这个资源对象并且修改它。
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
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视图中选择对象"
)
)
;
}
}
}
|
批量修改完毕啦。哇咔咔
最后是本文的下载地址 祝大家学习愉快,啦啦啦~~~