Example #1
0
 public static void PostChangeShader(Material material, Shader oldShader, Shader newShader)
 {
     if (material != null)
     {
         // DebugViewの保存に使っているタグはクリア
         WF_DebugViewEditor.ClearDebugOverrideTag(material);
         // 不要なシェーダキーワードは削除
         foreach (var key in DELETE_KEYWORD)
         {
             if (material.IsKeywordEnabled(key))
             {
                 material.DisableKeyword(key);
             }
         }
         // もし EmissionColor の Alpha が 0 になっていたら 1 にしちゃう
         if (!WFCommonUtility.IsSupportedShader(oldShader) && material.HasProperty("_EmissionColor"))
         {
             var em = material.GetColor("_EmissionColor");
             if (em.a < 1e-4)
             {
                 em.a = 1.0f;
                 material.SetColor("_EmissionColor", em);
             }
         }
     }
 }
        /// <summary>
        /// マテリアルの shader を指定の名前のものに変更する。
        /// </summary>
        /// <param name="name"></param>
        /// <param name="mats"></param>
        public static void ChangeShader(string name, params Material[] mats)
        {
            if (string.IsNullOrWhiteSpace(name) || mats.Length == 0)
            {
                return; // なにもしない
            }
            var newShader = Shader.Find(name);

            if (newShader != null)
            {
                Undo.RecordObjects(mats, "change shader");
                foreach (var m in mats)
                {
                    if (m == null)
                    {
                        continue;
                    }
                    var oldShader = m.shader;

                    // 初期化処理の呼び出し (カスタムエディタを取得してAssignNewShaderToMaterialしたかったけど手が届かなかったので静的アクセス)
                    if (WF_DebugViewEditor.IsSupportedShader(newShader))
                    {
                        WF_DebugViewEditor.PreChangeShader(m, oldShader, newShader);
                    }
                    else if (ShaderCustomEditor.IsSupportedShader(newShader))
                    {
                        ShaderCustomEditor.PreChangeShader(m, oldShader, newShader);
                    }
                    // マテリアルにシェーダ割り当て
                    m.shader = newShader;
                    // 初期化処理の呼び出し (カスタムエディタを取得してAssignNewShaderToMaterialしたかったけど手が届かなかったので静的アクセス)
                    if (WF_DebugViewEditor.IsSupportedShader(newShader))
                    {
                        WF_DebugViewEditor.PostChangeShader(m, oldShader, newShader);
                    }
                    else if (ShaderCustomEditor.IsSupportedShader(newShader))
                    {
                        ShaderCustomEditor.PostChangeShader(m, oldShader, newShader);
                    }
                }
            }
            else
            {
                Debug.LogErrorFormat("[WF][Common] Shader Not Found in this projects: {0}", name);
            }
        }