IdleGirl/Assets/Plugins/Editor/DarkTonic/MasterAudio/MasterAudioManager.cs

477 lines
21 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using Object = UnityEngine.Object;
#if UNITY_XBOXONE
using PlayerPrefs = DarkTonic.MasterAudio.FilePlayerPrefs;
#endif
namespace DarkTonic.MasterAudio.EditorScripts
{
// ReSharper disable once CheckNamespace
public class MasterAudioManager : EditorWindow
{
private Vector2 _scrollPos = Vector2.zero;
[MenuItem("Window/Master Audio/Master Audio Manager")]
// ReSharper disable once UnusedMember.Local
static void Init()
{
var window = GetWindow<MasterAudioManager>(false, "Manager");
var height = 556;
window.minSize = new Vector2(560, height);
window.maxSize = new Vector2(560, height);
GetWindow(typeof(MasterAudioManager));
}
// ReSharper disable once UnusedMember.Local
// ReSharper disable once InconsistentNaming
void OnGUI()
{
_scrollPos = GUI.BeginScrollView(
new Rect(0, 0, position.width, position.height),
_scrollPos,
new Rect(0, 0, 550, 530)
);
PlaylistController.Instances = null;
var pcs = PlaylistController.Instances;
// ReSharper disable once PossibleNullReferenceException
var plControllerInScene = pcs.Count > 0;
if (MasterAudioInspectorResources.LogoTexture != null)
{
DTGUIHelper.ShowHeaderTexture(MasterAudioInspectorResources.LogoTexture);
}
if (Application.isPlaying)
{
DTGUIHelper.ShowLargeBarAlert("This screen cannot be used during play.");
GUI.EndScrollView();
return;
}
DTGUIHelper.HelpHeader("https://www.dtdevtools.com/docs/masteraudio/MasterAudioManager.htm");
var settings = MasterAudioInspectorResources.GearTexture;
MasterAudio.Instance = null;
var ma = MasterAudio.Instance;
var maInScene = ma != null;
var organizer = FindObjectOfType(typeof(SoundGroupOrganizer));
var hasOrganizer = organizer != null;
DTGUIHelper.ShowColorWarning("The Master Audio prefab holds sound FX group and mixer controls. Add this first (only one per scene).");
EditorGUILayout.BeginHorizontal(EditorStyles.objectFieldThumb);
EditorGUILayout.LabelField("Master Audio prefab", GUILayout.Width(300));
if (!maInScene)
{
GUI.contentColor = DTGUIHelper.BrightButtonColor;
if (GUILayout.Button(new GUIContent("Create", "Create Master Audio prefab"), EditorStyles.toolbarButton, GUILayout.Width(100)))
{
MasterAudioSettings.Instance.UseDbScale = true;
EditorUtility.SetDirty(MasterAudioSettings.Instance);
var go = MasterAudio.CreateMasterAudio();
AudioUndoHelper.CreateObjectForUndo(go, "Create Master Audio prefab");
}
GUI.contentColor = Color.white;
}
else
{
if (settings != null)
{
if (GUILayout.Button(new GUIContent(settings, "Master Audio Settings"), EditorStyles.toolbarButton))
{
Selection.activeObject = ma.transform;
}
}
GUILayout.Label("Exists in scene", EditorStyles.boldLabel);
}
GUILayout.FlexibleSpace();
DTGUIHelper.AddHelpIconNoStyle("https://www.dtdevtools.com/docs/masteraudio/MasterAudioManager.htm#MAGO");
EditorGUILayout.EndHorizontal();
EditorGUILayout.Separator();
// Playlist Controller
DTGUIHelper.ShowColorWarning("The Playlist Controller prefab controls sets of songs (or other audio) and ducking. No limit per scene.");
EditorGUILayout.BeginHorizontal(EditorStyles.objectFieldThumb);
EditorGUILayout.LabelField("Playlist Controller prefab", GUILayout.Width(300));
GUI.contentColor = DTGUIHelper.BrightButtonColor;
if (GUILayout.Button(new GUIContent("Create", "Place a Playlist Controller prefab in the current scene."), EditorStyles.toolbarButton, GUILayout.Width(100)))
{
var go = MasterAudio.CreatePlaylistController();
AudioUndoHelper.CreateObjectForUndo(go, "Create Playlist Controller prefab");
}
GUI.contentColor = Color.white;
GUILayout.FlexibleSpace();
DTGUIHelper.AddHelpIconNoStyle("https://www.dtdevtools.com/docs/masteraudio/MasterAudioManager.htm#PCGO");
EditorGUILayout.EndHorizontal();
if (!plControllerInScene)
{
DTGUIHelper.ShowLargeBarAlert("There is no Playlist Controller in the scene. Music will not play.");
}
EditorGUILayout.Separator();
// Dynamic Sound Group Creators
DTGUIHelper.ShowColorWarning("The Dynamic Sound Group Creator prefab can per-Scene Sound Groups and other audio. No limit per scene.");
EditorGUILayout.BeginHorizontal(EditorStyles.objectFieldThumb);
EditorGUILayout.LabelField("Dynamic Sound Group Creator prefab", GUILayout.Width(300));
GUI.contentColor = DTGUIHelper.BrightButtonColor;
if (GUILayout.Button(new GUIContent("Create", "Place a Dynamic Sound Group prefab in the current scene."), EditorStyles.toolbarButton, GUILayout.Width(100)))
{
var go = MasterAudio.CreateDynamicSoundGroupCreator();
AudioUndoHelper.CreateObjectForUndo(go, "Create Dynamic Sound Group Creator prefab");
}
GUI.contentColor = Color.white;
GUILayout.FlexibleSpace();
DTGUIHelper.AddHelpIconNoStyle("https://www.dtdevtools.com/docs/masteraudio/MasterAudioManager.htm#DSGC");
EditorGUILayout.EndHorizontal();
EditorGUILayout.Separator();
// Sound Group Organizer
DTGUIHelper.ShowColorWarning("The Sound Group Organizer prefab can import/export Groups to/from MA and Dynamic SGC prefabs.");
EditorGUILayout.BeginHorizontal(EditorStyles.objectFieldThumb);
EditorGUILayout.LabelField("Sound Group Organizer prefab", GUILayout.Width(300));
if (hasOrganizer)
{
if (settings != null)
{
if (GUILayout.Button(new GUIContent(settings, "Sound Group Organizer Settings"), EditorStyles.toolbarButton))
{
Selection.activeObject = organizer;
}
}
GUILayout.Label("Exists in scene", EditorStyles.boldLabel);
}
else
{
GUI.contentColor = DTGUIHelper.BrightButtonColor;
if (GUILayout.Button(new GUIContent("Create", "Place a Sound Group Organizer prefab in the current scene."), EditorStyles.toolbarButton, GUILayout.Width(100)))
{
var go = MasterAudio.CreateSoundGroupOrganizer();
AudioUndoHelper.CreateObjectForUndo(go, "Create Dynamic Sound Group Creator prefab");
}
}
GUI.contentColor = Color.white;
GUILayout.FlexibleSpace();
DTGUIHelper.AddHelpIconNoStyle("https://www.dtdevtools.com/docs/masteraudio/MasterAudioManager.htm#SGO");
EditorGUILayout.EndHorizontal();
EditorGUILayout.Separator();
if (!Application.isPlaying)
{
EditorGUILayout.BeginHorizontal(EditorStyles.objectFieldThumb);
GUILayout.Label("Global Settings");
DTGUIHelper.AddHelpIconNoStyle("https://www.dtdevtools.com/docs/masteraudio/MasterAudioManager.htm#GlobalSettings");
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
var newVol = GUILayout.Toggle(MasterAudio.UseDbScaleForVolume, " Display dB For Volumes");
// ReSharper disable once RedundantCheckBeforeAssignment
if (newVol != MasterAudio.UseDbScaleForVolume)
{
MasterAudio.UseDbScaleForVolume = newVol;
}
GUILayout.Space(30);
var newCents = GUILayout.Toggle(MasterAudio.UseCentsForPitch, " Display Semitones for Pitches");
// ReSharper disable once RedundantCheckBeforeAssignment
if (newCents != MasterAudio.UseCentsForPitch)
{
MasterAudio.UseCentsForPitch = newCents;
}
GUILayout.FlexibleSpace();
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
var useLogo = GUILayout.Toggle(MasterAudio.HideLogoNav, " Hide Logo Nav. in Inspectors");
// ReSharper disable once RedundantCheckBeforeAssignment
if (useLogo != MasterAudio.HideLogoNav)
{
MasterAudio.HideLogoNav = useLogo;
EditorUtility.SetDirty(MasterAudioSettings.Instance);
}
GUILayout.Space(2);
var removeVar = GUILayout.Toggle(MasterAudio.RemoveUnplayedVariationDueToProbability, new GUIContent(" Remove Probability-Unplayed Variations", "Remove Variations that were not played due to failing the Probability to Play Field"));
// ReSharper disable once RedundantCheckBeforeAssignment
if (removeVar != MasterAudio.RemoveUnplayedVariationDueToProbability)
{
MasterAudio.RemoveUnplayedVariationDueToProbability = removeVar;
}
GUILayout.FlexibleSpace();
EditorGUILayout.EndHorizontal();
if (!Application.isPlaying)
{
EditorGUILayout.BeginHorizontal();
var oldEdit = MasterAudioSettings.Instance.EditMAFolder;
MasterAudioSettings.Instance.EditMAFolder = GUILayout.Toggle(MasterAudioSettings.Instance.EditMAFolder, " Edit Installation Path");
if (oldEdit != MasterAudioSettings.Instance.EditMAFolder)
{
EditorUtility.SetDirty(MasterAudioSettings.Instance);
}
if (MasterAudioSettings.Instance.EditMAFolder)
{
var path = EditorGUILayout.TextField("", MasterAudio.ProspectiveMAPath);
// ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
if (!string.IsNullOrEmpty(path))
{
MasterAudio.ProspectiveMAPath = path;
}
else
{
MasterAudio.ProspectiveMAPath = MasterAudio.MasterAudioFolderPath;
}
GUI.contentColor = DTGUIHelper.BrightButtonColor;
if (
GUILayout.Button(
new GUIContent("Update",
"This will update the installation folder path with the value to the left."),
EditorStyles.toolbarButton, GUILayout.Width(60)))
{
MasterAudio.MasterAudioFolderPath = MasterAudio.ProspectiveMAPath;
DTGUIHelper.ShowAlert("Installation Path updated!");
}
GUILayout.Space(4);
if (GUILayout.Button(new GUIContent("Revert", "Revert to default settings"),
EditorStyles.toolbarButton, GUILayout.Width(60)))
{
MasterAudio.MasterAudioFolderPath = MasterAudio.MasterAudioDefaultFolder;
MasterAudio.ProspectiveMAPath = MasterAudio.MasterAudioDefaultFolder;
DTGUIHelper.ShowAlert("Installation Path reverted!");
}
GUI.contentColor = Color.white;
GUILayout.Space(10);
DTGUIHelper.AddHelpIconNoStyle("https://www.dtdevtools.com/docs/masteraudio/InstallationFolder.htm");
}
else
{
DTGUIHelper.AddHelpIconNoStyle("https://www.dtdevtools.com/docs/masteraudio/InstallationFolder.htm");
GUILayout.FlexibleSpace();
}
EditorGUILayout.EndHorizontal();
}
EditorGUILayout.Separator();
EditorGUILayout.BeginHorizontal(EditorStyles.objectFieldThumb);
GUILayout.Label("Utility Functions");
DTGUIHelper.AddHelpIconNoStyle("https://www.dtdevtools.com/docs/masteraudio/MasterAudioManager.htm#UtilityFunctions");
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
GUILayout.Space(10);
GUI.contentColor = DTGUIHelper.BrightButtonColor;
if (GUILayout.Button(new GUIContent("Delete all unused Filter FX", "This will delete all unused Unity Audio Filter FX components in the entire MasterAudio prefab and all Sound Groups within."), EditorStyles.toolbarButton, GUILayout.Width(160)))
{
DeleteAllUnusedFilterFx();
}
GUILayout.Space(10);
if (GUILayout.Button(new GUIContent("Reset Prefs / Settings", "This will delete all Master Audio's Persistent Settings and global preferences (back to installation default). None of your prefabs will be deleted."), EditorStyles.toolbarButton, GUILayout.Width(160)))
{
ResetPrefs();
}
GUI.contentColor = Color.white;
EditorGUILayout.EndHorizontal();
}
GUI.EndScrollView();
}
private static void ResetPrefs()
{
PlayerPrefs.DeleteKey(MasterAudio.StoredLanguageNameKey);
MasterAudio.UseDbScaleForVolume = false;
MasterAudio.UseCentsForPitch = false;
MasterAudio.HideLogoNav = false;
MasterAudioSettings.Instance.InstallationFolderPath = MasterAudio.MasterAudioDefaultFolder;
MasterAudioSettings.Instance.MixerWidthSetting = MasterAudio.MixerWidthMode.Narrow;
MasterAudioSettings.Instance.EditMAFolder = false;
MasterAudioSettings.Instance.BusesShownInNarrow = true;
MasterAudioSettings.Instance.ShowWelcomeWindowOnStart = true;
EditorUtility.SetDirty(MasterAudioSettings.Instance);
PlayerPrefs.DeleteKey(PersistentAudioSettings.SfxVolKey);
PlayerPrefs.DeleteKey(PersistentAudioSettings.MusicVolKey);
PlayerPrefs.DeleteKey(PersistentAudioSettings.SfxMuteKey);
PlayerPrefs.DeleteKey(PersistentAudioSettings.MusicMuteKey);
// delete group persistent settings
var groups = PersistentAudioSettings.GroupsUpdatedKeys.Split(new[] { PersistentAudioSettings.Separator }, StringSplitOptions.RemoveEmptyEntries);
// ReSharper disable once ForCanBeConvertedToForeach
for (var i = 0; i < groups.Length; i++)
{
var aGrp = groups[i];
var key = PersistentAudioSettings.GetGroupKey(aGrp);
PlayerPrefs.DeleteKey(key);
}
PlayerPrefs.DeleteKey(PersistentAudioSettings.GroupKeysKey);
// bus persistent settings
var buses = PersistentAudioSettings.BusesUpdatedKeys.Split(new[] { PersistentAudioSettings.Separator }, StringSplitOptions.RemoveEmptyEntries);
// ReSharper disable once ForCanBeConvertedToForeach
for (var i = 0; i < buses.Length; i++)
{
var aBus = buses[i];
var key = PersistentAudioSettings.MakeBusKey(aBus);
PlayerPrefs.DeleteKey(key);
}
PlayerPrefs.DeleteKey(PersistentAudioSettings.BusKeysKey);
}
private static void DeleteAllUnusedFilterFx()
{
var ma = MasterAudio.Instance;
if (ma == null)
{
DTGUIHelper.ShowAlert("There is no MasterAudio prefab in this scene. Try pressing this button on a different Scene.");
return;
}
var affectedVariations = new List<SoundGroupVariation>();
var filtersToDelete = new List<Object>();
for (var g = 0; g < ma.transform.childCount; g++)
{
var sGroup = ma.transform.GetChild(g);
for (var v = 0; v < sGroup.childCount; v++)
{
var variation = sGroup.GetChild(v);
var grpVar = variation.GetComponent<SoundGroupVariation>();
if (grpVar == null)
{
continue;
}
if (grpVar.LowPassFilter != null && !grpVar.LowPassFilter.enabled)
{
if (!filtersToDelete.Contains(grpVar.LowPassFilter))
{
filtersToDelete.Add(grpVar.LowPassFilter);
}
if (!affectedVariations.Contains(grpVar))
{
affectedVariations.Add(grpVar);
}
}
if (grpVar.HighPassFilter != null && !grpVar.HighPassFilter.enabled)
{
if (!filtersToDelete.Contains(grpVar.HighPassFilter))
{
filtersToDelete.Add(grpVar.HighPassFilter);
}
if (!affectedVariations.Contains(grpVar))
{
affectedVariations.Add(grpVar);
}
}
if (grpVar.ChorusFilter != null && !grpVar.ChorusFilter.enabled)
{
if (!filtersToDelete.Contains(grpVar.ChorusFilter))
{
filtersToDelete.Add(grpVar.ChorusFilter);
}
if (!affectedVariations.Contains(grpVar))
{
affectedVariations.Add(grpVar);
}
}
if (grpVar.DistortionFilter != null && !grpVar.DistortionFilter.enabled)
{
if (!filtersToDelete.Contains(grpVar.DistortionFilter))
{
filtersToDelete.Add(grpVar.DistortionFilter);
}
if (!affectedVariations.Contains(grpVar))
{
affectedVariations.Add(grpVar);
}
}
if (grpVar.EchoFilter != null && !grpVar.EchoFilter.enabled)
{
if (!filtersToDelete.Contains(grpVar.EchoFilter))
{
filtersToDelete.Add(grpVar.EchoFilter);
}
if (!affectedVariations.Contains(grpVar))
{
affectedVariations.Add(grpVar);
}
}
if (grpVar.ReverbFilter == null || grpVar.ReverbFilter.enabled)
{
continue;
}
if (!filtersToDelete.Contains(grpVar.ReverbFilter))
{
filtersToDelete.Add(grpVar.ReverbFilter);
}
if (!affectedVariations.Contains(grpVar))
{
affectedVariations.Add(grpVar);
}
}
}
AudioUndoHelper.RecordObjectsForUndo(affectedVariations.ToArray(), "delete all unused Filter FX Components");
foreach (var t in filtersToDelete)
{
DestroyImmediate(t);
}
DTGUIHelper.ShowAlert(string.Format("{0} Filter FX Components deleted.", filtersToDelete.Count));
}
}
}