论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
应用中心
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
大数据
›
数据仓库与分析
›
简单先容一下Unity中的material和sharedMaterial ...
简单先容一下Unity中的material和sharedMaterial
我爱普洱茶
论坛元老
|
2025-4-1 02:33:31
|
显示全部楼层
|
阅读模式
楼主
主题
1737
|
帖子
1737
|
积分
5211
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
在Unity中,材质(Material)是定义物体外观的关键组件,它决定了物体的颜色、纹理、光照结果等属性。Renderer组件(如MeshRenderer或SpriteRenderer)通过材质来渲染游戏对象的外观。Unity提供了两种访问材质的属性:material和sharedMaterial。它们的作用和举动有所差异,理解它们的区别对于精确管理材质和优化游戏性能至关紧张。接下来,我将详细解释这两个属性,并分析它们的区别。
material属性
定义
material是Renderer组件的一个属性,它返回一个
材质实例
。当你访问renderer.material时,Unity会执行以下逻辑:
如果该渲染器还没有独立的材质实例,Unity会
自动克隆
sharedMaterial,并返回这个新创建的实例。
如果已经存在一个独立的材质实例,则直接返回该实例。
// 通过material属性获取
Material instancedMaterial = renderer.material;
复制代码
举动
对material的修改
仅影响当前渲染器
,不会影响其他利用雷同材质的物体。
这种举动非常适合需要为特定物体定制材质属性的情况。
应用场景
为某个特定物体设置独特的颜色、纹理或shader属性。
在运行时动态调整材质属性,比方改变透明度或高光结果。
注意事项
每次访问renderer.material时,如果没有现成的实例,Unity会创建一个新的材质实例,这会增加内存开销。
频仍访问和修改material可能导致性能题目,尤其是在资源有限的平台(如移动设备)上。
示例代码
Renderer renderer = gameObject.GetComponent<Renderer>();
renderer.material.color = Color.red; // 只改变当前物体的颜色
复制代码
sharedMaterial属性
定义
sharedMaterial是Renderer组件的另一个属性,它返回渲染器当前利用的
共享材质
。共享材质是多个渲染器可以共同引用的材质资源。
// 通过sharedMaterial属性获取
Material originalMaterial = renderer.sharedMaterial;
复制代码
举动
对sharedMaterial的修改会
影响所有利用该材质的渲染器
。
如果多个物体共享同一个材质,修改sharedMaterial会同步更新所有相干物体的外观。
应用场景
当你希望多个物体共享雷同的材质属性时,比方场景中一组雷同的树木或敌人。
在编辑器中批量调整材质属性,比方同一修改所有物体的高光强度。
注意事项
在运行时修改sharedMaterial会影响所有引用该材质的物体,这可能导致意外的结果。
修改sharedMaterial会直接更改项目中的材质资产,这些更改可能会在下次运行时生存,除非手动重置。
示例代码
Renderer renderer = gameObject.GetComponent<Renderer>();
renderer.sharedMaterial.color = Color.blue; // 所有使用该材质的物体颜色都会变为蓝色
复制代码
material和sharedMaterial的区别
以下是两者的核心区别,总结成表格便于理解:
特性
materialsharedMaterial
访问时
返回一个材质实例(须要时克隆)返回共享的材质资源
修改影响
只影响当前渲染器影响所有利用该材质的渲染器
内存开销
每次克隆都会创建新实例,增加内存不创建新实例,共享同一材质
适用场景
定制特定物体的材质属性多个物体共享雷同的材质属性
运行时举动
适合动态、独立控制适合批量、同步控制
举个例子
假设场景中有三个物体A、B、C,它们默认共享同一个材质(颜色为白色):
如果你对物体A调用renderer.material.color = Color.red,只有A变成红色,B和C保持白色。
如果你对物体A调用renderer.sharedMaterial.color = Color.red,A、B、C都会变成红色。
何时利用sharedMaterial
需要多个物体共享雷同的材质属性时。
在编辑器中批量修改材质属性。
希望节流内存,避免创建多余的材质实例。
何时利用material
需要为某个物体设置独特的材质属性时。
在运行时动态调整特定物体的外观。
性能优化发起
避免频仍访问material
:因为这可能导致不须要的材质实例创建,增加内存和渲染开销。
优先利用sharedMaterial进行批量修改
:如果需要同步更新多个物体,sharedMaterial更高效。
利用MaterialPropertyBlock
:如果需要在运行时独立控制材质属性而又不想创建新实例,可以利用MaterialPropertyBlock,这是一种更高效的替代方案。
示例:利用MaterialPropertyBlock
Renderer renderer = gameObject.GetComponent<Renderer>();
MaterialPropertyBlock block = new MaterialPropertyBlock();
block.SetColor("_Color", Color.green);
renderer.SetPropertyBlock(block); // 修改颜色,不创建新材质实例
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
我爱普洱茶
论坛元老
这个人很懒什么都没写!
楼主热帖
事务
KAFKA EAGLE 监控MRS kafka之操作实践 ...
Java 中怎样将 bytes 转换为 long 类型 ...
大数据揭秘丨疫情影响下亚马逊女性夹克 ...
初学Vue(全家桶)-第16天(vue-router ...
OpenHarmony轻量系统开发【1】初始Open ...
Metasploit(msf)利用ms17_010(永恒 ...
信息系统安全运维整改参考
如何优雅的备份MySQL数据?看这篇文章 ...
Python教程:高级特性
标签云
集成商
AI
运维
CIO
存储
服务器
登录参与点评抽奖加入IT实名职场社区
下次自动登录
忘记密码?点此找回!
登陆
新用户注册
用其它账号登录:
关闭
快速回复
返回顶部
返回列表