遍历修改粒子系统渲染材质的问题

问题描述:

当粒子系统中只有renderer材质,没有拖尾材质时,尝试遍历并修改粒子系统下的材质时,粒子系统下的材质会出现两份。

问题结果:

在特定情况下,由于多存在一份材质,美术效果不如预期,通常表现为过爆。

问题截图:
1.jpg
预期效果:

由于我们项目中,需要遍历角色上的物件,统一修改材质信息。所以需要可以正确修改粒子系统中的renderer材质。

问题原因:
  1. 在代码中通过renderer访问材质有两种方法 .material.sharedMaterial
  • 使用material时,unity为了保护原有材质不被修改,会机智地复制一份原有的材质,并填充入材质数组中,并尝试替换掉原有的材质。该行为只会发生一次。
  • 使用sharedMaterial则如其名,会直接修改原有的材质,该行为会影响所有引用该材质的物件。
  1. 遍历粒子系统下材质会发现有两份,一份是renderer的渲染材质,另一份是勾选拖尾(Trails)后出现的拖尾材质。即使在拖尾效果不勾选的情况,通过遍历的方式仍然会访问到拖尾材质
问题结论:

Unity早期的粒子系统中(笔者使用的是5.6,确认在2018中已经不存在该问题),renderer下的拖尾材质受外部拖尾模块的勾选状态控制。在不开启拖尾效果时,我们常常不会设置该材质,但当我们遍历修改粒子系统下的材质时,却可以访问到拖尾材质,就会因为上述问题原因1而被Unity创建出一个新的拖尾材质。

2.jpg

所以当需要遍历修改粒子系统的材质时,导出的粒子系统需要设置拖尾特效,即使我们不需要它,也要反勾选用于占位。如下图所示,当添加该占位拖尾材质后,再尝试修改粒子系统中的render材质时,就不会发生填充拖尾特效的情况。
3.jpg

问题探索1:material与sharedMaterial

当两个物件使用同一材质时,使用material方式修改材质只会修改物件自身的材质,原理是Unity将原有材质复制一份并替换掉了原有材质。

实验1:修改material

尝试修改materila时,Unity可以正确复制原有材质并替换掉原有材质,在命名后面多出的(Instance)说明了这一点。


4.jpg
实验2:两个物件公用同一材质,通过material修改其中一个。初始2个cube皆为绿色。
private void changeMaterial() 
{
      MeshRenderer meshRenderer = cube_1.GetComponentInChildren<MeshRenderer>();    
      meshRenderer.material.color = Color.red;
}
5.jpg
实验3:两个物件公用同一材质,通过sharedMaterial修改其中一个。初始2个cube皆为绿色。
private void changeSharedMaterial() {
    MeshRenderer meshRenderer = cube_1.GetComponentInChildren<MeshRenderer>();  
    meshRenderer.sharedMaterial.color = Color.red;
}
6.jpg
问题探索2:在Editor中修改sharedMaterial

承接上述实验3,发现在编辑器中运行时,修改sharedMaterial会影响本地的材质文件并被持久化保存,所以在编辑器中运行时,可用如下方案避免原有材质文件不被误改:

  1. 在版本控制中分开提交材质文件,在不该提交材质文件的提交批次中,回滚调试后的材质文件
  2. 不影响调试的情况下,利用UNITY_EDITOR宏进行区分,替换为通过material修改调试
#if UNITY_EDITOR
    return render.material;
#else
    return render.sharedMaterial;
#endif
问题总结:
  1. 如有遍历粒子特效的材质的需求,即使没有开启拖尾效果,也需要提供一个dummy的拖尾材质,防止unity自动创建拖尾特效。
  2. 修改material和sharedMaterial行为不同:
  • 通过material修改会引起在内存中创建一份新的material实例,需要注意内存管理;
  • 通过sharedMaterial修改会导致所有公用同一材质的物件都受影响,在编辑器模式下,会导致材质文件永久被更改。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容

  • 每天500字.58 又是一个加班的夜晚,在一个人的办公室,伴着随机播放的音乐,与电脑屏幕对视三小时,真可谓“独坐音...
    木堇206阅读 203评论 0 3
  • 今天是很奇妙的一天,同时收到两位挚友对我的生日祝福,他们俩把616阴历日期当成公历日期了,意外的惊喜让我也很...
    吕沐霏阅读 967评论 2 1
  • 前言 网页原生布局的方法其实网上有很多,大概为Flow(流动布局模型)、Float(浮动布局模型)、Layer(层...
    cduyzh阅读 893评论 0 5