Unity一键替换模型中的Shader工具

该博客介绍了一款专为美术设计的工具,能够方便地一键替换Unity模型中的Shader。使用者只需输入旧Shader名称和新Shader名称,即可完成替换操作。文章强调了处理本地Shader与系统Shader的不同方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有些需求是一键替换模型中的一些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]))
                {
   
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值