不知道大家能否看懂关于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换了,并不是我们修改的了。那么我们只要把这个也改了就好了。