【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开发批量提取Excel图片的小工具

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

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

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

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

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

通过Python脚本批量复制并规范命名视频文件

《通过Python脚本批量复制并规范命名视频文件》本文介绍了如何通过Python脚本批量复制并规范命名视频文件,实现自动补齐数字编号、保留原始文件、智能识别有效文件等功能,听过代码示例介绍的非常详细,... 目录一、问题场景:杂乱的视频文件名二、完整解决方案三、关键技术解析1. 智能路径处理2. 精准文件名

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

使用Python实现批量分割PDF文件

《使用Python实现批量分割PDF文件》这篇文章主要为大家详细介绍了如何使用Python进行批量分割PDF文件功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、架构设计二、代码实现三、批量分割PDF文件四、总结本文将介绍如何使用python进js行批量分割PDF文件的方法

macOS怎么轻松更换App图标? Mac电脑图标更换指南

《macOS怎么轻松更换App图标?Mac电脑图标更换指南》想要给你的Mac电脑按照自己的喜好来更换App图标?其实非常简单,只需要两步就能搞定,下面我来详细讲解一下... 虽然 MACOS 的个性化定制选项已经「缩水」,不如早期版本那么丰富,www.chinasem.cn但我们仍然可以按照自己的喜好来更换

Python在固定文件夹批量创建固定后缀的文件(方法详解)

《Python在固定文件夹批量创建固定后缀的文件(方法详解)》文章讲述了如何使用Python批量创建后缀为.md的文件夹,生成100个,代码中需要修改的路径、前缀和后缀名,并提供了注意事项和代码示例,... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5.

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

使用Python制作一个PDF批量加密工具

《使用Python制作一个PDF批量加密工具》PDF批量加密‌是一种保护PDF文件安全性的方法,通过为多个PDF文件设置相同的密码,防止未经授权的用户访问这些文件,下面我们来看看如何使用Python制... 目录1.简介2.运行效果3.相关源码1.简介一个python写的PDF批量加密工具。PDF批量加密