关于material和sharedMaterial一直不是太清楚这俩有啥区别,只是简单的知道sharedMaterial是共享材质,一旦改变了一个材质的属性,其他 所有用到的同样材质球的物体也会跟着改变这样。
上网看文章也是大概就是这个意思。但是我一直不明白,那我再编辑器里简单的拖进来一个材质球给一个物体,那么此时这个材质球是这个物体的material还是sharedMaterial呢?也没有标注他是否是共享材质的方法呀?或者说,我平时在unity里改变某个材质球的参数的时候,一般都是所有同材质的物体都会跟着变呀?是不是编辑器的效果和移动平台不一样呢?
实践是检验真理的唯一标准,开整!
实验一: 在编辑器里制造出来一个球体,再随便新建一个材质,给这个材质使用一个可以变颜色的shader(我这个工程里有这么一个shader ,就直接拿来用了,里面有一个名为“_Color0”的颜色参数) 之后该球体复制7个。
请忽略该shader的其他参数 我只是要用colorstart这个参数来实验(再shader里叫“_Color0”)
现在,我在面板上直接改变colorstart的颜色,然后让它变成原谅色,预测结果应该是7个都变原谅色,实验结果:
和预测的一样。
实验二:
用脚本来改,写一个简单的脚本:
关键代码:
public GameObject bt1;
public GameObject bt2;
public List<GameObject> goes;
// Start is called before the first frame update
void Start()
{
EventTriggerListener.Get(bt1).onPointerClick = (pointereventData) => { goes[0].GetComponent<Renderer>().material.SetColor("_Color0", Color.green); };
EventTriggerListener.Get(bt2).onPointerClick = (pointereventData) => { goes[0].GetComponent<Renderer>().sharedMaterial.SetColor("_Color0", Color.yellow) ; };
}
再场景里随便拖两个东西当做按钮bt1和bt2
左边的绿色按钮是把一号球的material变绿,右侧黄色按钮是把一号球的sharedMaterial变黄。
先把材质球恢复成没有颜色,灰灰的。然后实验
预测,点左边的按钮,只有一号变绿,点击右侧的按钮所有球都变黄。
实验结果:点击左边按钮结果:之后点击右侧按钮的结果:
呀,这和我想象的不一样了,为什么我点击黄色按钮是改变共享材质其他的缺没变化呢?此时我直接点击材质球发现他是无色,也就是说另外六个物体表现的和材质球一样,只有一号球是个特例,此时我想到了这个可能就是之前网上说的,因为点击左侧按钮改变该球的material的时候相当于给他新建了一个材质实例,之后一ihe号球就不再和其他几个是一个材质球了,所以之后再改一号球,即使改的是sharedmaterial也不会影响其他六个了。
实验二结束后我点击结束游戏,一号球也变回了灰色,这就验证了我的想法,一号球已经是复制出来的临时材质球了,再游戏结束的时候会被销毁所以会恢复原状
实验三:先按右侧按钮,再按左侧
实验结果:有了之前的思考,这个实验结果应该和我想得一样
先点击右侧按钮改变共享材质,所有的都变黄,然后再点击左侧的按钮只有一号球变绿
结论:再unity里直接放进去的material是不是共享材质是取决于你如何调用它,sharedmaterial相当于他的本体,你在编辑器里直接手动修改自然相当于把他的本体直接改了,那么所有用这个材质的东西都会变,这个操作相当于代码里render.sharedMaterial.setXXX ,而相反的,再代码里使用render.material.setXXX,就会先给该材质创建一个副本,然后改变这个副本,之后这个物体就使用这个副本当作自己的材质球了,和其他sharedMaterial划清界线了,大概就是这个意思,本菜鸡只能理解到这里了。