【Shader】Unity批量更换Shader

2024-06-12 11:52
文章标签 批量 unity 更换 shader

本文主要是介绍【Shader】Unity批量更换Shader,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在Unity开发中,因为渲染管线问题,经常会遇到需要大量更改shader的问题,本篇文章讲述批量更换Shader的工具

一、原理:

  • 拿到场景内、指定文件夹内所有模型或指定模型
  • 编辑获取其Renderer上的所有材质球
  • 记录原材质的颜色贴图
  • 更换新的shader
  • 将颜色与贴图赋值给新的shader

二、代码

  • 代码功能:(其他地方可自行更改)
    • 更换场景内所有物体的shader
    • 目标Shader为URP管线
	public class BatchChangeShaderUtils : EditorWindow{private Shader targetShader;private int selectedShaderIndex = 0;private readonly string[] urpShaders = {"Universal Render Pipeline/Lit","Universal Render Pipeline/Simple Lit","Universal Render Pipeline/Unlit"};[MenuItem("MyTools/GameUtils")]public static void ShowWindow(){GetWindow<GameUtilsEditor>();}private void OnGUI(){GUILayout.Label("GameUtils", EditorStyles.boldLabel);selectedShaderIndex = EditorGUILayout.Popup("Target Shader", selectedShaderIndex, urpShaders);targetShader = Shader.Find(urpShaders[selectedShaderIndex]);if (GUILayout.Button("设置场景中所有对象的shader")) {if (targetShader != null){SetShaderForAllObjectsInScene(targetShader);}else{Debug.LogWarning("Please select a valid URP shader.");}}}private void SetShaderForAllObjectsInScene(Shader shader){GameObject[] allObjects = SceneManager.GetActiveScene().GetRootGameObjects();foreach (GameObject obj in allObjects){TraverseAndSetShader(obj, shader);}Debug.Log("Shader has been set for all objects in the scene.");}private void TraverseAndSetShader(GameObject obj, Shader shader){SetShaderForAllRenderers(obj, shader);foreach (Transform child in obj.transform){TraverseAndSetShader(child.gameObject, shader);}}private void SetShaderForAllRenderers(GameObject obj, Shader shader){Renderer[] renderers = obj.GetComponents<Renderer>();foreach (Renderer renderer in renderers){if (renderer != null){foreach (Material material in renderer.sharedMaterials){if (material != null){Color albedoColor = material.color;Texture albedoTexture = material.mainTexture;material.shader = shader;material.color = albedoColor;material.mainTexture = albedoTexture;}}}}}}

这篇关于【Shader】Unity批量更换Shader的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054143

相关文章

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

Python批量替换多个Word文档的多个关键字的方法

《Python批量替换多个Word文档的多个关键字的方法》有时,我们手头上有多个Excel或者Word文件,但是领导突然要求对某几个术语进行批量的修改,你是不是有要崩溃的感觉,所以本文给大家介绍了Py... 目录工具准备先梳理一下思路神奇代码来啦!代码详解激动人心的测试结语嘿,各位小伙伴们,大家好!有没有想

shell脚本批量导出redis key-value方式

《shell脚本批量导出rediskey-value方式》为避免keys全量扫描导致Redis卡顿,可先通过dump.rdb备份文件在本地恢复,再使用scan命令渐进导出key-value,通过CN... 目录1 背景2 详细步骤2.1 本地docker启动Redis2.2 shell批量导出脚本3 附录总

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k