不知道大家能否看懂关于NGUI主Panel下子Panel渲染Shader被修改的问题 ,发现这个问题纯属巧合,是因为项目中要用到置灰,但是NGUI本身的置灰并不理想,是变暗而不是置灰。那么我就上网查了一下解决方案,还真有高人通过修改shader,取一个约定值,当sprite的颜色值变成了这个约定值那么就显示置灰效果,这里就不贴出方法了,大家可以百度查找,项目中会用到的,这里要说的重点是另外一个问题。
这个方法显示置灰没问题,效果也是我们想要的,可是运行的时候发现了问题,如果我的这个sprite是在一个scrollView下,而这个ScrollView又是在一个主Panel的控件下,那么置灰就不起作用了而是变为真正的纯黑值图片了,为什么呢?!
经过一番追查我找到了答案,因为在NGUI的UIDrawCall.cs下有这样一段代码
Shader shader;
mLegacyShader = false;
mClipCount = panel.clipCount;
if (mClipCount != 0)
{
shader = Shader.Find("HIDDEN/" + shaderName + " " + mClipCount);
if (shader == null) Shader.Find(shaderName + " " + mClipCount);
// Legacy functionality
if (shader == null && mClipCount == 1)
{
mLegacyShader = true;
shader = Shader.Find(shaderName + soft);
}
}
else shader = Shader.Find(shaderName);
这段代码的大概逻辑就是用来替换子panel的shader的,(这里说明一下scrollView是自带一个UIPanel,这样也就造成我们的scrollView如果是挂在一个UIPanel的下面或者子集的下面空i让我们的ScrollView变成了子Panel)也就是让我们原先用的shader自加了一个1,也就是说如果原来用的是AShader那么这时候我们的Shader就便成了AShader 1了,这也就解释了我们添加在子Panel里的sprite置灰效果不起作用了,因为shader换了,并不是我们修改的了。那么我们只要把这个也改了就好了。