NGUIでのScrollViewのカスタムshaderの使用には役に立たないソリューションについて
NGUIのUIdrawCall.csにはこのようなコードがあります
Scroll Viewを作成したpanelの数が1でない場合、NGUIはパネルに同じように表示されているが、他のshaderを使用します.しかし、実際に使われているのは同じではありません.
解決方法:NGUIのエラーロールバックの前に、検索shaderが存在するかどうかを判断します.(カスタムシェーダーを使用しているかどうかは理解できます)
KeyCode:
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 name
shaderName = 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 functionality
const 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 functionality
if (shader == null && mClipCount == 1)
{
mLegacyShader = true;
shader = Shader.Find(shaderName + soft);
}
}
else shader = Shader.Find(shaderName);
// Always fallback to the default shader
if (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_FLASH
string[] 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 material
if (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が存在するかどうかを判断します.(カスタムシェーダーを使用しているかどうかは理解できます)
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 functionality
if (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 shader
if (shader == null) shader = Shader.Find("Unlit/Transparent Colored");