有些需求是一键替换模型中的一些shader,这个工具是给美术使用的,只需要填写要替换的sheder名字,和新的名字即可。
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
//一键替换模型上的Shader
public class AutoReplaceShader
{
#region 旧版更换shader工具,要在代码中更换地址
static Shader newShader; //要替换的很挫的shader 路径: Assets/Resources/Shaders/Normal-Diffuse.shader
static string newShaderPath = "Assets/Resources/Shaders/Normal-Diffuse.shader"; //要更换的新shader地址(自定义shader)
static string newShaderName = "Mobile/Diffuse"; //要更换的系统shader路径
//白名单
static string[] writeModelList = {
"three004", "parrot_ctrl" }; //如果一个物体,交这个名字,则不更换shader
//黑名单
static string[] blackShaderList = {
"MXR_multy_Texture_alphaTest2Side", "Diffuse" }; //如果一个Shader的名字包含这些关键词,则就要被替换掉
static int changeNum; //更换shader的数量
//[MenuItem("Tools/替换Shader")]
public static void ReplaceShader()
{
//1、必须将模型的已生成的预制体Model拖到Actor下面
GameObject model = GameObject.Find("Actor/Model").gameObject;
newShader = AssetDatabase.LoadAssetAtPath(newShaderPath, typeof(Shader)) as Shader;
changeNum = 0;
MeshRenderer[] meshRs = model.GetComponentsInChildren<MeshRenderer>();
for (int i = 0; i < meshRs.Length; ++i)
{
ChangeShader(meshRs[i].gameObject, meshRs[i].sharedMaterials);
}
SkinnedMeshRenderer[] skins = model.GetComponentsInChildren<SkinnedMeshRenderer>();
for (int i = 0; i < skins.Length; ++i)
{
ChangeShader(skins[i].gameObject, skins[i].sharedMaterials);
}
AssetDatabase.Refresh();
Debug.Log("Changer " + changeNum + " shaders over.");
}
//更换材质上的shader
static void ChangeShader(GameObject model, Material[] modelMaters)
{
for (int i = 0; i < writeModelList.Length; ++i)
{
if (writeModelList[i] == model.name)
{
//白名单的物体不修改shader
return;
}
}
for (int i = 0; i < modelMaters.Length; ++i)
{
for (int j = 0; j < blackShaderList.Length; ++j)
{
if (!modelMaters[i].shader.name.Contains(blackShaderList[j]))
{