场景Shader替换工具
2024-03-26 本文已影响0人
NightChord
工具说明
Shader替换工具是一款Unity编辑器扩展工具,用于批量替换场景中物体的Shader。
功能
- 支持替换单个物体或递归替换所有子物体
- 自动赋值原有材质的贴图到替换后的Shader
- 支持自定义替换Shader
使用方法
- 在Unity菜单栏中选择 EditorTools/Shader Replace Tool 打开工具窗口
- 选择要替换的Shader
- 选择是否替换子物体
- 点击 Replace 按钮开始替换
注意事项
- 替换Shader后,需要手动保存场景
- 脚本中获取贴图的代码可能需要根据实际情况进行修改
代码示例
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class ShaderReplaceTool : EditorWindow
{
// 替换shader
public Shader replaceShader;
// 是否替换子物体
public bool replaceChildren = true;
[MenuItem("EditorTools/Shader Replace Tool")]
static void Init()
{
ShaderReplaceTool window = (ShaderReplaceTool)EditorWindow.GetWindow(typeof(ShaderReplaceTool));
window.Show();
}
void OnGUI()
{
replaceShader = (Shader)EditorGUILayout.ObjectField("Replace Shader", replaceShader, typeof(Shader), false);
replaceChildren = EditorGUILayout.Toggle("Replace Children", replaceChildren);
if (GUILayout.Button("Replace"))
{
ReplaceShader();
}
}
void ReplaceShader()
{
// 获取当前场景中所有物体
GameObject[] allObjects = GameObject.FindObjectsOfType<GameObject>();
foreach (GameObject obj in allObjects)
{
// 遍历物体及其子物体
if (replaceChildren)
{
ReplaceShader(obj.transform);
}
else
{
ReplaceShader(obj.transform, false);
}
}
}
void ReplaceShader(Transform trans, bool recursive = true)
{
// 获取物体的材质
Renderer renderer = trans.GetComponent<Renderer>();
if (renderer != null)
{
// 替换材质的shader
Material[] mats = renderer.sharedMaterials;
for (int i = 0; i < mats.Length; i++)
{
mats[i].shader = replaceShader;
// 赋值贴图
if (replaceShader != null)
{
// 获取原有材质的贴图
Texture2D baseMap = mats[i].GetTexture("_MainTex") as Texture2D;
Texture2D normalMap = mats[i].GetTexture("_BumpMap") as Texture2D;
Texture2D metallicMap = mats[i].GetTexture("_MetallicGlossMap") as Texture2D;
// 赋值到替换shader后的材质
mats[i].SetTexture("_Base_Map", baseMap);
mats[i].SetTexture("_Normal_Map", normalMap);
mats[i].SetTexture("_ORM", metallicMap);
}
}
}
// 递归遍历子物体
if (recursive)
{
foreach (Transform child in trans)
{
ReplaceShader(child, recursive);
}
}
}
}