在游戏中某些地方可能需要对按钮进行灰化显示,从而表示不能点击!在网上找了一下有些方法是直接用UITexture+灰化shader去做这件事!另外有些方案写的不太清楚,看不懂!不过也基本都是要使用灰化shader,不可能说每有一个需要灰化地方的图片就让美术出多一张对应的灰化资源图,这样太浪费空间了。
我的解决方法是这样的:copy已有的atlas材质及预设体!然后将材质的shader指定为灰化的shader,atlas预设体中的材质指定灰化材质!具体步骤如下:
0.需要一个灰化效果的shader,具体直接网上搜索找一下相关的shader代码就可以了!
1.使用atlas maker制作生成了图集common_atlas(包括生成了贴图图集common_atlas.png、预设体common_atlas.prefab、材质common_atlas.mat这三个文件)
2.复制了图集预设体、图集材质,姑且命名为gray_common_atlas.prefab, gray_common_atlas.mat,然后将材质文件gray_common_atlas.mat默认的shader指定为前面选好的灰化shader,这样使用这个灰化prefab的sprite就都是灰化效果。
3.在运行中,一旦某个按钮或者图标sprite(它们的atlas是指定为正常的common_atlas.prefab)需要灰化,这个时候就动态的将Sprite.atlas设置为gray_common_atlas.prefab,需要设置正常状态的时候,就反过来设置为正常的common_atlas.prefab。
4.当然了,由于sprite的atlas属性你不好去new一个,所以我是在布局阶段,每有一个图集就新建1个sprite,然后选择对应的图集atlas,然后将这个sprite放在一个单体类AllAtlas中,一旦某个按钮或图标的sprite需要动态设置指定的atlas属性,就将AllAtlas中对应的sprite.atlas赋值给它。
比如AwardSprite.atlas = AllAtlas.Instance.CommonSprite.atlas,这样就设置了想要的atlas!
因为1个atlas就是1个drawcall,而用到灰化图标的地方同屏显示的其他图片肯定是其他atlas,这样使用1个这样的灰化atlas会增加1个drawcall!