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); } }