关于NGUI中ScrollView使用自定义shader没有作用的解决方案

来源:互联网 发布:使用域名的好处 编辑:程序博客网 时间:2024/05/16 00:55

在NGUI的UIDrawCall.cs中有这么一段代码

void CreateMaterial (){mTextureClip = false;mLegacyShader = false;mClipCount = panel.clipCount;string shaderName = (mShader != null) ? mShader.name :((mMaterial != null) ? mMaterial.shader.name : "Unlit/Transparent Colored");// Figure out the normal shader's nameshaderName = shaderName.Replace("GUI/Text Shader", "Unlit/Text");if (shaderName.Length > 2){if (shaderName[shaderName.Length - 2] == ' '){int index = shaderName[shaderName.Length - 1];if (index > '0' && index <= '9') shaderName = shaderName.Substring(0, shaderName.Length - 2);}}if (shaderName.StartsWith("Hidden/"))shaderName = shaderName.Substring(7);// Legacy functionalityconst string soft = " (SoftClip)";shaderName = shaderName.Replace(soft, "");const string textureClip = " (TextureClip)";shaderName = shaderName.Replace(textureClip, "");if (panel.clipping == Clipping.TextureMask){mTextureClip = true;shader = Shader.Find("Hidden/" + shaderName + textureClip);}else if (mClipCount != 0){shader = Shader.Find("Hidden/" + shaderName + " " + mClipCount);if (shader == null) shader = Shader.Find(shaderName + " " + mClipCount);// Legacy functionalityif (shader == null && mClipCount == 1){mLegacyShader = true;shader = Shader.Find(shaderName + soft);}}else shader = Shader.Find(shaderName);
// Always fallback to the default shaderif (shader == null) shader = Shader.Find("Unlit/Transparent Colored");if (mMaterial != null){mDynamicMat = new Material(mMaterial);mDynamicMat.name = "[NGUI] " + mMaterial.name;mDynamicMat.hideFlags = HideFlags.DontSave | HideFlags.NotEditable;mDynamicMat.CopyPropertiesFromMaterial(mMaterial);#if !UNITY_FLASHstring[] keywords = mMaterial.shaderKeywords;for (int i = 0; i < keywords.Length; ++i)mDynamicMat.EnableKeyword(keywords[i]);#endif// If there is a valid shader, assign it to the custom materialif (shader != null){mDynamicMat.shader = shader;}else if (mClipCount != 0){Debug.LogError(shaderName + " shader doesn't have a clipped shader version for " + mClipCount + " clip regions");}}else{mDynamicMat = new Material(shader);mDynamicMat.name = "[NGUI] " + shader.name;mDynamicMat.hideFlags = HideFlags.DontSave | HideFlags.NotEditable;}}

当创建Scroll View后的panel数不为1,NGUI会使用其他的shader虽然在面板里显示的是同一个。但事实上用的并不是同一个。

 解决方法:在NGUI的错误回滚之前判断先执行一遍查找shader是否存在。(可以理解为是不是使用自定义的shader)  

KeyCode:

if (panel.clipping == Clipping.TextureMask){mTextureClip = true;shader = Shader.Find("Hidden/" + shaderName + textureClip);}else if (mClipCount != 0){shader = Shader.Find("Hidden/" + shaderName + " " + mClipCount);if (shader == null) shader = Shader.Find(shaderName + " " + mClipCount);// Legacy functionalityif (shader == null && mClipCount == 1){mLegacyShader = true;shader = Shader.Find(shaderName + soft);}}else shader = Shader.Find(shaderName);if(shader == null){shader = Shader.Find(shaderName);}// Always fallback to the default shaderif (shader == null) shader = Shader.Find("Unlit/Transparent Colored");


1 0
原创粉丝点击