• 何时产生
  • 如何产生
  • 如何使用
  • 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换回去,再引用才会发生。