public void CreateVariation(DynamicSoundGroup group, AudioClip clip) { var resourceFileName = string.Empty; if (group.bulkVariationMode == MasterAudio.AudioLocation.ResourceFile) { resourceFileName = DTGUIHelper.GetResourcePath(clip); if (string.IsNullOrEmpty(resourceFileName)) { resourceFileName = clip.name; } } var clipName = clip.name; if (group.transform.FindChild(clipName) != null) { DTGUIHelper.ShowAlert("You already have a Variation for this Group named '" + clipName + "'. \n\nPlease rename these Variations when finished to be unique, or you may not be able to play them by name if you have a need to."); } var newVar = (GameObject) GameObject.Instantiate(_group.variationTemplate, _group.transform.position, Quaternion.identity); UndoHelper.CreateObjectForUndo(newVar, "create Variation"); newVar.transform.name = clipName; newVar.transform.parent = group.transform; var variation = newVar.GetComponent<DynamicGroupVariation>(); if (group.bulkVariationMode == MasterAudio.AudioLocation.ResourceFile) { variation.audLocation = MasterAudio.AudioLocation.ResourceFile; variation.resourceFileName = resourceFileName; } else { newVar.audio.clip = clip; } }
private static void UpgradeMasterAudioPrefab() { var ma = MasterAudio.Instance; var added = 0; for (var i = 0; i < ma.transform.childCount; i++) { var grp = ma.transform.GetChild(i); for (var v = 0; v < grp.transform.childCount; v++) { var variation = grp.transform.GetChild(v); var updater = variation.GetComponent <SoundGroupVariationUpdater>(); if (updater != null) { continue; } variation.gameObject.AddComponent <SoundGroupVariationUpdater>(); added++; } } DTGUIHelper.ShowAlert(string.Format("{0} Variations fixed.", added)); }
private Transform CreateGroup(AudioClip aClip) { if (_creator.groupTemplate == null) { DTGUIHelper.ShowAlert("Your 'Group Template' field is empty, please assign it in debug mode. Drag the 'DynamicSoundGroup' prefab from MasterAudio/Sources/Prefabs into that field, then switch back to normal mode."); return(null); } var groupName = UtilStrings.TrimSpace(aClip.name); var matchingGroup = _groups.Find(delegate(DynamicSoundGroup obj) { return(obj.transform.name == groupName); }); if (matchingGroup != null) { DTGUIHelper.ShowAlert("You already have a Group named '" + groupName + "'. \n\nPlease rename this Group when finished to be unique."); } var spawnedGroup = (GameObject)GameObject.Instantiate(_creator.groupTemplate, _creator.transform.position, Quaternion.identity); spawnedGroup.name = groupName; UndoHelper.CreateObjectForUndo(spawnedGroup, "create Dynamic Group"); spawnedGroup.transform.parent = _creator.transform; CreateVariation(spawnedGroup.transform, aClip); return(spawnedGroup.transform); }
private void RevertSelected() { if (SelectedClips.Count == 0) { DTGUIHelper.ShowAlert(NoClipsSelected); return; } foreach (var aClip in SelectedClips) { RevertChanges(aClip); } }
private void CreateVariation(Transform aGroup, AudioClip aClip) { if (_creator.variationTemplate == null) { DTGUIHelper.ShowAlert("Your 'Variation Template' field is empty, please assign it in debug mode. Drag the 'DynamicGroupVariation' prefab from MasterAudio/Sources/Prefabs into that field, then switch back to normal mode."); return; } var resourceFileName = string.Empty; if (_creator.bulkVariationMode == MasterAudio.AudioLocation.ResourceFile) { resourceFileName = DTGUIHelper.GetResourcePath(aClip); if (string.IsNullOrEmpty(resourceFileName)) { resourceFileName = aClip.name; } } var clipName = UtilStrings.TrimSpace(aClip.name); var myGroup = aGroup.GetComponent <DynamicSoundGroup>(); var matches = myGroup.groupVariations.FindAll(delegate(DynamicGroupVariation obj) { return(obj.name == clipName); }); if (matches.Count > 0) { DTGUIHelper.ShowAlert("You already have a variation for this Group named '" + clipName + "'. \n\nPlease rename these variations when finished to be unique, or you may not be able to play them by name if you have a need to."); } var spawnedVar = (GameObject)GameObject.Instantiate(_creator.variationTemplate, _creator.transform.position, Quaternion.identity); spawnedVar.name = clipName; spawnedVar.transform.parent = aGroup; var dynamicVar = spawnedVar.GetComponent <DynamicGroupVariation>(); if (_creator.bulkVariationMode == MasterAudio.AudioLocation.ResourceFile) { dynamicVar.audLocation = MasterAudio.AudioLocation.ResourceFile; dynamicVar.resourceFileName = resourceFileName; } else { dynamicVar.audio.clip = aClip; } }
private void RenameEvent(CustomEvent cEvent) { var match = _creator.customEventsToCreate.FindAll(delegate(CustomEvent obj) { return(obj.EventName == cEvent.ProspectiveName); }); if (match.Count > 0) { DTGUIHelper.ShowAlert("You already have a custom event named '" + cEvent.ProspectiveName + "' configured here. Please choose a different name."); return; } cEvent.EventName = cEvent.ProspectiveName; }
private void RevertSelected() { if (SelectedClips.Count == 0) { DTGUIHelper.ShowAlert(NO_CLIPS_SELECTED); return; } for (var i = 0; i < SelectedClips.Count; i++) { var aClip = SelectedClips[i]; RevertChanges(aClip); } }
private void CreateCustomEvent(string newEventName) { var match = _creator.customEventsToCreate.FindAll(delegate(CustomEvent custEvent) { return(custEvent.EventName == newEventName); }); if (match.Count > 0) { DTGUIHelper.ShowAlert("You already have a custom event named '" + newEventName + "' configured here. Please choose a different name."); return; } var newEvent = new CustomEvent(newEventName); _creator.customEventsToCreate.Add(newEvent); }
private void DeleteAudioSources() { Selection.objects = new Object[] { }; var sources = GetNonMAAudioSources(); var destroyed = 0; foreach (var aud in sources) { DestroyImmediate(aud.GetComponent <AudioSource>()); destroyed++; } DTGUIHelper.ShowAlert(destroyed + " Audio Source(s) destroyed."); _audioSources = 0; }
private void ApplySelected() { if (SelectedClips.Count == 0) { DTGUIHelper.ShowAlert(NoClipsSelected); return; } foreach (var aClip in SelectedClips) { ApplyClipChanges(aClip, false); aClip.HasChanged = true; } _clipList.NeedsRefresh = true; WriteFile(_clipList); }
private void ApplySelected() { if (SelectedClips.Count == 0) { DTGUIHelper.ShowAlert(NO_CLIPS_SELECTED); return; } for (var i = 0; i < SelectedClips.Count; i++) { var aClip = SelectedClips[i]; ApplyClipChanges(aClip, false); aClip._hasChanged = true; } clipList.needsRefresh = true; WriteFile(clipList); }
private void DisplayClips() { EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); GUI.contentColor = DTGUIHelper.BrightButtonColor; if (GUILayout.Button("All", EditorStyles.toolbarButton, GUILayout.Width(36))) { foreach (var t in FilteredClips) { t.IsSelected = true; } } if (GUILayout.Button("None", EditorStyles.toolbarButton, GUILayout.Width(36))) { foreach (var t in _clipList.AudioInfor) { t.IsSelected = false; } } GUI.contentColor = DTGUIHelper.BrightButtonColor; GUILayout.Space(6); var columnPrefix = ColumnPrefix(ClipSortColumn.Name); if (GUILayout.Button(new GUIContent(columnPrefix + "Clip Name", "Click to sort by Clip Name"), EditorStyles.toolbarButton, GUILayout.Width(156))) { ChangeSortColumn(ClipSortColumn.Name); } columnPrefix = ColumnPrefix(ClipSortColumn.Bitrate); if (GUILayout.Button(new GUIContent(columnPrefix + "Compression (kbps)", "Click to sort by Compression Bitrate"), EditorStyles.toolbarButton, GUILayout.Width(214))) { ChangeSortColumn(ClipSortColumn.Bitrate); } columnPrefix = ColumnPrefix(ClipSortColumn.Is3D); if (GUILayout.Button(new GUIContent(columnPrefix + "3D", "Click to sort by 3D"), EditorStyles.toolbarButton, GUILayout.Width(36))) { ChangeSortColumn(ClipSortColumn.Is3D); } columnPrefix = ColumnPrefix(ClipSortColumn.ForceMono); if (GUILayout.Button(new GUIContent(columnPrefix + "Force Mono", "Click to sort by Force Mono"), EditorStyles.toolbarButton, GUILayout.Width(80))) { ChangeSortColumn(ClipSortColumn.ForceMono); } columnPrefix = ColumnPrefix(ClipSortColumn.AudioFormat); if (GUILayout.Button(new GUIContent(columnPrefix + "Audio Format", "Click to sort by Audio Format"), EditorStyles.toolbarButton, GUILayout.Width(144))) { ChangeSortColumn(ClipSortColumn.AudioFormat); } columnPrefix = ColumnPrefix(ClipSortColumn.LoadType); if (GUILayout.Button(new GUIContent(columnPrefix + "Load Type", "Click to sort by Load Type"), EditorStyles.toolbarButton, GUILayout.Width(182))) { ChangeSortColumn(ClipSortColumn.LoadType); } GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); if (FilteredClips.Count == 0) { DTGUIHelper.ShowLargeBarAlert("You have filtered all clips out."); return; } _scrollPos = GUI.BeginScrollView(new Rect(0, 123, 896, 485), _scrollPos, new Rect(0, 124, 880, 24 * FilteredClips.Count + 4)); foreach (var aClip in FilteredClips) { // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression if (aClip.IsSelected) { GUI.backgroundColor = DTGUIHelper.BrightButtonColor; } else { GUI.backgroundColor = Color.white; } EditorGUILayout.BeginHorizontal(EditorStyles.miniButtonMid); // miniButtonMid, numberField, textField EditorGUILayout.BeginHorizontal(); var wasSelected = aClip.IsSelected; aClip.IsSelected = GUILayout.Toggle(aClip.IsSelected, ""); if (aClip.IsSelected) { if (!wasSelected) { SelectClip(aClip); } } var bitrateChanged = !aClip.OrigCompressionBitrate.Equals(aClip.CompressionBitrate); var is3DChanged = !aClip.OrigIs3D.Equals(aClip.Is3D); var isMonoChanged = !aClip.OrigForceMono.Equals(aClip.ForceMono); var isFormatChanged = !aClip.OrigFormat.Equals(aClip.Format); var isLoadTypeChanged = !aClip.OrigLoadType.Equals(aClip.LoadType); var hasChanged = bitrateChanged || is3DChanged || isMonoChanged || isFormatChanged || isLoadTypeChanged; if (!hasChanged) { ShowDisabledColors(); } else { GUI.contentColor = DTGUIHelper.BrightButtonColor; } if (GUILayout.Button(new GUIContent("Revert"), EditorStyles.toolbarButton, GUILayout.Width(45))) { if (!hasChanged) { DTGUIHelper.ShowAlert("This clip's properties have not changed."); } else { RevertChanges(aClip); } } RevertColor(); GUILayout.Space(10); GUILayout.Label(new GUIContent(aClip.Name, aClip.FullPath), GUILayout.Width(150)); GUILayout.Space(10); MaybeShowChangedColors(bitrateChanged); var oldBitrate = aClip.CompressionBitrate; var bitRate = (int)(aClip.CompressionBitrate * .001f); aClip.CompressionBitrate = EditorGUILayout.IntSlider("", bitRate, 32, 256, GUILayout.Width(202)) * 1000; if (oldBitrate != aClip.CompressionBitrate) { aClip.IsSelected = true; SelectClip(aClip); } RevertColor(); GUILayout.Space(12); MaybeShowChangedColors(is3DChanged); var old3D = aClip.Is3D; aClip.Is3D = GUILayout.Toggle(aClip.Is3D, ""); if (old3D != aClip.Is3D) { aClip.IsSelected = true; SelectClip(aClip); } RevertColor(); GUILayout.Space(36); MaybeShowChangedColors(isMonoChanged); var oldMono = aClip.ForceMono; aClip.ForceMono = GUILayout.Toggle(aClip.ForceMono, "", GUILayout.Width(40)); if (oldMono != aClip.ForceMono) { aClip.IsSelected = true; SelectClip(aClip); } RevertColor(); GUILayout.Space(10); MaybeShowChangedColors(isFormatChanged); var oldFmt = aClip.Format; aClip.Format = (AudioImporterFormat)EditorGUILayout.EnumPopup(aClip.Format, GUILayout.Width(136)); if (oldFmt != aClip.Format) { aClip.IsSelected = true; SelectClip(aClip); } RevertColor(); GUILayout.Space(6); MaybeShowChangedColors(isLoadTypeChanged); var oldLoad = aClip.LoadType; aClip.LoadType = (AudioImporterLoadType)EditorGUILayout.EnumPopup(aClip.LoadType, GUILayout.Width(140)); if (oldLoad != aClip.LoadType) { aClip.IsSelected = true; SelectClip(aClip); } RevertColor(); GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); EditorGUILayout.EndHorizontal(); RevertColor(); } GUI.EndScrollView(); }
// 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, 600, 210) ); if (MasterAudioInspectorResources.LogoTexture != null) { DTGUIHelper.ShowHeaderTexture(MasterAudioInspectorResources.LogoTexture); } if (Application.isPlaying) { DTGUIHelper.ShowLargeBarAlert("This window can only be used in edit mode."); } else { DTGUIHelper.ShowColorWarning("This window will help you prepare a project that has existing audio for switching over to Master Audio."); DTGUIHelper.ShowColorWarning("All Audio Source components should be created by Master Audio only. Let's remove all your old ones."); DTGUIHelper.ShowLargeBarAlert("For each Scene, open the Scene, then go through the steps below to locate & delete items."); EditorGUILayout.Separator(); EditorGUILayout.LabelField("Step 1", EditorStyles.boldLabel); EditorGUILayout.BeginHorizontal(EditorStyles.objectFieldThumb); GUI.contentColor = DTGUIHelper.BrightButtonColor; if (GUILayout.Button(new GUIContent("Find Audio Sources In Scene"), EditorStyles.toolbarButton, GUILayout.Width(200))) { var audSources = GetNonMAAudioSources(); _audioSources = audSources.Count; if (_audioSources > 0) { Selection.objects = audSources.ToArray(); } if (_audioSources == 0) { DTGUIHelper.ShowAlert("You have zero AudioSources in your Scene. You are finished."); } else { DTGUIHelper.ShowAlert(audSources.Count + " AudioSource(s) found and selected in the Hierarchy. Please take note of what game objects these are, so you can add sound to them later with Master Audio."); } } GUI.contentColor = Color.white; if (_audioSources < 0) { GUI.contentColor = DTGUIHelper.BrightButtonColor; GUILayout.Label("Click button to find Audio Sources."); } else if (_audioSources == 0) { GUI.contentColor = DTGUIHelper.BrightButtonColor; GUILayout.Label("No Audio Sources! You are finished."); } else { GUI.contentColor = Color.red; GUILayout.Label(_audioSources.ToString() + " Audio Source(s) selected. Take note of them and go to step 2."); } GUI.contentColor = Color.white; EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.LabelField("Step 2", EditorStyles.boldLabel); EditorGUILayout.BeginHorizontal(EditorStyles.objectFieldThumb); GUI.contentColor = DTGUIHelper.BrightButtonColor; if (GUILayout.Button(new GUIContent("Delete Audio Sources In Scene"), EditorStyles.toolbarButton, GUILayout.Width(200))) { var audSources = GetNonMAAudioSources(); _audioSources = audSources.Count; if (_audioSources == 0) { DTGUIHelper.ShowAlert("You have zero AudioSources in your Scene. You are finished."); _audioSources = 0; } else { DeleteAudioSources(); } } EditorGUILayout.EndHorizontal(); } GUI.EndScrollView(); }
private void UpgradeData() { if (_creator.groupTemplate == null) { DTGUIHelper.ShowAlert("Your 'Group Template' field is empty, please assign it in debug mode. Drag the 'DynamicSoundGroup' prefab from MasterAudio/Sources/Prefabs into that field, then switch back to normal mode. Upgrade data cancelled."); return; } if (_creator.variationTemplate == null) { DTGUIHelper.ShowAlert("Your 'Variation Template' field is empty, please assign it in debug mode. Drag the 'DynamicGroupVariation' prefab from MasterAudio/Sources/Prefabs into that field, then switch back to normal mode. Upgrade data cancelled"); return; } for (var g = 0; g < _creator.soundGroupsToCreate.Count; g++) { var grp = _creator.soundGroupsToCreate[g]; var groupName = grp.groupName; var match = _groups.FindAll(delegate(DynamicSoundGroup obj) { return(obj.name == groupName); }); if (match.Count > 0) { Debug.LogWarning("Dynamic Sound Group '" + groupName + "' already exists. Please rename one of them."); } var newGrp = (GameObject)GameObject.Instantiate(_creator.groupTemplate, _creator.transform.position, Quaternion.identity); newGrp.transform.name = groupName; newGrp.transform.parent = _creator.transform; var groupScript = newGrp.GetComponent <DynamicSoundGroup>(); if (grp.duckSound) { var duckMatch = _creator.musicDuckingSounds.FindAll(delegate(DuckGroupInfo obj) { return(obj.soundType == groupName); }); if (duckMatch.Count > 0) { Debug.LogWarning("Dynamic Duck Setting for Sound Group '" + groupName + "' already exists. Skipping adding Duck Group."); } else { var newDuck = new DuckGroupInfo() { soundType = groupName, riseVolStart = grp.riseVolStart }; _creator.musicDuckingSounds.Add(newDuck); } } switch (grp.busMode) { case DynamicSoundGroupInfo.BusMode.NoBus: break; case DynamicSoundGroupInfo.BusMode.UseExisting: var matchBusIndex = _creator.groupBuses.FindIndex(delegate(GroupBus obj) { return(obj.busName == grp.busName); }); if (matchBusIndex < 0) // bus doesn't exist in Dynamic SGC { var newBus = new GroupBus() { busName = grp.busName, isExisting = true }; _creator.groupBuses.Add(newBus); matchBusIndex = _creator.groupBuses.FindIndex(delegate(GroupBus obj) { return(obj.busName == grp.busName); }); } groupScript.busIndex = matchBusIndex + DynamicSoundGroupCreator.HardCodedBusOptions; groupScript.busName = grp.busName; break; case DynamicSoundGroupInfo.BusMode.CreateNew: break; } groupScript.groupMasterVolume = grp.groupMasterVolume; groupScript.retriggerPercentage = grp.retriggerPercentage; groupScript.curVariationSequence = grp.curVariationSequence; groupScript.useInactivePeriodPoolRefill = grp.useInactivePeriodPoolRefill; groupScript.inactivePeriodSeconds = grp.inactivePeriodSeconds; groupScript.curVariationMode = grp.curVariationMode; groupScript.limitMode = grp.limitMode; groupScript.limitPerXFrames = grp.limitPerXFrames; groupScript.minimumTimeBetween = grp.minimumTimeBetween; groupScript.limitPolyphony = grp.limitPolyphony; groupScript.voiceLimitCount = grp.voiceLimitCount; // make variations! for (var v = 0; v < grp.variations.Count; v++) { var aVar = grp.variations[v]; var newVar = (GameObject)GameObject.Instantiate(_creator.variationTemplate, _creator.transform.position, Quaternion.identity); var varName = string.Empty; switch (aVar.audLocation) { case MasterAudio.AudioLocation.Clip: varName = string.IsNullOrEmpty(aVar.clipName) ? aVar.clip.name : aVar.clipName; break; case MasterAudio.AudioLocation.ResourceFile: varName = aVar.resourceFileName; break; } newVar.transform.name = varName; newVar.transform.parent = newGrp.transform; var varScript = newVar.GetComponent <DynamicGroupVariation>(); varScript.audLocation = aVar.audLocation; switch (aVar.audLocation) { case MasterAudio.AudioLocation.Clip: varScript.audio.clip = aVar.clip; break; case MasterAudio.AudioLocation.ResourceFile: varScript.resourceFileName = aVar.resourceFileName; break; } varScript.weight = aVar.weight; varScript.audio.volume = aVar.volume; varScript.audio.pitch = aVar.pitch; varScript.audio.loop = aVar.loopClip; varScript.randomPitch = aVar.randomPitch; varScript.randomVolume = aVar.randomVolume; varScript.useFades = aVar.useFades; varScript.fadeInTime = aVar.fadeInTime; varScript.fadeOutTime = aVar.fadeOutTime; varScript.audio.rolloffMode = aVar.audRollOffMode; varScript.audio.minDistance = aVar.audMinDistance; varScript.audio.maxDistance = aVar.audMaxDistance; varScript.audio.dopplerLevel = aVar.audDopplerLevel; varScript.audio.spread = aVar.audSpread; varScript.audio.panLevel = aVar.audPanLevel; } } _creator.soundGroupsToCreate.Clear(); DTGUIHelper.ShowAlert("Dynamic Sound Group Creator data upgraded successfully!"); }
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)); }
private void EqualizeVariationVolumes(List <DynamicGroupVariation> variations) { var clips = new Dictionary <DynamicGroupVariation, float>(); if (variations.Count < 2) { DTGUIHelper.ShowAlert("You must have at least 2 Variations to use this function."); return; } float lowestVolume = 1f; for (var i = 0; i < variations.Count; i++) { var setting = variations[i]; AudioClip ac = null; switch (setting.audLocation) { case MasterAudio.AudioLocation.Clip: if (setting.audio.clip == null) { continue; } ac = setting.audio.clip; break; case MasterAudio.AudioLocation.ResourceFile: if (string.IsNullOrEmpty(setting.resourceFileName)) { continue; } ac = Resources.Load(setting.resourceFileName) as AudioClip; if (ac == null) { continue; // bad resource path } break; } if (!ac.isReadyToPlay) { Debug.Log("Clip is not ready to play (streaming?). Skipping '" + setting.name + "'."); continue; } float average = 0f; var buffer = new float[ac.samples]; Debug.Log("Measuring amplitude of '" + ac.name + "'."); ac.GetData(buffer, 0); for (int c = 0; c < ac.samples; c++) { average += Mathf.Pow(buffer[c], 2); } average = Mathf.Sqrt(1f / (float)ac.samples * average); if (average < lowestVolume) { lowestVolume = average; } if (average == 0f) { // don't factor in. continue; } clips.Add(setting, average); } if (clips.Count < 2) { DTGUIHelper.ShowAlert("You must have at least 2 Variations with non-compressed, non-streaming clips to use this function."); return; } foreach (var kv in clips) { if (kv.Value == 0) { // skip continue; } float adjustedVol = lowestVolume / kv.Value; //set your volume for each Variation in your Sound Group. kv.Key.audio.volume = adjustedVol; } }
// 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, 540) ); 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; } 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))) { 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; } } EditorGUILayout.LabelField("Exists in scene", EditorStyles.boldLabel); } GUILayout.FlexibleSpace(); 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(); 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(); 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; } } EditorGUILayout.LabelField("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(); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); if (!Application.isPlaying) { EditorGUILayout.BeginHorizontal(EditorStyles.objectFieldThumb); GUILayout.Label("Global Settings"); 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(); var useLogo = GUILayout.Toggle(MasterAudio.HideLogoNav, " Hide Logo Nav. in Inspectors"); // ReSharper disable once RedundantCheckBeforeAssignment if (useLogo != MasterAudio.HideLogoNav) { MasterAudio.HideLogoNav = useLogo; } if (!Application.isPlaying) { EditorGUILayout.BeginHorizontal(); MasterAudio._editMAFolder = GUILayout.Toggle(MasterAudio._editMAFolder, " Edit Installation Path"); if (MasterAudio._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); } EditorGUILayout.EndHorizontal(); } EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(EditorStyles.objectFieldThumb); GUILayout.Label("Utility Functions"); 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(); } if (maInScene) { GUILayout.Space(10); if (GUILayout.Button(new GUIContent("Upgrade MA Prefab to V3.5.5", "This will upgrade all Sound Groups in the entire MasterAudio prefab and all Sound Groups within to the latest changes, including a new script in V3.5.5."), EditorStyles.toolbarButton, GUILayout.Width(160))) { UpgradeMasterAudioPrefab(); } } GUI.contentColor = Color.white; EditorGUILayout.EndHorizontal(); } GUI.EndScrollView(); }
// ReSharper disable once FunctionComplexityOverflow public override void OnInspectorGUI() { EditorGUI.indentLevel = 1; var isDirty = false; _variation = (DynamicGroupVariation)target; if (MasterAudioInspectorResources.LogoTexture != null) { DTGUIHelper.ShowHeaderTexture(MasterAudioInspectorResources.LogoTexture); } EditorGUI.indentLevel = 0; // Space will handle this for the header var previewLang = SystemLanguage.English; GameObject dgscGO = null; if (_variation.transform.parent != null && _variation.transform.parent.parent != null) { var parentParent = _variation.transform.parent.parent; dgscGO = parentParent.gameObject; var dgsc = dgscGO.GetComponent <DynamicSoundGroupCreator>(); if (dgsc != null) { previewLang = dgsc.previewLanguage; } } if (dgscGO == null) { DTGUIHelper.ShowRedError("This prefab must have a GameObject 2 parents up. Prefab broken."); return; } AudioSource previewer; EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); GUI.contentColor = DTGUIHelper.BrightButtonColor; if (GUILayout.Button(new GUIContent("Back to Group", "Select Group in Hierarchy"), EditorStyles.toolbarButton, GUILayout.Width(120))) { // ReSharper disable once PossibleNullReferenceException Selection.activeObject = _variation.transform.parent.gameObject; } GUILayout.FlexibleSpace(); GUI.contentColor = Color.white; var buttonPressed = DTGUIHelper.AddDynamicVariationButtons(); switch (buttonPressed) { case DTGUIHelper.DTFunctionButtons.Play: isDirty = true; previewer = MasterAudioInspector.GetPreviewer(); var randPitch = SoundGroupVariationInspector.GetRandomPreviewPitch(_variation); var varVol = SoundGroupVariationInspector.GetRandomPreviewVolume(_variation); if (_variation.audLocation != MasterAudio.AudioLocation.FileOnInternet) { if (previewer != null) { MasterAudioInspector.StopPreviewer(); previewer.pitch = randPitch; } } var calcVolume = varVol * _variation.ParentGroup.groupMasterVolume; switch (_variation.audLocation) { case MasterAudio.AudioLocation.ResourceFile: var fileName = AudioResourceOptimizer.GetLocalizedDynamicSoundGroupFileName(previewLang, _variation.useLocalization, _variation.resourceFileName); var clip = Resources.Load(fileName) as AudioClip; if (clip != null) { if (previewer != null) { previewer.PlayOneShot(clip, calcVolume); } } else { DTGUIHelper.ShowAlert("Could not find Resource file: " + fileName); } break; case MasterAudio.AudioLocation.Clip: if (previewer != null) { previewer.PlayOneShot(_variation.VarAudio.clip, calcVolume); } break; case MasterAudio.AudioLocation.FileOnInternet: if (!string.IsNullOrEmpty(_variation.internetFileUrl)) { Application.OpenURL(_variation.internetFileUrl); } break; } break; case DTGUIHelper.DTFunctionButtons.Stop: if (_variation.audLocation != MasterAudio.AudioLocation.FileOnInternet) { MasterAudioInspector.StopPreviewer(); } break; } EditorGUILayout.EndHorizontal(); DTGUIHelper.HelpHeader("http://www.dtdevtools.com/docs/masteraudio/SoundGroupVariations.htm"); if (!Application.isPlaying) { DTGUIHelper.ShowColorWarning(MasterAudio.PreviewText); } var oldLocation = _variation.audLocation; EditorGUILayout.BeginHorizontal(); var newLocation = (MasterAudio.AudioLocation)EditorGUILayout.EnumPopup("Audio Origin", _variation.audLocation); DTGUIHelper.AddHelpIcon("http://www.dtdevtools.com/docs/masteraudio/SoundGroupVariations.htm#AudioOrigin"); EditorGUILayout.EndHorizontal(); if (newLocation != oldLocation) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Audio Origin"); _variation.audLocation = newLocation; } switch (_variation.audLocation) { case MasterAudio.AudioLocation.Clip: var newClip = (AudioClip)EditorGUILayout.ObjectField("Audio Clip", _variation.VarAudio.clip, typeof(AudioClip), false); if (newClip != _variation.VarAudio.clip) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation.VarAudio, "assign Audio Clip"); _variation.VarAudio.clip = newClip; } break; case MasterAudio.AudioLocation.FileOnInternet: if (oldLocation != _variation.audLocation) { if (_variation.VarAudio.clip != null) { Debug.Log("Audio clip removed to prevent unnecessary memory usage on File On Internet Variation."); } _variation.VarAudio.clip = null; } if (!Application.isPlaying) { var newUrl = EditorGUILayout.TextField("Internet File URL", _variation.internetFileUrl); if (newUrl != _variation.internetFileUrl) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Internet File URL"); _variation.internetFileUrl = newUrl; } } if (string.IsNullOrEmpty(_variation.internetFileUrl)) { DTGUIHelper.ShowLargeBarAlert("You have not specified a URL for the File On Internet. This Variation will not be available to play without one."); } break; case MasterAudio.AudioLocation.ResourceFile: if (oldLocation != _variation.audLocation) { if (_variation.VarAudio.clip != null) { Debug.Log("Audio clip removed to prevent unnecessary memory usage on Resource file Variation."); } _variation.VarAudio.clip = null; } EditorGUILayout.BeginVertical(); var anEvent = Event.current; GUI.color = DTGUIHelper.DragAreaColor; var dragArea = GUILayoutUtility.GetRect(0f, 20f, GUILayout.ExpandWidth(true)); GUI.Box(dragArea, "Drag Resource Audio clip here to use its name!"); GUI.color = Color.white; string newFilename; switch (anEvent.type) { case EventType.DragUpdated: case EventType.DragPerform: if (!dragArea.Contains(anEvent.mousePosition)) { break; } DragAndDrop.visualMode = DragAndDropVisualMode.Copy; if (anEvent.type == EventType.DragPerform) { DragAndDrop.AcceptDrag(); foreach (var dragged in DragAndDrop.objectReferences) { var aClip = dragged as AudioClip; if (aClip == null) { continue; } AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Resource filename"); var useLocalization = false; newFilename = DTGUIHelper.GetResourcePath(aClip, ref useLocalization); if (string.IsNullOrEmpty(newFilename)) { newFilename = aClip.name; } _variation.resourceFileName = newFilename; _variation.useLocalization = useLocalization; break; } } Event.current.Use(); break; } EditorGUILayout.EndVertical(); newFilename = EditorGUILayout.TextField("Resource Filename", _variation.resourceFileName); if (newFilename != _variation.resourceFileName) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Resource filename"); _variation.resourceFileName = newFilename; } EditorGUI.indentLevel = 1; var newLocal = EditorGUILayout.Toggle("Use Localized Folder", _variation.useLocalization); if (newLocal != _variation.useLocalization) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "toggle Use Localized Folder"); _variation.useLocalization = newLocal; } break; } EditorGUI.indentLevel = 0; var newProbability = EditorGUILayout.IntSlider("Probability to Play (%)", _variation.probabilityToPlay, 0, 100); if (newProbability != _variation.probabilityToPlay) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Probability to Play (%)"); _variation.probabilityToPlay = newProbability; } if (_variation.probabilityToPlay < 100) { DTGUIHelper.ShowLargeBarAlert("Since Probability to Play is less than 100%, you will not always hear this Variation when it's selected to play."); } var newVolume = EditorGUILayout.Slider("Volume", _variation.VarAudio.volume, 0f, 1f); if (newVolume != _variation.VarAudio.volume) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation.VarAudio, "change Volume"); _variation.VarAudio.volume = newVolume; } var newPitch = DTGUIHelper.DisplayPitchField(_variation.VarAudio.pitch); if (newPitch != _variation.VarAudio.pitch) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation.VarAudio, "change Pitch"); _variation.VarAudio.pitch = newPitch; } if (_variation.ParentGroup.curVariationMode == MasterAudioGroup.VariationMode.LoopedChain) { DTGUIHelper.ShowLargeBarAlert(MasterAudio.LoopDisabledLoopedChain); } else if (_variation.useRandomStartTime && _variation.randomEndPercent != 100f) { DTGUIHelper.ShowLargeBarAlert(MasterAudio.LoopDisabledCustomEnd); } else { var newLoop = EditorGUILayout.Toggle("Loop Clip", _variation.VarAudio.loop); if (newLoop != _variation.VarAudio.loop) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation.VarAudio, "toggle Loop"); _variation.VarAudio.loop = newLoop; } } EditorGUILayout.BeginHorizontal(); var newWeight = EditorGUILayout.IntSlider("Voices (Weight)", _variation.weight, 0, 100); DTGUIHelper.AddHelpIcon("http://www.dtdevtools.com/docs/masteraudio/SoundGroupVariations.htm#Voices"); EditorGUILayout.EndHorizontal(); if (newWeight != _variation.weight) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Voices (Weight)"); _variation.weight = newWeight; } DTGUIHelper.StartGroupHeader(); var newUseRndPitch = EditorGUILayout.BeginToggleGroup(" Use Random Pitch", _variation.useRandomPitch); if (newUseRndPitch != _variation.useRandomPitch) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "toggle Use Random Pitch"); _variation.useRandomPitch = newUseRndPitch; } DTGUIHelper.EndGroupHeader(); if (_variation.useRandomPitch) { var newMode = (SoundGroupVariation.RandomPitchMode)EditorGUILayout.EnumPopup("Pitch Compute Mode", _variation.randomPitchMode); if (newMode != _variation.randomPitchMode) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Pitch Compute Mode"); _variation.randomPitchMode = newMode; } var newPitchMin = DTGUIHelper.DisplayPitchField(_variation.randomPitchMin, "Random Pitch Min"); if (newPitchMin != _variation.randomPitchMin) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Random Pitch Min"); _variation.randomPitchMin = newPitchMin; if (_variation.randomPitchMax <= _variation.randomPitchMin) { _variation.randomPitchMax = _variation.randomPitchMin; } } var newPitchMax = DTGUIHelper.DisplayPitchField(_variation.randomPitchMax, "Random Pitch Max"); if (newPitchMax != _variation.randomPitchMax) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Random Pitch Max"); _variation.randomPitchMax = newPitchMax; if (_variation.randomPitchMin > _variation.randomPitchMax) { _variation.randomPitchMin = _variation.randomPitchMax; } } } EditorGUILayout.EndToggleGroup(); DTGUIHelper.AddSpaceForNonU5(2); DTGUIHelper.StartGroupHeader(); var newUseRndVol = EditorGUILayout.BeginToggleGroup(" Use Random Volume", _variation.useRandomVolume); if (newUseRndVol != _variation.useRandomVolume) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "toggle Use Random Volume"); _variation.useRandomVolume = newUseRndVol; } DTGUIHelper.EndGroupHeader(); if (_variation.useRandomVolume) { var newMode = (SoundGroupVariation.RandomVolumeMode)EditorGUILayout.EnumPopup("Volume Compute Mode", _variation.randomVolumeMode); if (newMode != _variation.randomVolumeMode) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Volume Compute Mode"); _variation.randomVolumeMode = newMode; } var volMin = 0f; if (_variation.randomVolumeMode == SoundGroupVariation.RandomVolumeMode.AddToClipVolume) { volMin = -1f; } var newVolMin = DTGUIHelper.DisplayVolumeField(_variation.randomVolumeMin, DTGUIHelper.VolumeFieldType.None, MasterAudio.MixerWidthMode.Normal, volMin, true, "Random Volume Min"); if (newVolMin != _variation.randomVolumeMin) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Random Volume Min"); _variation.randomVolumeMin = newVolMin; if (_variation.randomVolumeMax <= _variation.randomVolumeMin) { _variation.randomVolumeMax = _variation.randomVolumeMin; } } var newVolMax = DTGUIHelper.DisplayVolumeField(_variation.randomVolumeMax, DTGUIHelper.VolumeFieldType.None, MasterAudio.MixerWidthMode.Normal, volMin, true, "Random Volume Max"); if (newVolMax != _variation.randomVolumeMax) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Random Volume Max"); _variation.randomVolumeMax = newVolMax; if (_variation.randomVolumeMin > _variation.randomVolumeMax) { _variation.randomVolumeMin = _variation.randomVolumeMax; } } } EditorGUILayout.EndToggleGroup(); DTGUIHelper.AddSpaceForNonU5(2); DTGUIHelper.StartGroupHeader(); var newSilence = EditorGUILayout.BeginToggleGroup(" Use Random Delay", _variation.useIntroSilence); if (newSilence != _variation.useIntroSilence) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "toggle Use Random Delay"); _variation.useIntroSilence = newSilence; } DTGUIHelper.EndGroupHeader(); if (_variation.useIntroSilence) { var newSilenceMin = EditorGUILayout.Slider("Delay Min (sec)", _variation.introSilenceMin, 0f, 100f); if (newSilenceMin != _variation.introSilenceMin) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Delay Min (sec)"); _variation.introSilenceMin = newSilenceMin; if (_variation.introSilenceMin > _variation.introSilenceMax) { _variation.introSilenceMax = newSilenceMin; } } var newSilenceMax = EditorGUILayout.Slider("Delay Max (sec)", _variation.introSilenceMax, 0f, 100f); if (newSilenceMax != _variation.introSilenceMax) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Delay Max (sec)"); _variation.introSilenceMax = newSilenceMax; if (_variation.introSilenceMax < _variation.introSilenceMin) { _variation.introSilenceMin = newSilenceMax; } } } EditorGUILayout.EndToggleGroup(); DTGUIHelper.AddSpaceForNonU5(2); DTGUIHelper.StartGroupHeader(); var newStart = EditorGUILayout.BeginToggleGroup(" Use Custom Start/End Position", _variation.useRandomStartTime); if (newStart != _variation.useRandomStartTime) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "toggle Use Custom Start/End Position"); _variation.useRandomStartTime = newStart; } DTGUIHelper.EndGroupHeader(); if (_variation.useRandomStartTime) { var newMin = EditorGUILayout.Slider("Start Min (%)", _variation.randomStartMinPercent, 0f, 100f); if (newMin != _variation.randomStartMinPercent) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Start Min (%)"); _variation.randomStartMinPercent = newMin; if (_variation.randomStartMaxPercent <= _variation.randomStartMinPercent) { _variation.randomStartMaxPercent = _variation.randomStartMinPercent; } } var newMax = EditorGUILayout.Slider("Start Max (%)", _variation.randomStartMaxPercent, 0f, 100f); if (newMax != _variation.randomStartMaxPercent) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Start Max (%)"); _variation.randomStartMaxPercent = newMax; if (_variation.randomStartMinPercent > _variation.randomStartMaxPercent) { _variation.randomStartMinPercent = _variation.randomStartMaxPercent; } } var newEnd = EditorGUILayout.Slider("End (%)", _variation.randomEndPercent, 0f, 100f); if (newEnd != _variation.randomEndPercent || _variation.randomEndPercent < _variation.randomStartMaxPercent) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change End (%)"); _variation.randomEndPercent = newEnd; if (_variation.randomEndPercent < _variation.randomStartMaxPercent) { _variation.randomEndPercent = _variation.randomStartMaxPercent; } } } EditorGUILayout.EndToggleGroup(); DTGUIHelper.AddSpaceForNonU5(2); if (_variation.VarAudio.loop) { DTGUIHelper.StartGroupHeader(); newStart = EditorGUILayout.BeginToggleGroup(" Use Finite Looping", _variation.useCustomLooping); if (newStart != _variation.useCustomLooping) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "toggle Use Finite Looping"); _variation.useCustomLooping = newStart; } DTGUIHelper.EndGroupHeader(); if (_variation.useCustomLooping) { var newMin = EditorGUILayout.IntSlider("Min Loops", _variation.minCustomLoops, 1, 100); if (newMin != _variation.minCustomLoops) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Min Loops"); _variation.minCustomLoops = newMin; if (_variation.maxCustomLoops <= _variation.minCustomLoops) { _variation.maxCustomLoops = _variation.minCustomLoops; } } var newMax = EditorGUILayout.IntSlider("Max Loops", _variation.maxCustomLoops, 1, 100); if (newMax != _variation.maxCustomLoops) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Max Loops"); _variation.maxCustomLoops = newMax; if (_variation.minCustomLoops > _variation.maxCustomLoops) { _variation.minCustomLoops = _variation.maxCustomLoops; } } } EditorGUILayout.EndToggleGroup(); DTGUIHelper.AddSpaceForNonU5(2); } DTGUIHelper.StartGroupHeader(); var newUseFades = EditorGUILayout.BeginToggleGroup(" Use Custom Fading", _variation.useFades); if (newUseFades != _variation.useFades) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "toggle Use Custom Fading"); _variation.useFades = newUseFades; } DTGUIHelper.EndGroupHeader(); if (_variation.useFades) { var newFadeIn = EditorGUILayout.Slider("Fade In Time (sec)", _variation.fadeInTime, 0f, 10f); if (newFadeIn != _variation.fadeInTime) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Fade In Time"); _variation.fadeInTime = newFadeIn; } if (_variation.VarAudio.loop) { DTGUIHelper.ShowColorWarning("Looped clips cannot have a custom fade out."); } else { var newFadeOut = EditorGUILayout.Slider("Fade Out time (sec)", _variation.fadeOutTime, 0f, 10f); if (newFadeOut != _variation.fadeOutTime) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _variation, "change Fade Out Time"); _variation.fadeOutTime = newFadeOut; } } } EditorGUILayout.EndToggleGroup(); if (GUI.changed || isDirty) { EditorUtility.SetDirty(target); } //DrawDefaultInspector(); }
private void DisplayClips() { EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); GUI.contentColor = DTGUIHelper.BrightButtonColor; if (GUILayout.Button("All", EditorStyles.toolbarButton, GUILayout.Width(32))) { foreach (var t in FilteredClips) { t.IsSelected = true; } } if (GUILayout.Button("None", EditorStyles.toolbarButton, GUILayout.Width(36))) { foreach (var t in _clipList.AudioInfor) { t.IsSelected = false; } } GUI.contentColor = DTGUIHelper.BrightButtonColor; var columnPrefix = ColumnPrefix(ClipSortColumn.Name); if (GUILayout.Button(new GUIContent(columnPrefix + "Clip Name", "Click to sort by Clip Name"), EditorStyles.toolbarButton, GUILayout.Width(160))) { ChangeSortColumn(ClipSortColumn.Name); } columnPrefix = ColumnPrefix(ClipSortColumn.ForceMono); if (GUILayout.Button(new GUIContent(columnPrefix + "Force Mono", "Click to sort by Force Mono"), EditorStyles.toolbarButton, GUILayout.Width(86))) { ChangeSortColumn(ClipSortColumn.ForceMono); } columnPrefix = ColumnPrefix(ClipSortColumn.LoadInBackground); if (GUILayout.Button(new GUIContent(columnPrefix + "Load In BG", "Click to sort by Load In BG"), EditorStyles.toolbarButton, GUILayout.Width(80))) { ChangeSortColumn(ClipSortColumn.LoadInBackground); } columnPrefix = ColumnPrefix(ClipSortColumn.PreloadAudio); if (GUILayout.Button(new GUIContent(columnPrefix + "Preload Aud.", "Click to sort by Preload Audio Data"), EditorStyles.toolbarButton, GUILayout.Width(90))) { ChangeSortColumn(ClipSortColumn.PreloadAudio); } columnPrefix = ColumnPrefix(ClipSortColumn.LoadType); if (GUILayout.Button(new GUIContent(columnPrefix + "Load Type", "Click to sort by Load Type"), EditorStyles.toolbarButton, GUILayout.Width(90))) { ChangeSortColumn(ClipSortColumn.LoadType); } columnPrefix = ColumnPrefix(ClipSortColumn.CompressionFormat); if (GUILayout.Button(new GUIContent(columnPrefix + "Comp. Format", "Click to sort by Compression Format"), EditorStyles.toolbarButton, GUILayout.Width(96))) { ChangeSortColumn(ClipSortColumn.CompressionFormat); } columnPrefix = ColumnPrefix(ClipSortColumn.Quality); if (GUILayout.Button(new GUIContent(columnPrefix + "Quality", "Click to sort by Quality"), EditorStyles.toolbarButton, GUILayout.Width(65))) { ChangeSortColumn(ClipSortColumn.Quality); } columnPrefix = ColumnPrefix(ClipSortColumn.SampleRateSetting); if (GUILayout.Button(new GUIContent(columnPrefix + "Sample Rt. Setting", "Click to sort by Sample Rate Setting"), EditorStyles.toolbarButton, GUILayout.Width(122))) { ChangeSortColumn(ClipSortColumn.SampleRateSetting); } columnPrefix = ColumnPrefix(ClipSortColumn.SampleRate); if (GUILayout.Button(new GUIContent(columnPrefix + "Sample Rate", "Click to sort by Sample Rate"), EditorStyles.toolbarButton, GUILayout.Width(90))) { ChangeSortColumn(ClipSortColumn.SampleRate); } GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); if (FilteredClips.Count == 0) { DTGUIHelper.ShowLargeBarAlert("You have filtered all clips out."); return; } #if UNITY_2019_3_OR_NEWER _scrollPos = GUI.BeginScrollView(new Rect(0, 137, 947, 475), _scrollPos, new Rect(0, 138, 880, 24 * FilteredClips.Count - 2)); #else _scrollPos = GUI.BeginScrollView(new Rect(0, 123, 953, 485), _scrollPos, new Rect(0, 124, 880, 24 * FilteredClips.Count + 4)); #endif foreach (var aClip in FilteredClips) { // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression if (aClip.IsSelected) { GUI.backgroundColor = DTGUIHelper.BrightButtonColor; } else { GUI.backgroundColor = Color.white; } GUIStyle style = new GUIStyle(EditorStyles.miniButtonMid) { fixedHeight = 22 }; EditorGUILayout.BeginHorizontal(style); // miniButtonMid, numberField, textField EditorGUILayout.BeginHorizontal(); var wasSelected = aClip.IsSelected; aClip.IsSelected = GUILayout.Toggle(aClip.IsSelected, ""); if (aClip.IsSelected) { if (!wasSelected) { SelectClip(aClip); } } var usesSampleRateOverride = aClip.SampleRateSetting == AudioSampleRateSetting.OverrideSampleRate; var usesQuality = aClip.CompressionFormat == AudioCompressionFormat.Vorbis; var isMonoChanged = !aClip.OrigForceMono.Equals(aClip.ForceMono); var isLoadInBGChanged = !aClip.OrigLoadBG.Equals(aClip.LoadBG); var isLoadTypeChanged = !aClip.OrigLoadType.Equals(aClip.LoadType); var isPreloadAudioChanged = !aClip.OrigPreload.Equals(aClip.Preload); var isCompFormatChanged = !aClip.OrigCompressionFormat.Equals(aClip.CompressionFormat); var isSampleRateSettingChanged = !aClip.OrigSampleRateSetting.Equals(aClip.SampleRateSetting); var isQualityChanged = usesQuality && !aClip.OrigQuality.Equals(aClip.Quality); var isSampleRateChanged = usesSampleRateOverride && !aClip.OrigSampleRateOverride.Equals(aClip.SampleRateOverride); var hasChanged = isMonoChanged || isLoadInBGChanged || isPreloadAudioChanged || isLoadTypeChanged || isCompFormatChanged || isSampleRateSettingChanged || isQualityChanged || isSampleRateChanged; if (!hasChanged) { ShowDisabledColors(); } else { GUI.contentColor = DTGUIHelper.BrightButtonColor; } if (GUILayout.Button(new GUIContent("Revert"), EditorStyles.toolbarButton, GUILayout.Width(45))) { if (!hasChanged) { DTGUIHelper.ShowAlert("This clip's properties have not changed."); } else { RevertChanges(aClip); } } RevertColor(); GUILayout.Space(10); GUILayout.Label(new GUIContent(aClip.Name, aClip.FullPath), GUILayout.Width(150)); GUILayout.Space(28); MaybeShowChangedColors(isMonoChanged); var newMono = GUILayout.Toggle(aClip.ForceMono, "", GUILayout.Width(40)); if (newMono != aClip.ForceMono) { SelectClip(aClip); aClip.IsSelected = true; if (isBulkMode) { CopyForceMonoToSelected(newMono); } else { aClip.ForceMono = newMono; } } RevertColor(); GUILayout.Space(42); MaybeShowChangedColors(isLoadInBGChanged); var newLoadBG = GUILayout.Toggle(aClip.LoadBG, "", GUILayout.Width(40)); if (newLoadBG != aClip.LoadBG) { aClip.IsSelected = true; SelectClip(aClip); if (isBulkMode) { CopyLoadInBGToSelected(newLoadBG); } else { aClip.LoadBG = newLoadBG; } } RevertColor(); GUILayout.Space(40); MaybeShowChangedColors(isPreloadAudioChanged); var newPreload = GUILayout.Toggle(aClip.Preload, "", GUILayout.Width(40)); if (newPreload != aClip.Preload) { aClip.IsSelected = true; SelectClip(aClip); if (isBulkMode) { CopyPreloadAudioToSelected(newPreload); } else { aClip.Preload = newPreload; } } RevertColor(); GUILayout.Space(12); MaybeShowChangedColors(isLoadTypeChanged); var newLoad = (AudioClipLoadType)EditorGUILayout.EnumPopup(aClip.LoadType, GUILayout.Width(84)); if (newLoad != aClip.LoadType) { aClip.IsSelected = true; SelectClip(aClip); if (isBulkMode) { CopyLoadTypeToSelected(newLoad); } else { aClip.LoadType = newLoad; } } RevertColor(); GUILayout.Space(8); MaybeShowChangedColors(isCompFormatChanged); var newComp = (AudioCompressionFormat)EditorGUILayout.EnumPopup(aClip.CompressionFormat, GUILayout.Width(82)); if (newComp != aClip.CompressionFormat) { aClip.IsSelected = true; SelectClip(aClip); if (isBulkMode) { CopyCompFormatToSelected(newComp); } else { aClip.CompressionFormat = newComp; } } RevertColor(); GUILayout.Space(8); if (usesQuality) { MaybeShowChangedColors(isQualityChanged); var newQuality = EditorGUILayout.FloatField(aClip.Quality, GUILayout.Width(57)); newQuality = Math.Max(0f, newQuality); newQuality = Math.Min(1f, newQuality); if (newQuality != aClip.Quality) { aClip.IsSelected = true; SelectClip(aClip); if (isBulkMode) { CopyQualityToSelected(newQuality); } else { aClip.Quality = newQuality; } } RevertColor(); } else { GUILayout.Space(61); } GUILayout.Space(4); MaybeShowChangedColors(isSampleRateSettingChanged); var newSample = (AudioSampleRateSetting)EditorGUILayout.EnumPopup(aClip.SampleRateSetting, GUILayout.Width(112)); if (newSample != aClip.SampleRateSetting) { aClip.IsSelected = true; SelectClip(aClip); if (isBulkMode) { CopySampleRateSettingToSelected(newSample); } else { aClip.SampleRateSetting = newSample; } } RevertColor(); GUILayout.Space(4); if (usesSampleRateOverride) { MaybeShowChangedColors(isSampleRateChanged); var selectedIndex = _sampleRates.IndexOf(aClip.SampleRateOverride); if (selectedIndex < 0) { selectedIndex = 0; } var selectedValue = _sampleRates[selectedIndex]; var newSampleRate = EditorGUILayout.IntPopup(selectedValue, _sampleRateDisplays, _sampleRates.ToArray(), GUILayout.Width(82)); if (newSampleRate != aClip.SampleRateOverride) { aClip.IsSelected = true; SelectClip(aClip); if (isBulkMode) { CopySampleRateToSelected(newSampleRate); } else { aClip.SampleRateOverride = newSampleRate; } } RevertColor(); } else { GUILayout.Space(78); } GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); EditorGUILayout.EndHorizontal(); RevertColor(); } GUI.EndScrollView(); }