protected static List <Action <ConvertContext> > CreateConverterList() { return(new List <Action <ConvertContext> >() { ctx => { bool cnv = false; var shader = ctx.target.shader; while (WFCommonUtility.IsSupportedShader(shader) && !WFCommonUtility.IsMobileSupportedShader(shader)) { // シェーダ切り替え var fallback = WFCommonUtility.GetShaderFallBackTarget(shader) ?? "Hidden/UnlitWF/WF_UnToon_Hidden"; WFCommonUtility.ChangeShader(fallback, ctx.target); // シェーダ切り替え後に RenderQueue をコピー ctx.target.renderQueue = ctx.oldMaterial.renderQueue; shader = ctx.target.shader; cnv = true; } if (cnv) { WFCommonUtility.SetupShaderKeyword(ctx.target); EditorUtility.SetDirty(ctx.target); } }, ctx => { if (IsMatchShaderName(ctx.oldMaterial.shader, "Transparent3Pass") && !IsMatchShaderName(ctx.target.shader, "Transparent3Pass")) { // Transparent3Pass からそうではないシェーダの切り替えでは、_AL_ZWrite を ON に変更する ctx.target.SetInt("_AL_ZWrite", 1); } }, }); }
private void AppendUsedShaderVariant(Material mat, Shader shader) { // マテリアルから _XX_ENABLE となっているキーワードを回収 IEnumerable <string> keywords = mat.shaderKeywords.Where(kwd => WFCommonUtility.IsEnableKeyword(kwd)); UsedShaderVariant usv = new UsedShaderVariant(shader.name, keywords); if (!usedShaderVariantList.Contains(usv)) { usedShaderVariantList.Add(usv); // 直接のシェーダではなく、そのフォールバックを利用できるならばそれも追加する if (settings == null || !settings.stripFallback) { var name = WFCommonUtility.GetShaderFallBackTarget(shader); var fallback = name == null ? null : Shader.Find(name); if (IsStripTargetShader(fallback)) { AppendUsedShaderVariant(mat, fallback); } } } }