【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

相关文章

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

Java如何从Redis中批量读取数据

《Java如何从Redis中批量读取数据》:本文主要介绍Java如何从Redis中批量读取数据的情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一.背景概述二.分析与实现三.发现问题与屡次改进3.1.QPS过高而且波动很大3.2.程序中断,抛异常3.3.内存消

MySQL数据库实现批量表分区完整示例

《MySQL数据库实现批量表分区完整示例》通俗地讲表分区是将一大表,根据条件分割成若干个小表,:本文主要介绍MySQL数据库实现批量表分区的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录一、表分区条件二、常规表和分区表的区别三、表分区的创建四、将既有表转换分区表脚本五、批量转换表为分区

Oracle 通过 ROWID 批量更新表的方法

《Oracle通过ROWID批量更新表的方法》在Oracle数据库中,使用ROWID进行批量更新是一种高效的更新方法,因为它直接定位到物理行位置,避免了通过索引查找的开销,下面给大家介绍Orac... 目录oracle 通过 ROWID 批量更新表ROWID 基本概念性能优化建议性能UoTrFPH优化建议注

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

Python实现AVIF图片与其他图片格式间的批量转换

《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图

详解如何通过Python批量转换图片为PDF

《详解如何通过Python批量转换图片为PDF》:本文主要介绍如何基于Python+Tkinter开发的图片批量转PDF工具,可以支持批量添加图片,拖拽等操作,感兴趣的小伙伴可以参考一下... 目录1. 概述2. 功能亮点2.1 主要功能2.2 界面设计3. 使用指南3.1 运行环境3.2 使用步骤4. 核

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

Jmeter如何向数据库批量插入数据

《Jmeter如何向数据库批量插入数据》:本文主要介绍Jmeter如何向数据库批量插入数据方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Jmeter向数据库批量插入数据Jmeter向mysql数据库中插入数据的入门操作接下来做一下各个元件的配置总结Jmete

Python批量调整Word文档中的字体、段落间距及格式

《Python批量调整Word文档中的字体、段落间距及格式》这篇文章主要为大家详细介绍了如何使用Python的docx库来批量处理Word文档,包括设置首行缩进、字体、字号、行间距、段落对齐方式等,需... 目录关键代码一级标题设置  正文设置完整代码运行结果最近关于批处理格式的问题我查了很多资料,但是都没