我爱普洱茶 发表于 2025-4-1 02:33:31

简单先容一下Unity中的material和sharedMaterial

在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企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 简单先容一下Unity中的material和sharedMaterial