Unity3D研究之自制批量修改Shader插件

2015年03月25日 16:45 0 点赞 0 评论 更新于 2025-11-21 18:34

配置文件 shader.txt

shader.txt 是用于配置批量修改 Shader 的列表文件。在这个文件中,你既可以选择系统自带的 Shader,也可以选择自己创建的 Shader,只需确保名称准确即可。若需要添加更多 Shader,只要项目资源中存在相应的 Shader,就可以继续添加。不同 Shader 名称之间使用 & 字符隔开。

以下是 shader.txt 的示例内容:

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

其中,Custom/NewShader 是自定义创建的 Shader。Shader 的名称可根据需求任意配置。

插件使用方法

该插件的使用方法非常简单,具体步骤如下:

  1. 在 Hierarchy 视图中选择需要批量修改 Shader 的对象。你可以放心选择对象,程序会自动检测所选对象是否可以修改 Shader。
  2. 在 Unity 导航菜单栏中选择 Window -> ChangerShader
  3. 点击需要批量修改的 Shader。之后查看模型材质上的 Shader,你会发现它们已经被成功修改。

插件测试情况

目前,这个小插件已在我的工程中完美测试通过,但这并不意味着它没有任何 BUG。希望大家多多使用,并给我提出宝贵的意见。

插件源码 ChangeShader.cs

以下是 ChangeShader.cs 插件的源码。代码相对简单,核心逻辑是根据 Hierarchy 视图中的游戏对象找到其材质组件,若组件中使用了 Project 视图中的资源文件的 Shader 文件,则在 Project 中找到该资源文件的路径,最后获取这个资源对象并修改其 Shader。

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('&');
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 视图中选择对象"));
}
}
}

作者信息

feifeila

feifeila

共发布了 3994 篇文章