【bug】button/toggle组件被悬停/点击后会自动切换为默认材质【附demo】

Creator 版本: 2.3.4
目标平台:Chorme浏览器
重现方式:
1.创建一个node
2.添加toggle组件/button组件
3.添加sprite组件,并且自定义一个shader赋给sprite组件
4.调试可以发现,鼠标一旦掠过这个组件,自定义shader会自动重置成默认shader

同样报告此bug的帖子:


建议:
不要在悬停时改变组件的shader,或者允许我配置这个组件被悬停时替换成哪个shader
(目前的规避方式是创造一个和sprite完全重叠的节点放置button组件,但这样做显得很愚蠢…)

demo:
shader失效demo.zip (1.5 MB)

把你重现方式的第2步按钮的normalMaterial属性修改为你要用的shader,应该可以解决你的问题

按钮组件的normalMaterial属性并没有暴露,至少2.3.4是没有暴露的
除非勾上EnableAutoGrayEffect……但这样还是显得很蠢,而且同样有问题:当触发button事件时还是重新赋值了材质,这会导致原来已经给shader的赋值被重置。——所以说完美的规避方法只能是套一个别的node专门做button
归根结底,这个bug的问题就在于,这个组件默认会在悬停时切换shader,而正确的做法应该是默认情况下不切换

normalMaterial有暴露,2.3的文档就能看见,你自己打印应该也能看见这个属性,其次,根据源码


EnableAutoGrayEffect关闭时 button每次更新材质都会刷新为normalMaterial,所以如果你需要修改shader的节点里有button,那么把button的normalMaterial修改为你的材质即可。我也觉得引擎这个设计不太合理

那还是会重置shader啊兄弟,我给shader赋值了怎么办,你意思我还得监听悬停事件,并且记录下赋值,让shader刷新的时候重新赋值?
那我为什么不额外加一个node,让button和sprite脱离,岂不是方便得多……

https://github.com/cocos-creator/engine/pull/6562
你看看这个链接,bug在2.4.0修复了