当前位置: 首页 > article >正文

Unity中的MaterialPropertyBlock的作用和 Material 的区别

MaterialPropertyBlock 是 Unity 提供的一个用于动态修改材质属性的轻量级工具,核心作用是避免材质实例化(Material Instantiation),从而优化性能。以下是它的关键特性和使用方法:


1. 核心作用

  • 避免材质实例化
    直接修改 Material 对象(如 material.color = ...)会导致 Unity 创建该材质的独立副本(实例化),增加内存占用和 Draw Call。
    MaterialPropertyBlock 允许多个对象共享同一材质,但拥有独立的属性值(如颜色、纹理)。

  • 动态属性控制
    适合在运行时频繁修改材质属性(如颜色渐变、纹理切换),同时保持渲染性能。


2. 基本用法

// 步骤 1: 获取 Renderer 组件
Renderer renderer = GetComponent<Renderer>();// 步骤 2: 创建或获取 MaterialPropertyBlock
MaterialPropertyBlock mpb = new MaterialPropertyBlock();
renderer.GetPropertyBlock(mpb); // 获取当前属性块(保留未修改的属性)// 步骤 3: 修改属性
mpb.SetColor("_BaseColor", Color.red); // 修改颜色
mpb.SetTexture("_BaseMap", myTexture); // 修改纹理// 步骤 4: 应用到 Renderer
renderer.SetPropertyBlock(mpb);

3. 与直接修改 Material 的区别

特性直接修改 MaterialMaterialPropertyBlock
材质实例化会创建材质副本(内存↑)共享材质,无副本(内存优化)
性能频繁调用可能导致卡顿高效,适合动态属性修改
属性持久化修改永久生效(保存到材质)临时修改(仅运行时有效)
适用场景需要持久化属性修改时动态效果(如闪烁、颜色渐变)

4. 关键优势

  • 减少Draw Call
    多个对象使用相同的材质和MaterialPropertyBlock时,Unity会自动合并渲染批次(Batching)。

  • 内存友好
    避免因频繁材质实例化导致的内存碎片和泄漏。

  • 灵活控制
    可动态修改材质属性,同时不影响其他使用相同材质的对象。


