【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

相关文章

秒变高手:玩转CentOS 7软件更换的方法大全

在 CentOS 7 中更换软件源可以通过以下步骤完成。更换源可以加快软件包的下载速度,特别是当默认源速度较慢时。以下是详细步骤: 前言 为了帮助您解决在使用CentOS 7安装不了软件速度慢的问题,我们推出了这份由浪浪云赞助的教程——“CentOS7如何更换软件源加快下载速度”。 浪浪云,以他们卓越的弹性计算、云存储和网络服务受到广泛好评,他们的支持和帮助使得我们可以将最前沿的技术知识分

Python脚本:对文件进行批量重命名

字符替换:批量对文件名中指定字符进行替换添加前缀:批量向原文件名添加前缀添加后缀:批量向原文件名添加后缀 import osdef Rename_CharReplace():#对文件名中某字符进行替换(已完结)re_dir = os.getcwd()re_list = os.listdir(re_dir)original_char = input('请输入你要替换的字符:')replace_ch

Python脚本:批量解压RAR文件

所需模块: os.getcwd() #获取脚本文件路径os.system() #执行系统命令 import os#source_dir = input("Please input in source_dir:")#unzip_dir = input("Please input in unzip_dir:") source_dir = os.

vcpkg子包路径批量获取

获取vcpkg 子包的路径,并拼接为set(CMAKE_PREFIX_PATH “拼接路径” ) import osdef find_directories_with_subdirs(root_dir):# 构建根目录下的 "packages" 文件夹路径root_packages_dir = os.path.join(root_dir, "packages")# 如果 "packages"

Python批量读取身份证信息录入系统和重命名

前言 大家好, 如果你对自动化处理身份证图片感兴趣,可以尝试以下操作:从身份证图片中快速提取信息,填入表格并提交到网页系统。如果你无法完成这个任务,我们将在“Python自动化办公2.0”课程中详细讲解实现整个过程。 实现过程概述: 模块与功能: re 模块:用于从 OCR 识别出的文本中提取所需的信息。 日期模块:计算年龄。 pandas:处理和操作表格数据。 PaddleOCR:百度的

Unity Post Process Unity后处理学习日志

Unity Post Process Unity后处理学习日志 在现代游戏开发中,后处理(Post Processing)技术已经成为提升游戏画面质量的关键工具。Unity的后处理栈(Post Processing Stack)是一个强大的插件,它允许开发者为游戏场景添加各种视觉效果,如景深、色彩校正、辉光、模糊等。这些效果不仅能够增强游戏的视觉吸引力,还能帮助传达特定的情感和氛围。 文档

Unity协程搭配队列开发Tips弹窗模块

概述 在Unity游戏开发过程中,提示系统是提升用户体验的重要组成部分。一个设计良好的提示窗口不仅能及时传达信息给玩家,还应当做到不干扰游戏流程。本文将探讨如何使用Unity的协程(Coroutine)配合队列(Queue)数据结构来构建一个高效且可扩展的Tips弹窗模块。 技术模块介绍 1. Unity协程(Coroutines) 协程是Unity中的一种特殊函数类型,允许异步操作的实现

分享MSSQL、MySql、Oracle的大数据批量导入方法及编程手法细节

1:MSSQL SQL语法篇: BULK INSERT      [ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ]         FROM 'data_file'        [ WITH       (      [ [ , ] BATCHSIZE = batch_siz

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光 一,前言二,资源包内容三,免费获取资源包 一,前言 在创意的世界里,每一个细节都能决定一个项目的独特魅力。今天,要向大家介绍一款令人惊艳的粒子效果包 ——Super Confetti FX。 二,资源包内容 💥充满活力与动态,是 Super Confetti FX 最显著的标签。它宛如一位

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(4)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)-CSDN博客  这节就是真正的存储数据了   理清一下思路: 1.存储路径并检查 //2进制文件类存储private static string Data_Binary_Pa