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

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

有些需求是一键替换模型中的一些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]))
                {
   
            
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Unity是一种集成开发环境,用于开发2D和3D多平台游戏、应用程序和交互式体验。Unity引擎支持多种平台,并具有完全可自定义的输入系统,可实现跨平台开发和部署。Unity引擎提供了许多工具和功能,可轻松地创建出色的游戏和交互式体验。 在Unity引擎Shader是一种特殊的程序,用于呈现3D对象。当我们使用Shader时,会创建出许多不同的Shader变体,以匹配不同的硬件和图形API。这些变体可能会导致内存使用量增加,从而影响游戏的性能。因此,Unity提供了一种功能,用于自动收集所有Shader变体。 使用unity 一键自动收集所有shader变体功能,可以更好地管理Shader变体,并将其转化为更有效的方式运行。这种功能可对我们开发过程的时间和性能产生积极的影响。一键自动收集功能的实现原理是,Unity会扫描场景使用到的Shaders,并在运行时自动生成他们的变体。这些变体将根据当前硬件和图形API的能力进行优化,以确保游戏在不同的设备和平台上都能够正常工作。 总的来说,unity 一键自动收集所有shader变体功能是Unity引擎提供的重要功能之一,它可以帮助我们轻松管理Shaders,并优化游戏的性能和体验。这个功能的使用需要我们了解Shaders的相关知识和优化方法,在实际开发充分利用这个功能的优势,以创造出更出色的游戏体验。 ### 回答2: Unity是一款流行的游戏开发引擎,其着重于易用性和跨平台性。它的一键自动收集所有Shader变体功能有助于优化游戏性能。 ShaderUnity的重要组成部分,它控制着游戏物体的外观和动画。在Unity,一个Shader可以包含多个变体,每个变体可以对应一种不同的物体属性或光照条件。然而,每个变体都会带来一定的额外开销,如内存占用和编译时间。因此,对于大型项目,有时需要限制生成变体的数量。 在之前的Unity版本,开发者需要手动收集和管理所有的Shader变体。这使得Shader变体的管理变得非常繁琐,并且容易出现错误。但是,现在Unity引入了一键自动收集所有Shader变体的功能。这个功能简化了Shader变体管理的流程,使得开发者可以更轻松地控制Shader在游戏的表现。 这个功能的工作原理非常简单,Unity会在游戏运行前自动收集所有的Shader变体,并生成一个包含所有变体的列表。这个列表可以被开发者用来分析哪些变体需要被优化或删除。此外,这个功能还可以在发布游戏时从项目删除未使用的Shader变体以减少包的大小。 总之,一键自动收集所有Shader变体是一个非常有用的功能,它可以简化开发者的工作流程并提高游戏性能。 ### 回答3: Unity是一款非常流行的游戏开发引擎,它的Shader变体管理系统可以让开发者轻松管理不同平台和设备上的Shader,提高游戏的性能和稳定性。而Unity一键自动收集所有Shader变体功能则可以进一步简化Shader变体管理的流程。 该功能可以通过在Unity的菜单栏选择“Assets”→“Shader Variants Collector”来实现。当点击该菜单时,Unity会自动扫描项目的所有Shader,并生成一个清单,列出所有已定义的变体。在生成清单后,用户可以选择一键收集所有变体信息,然后将其保存到硬盘上的一个文件。此外,用户还可以选择将这些变体信息上传到Unity的服务器上,以便其他团队成员能够访问并使用。 通过使用Unity一键自动收集所有Shader变体功能,开发者可以极大地方便Shader变体管理的流程,同时还能大大减少出错的概率,提高工作效率和游戏的表现。因此,这是一个非常实用和方便的功能,也是众多游戏开发者使用Unity引擎的很重要的原因之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值