• 何时产生
  • 如何产生
  • 如何使用
  • sharedMaterial成员是啥

我随手下的插件每次运行就发现材质名称后方有两个(instance),做了搜索和测试。结论如下

Unity的Material Instance和Unreal的不同,并不是直接在资源目录里通过原材质直接创建的。目前看必须通过运行时代码操作才能产生,不能提前创建。
Material Instance主要用于相同着色器,不同配置参数。unity的Shader定位类似unreal的Material,集成了着色器算法的功能,而unity的material则对应到Unreal的instance,给相同算法搭配不同参数。

材质共享SharedMaterial

正常来说默认的材质就是共享材质,给两个物体使用相同材质时,修改其中任意一个的参数都会影响到另一个物体的表现。因为他们本质使用的是同一个数据。
在建筑演示类的项目中,同一个材质的物体可以共享材质,比如木门、门框、柜子的主体可以用一个材质,比如门把手都用同一个材质。需要调整效果时肯定是统一修改的。

修改renderer的sharedMaterial是什么呢

大佬的严谨验证
我认为renderer下materilal成员和sharedMaterial成员没啥成分区别,只是访问material会认为需要产生实例,不对存在工程文件里的材质资源造成影响。
那么如果material已经是实例,那sharedMaterial本身就已经跟硬盘上的资源没有关系。不想产生访问material产生的问题就可以直接修改sharedmaterial。(未验证,夜深了回头补充)

游戏里的材质

对于游戏而言使用同一种材质的情况反而很少,除了完全相同的物体通常都需要一些定制改变。其中大部分变体也是必须在制作中实时查看的,不可能通过运行时代码去赋予不同的参数。

我的instance应用

接上一篇文章,我正在制作一个护盾效果。
游戏机制要求怪物受到伤害后护盾颜色产生变化,这种变化肯定是对应每个怪物各自一套。如果使用sharedmaterial会造不论怪物血多血少都显示一样的颜色。
这里就需要使用material instance。

如何创建instance

  • New Material(meshRenderer.material)
  • var temp_or_member_var = meshRenderer.material
  • var temp_or_member_var = meshRenderer.materials[i] (多材质时)
  • Function(mershRenderer.material)
    通过实验,基本所有传值操作都会使材质创建实例(instance),哪怕只是给一个空的函数传递参数。

其中New Material()获得的引用并不是操作之后物体上的实例,给new获得的材质更改参数不会作用到当前的物体上。

两个instance的来源

已经是实例的材质进行操作并不会直接造成资源名后面(instance)(instance)。
目前测试只有 new Material(xx)之后,把instance换回去,再引用才会发生。

Unity Material Instance相关推荐

  1. Unity GPU Instance踩坑记录

    Unity GPU Instance踩坑记录 Unity中GPUInstance主要有两种:一种是unity自动进行的,或者调用Graphics.DrawMeshInstancedIndirect等A ...

  2. unity Gpu Instance

    参考网址: https://blog.csdn.net/leonwei/article/details/73274808 https://docs.unity3d.com/ScriptReferenc ...

  3. unity material之tiling和offset属性

    在Unity中,使用材质或者着色器是通过创建一个材质来实现的,新建一个材质,会要求选择使用哪个着色器,默认的是Diffuse着色器.确定了着色器后,在材质属性面板中就会出现该着色器需要用到的一些属性, ...

  4. unity Material的批量修改和单独处理

    蹭一波1024的热度,祝大家节日快乐. Material unity为我们提供了Material这一模块,使得我们对游戏对象的各种渲染操作更加便捷. 一个完整的Material由shader和Text ...

  5. Unity material修改图片的UV通道

    勾选Swap UVs切换uv,达到可以切换导入模型的主uv和次uv的目的. 贴图贴到Detail Albedo X2 修改UV Set 就可以了 如果想动态修改2个以上的UV通道,需要代码实现 进一步 ...

  6. Unity中的静态合批、动态合批、GPU Instance 以及SRP Batching

    文章目录 Unity中的静态合批.动态合批.GPU Instance 以及SRP Batching 四种合批简介 GPU instancing static Batching Dynamic batc ...

  7. Unity中基于Gpu Instance进行大量物体渲染的实现与分析(一)

    图  一个使用gpu instance绘制4000棵树的场景 在3D渲染中,尤其是现代3D游戏中,我希望能够绘制越来越多的场景物体,这对于设备(尤其是移动端)的性能是个极大的考验,对于新一代的渲染ap ...

  8. Google Filament 源码学习(三):Material System (二)

    目录 Filament Materials Guide Introduction 相关术语与概念 Material Models Lit Model Base Color Metallic Rough ...

  9. Unity游戏优化指南大全(持续更新中!)

    Unity游戏优化指南大全 三个官方优化提示: 性能和优化 (Performance and Optimization) - 关于性能分析器以及性能和优化技巧的 Unity 学习教程. Best pr ...

最新文章

  1. Android APK加壳技术方案----代码实现
  2. 2015-03-06——正则表达式基础
  3. zk reconnect
  4. Go语言中cannot convert adminname (type interface {}) to type *: need type assertion的解决办法...
  5. Http协议之报文·方法·状态码
  6. SQL Server 全文索引创建
  7. xgboost 怎么读_【泰语单词】“祸从口出”泰语怎么表达?意想不到的简单
  8. C/C++[codeup 2044]神奇的口袋
  9. qt的qmap根据key进行归类,汇总
  10. 二阶有源低通滤波器设计
  11. 神秘诡异的量子世界是如何毁掉科学家三观的?
  12. 2022-2028年中国密码机行业竞争现状及投资策略研究报告
  13. js距离单位换算_js实现单位互换px/cm/mm篇
  14. 经验分享:新媒体运营离不开的几款运营软件
  15. RxJava 与 Retrofit 结合的最佳实践
  16. mysql的password()函数和md5函数
  17. RL——Policy Gradient类方法
  18. 巨简单 在eclips上面新建一个网页动态项目
  19. CRM系统和OA系统是否可以共用一个系统,如何操作?
  20. linux远程root拒绝,ubuntu拒绝root用户ssh远程登录解决办法

热门文章

  1. 企业信用报告查询流程
  2. mysql中自定义nvl函数
  3. 淘宝 Android 帧率采集与监控详解
  4. James Squire推出澳大利亚最珍贵开瓶器价值超过3万澳元
  5. 新冠后丧失嗅觉的关键原因找到了,科学家:长期失灵也能恢复 | Science子刊
  6. 中高级测试工程师面试题(四)
  7. 英文版windows11更改语言
  8. 【精品】Intellij中Emmet插件的使用技巧
  9. 第二十一章、系统配置工具(网络与打印机)与硬件侦测
  10. java之学习记录 3 - 2 - jquery