5. 注意事项

  • 属性名称需匹配
    必须使用着色器中定义的属性名称(如URP中的_BaseColor,而非旧版的_Color)。

  • 属性块生命周期
    MaterialPropertyBlock 是临时对象,需在每次修改时重新应用。
    (例如:在 Update() 中动态修改颜色时,需每帧调用 SetPropertyBlock

  • 线程安全
    只能在主线程中操作(Unity的渲染API非线程安全)。


6. 典型应用场景

  • 角色受伤闪烁
    动态修改 _BaseColor 实现颜色变化,不影响其他角色。
  • 动态环境切换
    批量修改一组对象的纹理(如季节变化)。
  • UI 动态样式
    修改按钮的高光颜色或背景纹理。

示例:批量修改颜色(高效版)

public class BatchColorChanger : MonoBehaviour
{public Renderer[] renderers;public Color targetColor;void Start(){MaterialPropertyBlock mpb = new MaterialPropertyBlock();foreach (var renderer in renderers){renderer.GetPropertyBlock(mpb); // 获取当前属性mpb.SetColor("_BaseColor", targetColor); // 修改颜色renderer.SetPropertyBlock(mpb); // 应用修改}}
}

总结:MaterialPropertyBlock 是优化运行时材质修改的核心工具,尤其在需要批量处理或动态效果时,能显著提升性能。在URP/HDRP项目中,建议优先使用它替代直接修改材质属性。

相关文章:

Unity中的MaterialPropertyBlock的作用和 Material 的区别

MaterialPropertyBlock 是 Unity 提供的一个用于动态修改材质属性的轻量级工具&#xff0c;核心作用是避免材质实例化&#xff08;Material Instantiation&#xff09;&#xff0c;从而优化性能。以下是它的关键特性和使用方法&#xff1a; 1. 核心作用 避免材质实例化 直接修改…...

Python与文件——保存文件

1.以下关于Python二维数据的描述中,错误的是()。 A、CSV文件的每一行是一维数据,可以用列表、元组表示。 B、从CSV文件获得数据内容后,可以用replace()来去掉每行最后的换行符。 C、若一个列表变量里的元素都是字符串类型,则可以用join()合成字符串。 D、列表中保存的二维数据,…...

HarmonyOS主题管理工具封装:动态切换、持久化存储与常见问题解析

注&#xff1a;适用版本&#xff08;Harmony OS NEXT / 5.0 / API 12 &#xff09; 一、效果展示 二、技术栈 HarmonyOS ArkUI框架 使用AppStorage实现跨组件状态管理&#xff0c;PersistentStorage持久化存储用户偏好。 系统配置常量 ConfigurationConstant.Color…...

60V单通道高精度线性恒流LED驱动器防60V反接SOD123封装

产品描述: PC561A 系列产品是用于产生单通道、高精度恒流源&#xff08; Constant Current Regulator&#xff0c; CCR&#xff09; 的LED 驱动芯片&#xff0c;为各类 LED 照明应用提供高性价比恒流方案。PC561A 采用晶体管自偏置技术&#xff0c;可在超宽工作电压范围内维持…...

学习threejs,使用Sprite精灵、SpriteMaterial精灵材质

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Sprite1.1.1 ☘️代码…...

网络相关的知识总结1

1.设备可以通过以太网电缆&#xff08;如双绞线&#xff09;连接到交换机的端口&#xff0c;交换机也通过以太网电缆连接到路由器。但是如果距离过远&#xff0c;比如跨国路由器如何连接&#xff1f; 1.专用通信线路&#xff08;如 MPLS、光纤专线&#xff09;&#xff1a;租用…...

Cent OS7+Docker+Dify

由于我之前安装了Dify v1.0.0&#xff0c;出现了一些问题&#xff1a;无法删除&#xff0c;包括&#xff1a;知识库中的文件、应用、智能体、工作流&#xff0c;都无法删除。现在把服务器初始化&#xff0c;一步步重新安装&#xff0c;从0到有。 目录 1、服务器重装系统和配置…...

本地AI大模型部署革命:Ollama部署和API调试教程

Ollama&#xff1a;你的私人AI助手 还在为云端AI服务的高昂费用和隐私问题而烦恼吗&#xff1f;Ollama横空出世&#xff0c;它是一款专为本地环境打造的大模型部署神器&#xff0c;让你轻松在自己的设备上运行各种强大的AI模型。无论你是开发者还是普通用户&#xff0c;Ollama…...

centos7 linux VMware虚拟机新添加的网卡,能看到网卡名称,但是看不到网卡的配置文件

问题现象&#xff1a;VMware虚拟机新添加的网卡&#xff0c;能看到网卡&#xff0c;但是看不到网卡的配置文件 解决方案&#xff1a; nmcli connection show nmcli connection add con-name ens36 ifname ens36 type ethernet #创建一个网卡连接配置文件&#xff0c;这里con…...

SRT协议

SRT&#xff08;Secure Reliable Transport&#xff09;是一种开源的视频传输协议&#xff0c;专为高丢包、高延迟网络环境设计&#xff0c;结合了UDP的低延迟和TCP的可靠性&#xff0c;广泛应用于直播、远程制作、视频会议等场景。 定位&#xff1a;SRT协议的官方C/C实现库&am…...

K8S学习之基础五十一:k8s部署jenkins

k8s部署jenkins 创建nfs共享目录&#xff0c; mkdir -p /data/v2 echo /data/v2 *(rw,no_root_squash) > /etc/exports exportfs -arv创建pv、pvc vi pv.yaml apiVersion: v1 kind: PersistentVolume metadata:name: jenkins-k8s-pv spec:capacity:storage: 1GiaccessMod…...

在 Mermaid 流程图里“驯服”quot;的魔法指南!!!

&#x1f409; 在 Mermaid 流程图里“驯服”"的魔法指南 在使用 Mermaid 画流程图时&#xff0c;是不是经常遇到想秀一波 &quot; 却被它“反杀”的情况&#xff1f;&#x1f3af; 今天就来教大家如何在这头代码野兽的嘴里&#xff0c;抢回我们的双引号实体编码&#…...

GitHub美化个人主页3D图表显示配置操作

这个功能主要是用的这个开源仓库&#xff1a;https://github.com/yoshi389111/github-profile-3d-contrib 想看效果的话&#xff0c;我的个人主页&#xff1a;https://github.com/Sjj1024 开始操作 1.创建自己的github主页属性项目——跟你github用户名一致即可&#xff0c;…...

欧几里得距离(Euclidean Distance)公式

欧几里得距离公式 欧几里得距离&#xff08;Euclidean Distance&#xff09;是计算两点之间直线距离的一种方法。它是最常见的距离度量方式之一&#xff0c;广泛应用于数学、物理、机器学习、计算机视觉等领域。 公式定义 1. 二维空间 在二维平面上&#xff0c;假设有两个点…...

HarmonyOS NEXT 鸿蒙中关系型数据库@ohos.data.relationalStore API 9+

核心API ohos.data.relationalStore API 9 数据库 数据库是存储和管理数据的系统 数据库&#xff08;Database&#xff09;是一个以特定方式组织、存储和管理数据的集合&#xff0c;通常用于支持各种应用程序和系统的运行。它不仅是存放数据的仓库&#xff0c;还通过一定的…...

【JavaScript】JavaScript Promises实践指南

【JavaScript】JavaScript Promises实践指南 你了解JavaScript中的Promises吗&#xff1f;这是一个很多人一开始就放弃的主题&#xff0c;但我会尽量让它变得尽可能简单。 1. “Promise”到底是什么&#xff1f; “Promise”是异步编程中的一个基本概念&#xff0c;特别是在J…...

【软件工程】习题及答案

目录 第一章 习题第一章 习题答案第二章 习题第二章 习题答案第三章 习题第三章 习题答案第四章 习题第四章 习题答案第五章 习题第五章 习题答案第六章 习题第六章 习题答案第七章 习题第七章 习题答案 第一章 习题 一、选择题 1&#xff0e;关于引起软件危机的原因&#xff…...

git push的时候出现无法访问的解决

fatal: 无法访问 https://github.com/...&#xff1a;gnutls_handshake() failed: Error in the pull function. push的时候没有输入自己的github账号密码&#xff0c;为了解决每次push都要登录github这个问题&#xff0c;采用ssh密钥的方式认证&#xff0c;可以免去每次都输入…...

《深度剖析Android 12 SystemUI锁屏通知布局亮屏流程:从源码到实现》

优化后文章结构&#xff1a; 1. 前言 强调锁屏通知布局的重要性及分析目的&#xff0c;引出后续源码分析的必要性。 2. 核心类解析 KeyguardViewMediator&#xff1a;锁屏核心逻辑控制&#xff0c;处理亮屏/息屏事件分发。 PhoneWindowManager&#xff1a;系统输入事件&…...

为什么大模型在 OCR 任务上表现不佳?

编者按&#xff1a; 你是否曾经用最先进的大语言模型处理企业文档&#xff0c;却发现它把财务报表中的“$1,234.56”读成了“123456”&#xff1f;或者在处理医疗记录时&#xff0c;将“0.5mg”误读为“5mg”&#xff1f;对于依赖数据准确性的运营和采购团队来说&#xff0c;这…...

HCIP(VLAN综合实验)

实验拓补图 实验分析 一、实验目的 掌握VLAN的创建和配置方法理解VLAN在局域网中的作用学习如何通过VLAN实现网络隔离和通信 二、实验环境 交换机&#xff08;SW1、SW2、SW3&#xff09;个人电脑&#xff08;PC1、PC2、PC3、PC4、PC5、PC6&#xff09;路由器&#xff08;R1…...

每日算法-250328

记录今天学习和解决的LeetCode算法题。 92. 反转链表 II 题目 思路 本题要求反转链表中从 left 到 right 位置的节点。我们可以采用 头插法 的思路来反转指定区间的链表。 具体来说&#xff0c;我们首先定位到 left 位置节点的前一个节点 prev。然后&#xff0c;从 left 位置…...

从 Word 到 HTML:使用 Aspose.Words 轻松实现 Word 文档的高保真转换

从 Word 到 HTML&#xff1a;使用 Aspose.Words 轻松实现 Word 文档的高保真转换 前言一、环境准备二、核心代码实现1. 将 Word 转换为 HTML 文件流2. 优化超链接样式 三、测试效果四、总结 前言 在日常开发中&#xff0c;我们经常需要将 Word 文档转换为 HTML&#xff0c;用于…...

Android 设备实现 adb connect 连接的步骤

1. 检查设备的开发者选项 确保平板设备已开启开发者模式&#xff0c;并启用了USB调试。 2. 检查设备和电脑的网络连接 确保平板和电脑连接到同一个Wi-Fi网络&#xff0c;确认设备的 IP 地址是否正确。 通过 ping 命令测试&#xff1a; ping 192.168.3.243. 通过USB线进行初…...

【人工智能】解锁大模型潜力:Ollama 与 DeepSeek 的分布式推理与集群部署实践

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大语言模型(LLM)的快速发展,其推理能力在自然语言处理、代码生成等领域展现出巨大潜力。然而,单机部署难以满足高并发、低延迟的需…...

离散的数据及参数适合用什么算法做模型

离散数据和参数适用的机器学习算法取决于具体任务(分类、回归、聚类等)、数据特点(稀疏性、类别数量等)以及业务需求。以下是针对离散数据的常用算法分类和选择建议: 1. 分类任务(离散目标变量) 经典算法 决策树(ID3/C4.5/CART) 直接处理离散特征,无需编码,可解释性…...

VMware 安装 Ubuntu 实战分享

VMware 安装 Ubuntu 实战分享 VMware 是一款强大的虚拟机软件&#xff0c;广泛用于多操作系统环境的搭建。本文将详细介绍如何在 VMware 中安装 Ubuntu&#xff0c;并分享安装过程中的常见问题及解决方法。 1. 安装前的准备工作 (1) 系统要求 主机操作系统&#xff1a;Windo…...

RSA 简介及 C# 和 js 实现【加密知多少系列_4】

〇、简介 谈及 RSA 加密算法&#xff0c;我们就需要先了解下这两个专业名词&#xff0c;对称加密和非对称加密。 对称加密&#xff1a;在同一密钥的加持下&#xff0c;发送方将未加密的原文&#xff0c;通过算法加密成密文&#xff1b;相对的接收方通过算法将密文解密出来原文…...

在IDEA中快速注释所有console.log

在IDEA中快速注释所有console.log 在前端IDEA中&#xff0c;快速注释所有console.log语句可以通过以下步骤实现2&#xff1a; 打开要修改的文件。使用快捷键CtrlF打开搜索框。点击打开使用正则搜索的开关或者通过AltR快捷键来打开。在搜索框输入[]*console.log[]*&#xff0c;…...

GPT-4o图像生成功能:技术突破与隐忧并存

2025年3月25日&#xff0c;OpenAI正式推出GPT-4o原生图像生成功能&#xff0c;宣称其实现了“文本到图像的终极跨越”。然而&#xff0c;这一被市场追捧的技术在短短72小时内便因用户需求过载触发限流&#xff0c;暴露出算力瓶颈与商业化矛盾的尖锐性。这场技术狂欢的背后&…...