private DynamicSoundGroup RescanChildren(DynamicSoundGroup group) { var newChildren = new List <DynamicGroupVariation>(); var childNames = new List <string>(); DynamicGroupVariation variation = null; for (var i = 0; i < group.transform.childCount; i++) { var child = group.transform.GetChild(i); if (!Application.isPlaying) { if (childNames.Contains(child.name)) { DTGUIHelper.ShowRedError("You have more than one Variation named: " + child.name + "."); DTGUIHelper.ShowRedError("Please ensure each Variation of this Group has a unique name."); isValid = false; return(null); } } childNames.Add(child.name); variation = child.GetComponent <DynamicGroupVariation>(); newChildren.Add(variation); } group.groupVariations = newChildren; return(group); }
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; } }
public void CreateVariation(DynamicSoundGroup group, AudioClip clip) { var resourceFileName = string.Empty; var useLocalization = false; if (group.bulkVariationMode == MasterAudio.AudioLocation.ResourceFile) { resourceFileName = DTGUIHelper.GetResourcePath(clip, ref useLocalization); 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; variation.useLocalization = useLocalization; } else { variation.VarAudio.clip = clip; } }
public static DTFunctionButtons AddDynamicGroupButtons(DynamicSoundGroup grp) { if (Application.isPlaying) { return(DTFunctionButtons.None); } // ReSharper disable once InvertIf if (!IsPrefabInProjectView(grp)) { if (GUILayout.Button(new GUIContent(MasterAudioInspectorResources.PreviewTexture, "Click to preview Variation"), EditorStyles.toolbarButton, GUILayout.Height(16), GUILayout.Width(40))) { return(DTFunctionButtons.Play); } // ReSharper disable once ConvertIfStatementToReturnStatement if ( GUILayout.Button( new GUIContent(MasterAudioInspectorResources.StopTexture, "Click to stop audio preview"), EditorStyles.toolbarButton, GUILayout.Height(16), GUILayout.Width(40))) { return(DTFunctionButtons.Stop); } } return(DTFunctionButtons.None); }
private void DeleteBus(int busIndex) { DynamicSoundGroup aGroup = null; var groupsWithBus = new List <DynamicSoundGroup>(); var groupsWithHigherBus = new List <DynamicSoundGroup>(); for (var i = 0; i < this._groups.Count; i++) { aGroup = this._groups[i]; if (aGroup.busIndex == -1) { continue; } if (aGroup.busIndex == busIndex + DynamicSoundGroupCreator.HardCodedBusOptions) { groupsWithBus.Add(aGroup); } else if (aGroup.busIndex > busIndex + DynamicSoundGroupCreator.HardCodedBusOptions) { groupsWithHigherBus.Add(aGroup); } } var allObjects = new List <UnityEngine.Object>(); allObjects.Add(_creator); foreach (var g in groupsWithBus) { allObjects.Add(g as UnityEngine.Object); } foreach (var g in groupsWithHigherBus) { allObjects.Add(g as UnityEngine.Object); } UndoHelper.RecordObjectsForUndo(allObjects.ToArray(), "delete Bus"); // change all _creator.groupBuses.RemoveAt(busIndex); foreach (var group in groupsWithBus) { group.busIndex = -1; } foreach (var group in groupsWithHigherBus) { group.busIndex--; } }
public static DTFunctionButtons AddDynamicGroupButtons(DynamicSoundGroup _group) { if (GUILayout.Button(new GUIContent(MasterAudioInspectorResources.previewTexture, "Click to preview Variation"), EditorStyles.toolbarButton, GUILayout.Width(40))) { return(DTFunctionButtons.Play); } if (GUILayout.Button(new GUIContent(MasterAudioInspectorResources.stopTexture, "Click to stop audio preview"), EditorStyles.toolbarButton, GUILayout.Width(40))) { return(DTFunctionButtons.Stop); } return(DTFunctionButtons.None); }
public void EqualizeWeights(DynamicSoundGroup _group) { var variations = new DynamicGroupVariation[_group.groupVariations.Count]; DynamicGroupVariation variation = null; for (var i = 0; i < _group.groupVariations.Count; i++) { variation = _group.groupVariations[i]; variations[i] = variation; } UndoHelper.RecordObjectsForUndo(variations, "Equalize Weights"); foreach (var vari in variations) { vari.weight = 1; } }
public void EqualizeWeights(DynamicSoundGroup grp) { var variations = new DynamicGroupVariation[grp.groupVariations.Count]; for (var i = 0; i < grp.groupVariations.Count; i++) { var variation = grp.groupVariations[i]; variations[i] = variation; } AudioUndoHelper.RecordObjectsForUndo(variations, "Equalize Voices"); foreach (var vari in variations) { vari.weight = 1; } }
private void PreviewGroup(DynamicSoundGroup aGroup) { var rndIndex = UnityEngine.Random.Range(0, aGroup.groupVariations.Count); var rndVar = aGroup.groupVariations[rndIndex]; if (rndVar.audLocation == MasterAudio.AudioLocation.ResourceFile) { _creator.PreviewerInstance.Stop(); _creator.PreviewerInstance.PlayOneShot(Resources.Load(rndVar.resourceFileName) as AudioClip, rndVar.audio.volume); } else { _creator.PreviewerInstance.PlayOneShot(rndVar.audio.clip, rndVar.audio.volume); } }
private DynamicSoundGroup RescanChildren(DynamicSoundGroup group) { var newChildren = new List<DynamicGroupVariation>(); var childNames = new List<string>(); DynamicGroupVariation variation = null; for (var i = 0; i < group.transform.childCount; i++) { var child = group.transform.GetChild(i); if (!Application.isPlaying) { if (childNames.Contains(child.name)) { DTGUIHelper.ShowRedError("You have more than one Variation named: " + child.name + "."); DTGUIHelper.ShowRedError("Please ensure each Variation of this Group has a unique name."); isValid = false; return null; } } childNames.Add(child.name); variation = child.GetComponent<DynamicGroupVariation>(); newChildren.Add(variation); } group.groupVariations = newChildren; return group; }
public static DTFunctionButtons AddDynamicGroupButtons(DynamicSoundGroup _group) { if (!Application.isPlaying) { if (GUILayout.Button(new GUIContent(MasterAudioInspectorResources.previewTexture, "Click to preview Variation"), EditorStyles.toolbarButton, GUILayout.Width(40))) { return DTFunctionButtons.Play; } if (GUILayout.Button(new GUIContent(MasterAudioInspectorResources.stopTexture, "Click to stop audio preview"), EditorStyles.toolbarButton, GUILayout.Width(40))) { return DTFunctionButtons.Stop; } } return DTFunctionButtons.None; }
public static DTFunctionButtons AddDynamicGroupButtons(DynamicSoundGroup grp) { if (Application.isPlaying) { return DTFunctionButtons.None; } // ReSharper disable once InvertIf if (!IsPrefabInProjectView(grp)) { if (GUILayout.Button(new GUIContent(MasterAudioInspectorResources.PreviewTexture, "Click to preview Variation"), EditorStyles.toolbarButton, GUILayout.Height(16), GUILayout.Width(40))) { return DTFunctionButtons.Play; } // ReSharper disable once ConvertIfStatementToReturnStatement if ( GUILayout.Button( new GUIContent(MasterAudioInspectorResources.StopTexture, "Click to stop audio preview"), EditorStyles.toolbarButton, GUILayout.Height(16), GUILayout.Width(40))) { return DTFunctionButtons.Stop; } } return DTFunctionButtons.None; }
private void PreviewGroup(DynamicSoundGroup aGroup) { var rndIndex = Random.Range(0, aGroup.groupVariations.Count); var rndVar = aGroup.groupVariations[rndIndex]; switch (rndVar.audLocation) { case MasterAudio.AudioLocation.ResourceFile: StopPreviewer(); var fileName = AudioResourceOptimizer.GetLocalizedDynamicSoundGroupFileName(_organizer.previewLanguage, rndVar.useLocalization, rndVar.resourceFileName); var clip = Resources.Load(fileName) as AudioClip; if (clip != null) { GetPreviewer().PlayOneShot(clip, rndVar.VarAudio.volume); } else { DTGUIHelper.ShowAlert("Could not find Resource file: " + fileName); } break; case MasterAudio.AudioLocation.Clip: GetPreviewer().PlayOneShot(rndVar.VarAudio.clip, rndVar.VarAudio.volume); break; case MasterAudio.AudioLocation.FileOnInternet: if (!string.IsNullOrEmpty(rndVar.internetFileUrl)) { Application.OpenURL(rndVar.internetFileUrl); } break; } }
// ReSharper disable once FunctionComplexityOverflow private void ExportGroupToDgsc(DynamicSoundGroup aGroup) { var newGroup = (GameObject)Instantiate(_organizer.dynGroupTemplate, _organizer.transform.position, Quaternion.identity); newGroup.name = aGroup.name; newGroup.transform.position = _organizer.destObject.transform.position; AudioUndoHelper.CreateObjectForUndo(newGroup, "export Group(s)"); newGroup.transform.parent = _organizer.destObject.transform; var groupTrans = newGroup.transform; foreach (var t in aGroup.groupVariations) { var aVariation = t; var newVariation = (GameObject)Instantiate(_organizer.dynVariationTemplate.gameObject, groupTrans.position, Quaternion.identity); newVariation.transform.parent = groupTrans; newVariation.transform.position = groupTrans.position; var variation = newVariation.GetComponent<DynamicGroupVariation>(); var clipName = aVariation.name; var aVarAudio = aVariation.GetComponent<AudioSource>(); #if UNITY_3_0 || UNITY_3_1 || UNITY_3_2 || UNITY_3_3 || UNITY_3_4 || UNITY_3_5 || UNITY_4_0 // copy fields one by one like below. #else UnityEditorInternal.ComponentUtility.CopyComponent(aVarAudio); // ReSharper disable once ArrangeStaticMemberQualifier GameObject.DestroyImmediate(variation.VarAudio); UnityEditorInternal.ComponentUtility.PasteComponentAsNew(variation.gameObject); UnityEditorInternal.ComponentUtility.MoveComponentUp(variation.VarAudio); #endif switch (aVariation.audLocation) { case MasterAudio.AudioLocation.Clip: var clip = aVarAudio.clip; if (clip == null) { continue; } variation.VarAudio.clip = clip; break; case MasterAudio.AudioLocation.ResourceFile: variation.resourceFileName = aVariation.resourceFileName; variation.useLocalization = aVariation.useLocalization; break; case MasterAudio.AudioLocation.FileOnInternet: variation.internetFileUrl = aVariation.internetFileUrl; break; } variation.audLocation = aVariation.audLocation; variation.VarAudio.dopplerLevel = aVarAudio.dopplerLevel; variation.VarAudio.maxDistance = aVarAudio.maxDistance; variation.VarAudio.minDistance = aVarAudio.minDistance; variation.VarAudio.bypassEffects = aVarAudio.bypassEffects; variation.VarAudio.ignoreListenerVolume = aVarAudio.ignoreListenerVolume; variation.VarAudio.mute = aVarAudio.mute; #if UNITY_4_0 || UNITY_4_1 || UNITY_4_2 || UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_3_5 variation.VarAudio.pan = aVarAudio.pan; #else variation.VarAudio.panStereo = aVarAudio.panStereo; #endif variation.VarAudio.rolloffMode = aVarAudio.rolloffMode; variation.VarAudio.spread = aVarAudio.spread; variation.VarAudio.loop = aVarAudio.loop; variation.VarAudio.pitch = aVarAudio.pitch; variation.transform.name = clipName; variation.isExpanded = aVariation.isExpanded; variation.useRandomPitch = aVariation.useRandomPitch; variation.randomPitchMode = aVariation.randomPitchMode; variation.randomPitchMin = aVariation.randomPitchMin; variation.randomPitchMax = aVariation.randomPitchMax; variation.useRandomVolume = aVariation.useRandomVolume; variation.randomVolumeMode = aVariation.randomVolumeMode; variation.randomVolumeMin = aVariation.randomVolumeMin; variation.randomVolumeMax = aVariation.randomVolumeMax; variation.useFades = aVariation.useFades; variation.fadeInTime = aVariation.fadeInTime; variation.fadeOutTime = aVariation.fadeOutTime; variation.useIntroSilence = aVariation.useIntroSilence; variation.introSilenceMin = aVariation.introSilenceMin; variation.introSilenceMax = aVariation.introSilenceMax; variation.fxTailTime = aVariation.fxTailTime; variation.useRandomStartTime = aVariation.useRandomStartTime; variation.randomStartMinPercent = aVariation.randomStartMinPercent; variation.randomStartMaxPercent = aVariation.randomStartMaxPercent; // remove unused filter FX if (variation.LowPassFilter != null && !variation.LowPassFilter.enabled) { Destroy(variation.LowPassFilter); } if (variation.HighPassFilter != null && !variation.HighPassFilter.enabled) { Destroy(variation.HighPassFilter); } if (variation.DistortionFilter != null && !variation.DistortionFilter.enabled) { Destroy(variation.DistortionFilter); } if (variation.ChorusFilter != null && !variation.ChorusFilter.enabled) { Destroy(variation.ChorusFilter); } if (variation.EchoFilter != null && !variation.EchoFilter.enabled) { Destroy(variation.EchoFilter); } if (variation.ReverbFilter != null && !variation.ReverbFilter.enabled) { Destroy(variation.ReverbFilter); } } // added to Hierarchy! // populate sounds for playing! var groupScript = newGroup.GetComponent<DynamicSoundGroup>(); // populate other properties. groupScript.retriggerPercentage = aGroup.retriggerPercentage; groupScript.groupMasterVolume = aGroup.groupMasterVolume; groupScript.limitMode = aGroup.limitMode; groupScript.limitPerXFrames = aGroup.limitPerXFrames; groupScript.minimumTimeBetween = aGroup.minimumTimeBetween; groupScript.limitPolyphony = aGroup.limitPolyphony; groupScript.voiceLimitCount = aGroup.voiceLimitCount; groupScript.curVariationSequence = aGroup.curVariationSequence; groupScript.useInactivePeriodPoolRefill = aGroup.useInactivePeriodPoolRefill; groupScript.inactivePeriodSeconds = aGroup.inactivePeriodSeconds; groupScript.curVariationMode = aGroup.curVariationMode; groupScript.useDialogFadeOut = aGroup.useDialogFadeOut; groupScript.dialogFadeOutTime = aGroup.dialogFadeOutTime; groupScript.chainLoopDelayMin = aGroup.chainLoopDelayMin; groupScript.chainLoopDelayMax = aGroup.chainLoopDelayMax; groupScript.chainLoopMode = aGroup.chainLoopMode; groupScript.chainLoopNumLoops = aGroup.chainLoopNumLoops; groupScript.childGroupMode = aGroup.childGroupMode; groupScript.childSoundGroups = aGroup.childSoundGroups; #if UNITY_5 groupScript.spatialBlendType = aGroup.spatialBlendType; groupScript.spatialBlend = aGroup.spatialBlend; #endif groupScript.targetDespawnedBehavior = aGroup.targetDespawnedBehavior; groupScript.despawnFadeTime = aGroup.despawnFadeTime; groupScript.resourceClipsAllLoadAsync = aGroup.resourceClipsAllLoadAsync; groupScript.logSound = aGroup.logSound; groupScript.alwaysHighestPriority = aGroup.alwaysHighestPriority; }
public override void OnInspectorGUI() { EditorGUIUtility.LookLikeControls(); EditorGUI.indentLevel = 0; var isDirty = false; _group = (DynamicSoundGroup)target; _group = RescanChildren(_group); var dsgc = _group.transform.parent; DynamicSoundGroupCreator creator = null; if (dsgc != null) { creator = dsgc.GetComponent<DynamicSoundGroupCreator>(); } if (creator == null) { isValid = false; } if (!isValid) { return; } var isInProjectView = DTGUIHelper.IsPrefabInProjectView(_group); if (MasterAudioInspectorResources.logoTexture != null) { DTGUIHelper.ShowHeaderTexture(MasterAudioInspectorResources.logoTexture); } EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); GUI.contentColor = Color.green; if (GUILayout.Button(new GUIContent("Back to Dynamic Sound Group Creator", "Select Group in Hierarchy"), EditorStyles.toolbarButton, GUILayout.Width(220))) { Selection.activeObject = _group.transform.parent.gameObject; } GUI.contentColor = Color.white; GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); var newVol = EditorGUILayout.Slider("Group Master Volume", _group.groupMasterVolume, 0f, 1f); if (newVol != _group.groupMasterVolume) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Group Master Volume"); _group.groupMasterVolume = newVol; } var newVarSequence = (MasterAudioGroup.VariationSequence) EditorGUILayout.EnumPopup("Variation Sequence", _group.curVariationSequence); if (newVarSequence != _group.curVariationSequence) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Variation Sequence"); _group.curVariationSequence = newVarSequence; } if (_group.curVariationSequence == MasterAudioGroup.VariationSequence.TopToBottom) { var newUseInactive = EditorGUILayout.BeginToggleGroup("Refill Variation Pool After Inactive Time", _group.useInactivePeriodPoolRefill); if (newUseInactive != _group.useInactivePeriodPoolRefill) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "toggle Inactive Refill"); _group.useInactivePeriodPoolRefill = newUseInactive; } EditorGUI.indentLevel = 1; var newInactivePeriod = EditorGUILayout.Slider("Inactive Time (sec)", _group.inactivePeriodSeconds, .2f, 30f); if (newInactivePeriod != _group.inactivePeriodSeconds) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Inactive Time"); _group.inactivePeriodSeconds = newInactivePeriod; } EditorGUILayout.EndToggleGroup(); } EditorGUI.indentLevel = 0; var newVarMode = (MasterAudioGroup.VariationMode) EditorGUILayout.EnumPopup("Variation Mode", _group.curVariationMode); if (newVarMode != _group.curVariationMode) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Variation Mode"); _group.curVariationMode = newVarMode; } EditorGUI.indentLevel = 1; switch (_group.curVariationMode) { case MasterAudioGroup.VariationMode.LoopedChain: DTGUIHelper.ShowColorWarning("*In this mode, only one Variation can be played at a time."); var newLoopMode = (MasterAudioGroup.ChainedLoopLoopMode) EditorGUILayout.EnumPopup("Loop Mode", _group.chainLoopMode); if (newLoopMode != _group.chainLoopMode) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Loop Mode"); _group.chainLoopMode = newLoopMode; } if (_group.chainLoopMode == MasterAudioGroup.ChainedLoopLoopMode.NumberOfLoops) { var newLoopCount = EditorGUILayout.IntSlider("Number of Loops", _group.chainLoopNumLoops, 1, 500); if (newLoopCount != _group.chainLoopNumLoops) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Number of Loops"); _group.chainLoopNumLoops = newLoopCount; } } var newDelayMin = EditorGUILayout.Slider("Clip Change Delay Min", _group.chainLoopDelayMin, 0f, 20f); if (newDelayMin != _group.chainLoopDelayMin) { if (_group.chainLoopDelayMax < newDelayMin) { _group.chainLoopDelayMax = newDelayMin; } UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Chained Clip Delay Min"); _group.chainLoopDelayMin = newDelayMin; } var newDelayMax = EditorGUILayout.Slider("Clip Change Delay Max", _group.chainLoopDelayMax, 0f, 20f); if (newDelayMax != _group.chainLoopDelayMax) { if (newDelayMax < _group.chainLoopDelayMin) { newDelayMax = _group.chainLoopDelayMin; } UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Chained Clip Delay Max"); _group.chainLoopDelayMax = newDelayMax; } break; case MasterAudioGroup.VariationMode.Normal: var newRetrigger = EditorGUILayout.IntSlider("Retrigger Percentage", _group.retriggerPercentage, 0, 100); if (newRetrigger != _group.retriggerPercentage) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Retrigger Percentage"); _group.retriggerPercentage = newRetrigger; } var newLimitPoly = EditorGUILayout.Toggle("Limit Polyphony", _group.limitPolyphony); if (newLimitPoly != _group.limitPolyphony) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "toggle Limit Polyphony"); _group.limitPolyphony = newLimitPoly; } if (_group.limitPolyphony) { int maxVoices = 0; for (var i = 0; i < _group.groupVariations.Count; i++) { var variation = _group.groupVariations[i]; maxVoices += variation.weight; } var newVoiceLimit = EditorGUILayout.IntSlider("Polyphony Voice Limit", _group.voiceLimitCount, 1, maxVoices); if (newVoiceLimit != _group.voiceLimitCount) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Polyphony Voice Limit"); _group.voiceLimitCount = newVoiceLimit; } } var newLimitMode = (MasterAudioGroup.LimitMode) EditorGUILayout.EnumPopup("Replay Limit Mode", _group.limitMode); if (newLimitMode != _group.limitMode) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Replay Limit Mode"); _group.limitMode = newLimitMode; } switch (_group.limitMode) { case MasterAudioGroup.LimitMode.FrameBased: var newFrameLimit = EditorGUILayout.IntSlider("Min Frames Between", _group.limitPerXFrames, 1, 120); if (newFrameLimit != _group.limitPerXFrames) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Min Frames Between"); _group.limitPerXFrames = newFrameLimit; } break; case MasterAudioGroup.LimitMode.TimeBased: var newMinTime = EditorGUILayout.Slider("Min Seconds Between", _group.minimumTimeBetween, 0.1f, 10f); if (newMinTime != _group.minimumTimeBetween) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Min Seconds Between"); _group.minimumTimeBetween = newMinTime; } break; } break; case MasterAudioGroup.VariationMode.Dialog: DTGUIHelper.ShowColorWarning("*In this mode, only one Variation can be played at a time."); var newUseDialog = EditorGUILayout.Toggle("Dialog Custom Fade?", _group.useDialogFadeOut); if (newUseDialog != _group.useDialogFadeOut) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "toggle Dialog Custom Fade?"); _group.useDialogFadeOut = newUseDialog; } if (_group.useDialogFadeOut) { var newFadeTime = EditorGUILayout.Slider("Custom Fade Out Time", _group.dialogFadeOutTime, 0.1f, 20f); if (newFadeTime != _group.dialogFadeOutTime) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Custom Fade Out Time"); _group.dialogFadeOutTime = newFadeTime; } } break; } EditorGUI.indentLevel = 0; var newBulkMode = (MasterAudio.AudioLocation) EditorGUILayout.EnumPopup("Variation Create Mode", _group.bulkVariationMode); if (newBulkMode != _group.bulkVariationMode) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Bulk Variation Mode"); _group.bulkVariationMode = newBulkMode; } if (_group.bulkVariationMode == MasterAudio.AudioLocation.ResourceFile) { DTGUIHelper.ShowColorWarning("*Resource mode: make sure to drag from Resource folders only."); } var newLog = EditorGUILayout.Toggle("Log Sounds", _group.logSound); if (newLog != _group.logSound) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "toggle Log Sounds"); _group.logSound = newLog; } int? deadChildIndex = null; if (!Application.isPlaying) { EditorGUILayout.BeginHorizontal(); GUILayout.Space(4); GUILayout.Label("Actions", EditorStyles.wordWrappedLabel, GUILayout.Width(50f)); GUILayout.Space(96); GUI.contentColor = Color.green; if (GUILayout.Button(new GUIContent("Equalize Weights", "Reset Weights to one"), EditorStyles.toolbarButton, GUILayout.Width(120))) { isDirty = true; EqualizeWeights(_group); } GUILayout.Space(10); if (GUILayout.Button(new GUIContent("Equalize Variation Volumes"), EditorStyles.toolbarButton, GUILayout.Width(150))) { EqualizeVariationVolumes(_group.groupVariations); } GUI.contentColor = Color.white; EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); } if (!Application.isPlaying) { // new variation settings EditorGUILayout.BeginVertical(); var anEvent = Event.current; if (isInProjectView) { DTGUIHelper.ShowLargeBarAlert("*You are in Project View and cannot create Variations."); DTGUIHelper.ShowLargeBarAlert("*Pull this prefab into the Scene to create Variations."); } else { GUI.color = Color.yellow; var dragArea = GUILayoutUtility.GetRect(0f,35f,GUILayout.ExpandWidth(true)); GUI.Box (dragArea, "Drag Audio clips here to create Variations!"); GUI.color = Color.white; 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; } CreateVariation(_group, aClip); } } Event.current.Use(); break; } } EditorGUILayout.EndVertical(); // end new variation settings } if (_group.groupVariations.Count == 0) { DTGUIHelper.ShowRedError("You currently have no Variations."); } else { _group.groupVariations.Sort(delegate(DynamicGroupVariation x, DynamicGroupVariation y) { return x.name.CompareTo(y.name); }); for (var i = 0; i < _group.groupVariations.Count; i++) { var variation = _group.groupVariations[i]; EditorGUILayout.BeginHorizontal(EditorStyles.objectFieldThumb); EditorGUILayout.LabelField(variation.name, EditorStyles.boldLabel); GUILayout.FlexibleSpace(); if (GUILayout.Button(new GUIContent(MasterAudioInspectorResources.gearTexture, "Click to goto Variation"), EditorStyles.toolbarButton, GUILayout.Width(40))) { Selection.activeObject = variation; } if (!Application.isPlaying) { if (GUILayout.Button(new GUIContent(MasterAudioInspectorResources.deleteTexture, "Click to delete this Variation"), EditorStyles.toolbarButton, GUILayout.Width(40))) { deadChildIndex = i; isDirty = true; } } var varIsDirty = false; var buttonPressed = DTGUIHelper.AddDynamicGroupButtons(_group); switch (buttonPressed) { case DTGUIHelper.DTFunctionButtons.Play: if (variation.audLocation == MasterAudio.AudioLocation.ResourceFile) { creator.PreviewerInstance.Stop(); creator.PreviewerInstance.PlayOneShot(Resources.Load(variation.resourceFileName) as AudioClip); } else { variation.GetComponent<AudioSource>().Stop(); variation.GetComponent<AudioSource>().Play(); } isDirty = true; break; case DTGUIHelper.DTFunctionButtons.Stop: if (variation.audLocation == MasterAudio.AudioLocation.ResourceFile) { creator.PreviewerInstance.Stop(); } else { variation.GetComponent<AudioSource>().Stop(); } isDirty = true; break; } EditorGUILayout.EndHorizontal(); if (!Application.isPlaying) { DTGUIHelper.ShowColorWarning("*Fading & random settings are ignored by preview in edit mode."); } if (variation.GetComponent<AudioSource>() == null) { DTGUIHelper.ShowRedError(string.Format("The Variation: '{0}' has no Audio Source.", variation.name)); break; } var oldLocation = variation.audLocation; var newLocation = (MasterAudio.AudioLocation) EditorGUILayout.EnumPopup("Audio Origin", variation.audLocation); if (newLocation != variation.audLocation) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Audio Origin"); variation.audLocation = newLocation; } switch (variation.audLocation) { case MasterAudio.AudioLocation.Clip: var newClip = (AudioClip) EditorGUILayout.ObjectField("Audio Clip", variation.GetComponent<AudioSource>().clip, typeof(AudioClip), false); if (newClip != variation.GetComponent<AudioSource>().clip) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation.GetComponent<AudioSource>(), "change Audio Clip"); variation.GetComponent<AudioSource>().clip = newClip; } break; case MasterAudio.AudioLocation.ResourceFile: if (oldLocation != variation.audLocation) { if (variation.GetComponent<AudioSource>().clip != null) { Debug.Log("Audio clip removed to prevent unnecessary memory usage on Resource file Variation."); } variation.GetComponent<AudioSource>().clip = null; varIsDirty = true; } EditorGUILayout.BeginVertical(); var anEvent = Event.current; GUI.color = Color.yellow; 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; 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; } UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Resource Filename"); variation.resourceFileName = aClip.name; } } Event.current.Use(); break; } EditorGUILayout.EndVertical(); var newFilename = EditorGUILayout.TextField("Resource Filename", variation.resourceFileName); if (newFilename != variation.resourceFileName) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Resource Filename"); variation.resourceFileName = newFilename; } break; } var newVolume = EditorGUILayout.Slider("Volume", variation.GetComponent<AudioSource>().volume, 0f, 1f); if (newVolume != variation.GetComponent<AudioSource>().volume) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation.GetComponent<AudioSource>(), "change Volume"); variation.GetComponent<AudioSource>().volume = newVolume; } var newPitch = EditorGUILayout.Slider("Pitch", variation.GetComponent<AudioSource>().pitch, -3f, 3f); if (newPitch != variation.GetComponent<AudioSource>().pitch) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation.GetComponent<AudioSource>(), "change Pitch"); variation.GetComponent<AudioSource>().pitch = newPitch; } var newLoop = EditorGUILayout.Toggle("Loop Clip", variation.GetComponent<AudioSource>().loop); if (newLoop != variation.GetComponent<AudioSource>().loop) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation.GetComponent<AudioSource>(), "toggle Loop Clip"); variation.GetComponent<AudioSource>().loop = newLoop; } var newWeight = EditorGUILayout.IntSlider("Weight (Instances)", variation.weight, 0, 100); if (newWeight != variation.weight) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Weight"); variation.weight = newWeight; } var newFxTailTime = EditorGUILayout.Slider("FX Tail Time", variation.fxTailTime, 0f, 10f); if (newFxTailTime != variation.fxTailTime) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change FX Tail Time"); variation.fxTailTime = newFxTailTime; } var newUseRndPitch = EditorGUILayout.BeginToggleGroup("Use Random Pitch", variation.useRandomPitch); if (newUseRndPitch != variation.useRandomPitch) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "toggle Use Random Pitch"); variation.useRandomPitch = newUseRndPitch; } if (variation.useRandomPitch) { var newMode = (SoundGroupVariation.RandomPitchMode) EditorGUILayout.EnumPopup("Pitch Compute Mode", variation.randomPitchMode); if (newMode != variation.randomPitchMode) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Pitch Compute Mode"); variation.randomPitchMode = newMode; } var newPitchMin = EditorGUILayout.Slider("Random Pitch Min", variation.randomPitchMin, -3f, 3f); if (newPitchMin != variation.randomPitchMin) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Random Pitch Min"); variation.randomPitchMin = newPitchMin; if (variation.randomPitchMax <= variation.randomPitchMin) { variation.randomPitchMax = variation.randomPitchMin; } } var newPitchMax = EditorGUILayout.Slider("Random Pitch Max", variation.randomPitchMax, -3f, 3f); if (newPitchMax != variation.randomPitchMax) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Random Pitch Max"); variation.randomPitchMax = newPitchMax; if (variation.randomPitchMin > variation.randomPitchMax) { variation.randomPitchMin = variation.randomPitchMax; } } } EditorGUILayout.EndToggleGroup(); var newUseRndVol = EditorGUILayout.BeginToggleGroup("Use Random Volume", variation.useRandomVolume); if (newUseRndVol != variation.useRandomVolume) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "toggle Use Random Volume"); variation.useRandomVolume = newUseRndVol; } if (variation.useRandomVolume) { var newMode = (SoundGroupVariation.RandomVolumeMode) EditorGUILayout.EnumPopup("Volume Compute Mode", variation.randomVolumeMode); if (newMode != variation.randomVolumeMode) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Volume Compute Mode"); variation.randomVolumeMode = newMode; } var volMin = 0f; if (variation.randomVolumeMode == SoundGroupVariation.RandomVolumeMode.AddToClipVolume) { volMin = -1f; } var newVolMin = EditorGUILayout.Slider("Random Volume Min", variation.randomVolumeMin, volMin, 1f); if (newVolMin != variation.randomVolumeMin) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Random Volume Min"); variation.randomVolumeMin = newVolMin; if (variation.randomVolumeMax <= variation.randomVolumeMin) { variation.randomVolumeMax = variation.randomVolumeMin; } } var newVolMax = EditorGUILayout.Slider("Random Volume Max", variation.randomVolumeMax, volMin, 1f); if (newVolMax != variation.randomVolumeMax) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Random Volume Max"); variation.randomVolumeMax = newVolMax; if (variation.randomVolumeMin > variation.randomVolumeMax) { variation.randomVolumeMin = variation.randomVolumeMax; } } } EditorGUILayout.EndToggleGroup(); var newSilence = EditorGUILayout.BeginToggleGroup("Use Random Delay", variation.useIntroSilence); if (newSilence != variation.useIntroSilence) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "toggle Use Random Delay"); variation.useIntroSilence = newSilence; } if (variation.useIntroSilence) { var newSilenceMin = EditorGUILayout.Slider("Delay Min (sec)", variation.introSilenceMin, 0f, 100f); if (newSilenceMin != variation.introSilenceMin) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, 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) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Delay Max (sec)"); variation.introSilenceMax = newSilenceMax; if (variation.introSilenceMax < variation.introSilenceMin) { variation.introSilenceMin = newSilenceMax; } } } EditorGUILayout.EndToggleGroup(); var newFades = EditorGUILayout.BeginToggleGroup("Use Custom Fading", variation.useFades); if (newFades != variation.useFades) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "toggle Use Custom Fading"); variation.useFades = newFades; } if (variation.useFades) { var newFadeIn = EditorGUILayout.Slider("Fade In Time (sec)", variation.fadeInTime, 0f, 10f); if (newFadeIn != variation.fadeInTime) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Fade In Time"); variation.fadeInTime = newFadeIn; } var newFadeOut = EditorGUILayout.Slider("Fade Out time (sec)", variation.fadeOutTime, 0f, 10f); if (newFadeOut != variation.fadeOutTime) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Fade Out Time"); variation.fadeOutTime = newFadeOut; } } EditorGUILayout.EndToggleGroup(); EditorGUILayout.Separator(); if (varIsDirty) { EditorUtility.SetDirty(variation.GetComponent<AudioSource>()); EditorUtility.SetDirty(variation); } } } if (deadChildIndex.HasValue) { var deadVar = _group.groupVariations[deadChildIndex.Value]; if (deadVar != null) { // delete variation from Hierarchy UndoHelper.DestroyForUndo(deadVar.gameObject); } // delete group. _group.groupVariations.RemoveAt(deadChildIndex.Value); } if (GUI.changed || isDirty) { EditorUtility.SetDirty(target); } //DrawDefaultInspector(); }
/// <summary> /// This method will create a new Sound Group from the Audio Clips you pass in. /// </summary> /// <param name="gInfo">The object containing all variations and group info.</param> /// <param name="creatorObjectName">The name of the object creating this group (for debug).</param> /// <returns>Whether or not the Sound Group was created.</returns> public static Transform CreateNewSoundGroup(DynamicSoundGroup aGroup, string creatorObjectName) { if (!SceneHasMasterAudio) { return null; } if (!SoundsReady) { Debug.LogError("MasterAudio not finished initializing sounds. Cannot create new group yet."); return null; } var groupName = aGroup.transform.name; var ma = MasterAudio.Instance; if (MasterAudio.Instance.trans.FindChild(groupName) != null) { Debug.LogError("Cannot add a new Sound Group named '" + groupName + "' because there is already a Sound Group of that name."); return null; } GameObject newGroup = (GameObject)GameObject.Instantiate( ma.soundGroupTemplate.gameObject, ma.trans.position, Quaternion.identity); var groupTrans = newGroup.transform; groupTrans.name = UtilStrings.TrimSpace(groupName); groupTrans.parent = MasterAudio.Instance.trans; SoundGroupVariation variation = null; DynamicGroupVariation aVariation = null; AudioClip clip = null; for (var i = 0; i < aGroup.groupVariations.Count; i++) { aVariation = aGroup.groupVariations[i]; for (var j = 0; j < aVariation.weight; j++) { GameObject newVariation = (GameObject)GameObject.Instantiate(aVariation.gameObject, groupTrans.position, Quaternion.identity); newVariation.transform.parent = groupTrans; // remove dynamic group variation script. GameObject.Destroy(newVariation.GetComponent<DynamicGroupVariation>()); newVariation.AddComponent<SoundGroupVariation>(); variation = newVariation.GetComponent<SoundGroupVariation>(); var clipName = variation.name; var cloneIndex = clipName.IndexOf("(Clone)"); if (cloneIndex >= 0) { clipName = clipName.Substring(0, cloneIndex); } switch (aVariation.audLocation) { case MasterAudio.AudioLocation.Clip: clip = aVariation.audio.clip; if (clip == null) { Debug.LogWarning("No clip specified in DynamicSoundGroupCreator '" + creatorObjectName + "' - skipping this item."); continue; } variation.audio.clip = clip; break; case MasterAudio.AudioLocation.ResourceFile: AudioResourceOptimizer.AddTargetForClip(aVariation.resourceFileName, variation.audio); variation.audLocation = MasterAudio.AudioLocation.ResourceFile; variation.resourceFileName = aVariation.resourceFileName; break; } variation.original_Pitch = aVariation.audio.pitch; variation.transform.name = clipName; variation.useRandomPitch = aVariation.useRandomPitch; variation.randomPitchMode = aVariation.randomPitchMode; variation.randomPitchMin = aVariation.randomPitchMin; variation.randomPitchMax = aVariation.randomPitchMax; variation.useRandomVolume = aVariation.useRandomVolume; variation.randomVolumeMode = aVariation.randomVolumeMode; variation.randomVolumeMin = aVariation.randomVolumeMin; variation.randomVolumeMax = aVariation.randomVolumeMax; variation.useFades = aVariation.useFades; variation.fadeInTime = aVariation.fadeInTime; variation.fadeOutTime = aVariation.fadeOutTime; variation.useIntroSilence = aVariation.useIntroSilence; variation.introSilenceMin = aVariation.introSilenceMin; variation.introSilenceMax = aVariation.introSilenceMax; // remove unused filter FX if (variation.LowPassFilter != null && !variation.LowPassFilter.enabled) { GameObject.Destroy(variation.LowPassFilter); } if (variation.HighPassFilter != null && !variation.HighPassFilter.enabled) { GameObject.Destroy(variation.HighPassFilter); } if (variation.DistortionFilter != null && !variation.DistortionFilter.enabled) { GameObject.Destroy(variation.DistortionFilter); } if (variation.ChorusFilter != null && !variation.ChorusFilter.enabled) { GameObject.Destroy(variation.ChorusFilter); } if (variation.EchoFilter != null && !variation.EchoFilter.enabled) { GameObject.Destroy(variation.EchoFilter); } if (variation.ReverbFilter != null && !variation.ReverbFilter.enabled) { GameObject.Destroy(variation.ReverbFilter); } } } // added to Hierarchy! // populate sounds for playing! var groupScript = newGroup.GetComponent<MasterAudioGroup>(); // populate other properties. groupScript.retriggerPercentage = aGroup.retriggerPercentage; groupScript.groupMasterVolume = aGroup.groupMasterVolume; groupScript.limitMode = aGroup.limitMode; groupScript.limitPerXFrames = aGroup.limitPerXFrames; groupScript.minimumTimeBetween = aGroup.minimumTimeBetween; groupScript.limitPolyphony = aGroup.limitPolyphony; groupScript.voiceLimitCount = aGroup.voiceLimitCount; groupScript.curVariationSequence = aGroup.curVariationSequence; groupScript.useInactivePeriodPoolRefill = aGroup.useInactivePeriodPoolRefill; groupScript.inactivePeriodSeconds = aGroup.inactivePeriodSeconds; groupScript.curVariationMode = aGroup.curVariationMode; groupScript.useDialogFadeOut = aGroup.useDialogFadeOut; groupScript.dialogFadeOutTime = aGroup.dialogFadeOutTime; groupScript.chainLoopDelayMin = aGroup.chainLoopDelayMin; groupScript.chainLoopDelayMax = aGroup.chainLoopDelayMax; groupScript.chainLoopMode = aGroup.chainLoopMode; groupScript.chainLoopNumLoops = aGroup.chainLoopNumLoops; var sources = new List<AudioInfo>(); Transform aChild; AudioSource aSource; var playedStatuses = new List<int>(); for (var i = 0; i < newGroup.transform.childCount; i++) { playedStatuses.Add(i); aChild = newGroup.transform.GetChild(i); aSource = aChild.GetComponent<AudioSource>(); variation = aChild.GetComponent<SoundGroupVariation>(); sources.Add(new AudioInfo(variation, aSource, aSource.volume)); } audioSourcesBySoundType.Add(groupName, new AudioGroupInfo(sources, groupScript)); // fill up randomizer randomizer.Add(groupName, playedStatuses); clipsPlayedBySoundTypeOldestFirst.Add(groupName, new List<int>(playedStatuses.Count)); if (!string.IsNullOrEmpty(aGroup.busName)) { groupScript.busIndex = GetBusIndex(aGroup.busName, true); } return groupTrans; }
// ReSharper disable once FunctionComplexityOverflow public override void OnInspectorGUI() { EditorGUIUtility.LookLikeControls(); EditorGUI.indentLevel = 0; var isDirty = false; _isValid = true; _group = (DynamicSoundGroup)target; _group = RescanChildren(_group); if (_group == null) { return; } var theParent = _group.transform.parent; if (theParent != null) { _previewer = theParent.gameObject; } if (_previewer == null) { DTGUIHelper.ShowRedError("This prefab must have a GameObject above it. Prefab broken."); _isValid = false; } var previewLang = SystemLanguage.English; if (!_isValid) { return; } _dgsc = _previewer.GetComponent<DynamicSoundGroupCreator>(); if (_dgsc != null) { previewLang = _dgsc.previewLanguage; } var ma = MasterAudio.Instance; var maInScene = ma != null; if (maInScene) { _groupNames = ma.GroupNames; _groupNames.Remove(_group.name); _customEventNames = ma.CustomEventNames; } var isInProjectView = DTGUIHelper.IsPrefabInProjectView(_group); if (MasterAudioInspectorResources.LogoTexture != null) { DTGUIHelper.ShowHeaderTexture(MasterAudioInspectorResources.LogoTexture); } EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); GUI.contentColor = DTGUIHelper.BrightButtonColor; if (GUILayout.Button(new GUIContent("Up to Parent", "Select Group in Hierarchy"), EditorStyles.toolbarButton, GUILayout.Width(100))) { Selection.activeObject = _group.transform.parent.gameObject; } GUI.contentColor = Color.white; GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); var newVol = DTGUIHelper.DisplayVolumeField(_group.groupMasterVolume, DTGUIHelper.VolumeFieldType.None, MasterAudio.MixerWidthMode.Normal, 0f, true, "Group Master Volume"); if (newVol != _group.groupMasterVolume) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Group Master Volume"); _group.groupMasterVolume = newVol; } var newTargetGone = (MasterAudioGroup.TargetDespawnedBehavior)EditorGUILayout.EnumPopup("Caller Despawned Mode", _group.targetDespawnedBehavior); if (newTargetGone != _group.targetDespawnedBehavior) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "Change Caller Despawned Mode"); _group.targetDespawnedBehavior = newTargetGone; } if (_group.targetDespawnedBehavior == MasterAudioGroup.TargetDespawnedBehavior.FadeOut) { EditorGUI.indentLevel = 1; var newFade = EditorGUILayout.Slider("Fade Out Time", _group.despawnFadeTime, .1f, 20f); if (newFade != _group.despawnFadeTime) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "Change Called Despawned Fade Out Time"); _group.despawnFadeTime = newFade; } } var groupHasResource = false; foreach (var t in _group.groupVariations) { if (t.audLocation != MasterAudio.AudioLocation.ResourceFile) { continue; } groupHasResource = true; break; } if (MasterAudio.HasAsyncResourceLoaderFeature() && groupHasResource) { if ((maInScene && !ma.resourceClipsAllLoadAsync) || !maInScene) { var newAsync = EditorGUILayout.Toggle(new GUIContent("Load Resources Async", "Checking this means Resource files in this Sound Group will be loaded asynchronously."), _group.resourceClipsAllLoadAsync); if (newAsync != _group.resourceClipsAllLoadAsync) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "toggle Load Resources Async"); _group.resourceClipsAllLoadAsync = newAsync; } } } if (!maInScene || ma.prioritizeOnDistance) { var hiPri = EditorGUILayout.Toggle("Always Highest Priority", _group.alwaysHighestPriority); if (hiPri != _group.alwaysHighestPriority) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "toggle Always Highest Priority"); _group.alwaysHighestPriority = hiPri; } } var newLog = EditorGUILayout.Toggle("Log Sounds", _group.logSound); if (newLog != _group.logSound) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "toggle Log Sounds"); _group.logSound = newLog; } #if UNITY_5 DTGUIHelper.ShowLargeBarAlert("The Spatial Blend Rule below will only be used if the Master Audio prefab allows."); DTGUIHelper.StartGroupHeader(); var newSpatialType = (MasterAudio.ItemSpatialBlendType)EditorGUILayout.EnumPopup("Spatial Blend Rule", _group.spatialBlendType); if (newSpatialType != _group.spatialBlendType) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Spatial Blend Rule"); _group.spatialBlendType = newSpatialType; } EditorGUILayout.EndVertical(); switch (_group.spatialBlendType) { case MasterAudio.ItemSpatialBlendType.ForceToCustom: EditorGUI.indentLevel = 0; DTGUIHelper.ShowLargeBarAlert(MasterAudioInspector.SpatialBlendSliderText); var newBlend = EditorGUILayout.Slider("Spatial Blend", _group.spatialBlend, 0f, 1f); if (newBlend != _group.spatialBlend) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Spatial Blend"); _group.spatialBlend = newBlend; } break; } EditorGUILayout.EndVertical(); #endif EditorGUI.indentLevel = 0; DTGUIHelper.StartGroupHeader(); var newVarSequence = (MasterAudioGroup.VariationSequence)EditorGUILayout.EnumPopup("Variation Sequence", _group.curVariationSequence); if (newVarSequence != _group.curVariationSequence) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Variation Sequence"); _group.curVariationSequence = newVarSequence; } EditorGUILayout.EndVertical(); if (_group.curVariationSequence == MasterAudioGroup.VariationSequence.TopToBottom) { var newUseInactive = EditorGUILayout.BeginToggleGroup(" Refill Variation Pool After Inactive Time", _group.useInactivePeriodPoolRefill); if (newUseInactive != _group.useInactivePeriodPoolRefill) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "toggle Inactive Refill"); _group.useInactivePeriodPoolRefill = newUseInactive; } EditorGUI.indentLevel = 1; var newInactivePeriod = EditorGUILayout.Slider(" Inactive Time (sec)", _group.inactivePeriodSeconds, .2f, 30f); if (newInactivePeriod != _group.inactivePeriodSeconds) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Inactive Time"); _group.inactivePeriodSeconds = newInactivePeriod; } EditorGUILayout.EndToggleGroup(); } EditorGUILayout.EndVertical(); EditorGUI.indentLevel = 0; DTGUIHelper.AddSpaceForNonU5(2); DTGUIHelper.StartGroupHeader(); var newVarMode = (MasterAudioGroup.VariationMode)EditorGUILayout.EnumPopup("Variation Mode", _group.curVariationMode); if (newVarMode != _group.curVariationMode) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Variation Mode"); _group.curVariationMode = newVarMode; } EditorGUILayout.EndVertical(); EditorGUI.indentLevel = 0; switch (_group.curVariationMode) { case MasterAudioGroup.VariationMode.LoopedChain: DTGUIHelper.ShowColorWarning("In this mode, only one Variation can be played at a time."); var newLoopMode = (MasterAudioGroup.ChainedLoopLoopMode)EditorGUILayout.EnumPopup("Loop Mode", _group.chainLoopMode); if (newLoopMode != _group.chainLoopMode) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Loop Mode"); _group.chainLoopMode = newLoopMode; } if (_group.chainLoopMode == MasterAudioGroup.ChainedLoopLoopMode.NumberOfLoops) { var newLoopCount = EditorGUILayout.IntSlider("Number of Loops", _group.chainLoopNumLoops, 1, 500); if (newLoopCount != _group.chainLoopNumLoops) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Number of Loops"); _group.chainLoopNumLoops = newLoopCount; } } var newDelayMin = EditorGUILayout.Slider("Clip Change Delay Min", _group.chainLoopDelayMin, 0f, 20f); if (newDelayMin != _group.chainLoopDelayMin) { if (_group.chainLoopDelayMax < newDelayMin) { _group.chainLoopDelayMax = newDelayMin; } AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Chained Clip Delay Min"); _group.chainLoopDelayMin = newDelayMin; } var newDelayMax = EditorGUILayout.Slider("Clip Change Delay Max", _group.chainLoopDelayMax, 0f, 20f); if (newDelayMax != _group.chainLoopDelayMax) { if (newDelayMax < _group.chainLoopDelayMin) { newDelayMax = _group.chainLoopDelayMin; } AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Chained Clip Delay Max"); _group.chainLoopDelayMax = newDelayMax; } break; case MasterAudioGroup.VariationMode.Normal: var newRetrigger = EditorGUILayout.IntSlider("Retrigger Percentage", _group.retriggerPercentage, 0, 100); if (newRetrigger != _group.retriggerPercentage) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Retrigger Percentage"); _group.retriggerPercentage = newRetrigger; } var newLimitPoly = EditorGUILayout.Toggle("Limit Polyphony", _group.limitPolyphony); if (newLimitPoly != _group.limitPolyphony) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "toggle Limit Polyphony"); _group.limitPolyphony = newLimitPoly; } if (_group.limitPolyphony) { var maxVoices = 0; foreach (var variation in _group.groupVariations) { maxVoices += variation.weight; } var newVoiceLimit = EditorGUILayout.IntSlider("Polyphony Voice Limit", _group.voiceLimitCount, 1, maxVoices); if (newVoiceLimit != _group.voiceLimitCount) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Polyphony Voice Limit"); _group.voiceLimitCount = newVoiceLimit; } } var newLimitMode = (MasterAudioGroup.LimitMode)EditorGUILayout.EnumPopup("Replay Limit Mode", _group.limitMode); if (newLimitMode != _group.limitMode) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Replay Limit Mode"); _group.limitMode = newLimitMode; } switch (_group.limitMode) { case MasterAudioGroup.LimitMode.FrameBased: var newFrameLimit = EditorGUILayout.IntSlider("Min Frames Between", _group.limitPerXFrames, 1, 120); if (newFrameLimit != _group.limitPerXFrames) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Min Frames Between"); _group.limitPerXFrames = newFrameLimit; } break; case MasterAudioGroup.LimitMode.TimeBased: var newMinTime = EditorGUILayout.Slider("Min Seconds Between", _group.minimumTimeBetween, 0.1f, 10f); if (newMinTime != _group.minimumTimeBetween) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Min Seconds Between"); _group.minimumTimeBetween = newMinTime; } break; } break; case MasterAudioGroup.VariationMode.Dialog: DTGUIHelper.ShowColorWarning("In this mode, only one Variation can be played at a time."); var newUseDialog = EditorGUILayout.Toggle("Dialog Custom Fade?", _group.useDialogFadeOut); if (newUseDialog != _group.useDialogFadeOut) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "toggle Dialog Custom Fade?"); _group.useDialogFadeOut = newUseDialog; } if (_group.useDialogFadeOut) { var newFadeTime = EditorGUILayout.Slider("Custom Fade Out Time", _group.dialogFadeOutTime, 0.1f, 20f); if (newFadeTime != _group.dialogFadeOutTime) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Custom Fade Out Time"); _group.dialogFadeOutTime = newFadeTime; } } break; } EditorGUILayout.EndVertical(); DTGUIHelper.AddSpaceForNonU5(2); DTGUIHelper.StartGroupHeader(); EditorGUI.indentLevel = 0; var canCopy = false; var newChildMode = (MasterAudioGroup.ChildGroupMode)EditorGUILayout.EnumPopup(new GUIContent("Linked Group Mode", "Groups you set up in this section will also get played automatically when this Group plays."), _group.childGroupMode); if (newChildMode != _group.childGroupMode) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Linked Group Mode"); _group.childGroupMode = newChildMode; } EditorGUILayout.EndVertical(); if (_group.childGroupMode != MasterAudioGroup.ChildGroupMode.None) { if (_group.childSoundGroups.Count == 0) { DTGUIHelper.ShowLargeBarAlert("You have no other Groups set up to trigger."); EditorGUILayout.Separator(); } EditorGUI.indentLevel = 1; for (var i = 0; i < _group.childSoundGroups.Count; i++) { var aGroup = _group.childSoundGroups[i]; if (maInScene) { var existingIndex = _groupNames.IndexOf(aGroup); int? groupIndex = null; EditorGUI.indentLevel = 0; var noGroup = false; var noMatch = false; if (existingIndex >= 1) { groupIndex = EditorGUILayout.Popup("Sound Group", existingIndex, _groupNames.ToArray()); if (existingIndex == 1) { noGroup = true; } } else if (existingIndex == -1 && aGroup == MasterAudio.NoGroupName) { groupIndex = EditorGUILayout.Popup("Sound Group", existingIndex, _groupNames.ToArray()); } else { // non-match noMatch = true; var newSound = EditorGUILayout.TextField("Sound Group", aGroup); if (newSound != aGroup) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Sound Group"); _group.childSoundGroups[i] = newSound; } var newIndex = EditorGUILayout.Popup("All Sound Groups", -1, _groupNames.ToArray()); if (newIndex >= 0) { groupIndex = newIndex; } } if (noGroup) { DTGUIHelper.ShowRedError("No Sound Group specified. Action will do nothing."); } else if (noMatch) { DTGUIHelper.ShowRedError("Sound Group found no match. Type in or choose one."); } if (!groupIndex.HasValue) { continue; } if (existingIndex != groupIndex.Value) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Sound Group"); } if (groupIndex.Value == -1) { _group.childSoundGroups[i] = MasterAudio.NoGroupName; } else { _group.childSoundGroups[i] = _groupNames[groupIndex.Value]; } } else { var newSType = EditorGUILayout.TextField("Sound Group", aGroup); if (newSType == aGroup) { continue; } AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Sound Group"); _group.childSoundGroups[i] = newSType; } } GUI.contentColor = DTGUIHelper.BrightButtonColor; EditorGUILayout.BeginHorizontal(); if (GUILayout.Button(new GUIContent("Add Trigger Group"), EditorStyles.toolbarButton, GUILayout.Width(120))) { _group.childSoundGroups.Add(string.Empty); } GUILayout.Space(10); if (GUILayout.Button(new GUIContent("Delete Trigger Group", "Delete the last Trigger Group"), EditorStyles.toolbarButton, GUILayout.Width(120))) { _group.childSoundGroups.RemoveAt(_group.childSoundGroups.Count - 1); } EditorGUILayout.EndHorizontal(); GUI.contentColor = Color.white; } EditorGUILayout.EndVertical(); EditorGUI.indentLevel = 0; DTGUIHelper.StartGroupHeader(); var newUse = EditorGUILayout.BeginToggleGroup(" Group Played Event", _group.soundPlayedEventActive); if (newUse != _group.soundPlayedEventActive) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "toggle expand Group Played Event"); _group.soundPlayedEventActive = newUse; } DTGUIHelper.EndGroupHeader(); GUI.color = Color.white; if (_group.soundPlayedEventActive) { DTGUIHelper.ShowColorWarning("When this Group plays, fire Custom Event below."); if (maInScene) { var existingIndex = _customEventNames.IndexOf(_group.soundPlayedCustomEvent); int? customEventIndex = null; EditorGUI.indentLevel = 0; var noEvent = false; var noMatch = false; if (existingIndex >= 1) { customEventIndex = EditorGUILayout.Popup("Custom Event Name", existingIndex, _customEventNames.ToArray()); if (existingIndex == 1) { noEvent = true; } } else if (existingIndex == -1 && _group.soundPlayedCustomEvent == MasterAudio.NoGroupName) { customEventIndex = EditorGUILayout.Popup("Custom Event Name", existingIndex, _customEventNames.ToArray()); } else { // non-match noMatch = true; var newEventName = EditorGUILayout.TextField("Custom Event Name", _group.soundPlayedCustomEvent); if (newEventName != _group.soundPlayedCustomEvent) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Custom Event Name"); _group.soundPlayedCustomEvent = newEventName; } var newIndex = EditorGUILayout.Popup("All Custom Events", -1, _customEventNames.ToArray()); if (newIndex >= 0) { customEventIndex = newIndex; } } if (noEvent) { DTGUIHelper.ShowRedError("No Custom Event specified. This section will do nothing."); } else if (noMatch) { DTGUIHelper.ShowRedError("Custom Event found no match. Type in or choose one."); } if (customEventIndex.HasValue) { if (existingIndex != customEventIndex.Value) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Custom Event"); } // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression if (customEventIndex.Value == -1) { _group.soundPlayedCustomEvent = MasterAudio.NoGroupName; } else { _group.soundPlayedCustomEvent = _customEventNames[customEventIndex.Value]; } } } else { var newCustomEvent = EditorGUILayout.TextField("Custom Event Name", _group.soundPlayedCustomEvent); if (newCustomEvent != _group.soundPlayedCustomEvent) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "Custom Event Name"); _group.soundPlayedCustomEvent = newCustomEvent; } } } EditorGUILayout.EndToggleGroup(); if (!Application.isPlaying) { DTGUIHelper.AddSpaceForNonU5(2); DTGUIHelper.StartGroupHeader(); EditorGUI.indentLevel = 1; var newBulk = DTGUIHelper.Foldout(_group.copySettingsExpanded, "Copy Settings"); if (newBulk != _group.copySettingsExpanded) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "toggle Copy Settings"); _group.copySettingsExpanded = newBulk; } EditorGUILayout.EndVertical(); EditorGUI.indentLevel = 0; GUI.color = Color.white; if (_group.copySettingsExpanded) { if (_group.groupVariations.Count == 0) { DTGUIHelper.ShowLargeBarAlert("You currently have no Variations in this Group."); } else if (_group.groupVariations.Count == 1) { DTGUIHelper.ShowLargeBarAlert("You only have a single Variation in this Group. Nothing to copy to."); } else { canCopy = true; var varNames = new List<string>(_group.groupVariations.Count); foreach (var t in _group.groupVariations) { varNames.Add(t.name); } if (_group.selectedVariationIndex >= varNames.Count) { _group.selectedVariationIndex = 0; } var newVar = EditorGUILayout.Popup("Source Variation", _group.selectedVariationIndex, varNames.ToArray()); if (newVar != _group.selectedVariationIndex) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Source Variation"); _group.selectedVariationIndex = newVar; } EditorGUILayout.BeginHorizontal(); GUILayout.Label("Target Variations"); GUILayout.Space(44); GUI.contentColor = DTGUIHelper.BrightButtonColor; if (GUILayout.Button("Check All", EditorStyles.toolbarButton, GUILayout.Width(80))) { CheckAll(); } GUILayout.Space(10); if (GUILayout.Button("Uncheck All", EditorStyles.toolbarButton, GUILayout.Width(80))) { UncheckAll(); } GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); DTGUIHelper.ShowColorWarning( "Click buttons below to copy from Source to checked Variations."); var hasSelected = GetNonMatchingVariations().Count > 0; if (!hasSelected) { DTGUIHelper.ShowRedError( "You have no Variations checked. Please use the checkboxes."); EditorGUILayout.Separator(); } var sourceVar = _group.groupVariations[_group.selectedVariationIndex]; const int btnWidth = 96; GUI.contentColor = DTGUIHelper.BrightButtonColor; EditorGUILayout.BeginHorizontal(); GUILayout.Space(10); if (GUILayout.Button("Volume", EditorStyles.toolbarButton, GUILayout.Width(btnWidth))) { CopyVolumes(sourceVar); isDirty = true; } GUILayout.Space(10); if (GUILayout.Button("Pitch", EditorStyles.toolbarButton, GUILayout.Width(btnWidth))) { CopyPitches(sourceVar); isDirty = true; } GUILayout.Space(10); if (GUILayout.Button("Loop", EditorStyles.toolbarButton, GUILayout.Width(btnWidth))) { CopyLoops(sourceVar); isDirty = true; } EditorGUILayout.EndHorizontal(); DTGUIHelper.VerticalSpace(2); EditorGUILayout.BeginHorizontal(); GUILayout.Space(10); if (GUILayout.Button("FX Tail Time", EditorStyles.toolbarButton, GUILayout.Width(btnWidth))) { CopyFxTail(sourceVar); isDirty = true; } GUILayout.Space(10); if (GUILayout.Button("Rand. Pitch", EditorStyles.toolbarButton, GUILayout.Width(btnWidth))) { CopyRandomPitch(sourceVar); isDirty = true; } GUILayout.Space(10); if (GUILayout.Button("Rand. Volume", EditorStyles.toolbarButton, GUILayout.Width(btnWidth))) { CopyRandomVolume(sourceVar); isDirty = true; } EditorGUILayout.EndHorizontal(); DTGUIHelper.VerticalSpace(2); EditorGUILayout.BeginHorizontal(); GUILayout.Space(10); if (GUILayout.Button("Rand. Delay", EditorStyles.toolbarButton, GUILayout.Width(btnWidth))) { CopyRandomDelay(sourceVar); isDirty = true; } GUILayout.Space(10); if (GUILayout.Button("Custom Fade", EditorStyles.toolbarButton, GUILayout.Width(btnWidth))) { CopyCustomFade(sourceVar); isDirty = true; } EditorGUILayout.EndHorizontal(); GUI.contentColor = Color.white; } EditorGUILayout.Separator(); } EditorGUILayout.EndVertical(); } EditorGUI.indentLevel = 0; int? deadChildIndex = null; if (!Application.isPlaying) { DTGUIHelper.AddSpaceForNonU5(2); DTGUIHelper.StartGroupHeader(); EditorGUILayout.BeginHorizontal(); GUILayout.Label("Actions", EditorStyles.wordWrappedLabel, GUILayout.Width(50f)); GUILayout.Space(30); GUI.contentColor = DTGUIHelper.BrightButtonColor; var buttonText = "Collapse All"; var allCollapsed = true; foreach (var t in _group.groupVariations) { if (!t.isExpanded) { continue; } allCollapsed = false; break; } if (allCollapsed) { buttonText = "Expand All"; } GUILayout.FlexibleSpace(); if (GUILayout.Button(new GUIContent(buttonText), EditorStyles.toolbarButton, GUILayout.Width(80))) { isDirty = true; ExpandCollapseAll(allCollapsed); } GUILayout.Space(10); if (GUILayout.Button(new GUIContent("Eq. Voices", "Reset Voices to one"), EditorStyles.toolbarButton, GUILayout.Width(80))) { isDirty = true; EqualizeWeights(_group); } GUILayout.Space(10); if (GUILayout.Button(new GUIContent("Eq. Volumes"), EditorStyles.toolbarButton, GUILayout.Width(80))) { EqualizeVariationVolumes(_group.groupVariations); } GUI.contentColor = Color.white; EditorGUILayout.EndHorizontal(); DTGUIHelper.VerticalSpace(1); EditorGUILayout.BeginHorizontal(); GUILayout.Label("Localization", EditorStyles.wordWrappedLabel, GUILayout.Width(80f)); GUILayout.FlexibleSpace(); GUI.contentColor = DTGUIHelper.BrightButtonColor; if (GUILayout.Button(new GUIContent("All Use Loc.", "Check the 'Use Localized Folder' checkbox for all Variations."), EditorStyles.toolbarButton, GUILayout.Width(125))) { isDirty = true; BulkUseLocalization(_group.groupVariations, true); } GUILayout.Space(10); if (GUILayout.Button(new GUIContent("None Use Loc.", "Uncheck the 'Use Localized Folder' checkbox for all Variations."), EditorStyles.toolbarButton, GUILayout.Width(125))) { isDirty = true; BulkUseLocalization(_group.groupVariations, false); } GUI.contentColor = Color.white; EditorGUILayout.EndHorizontal(); var newBulkMode = DTGUIHelper.GetRestrictedAudioLocation("Variation Create Mode", _group.bulkVariationMode); if (newBulkMode != _group.bulkVariationMode) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Bulk Variation Mode"); _group.bulkVariationMode = newBulkMode; } if (_group.bulkVariationMode == MasterAudio.AudioLocation.ResourceFile) { DTGUIHelper.ShowColorWarning("Resource mode: make sure to drag from Resource folders only."); } DTGUIHelper.EndGroupHeader(); } DTGUIHelper.VerticalSpace(2); if (!Application.isPlaying) { // new variation settings EditorGUILayout.BeginVertical(); var anEvent = Event.current; if (isInProjectView) { DTGUIHelper.ShowLargeBarAlert("You are in Project View and cannot create Variations."); DTGUIHelper.ShowLargeBarAlert("Pull this prefab into the Scene to create Variations."); } else { GUI.color = DTGUIHelper.DragAreaColor; var dragArea = GUILayoutUtility.GetRect(0f, 35f, GUILayout.ExpandWidth(true)); GUI.Box(dragArea, "Drag Audio clips here to create Variations!"); GUI.color = Color.white; 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; } CreateVariation(_group, aClip); } } Event.current.Use(); break; } } EditorGUILayout.EndVertical(); // end new variation settings } if (_group.groupVariations.Count == 0) { DTGUIHelper.ShowRedError("You currently have no Variations."); } else { for (var i = 0; i < _group.groupVariations.Count; i++) { var variation = _group.groupVariations[i]; var isNotSource = _group.selectedVariationIndex != i; var state = variation.isExpanded; var text = variation.name; // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression if (!state) { GUI.backgroundColor = DTGUIHelper.InactiveHeaderColor; } else { GUI.backgroundColor = DTGUIHelper.ActiveHeaderColor; } GUILayout.BeginHorizontal(); #if UNITY_3_5_7 if (!state) { text += " (Click to expand)"; } #else text = "<b><size=11>" + text + "</size></b>"; #endif if (state) { text = "\u25BC " + text; } else { text = "\u25BA " + text; } if (!GUILayout.Toggle(true, text, "dragtab", GUILayout.MinWidth(20f))) { state = !state; } GUI.backgroundColor = Color.white; if (!state) { GUILayout.Space(3f); } if (state != variation.isExpanded) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, variation, "toggle Expand Variation"); variation.isExpanded = state; } EditorGUI.indentLevel = 0; if (canCopy) { if (isNotSource) { EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); var newChecked = EditorGUILayout.Toggle(variation.isChecked, GUILayout.Width(16), GUILayout.Height(16)); if (newChecked != variation.isChecked) { AudioUndoHelper.RecordObjectPropertyForUndo(ref isDirty, variation, "toggle check Variation"); variation.isChecked = newChecked; } EditorGUILayout.EndHorizontal(); } else { GUI.contentColor = DTGUIHelper.BrightTextColor; GUILayout.Label("SOURCE", GUILayout.Width(54)); GUI.contentColor = Color.white; } } if (GUILayout.Button(new GUIContent(MasterAudioInspectorResources.GearTexture, "Click to goto Variation"), EditorStyles.toolbarButton, GUILayout.Height(16), GUILayout.Width(40))) { Selection.activeObject = variation; } if (!Application.isPlaying && !DTGUIHelper.IsPrefabInProjectView(_group)) { if (GUILayout.Button(new GUIContent(MasterAudioInspectorResources.CopyTexture, "Click to clone Variation"), EditorStyles.toolbarButton, GUILayout.Height(16), GUILayout.Width(40))) { CloneVariation(i); } } var varIsDirty = false; var buttonPressed = DTGUIHelper.AddDynamicGroupButtons(_group); if (!Application.isPlaying && !DTGUIHelper.IsPrefabInProjectView(_group)) { if (GUILayout.Button(new GUIContent(MasterAudioInspectorResources.DeleteTexture, "Click to delete this Variation"), EditorStyles.toolbarButton, GUILayout.Height(16), GUILayout.Width(40))) { deadChildIndex = i; isDirty = true; } } GUILayout.Space(4); switch (buttonPressed) { case DTGUIHelper.DTFunctionButtons.Play: var calcVolume = variation.VarAudio.volume * _group.groupMasterVolume; switch (variation.audLocation) { case MasterAudio.AudioLocation.ResourceFile: StopPreviewer(); var fileName = AudioResourceOptimizer.GetLocalizedDynamicSoundGroupFileName(previewLang, variation.useLocalization, variation.resourceFileName); var clip = Resources.Load(fileName) as AudioClip; if (clip != null) { GetPreviewer().PlayOneShot(clip, calcVolume); } else { DTGUIHelper.ShowAlert("Could not find Resource file: " + fileName); } break; case MasterAudio.AudioLocation.Clip: variation.VarAudio.PlayOneShot(variation.VarAudio.clip, calcVolume); break; case MasterAudio.AudioLocation.FileOnInternet: if (!string.IsNullOrEmpty(variation.internetFileUrl)) { Application.OpenURL(variation.internetFileUrl); } break; } isDirty = true; break; case DTGUIHelper.DTFunctionButtons.Stop: if (variation.audLocation == MasterAudio.AudioLocation.ResourceFile) { StopPreviewer(); } else { variation.VarAudio.Stop(); } isDirty = true; break; } EditorGUILayout.EndHorizontal(); GUI.backgroundColor = Color.white; if (!variation.isExpanded) { DTGUIHelper.VerticalSpace(3); continue; } DTGUIHelper.BeginGroupedControls(); if (!Application.isPlaying) { DTGUIHelper.ShowColorWarning(MasterAudio.PreviewText); } if (variation.VarAudio == null) { DTGUIHelper.ShowRedError(string.Format("The Variation: '{0}' has no Audio Source.", variation.name)); break; } var oldLocation = variation.audLocation; var newLocation = (MasterAudio.AudioLocation)EditorGUILayout.EnumPopup("Audio Origin", variation.audLocation); if (newLocation != variation.audLocation) { AudioUndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, 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 varIsDirty, variation.VarAudio, "change 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 varIsDirty, 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; varIsDirty = true; } 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; 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; } var useLocalization = false; AudioUndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Resource Filename"); var newsFilename = DTGUIHelper.GetResourcePath(aClip, ref useLocalization); variation.resourceFileName = newsFilename; variation.useLocalization = useLocalization; } } Event.current.Use(); break; } EditorGUILayout.EndVertical(); var newFilename = EditorGUILayout.TextField("Resource Filename", variation.resourceFileName); if (newFilename != variation.resourceFileName) { AudioUndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, 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 newVolume = DTGUIHelper.DisplayVolumeField(variation.VarAudio.volume, DTGUIHelper.VolumeFieldType.None, MasterAudio.MixerWidthMode.Normal, 0f, true); if (newVolume != variation.VarAudio.volume) { AudioUndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation.VarAudio, "change Volume"); variation.VarAudio.volume = newVolume; } var newPitch = DTGUIHelper.DisplayPitchField(variation.VarAudio.pitch); if (newPitch != variation.VarAudio.pitch) { AudioUndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation.VarAudio, "change Pitch"); variation.VarAudio.pitch = newPitch; } if (_group.curVariationMode == MasterAudioGroup.VariationMode.LoopedChain) { DTGUIHelper.ShowLargeBarAlert("Loop Clip is always OFF for Looped Chain Groups"); } else { var newLoop = EditorGUILayout.Toggle("Loop Clip", variation.VarAudio.loop); if (newLoop != variation.VarAudio.loop) { AudioUndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation.VarAudio, "toggle Loop Clip"); variation.VarAudio.loop = newLoop; } } var newWeight = EditorGUILayout.IntSlider("Voices (Weight)", variation.weight, 0, 100); if (newWeight != variation.weight) { AudioUndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Voices (Weight)"); variation.weight = newWeight; } var newFxTailTime = EditorGUILayout.Slider("FX Tail Time", variation.fxTailTime, 0f, 10f); if (newFxTailTime != variation.fxTailTime) { AudioUndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change FX Tail Time"); variation.fxTailTime = newFxTailTime; } DTGUIHelper.StartGroupHeader(); var newUseRndPitch = EditorGUILayout.BeginToggleGroup(" Use Random Pitch", variation.useRandomPitch); if (newUseRndPitch != variation.useRandomPitch) { AudioUndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, 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 varIsDirty, variation, "change Pitch Compute Mode"); variation.randomPitchMode = newMode; } var newPitchMin = DTGUIHelper.DisplayPitchField(variation.randomPitchMin, "Random Pitch Min"); if (newPitchMin != variation.randomPitchMin) { AudioUndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, 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 varIsDirty, 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 varIsDirty, 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 varIsDirty, 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 varIsDirty, 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 varIsDirty, 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 varIsDirty, 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 varIsDirty, 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 varIsDirty, 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 Random Start Position", variation.useRandomStartTime); if (newStart != variation.useRandomStartTime) { AudioUndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "toggle Use Random Start 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 varIsDirty, variation, "toggle 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 varIsDirty, variation, "toggle Start Max (%)"); variation.randomStartMaxPercent = newMax; if (variation.randomStartMinPercent > variation.randomStartMaxPercent) { variation.randomStartMinPercent = variation.randomStartMaxPercent; } } } EditorGUILayout.EndToggleGroup(); DTGUIHelper.AddSpaceForNonU5(2); DTGUIHelper.StartGroupHeader(); var newFades = EditorGUILayout.BeginToggleGroup(" Use Custom Fading", variation.useFades); if (newFades != variation.useFades) { AudioUndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "toggle Use Custom Fading"); variation.useFades = newFades; } DTGUIHelper.EndGroupHeader(); if (variation.useFades) { var newFadeIn = EditorGUILayout.Slider("Fade In Time (sec)", variation.fadeInTime, 0f, 10f); if (newFadeIn != variation.fadeInTime) { AudioUndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Fade In Time"); variation.fadeInTime = newFadeIn; } var newFadeOut = EditorGUILayout.Slider("Fade Out time (sec)", variation.fadeOutTime, 0f, 10f); if (newFadeOut != variation.fadeOutTime) { AudioUndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Fade Out Time"); variation.fadeOutTime = newFadeOut; } } EditorGUILayout.EndToggleGroup(); DTGUIHelper.EndGroupedControls(); DTGUIHelper.VerticalSpace(3); if (!varIsDirty) { continue; } EditorUtility.SetDirty(variation.VarAudio); EditorUtility.SetDirty(variation); } } if (deadChildIndex.HasValue) { var deadVar = _group.groupVariations[deadChildIndex.Value]; if (deadVar != null) { // delete variation from Hierarchy AudioUndoHelper.DestroyForUndo(deadVar.gameObject); } // delete group. _group.groupVariations.RemoveAt(deadChildIndex.Value); } if (GUI.changed || isDirty) { EditorUtility.SetDirty(target); } //DrawDefaultInspector(); }
public override void OnInspectorGUI() { EditorGUIUtility.LookLikeControls(); EditorGUI.indentLevel = 0; var isDirty = false; isValid = true; _group = (DynamicSoundGroup)target; _group = RescanChildren(_group); if (_group == null) { return; } var dsgc = _group.transform.parent; if (dsgc != null) { _creator = dsgc.GetComponent<DynamicSoundGroupCreator>(); } if (_creator == null) { isValid = false; } if (!isValid) { return; } MasterAudio ma = MasterAudio.Instance; var maInScene = ma != null; if (maInScene) { groupNames = ma.GroupNames; groupNames.Remove(_group.name); } var isInProjectView = DTGUIHelper.IsPrefabInProjectView(_group); if (MasterAudioInspectorResources.logoTexture != null) { DTGUIHelper.ShowHeaderTexture(MasterAudioInspectorResources.logoTexture); } EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); GUI.contentColor = Color.green; if (GUILayout.Button(new GUIContent("Back to Dynamic Sound Group Creator", "Select Group in Hierarchy"), EditorStyles.toolbarButton, GUILayout.Width(220))) { Selection.activeObject = _group.transform.parent.gameObject; } GUI.contentColor = Color.white; GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); var newVol = EditorGUILayout.Slider("Group Master Volume", _group.groupMasterVolume, 0f, 1f); if (newVol != _group.groupMasterVolume) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Group Master Volume"); _group.groupMasterVolume = newVol; } var newVarSequence = (MasterAudioGroup.VariationSequence) EditorGUILayout.EnumPopup("Variation Sequence", _group.curVariationSequence); if (newVarSequence != _group.curVariationSequence) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Variation Sequence"); _group.curVariationSequence = newVarSequence; } if (_group.curVariationSequence == MasterAudioGroup.VariationSequence.TopToBottom) { var newUseInactive = EditorGUILayout.BeginToggleGroup("Refill Variation Pool After Inactive Time", _group.useInactivePeriodPoolRefill); if (newUseInactive != _group.useInactivePeriodPoolRefill) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "toggle Inactive Refill"); _group.useInactivePeriodPoolRefill = newUseInactive; } EditorGUI.indentLevel = 1; var newInactivePeriod = EditorGUILayout.Slider("Inactive Time (sec)", _group.inactivePeriodSeconds, .2f, 30f); if (newInactivePeriod != _group.inactivePeriodSeconds) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Inactive Time"); _group.inactivePeriodSeconds = newInactivePeriod; } EditorGUILayout.EndToggleGroup(); } EditorGUI.indentLevel = 0; var newVarMode = (MasterAudioGroup.VariationMode) EditorGUILayout.EnumPopup("Variation Mode", _group.curVariationMode); if (newVarMode != _group.curVariationMode) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Variation Mode"); _group.curVariationMode = newVarMode; } EditorGUI.indentLevel = 1; switch (_group.curVariationMode) { case MasterAudioGroup.VariationMode.LoopedChain: DTGUIHelper.ShowColorWarning("*In this mode, only one Variation can be played at a time."); var newLoopMode = (MasterAudioGroup.ChainedLoopLoopMode) EditorGUILayout.EnumPopup("Loop Mode", _group.chainLoopMode); if (newLoopMode != _group.chainLoopMode) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Loop Mode"); _group.chainLoopMode = newLoopMode; } if (_group.chainLoopMode == MasterAudioGroup.ChainedLoopLoopMode.NumberOfLoops) { var newLoopCount = EditorGUILayout.IntSlider("Number of Loops", _group.chainLoopNumLoops, 1, 500); if (newLoopCount != _group.chainLoopNumLoops) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Number of Loops"); _group.chainLoopNumLoops = newLoopCount; } } var newDelayMin = EditorGUILayout.Slider("Clip Change Delay Min", _group.chainLoopDelayMin, 0f, 20f); if (newDelayMin != _group.chainLoopDelayMin) { if (_group.chainLoopDelayMax < newDelayMin) { _group.chainLoopDelayMax = newDelayMin; } UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Chained Clip Delay Min"); _group.chainLoopDelayMin = newDelayMin; } var newDelayMax = EditorGUILayout.Slider("Clip Change Delay Max", _group.chainLoopDelayMax, 0f, 20f); if (newDelayMax != _group.chainLoopDelayMax) { if (newDelayMax < _group.chainLoopDelayMin) { newDelayMax = _group.chainLoopDelayMin; } UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Chained Clip Delay Max"); _group.chainLoopDelayMax = newDelayMax; } break; case MasterAudioGroup.VariationMode.Normal: var newRetrigger = EditorGUILayout.IntSlider("Retrigger Percentage", _group.retriggerPercentage, 0, 100); if (newRetrigger != _group.retriggerPercentage) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Retrigger Percentage"); _group.retriggerPercentage = newRetrigger; } var newLimitPoly = EditorGUILayout.Toggle("Limit Polyphony", _group.limitPolyphony); if (newLimitPoly != _group.limitPolyphony) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "toggle Limit Polyphony"); _group.limitPolyphony = newLimitPoly; } if (_group.limitPolyphony) { int maxVoices = 0; for (var i = 0; i < _group.groupVariations.Count; i++) { var variation = _group.groupVariations[i]; maxVoices += variation.weight; } var newVoiceLimit = EditorGUILayout.IntSlider("Polyphony Voice Limit", _group.voiceLimitCount, 1, maxVoices); if (newVoiceLimit != _group.voiceLimitCount) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Polyphony Voice Limit"); _group.voiceLimitCount = newVoiceLimit; } } var newLimitMode = (MasterAudioGroup.LimitMode) EditorGUILayout.EnumPopup("Replay Limit Mode", _group.limitMode); if (newLimitMode != _group.limitMode) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Replay Limit Mode"); _group.limitMode = newLimitMode; } switch (_group.limitMode) { case MasterAudioGroup.LimitMode.FrameBased: var newFrameLimit = EditorGUILayout.IntSlider("Min Frames Between", _group.limitPerXFrames, 1, 120); if (newFrameLimit != _group.limitPerXFrames) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Min Frames Between"); _group.limitPerXFrames = newFrameLimit; } break; case MasterAudioGroup.LimitMode.TimeBased: var newMinTime = EditorGUILayout.Slider("Min Seconds Between", _group.minimumTimeBetween, 0.1f, 10f); if (newMinTime != _group.minimumTimeBetween) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Min Seconds Between"); _group.minimumTimeBetween = newMinTime; } break; } break; case MasterAudioGroup.VariationMode.Dialog: DTGUIHelper.ShowColorWarning("*In this mode, only one Variation can be played at a time."); var newUseDialog = EditorGUILayout.Toggle("Dialog Custom Fade?", _group.useDialogFadeOut); if (newUseDialog != _group.useDialogFadeOut) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "toggle Dialog Custom Fade?"); _group.useDialogFadeOut = newUseDialog; } if (_group.useDialogFadeOut) { var newFadeTime = EditorGUILayout.Slider("Custom Fade Out Time", _group.dialogFadeOutTime, 0.1f, 20f); if (newFadeTime != _group.dialogFadeOutTime) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Custom Fade Out Time"); _group.dialogFadeOutTime = newFadeTime; } } break; } EditorGUI.indentLevel = 0; var newChildMode = (MasterAudioGroup.ChildGroupMode)EditorGUILayout.EnumPopup(new GUIContent("Linked Group Mode", "Groups you set up in this section will also get played automatically when this Group plays."), _group.childGroupMode); if (newChildMode != _group.childGroupMode) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Linked Group Mode"); _group.childGroupMode = newChildMode; } if (_group.childGroupMode != MasterAudioGroup.ChildGroupMode.None) { if (_group.childSoundGroups.Count == 0) { DTGUIHelper.ShowLargeBarAlert("You have no other Groups set up to trigger."); EditorGUILayout.Separator(); } EditorGUI.indentLevel = 1; for (var i = 0; i < _group.childSoundGroups.Count; i++) { var aGroup = _group.childSoundGroups[i]; if (maInScene) { var existingIndex = groupNames.IndexOf(aGroup); int? groupIndex = null; EditorGUI.indentLevel = 1; var noGroup = false; var noMatch = false; if (existingIndex >= 1) { groupIndex = EditorGUILayout.Popup("Sound Group", existingIndex, groupNames.ToArray()); if (existingIndex == 1) { noGroup = true; } } else if (existingIndex == -1 && aGroup == MasterAudio.NO_GROUP_NAME) { groupIndex = EditorGUILayout.Popup("Sound Group", existingIndex, groupNames.ToArray()); } else { // non-match noMatch = true; var newSound = EditorGUILayout.TextField("Sound Group", aGroup); if (newSound != aGroup) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Sound Group"); _group.childSoundGroups[i] = newSound; } var newIndex = EditorGUILayout.Popup("All Sound Groups", -1, groupNames.ToArray()); if (newIndex >= 0) { groupIndex = newIndex; } } if (noGroup) { DTGUIHelper.ShowRedError("No Sound Group specified. Action will do nothing."); } else if (noMatch) { DTGUIHelper.ShowRedError("Sound Group found no match. Type in or choose one."); } if (groupIndex.HasValue) { if (existingIndex != groupIndex.Value) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Sound Group"); } if (groupIndex.Value == -1) { _group.childSoundGroups[i] = MasterAudio.NO_GROUP_NAME; } else { _group.childSoundGroups[i] = groupNames[groupIndex.Value]; } } } else { var newSType = EditorGUILayout.TextField("Sound Group", aGroup); if (newSType != aGroup) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Sound Group"); _group.childSoundGroups[i] = newSType; } } } GUI.contentColor = Color.green; EditorGUILayout.BeginHorizontal(); GUILayout.Space(10); if (GUILayout.Button(new GUIContent("Add Trigger Group"), EditorStyles.toolbarButton, GUILayout.Width(120))) { _group.childSoundGroups.Add(string.Empty); } GUILayout.Space(10); if (GUILayout.Button(new GUIContent("Delete Trigger Group", "Delete the last Trigger Group"), EditorStyles.toolbarButton, GUILayout.Width(120))) { _group.childSoundGroups.RemoveAt(_group.childSoundGroups.Count - 1); } EditorGUILayout.EndHorizontal(); GUI.contentColor = Color.white; } var newTargetGone = (MasterAudioGroup.TargetDespawnedBehavior) EditorGUILayout.EnumPopup("Caller Despawned Mode", _group.targetDespawnedBehavior); if (newTargetGone != _group.targetDespawnedBehavior) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "Change Caller Despawned Mode"); _group.targetDespawnedBehavior = newTargetGone; } if (_group.targetDespawnedBehavior == MasterAudioGroup.TargetDespawnedBehavior.FadeOut) { EditorGUI.indentLevel = 1; var newFade = EditorGUILayout.Slider("Fade Out Time", _group.despawnFadeTime, .1f, 20f); if (newFade != _group.despawnFadeTime) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "Change Called Despawned Fade Out Time"); _group.despawnFadeTime = newFade; } } EditorGUI.indentLevel = 0; var newBulkMode = (MasterAudio.AudioLocation) EditorGUILayout.EnumPopup("Variation Create Mode", _group.bulkVariationMode); if (newBulkMode != _group.bulkVariationMode) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Bulk Variation Mode"); _group.bulkVariationMode = newBulkMode; } if (_group.bulkVariationMode == MasterAudio.AudioLocation.ResourceFile) { DTGUIHelper.ShowColorWarning("*Resource mode: make sure to drag from Resource folders only."); } var groupHasResource = false; for (var s = 0; s < _group.groupVariations.Count; s++) { if (_group.groupVariations[s].audLocation == MasterAudio.AudioLocation.ResourceFile) { groupHasResource = true; break; } } if (MasterAudio.HasAsyncResourceLoaderFeature() && groupHasResource) { if ((maInScene && !ma.resourceClipsAllLoadAsync) || !maInScene) { var newAsync = EditorGUILayout.Toggle(new GUIContent("Load Resources Async", "Checking this means Resource files in this Sound Group will be loaded asynchronously."), _group.resourceClipsAllLoadAsync); if (newAsync != _group.resourceClipsAllLoadAsync) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "toggle Load Resources Async"); _group.resourceClipsAllLoadAsync = newAsync; } } } var newLog = EditorGUILayout.Toggle("Log Sounds", _group.logSound); if (newLog != _group.logSound) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "toggle Log Sounds"); _group.logSound = newLog; } int? deadChildIndex = null; if (!Application.isPlaying) { EditorGUILayout.BeginHorizontal(); GUILayout.Label("Actions", EditorStyles.wordWrappedLabel, GUILayout.Width(50f)); GUILayout.Space(96); GUI.contentColor = Color.green; if (GUILayout.Button(new GUIContent("Equalize Weights", "Reset Weights to one"), EditorStyles.toolbarButton, GUILayout.Width(120))) { isDirty = true; EqualizeWeights(_group); } GUILayout.Space(10); if (GUILayout.Button(new GUIContent("Equalize Variation Volumes"), EditorStyles.toolbarButton, GUILayout.Width(150))) { EqualizeVariationVolumes(_group.groupVariations); } GUI.contentColor = Color.white; EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(); GUILayout.Label("Localization", EditorStyles.wordWrappedLabel, GUILayout.Width(100f)); GUILayout.Space(46); GUI.contentColor = Color.green; if (GUILayout.Button(new GUIContent("All Use Localization", "Check the 'Use Localized Folder' checkbox for all Variations."), EditorStyles.toolbarButton, GUILayout.Width(120))) { isDirty = true; BulkUseLocalization(_group.groupVariations, true); } GUILayout.Space(10); if (GUILayout.Button(new GUIContent("None Use Localiation", "Uncheck the 'Use Localized Folder' checkbox for all Variations."), EditorStyles.toolbarButton, GUILayout.Width(150))) { isDirty = true; BulkUseLocalization(_group.groupVariations, false); } GUI.contentColor = Color.white; EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); } if (!Application.isPlaying) { // bulk copy settings EditorGUI.indentLevel = 0; GUI.color = _group.copySettingsExpanded ? MasterAudioInspector.activeClr : MasterAudioInspector.inactiveClr; EditorGUILayout.BeginHorizontal(EditorStyles.objectFieldThumb); var newBulk = EditorGUILayout.Toggle("Show Copy Settings", _group.copySettingsExpanded); if (newBulk != _group.copySettingsExpanded) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "toggle Show Copy Settings"); _group.copySettingsExpanded = newBulk; } EditorGUILayout.EndHorizontal(); GUI.color = Color.white; if (_group.copySettingsExpanded) { if (_group.groupVariations.Count == 0) { DTGUIHelper.ShowLargeBarAlert("You currently have no Variations in this Group."); } else if (_group.groupVariations.Count == 1) { DTGUIHelper.ShowLargeBarAlert("You only have a single Variation in this Group. No point to copy."); } else { var varNames = new List<string>(_group.groupVariations.Count); for (var i = 0; i < _group.groupVariations.Count; i++) { varNames.Add(_group.groupVariations[i].name); } if (_group.selectedVariationIndex >= varNames.Count) { _group.selectedVariationIndex = 0; } var newVar = EditorGUILayout.Popup("Source Variation", _group.selectedVariationIndex, varNames.ToArray()); if (newVar != _group.selectedVariationIndex) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, _group, "change Source Variation"); _group.selectedVariationIndex = newVar; } DTGUIHelper.ShowColorWarning("*Click a setting below to copy from Source Variation to all Variations in this Group."); var sourceVar = _group.groupVariations[_group.selectedVariationIndex]; GUI.contentColor = Color.green; EditorGUILayout.BeginHorizontal(); GUILayout.Space(10); if (GUILayout.Button("Volume", EditorStyles.toolbarButton, GUILayout.Width(90))) { CopyVolumes(sourceVar); isDirty = true; } GUILayout.Space(10); if (GUILayout.Button("Pitch", EditorStyles.toolbarButton, GUILayout.Width(90))) { CopyPitches(sourceVar); isDirty = true; } GUILayout.Space(10); if (GUILayout.Button("Loop", EditorStyles.toolbarButton, GUILayout.Width(90))) { CopyLoops(sourceVar); isDirty = true; } GUILayout.Space(10); if (GUILayout.Button("FX Tail Time", EditorStyles.toolbarButton, GUILayout.Width(90))) { CopyFxTail(sourceVar); isDirty = true; } EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(); GUILayout.Space(10); if (GUILayout.Button("Rand. Pitch", EditorStyles.toolbarButton, GUILayout.Width(90))) { CopyRandomPitch(sourceVar); isDirty = true; } GUILayout.Space(10); if (GUILayout.Button("Rand. Volume", EditorStyles.toolbarButton, GUILayout.Width(90))) { CopyRandomVolume(sourceVar); isDirty = true; } GUILayout.Space(10); if (GUILayout.Button("Rand. Delay", EditorStyles.toolbarButton, GUILayout.Width(90))) { CopyRandomDelay(sourceVar); isDirty = true; } GUILayout.Space(10); if (GUILayout.Button("Custom Fade", EditorStyles.toolbarButton, GUILayout.Width(90))) { CopyCustomFade(sourceVar); isDirty = true; } EditorGUILayout.EndHorizontal(); GUI.contentColor = Color.white; } EditorGUILayout.Separator(); } // new variation settings EditorGUILayout.BeginVertical(); var anEvent = Event.current; if (isInProjectView) { DTGUIHelper.ShowLargeBarAlert("*You are in Project View and cannot create Variations."); DTGUIHelper.ShowLargeBarAlert("*Pull this prefab into the Scene to create Variations."); } else { GUI.color = Color.yellow; var dragArea = GUILayoutUtility.GetRect(0f,35f,GUILayout.ExpandWidth(true)); GUI.Box (dragArea, "Drag Audio clips here to create Variations!"); GUI.color = Color.white; 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; } CreateVariation(_group, aClip); } } Event.current.Use(); break; } } EditorGUILayout.EndVertical(); // end new variation settings } if (_group.groupVariations.Count == 0) { DTGUIHelper.ShowRedError("You currently have no Variations."); } else { _group.groupVariations.Sort(delegate(DynamicGroupVariation x, DynamicGroupVariation y) { return x.name.CompareTo(y.name); }); for (var i = 0; i < _group.groupVariations.Count; i++) { var variation = _group.groupVariations[i]; EditorGUILayout.BeginHorizontal(EditorStyles.objectFieldThumb); EditorGUILayout.LabelField(variation.name, EditorStyles.boldLabel); GUILayout.FlexibleSpace(); if (GUILayout.Button(new GUIContent(MasterAudioInspectorResources.gearTexture, "Click to goto Variation"), EditorStyles.toolbarButton, GUILayout.Width(40))) { Selection.activeObject = variation; } if (!Application.isPlaying) { if (GUILayout.Button(new GUIContent(MasterAudioInspectorResources.deleteTexture, "Click to delete this Variation"), EditorStyles.toolbarButton, GUILayout.Width(40))) { deadChildIndex = i; isDirty = true; } } var varIsDirty = false; var buttonPressed = DTGUIHelper.AddDynamicGroupButtons(_group); switch (buttonPressed) { case DTGUIHelper.DTFunctionButtons.Play: var calcVolume = variation.VarAudio.volume * _group.groupMasterVolume; if (variation.audLocation == MasterAudio.AudioLocation.ResourceFile) { _creator.PreviewerInstance.Stop(); var fileName = AudioResourceOptimizer.GetLocalizedDynamicSoundGroupFileName(_creator, variation.useLocalization, variation.resourceFileName); var clip = Resources.Load(fileName) as AudioClip; if (clip != null) { _creator.PreviewerInstance.PlayOneShot(clip, calcVolume); } else { DTGUIHelper.ShowAlert("Could not find Resource file: " + fileName); } } else { variation.VarAudio.PlayOneShot(variation.VarAudio.clip, calcVolume); } isDirty = true; break; case DTGUIHelper.DTFunctionButtons.Stop: if (variation.audLocation == MasterAudio.AudioLocation.ResourceFile) { _creator.PreviewerInstance.Stop(); } else { variation.VarAudio.Stop(); } isDirty = true; break; } EditorGUILayout.EndHorizontal(); if (!Application.isPlaying) { DTGUIHelper.ShowColorWarning(MasterAudio.PREVIEW_TEXT); } if (variation.VarAudio == null) { DTGUIHelper.ShowRedError(string.Format("The Variation: '{0}' has no Audio Source.", variation.name)); break; } var oldLocation = variation.audLocation; var newLocation = (MasterAudio.AudioLocation) EditorGUILayout.EnumPopup("Audio Origin", variation.audLocation); if (newLocation != variation.audLocation) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, 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) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation.VarAudio, "change Audio Clip"); variation.VarAudio.clip = newClip; } 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; varIsDirty = true; } EditorGUILayout.BeginVertical(); var anEvent = Event.current; GUI.color = Color.yellow; 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; 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; } var useLocalization = false; UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Resource Filename"); var newsFilename = DTGUIHelper.GetResourcePath(aClip, ref useLocalization); variation.resourceFileName = newsFilename; variation.useLocalization = useLocalization; } } Event.current.Use(); break; } EditorGUILayout.EndVertical(); var newFilename = EditorGUILayout.TextField("Resource Filename", variation.resourceFileName); if (newFilename != variation.resourceFileName) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Resource Filename"); variation.resourceFileName = newFilename; } EditorGUI.indentLevel = 1; var newLocal = EditorGUILayout.Toggle("Use Localized Folder", variation.useLocalization); if (newLocal != variation.useLocalization) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, variation, "toggle Use Localized Folder"); variation.useLocalization = newLocal; } break; } EditorGUI.indentLevel = 0; var newVolume = EditorGUILayout.Slider("Volume", variation.VarAudio.volume, 0f, 1f); if (newVolume != variation.VarAudio.volume) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation.VarAudio, "change Volume"); variation.VarAudio.volume = newVolume; } var newPitch = EditorGUILayout.Slider("Pitch", variation.VarAudio.pitch, -3f, 3f); if (newPitch != variation.VarAudio.pitch) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation.VarAudio, "change Pitch"); variation.VarAudio.pitch = newPitch; } var newLoop = EditorGUILayout.Toggle("Loop Clip", variation.VarAudio.loop); if (newLoop != variation.VarAudio.loop) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation.VarAudio, "toggle Loop Clip"); variation.VarAudio.loop = newLoop; } var newWeight = EditorGUILayout.IntSlider("Weight (Instances)", variation.weight, 0, 100); if (newWeight != variation.weight) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Weight"); variation.weight = newWeight; } var newFxTailTime = EditorGUILayout.Slider("FX Tail Time", variation.fxTailTime, 0f, 10f); if (newFxTailTime != variation.fxTailTime) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change FX Tail Time"); variation.fxTailTime = newFxTailTime; } var newUseRndPitch = EditorGUILayout.BeginToggleGroup("Use Random Pitch", variation.useRandomPitch); if (newUseRndPitch != variation.useRandomPitch) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "toggle Use Random Pitch"); variation.useRandomPitch = newUseRndPitch; } if (variation.useRandomPitch) { var newMode = (SoundGroupVariation.RandomPitchMode) EditorGUILayout.EnumPopup("Pitch Compute Mode", variation.randomPitchMode); if (newMode != variation.randomPitchMode) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Pitch Compute Mode"); variation.randomPitchMode = newMode; } var newPitchMin = EditorGUILayout.Slider("Random Pitch Min", variation.randomPitchMin, -3f, 3f); if (newPitchMin != variation.randomPitchMin) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Random Pitch Min"); variation.randomPitchMin = newPitchMin; if (variation.randomPitchMax <= variation.randomPitchMin) { variation.randomPitchMax = variation.randomPitchMin; } } var newPitchMax = EditorGUILayout.Slider("Random Pitch Max", variation.randomPitchMax, -3f, 3f); if (newPitchMax != variation.randomPitchMax) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Random Pitch Max"); variation.randomPitchMax = newPitchMax; if (variation.randomPitchMin > variation.randomPitchMax) { variation.randomPitchMin = variation.randomPitchMax; } } } EditorGUILayout.EndToggleGroup(); var newUseRndVol = EditorGUILayout.BeginToggleGroup("Use Random Volume", variation.useRandomVolume); if (newUseRndVol != variation.useRandomVolume) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "toggle Use Random Volume"); variation.useRandomVolume = newUseRndVol; } if (variation.useRandomVolume) { var newMode = (SoundGroupVariation.RandomVolumeMode) EditorGUILayout.EnumPopup("Volume Compute Mode", variation.randomVolumeMode); if (newMode != variation.randomVolumeMode) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Volume Compute Mode"); variation.randomVolumeMode = newMode; } var volMin = 0f; if (variation.randomVolumeMode == SoundGroupVariation.RandomVolumeMode.AddToClipVolume) { volMin = -1f; } var newVolMin = EditorGUILayout.Slider("Random Volume Min", variation.randomVolumeMin, volMin, 1f); if (newVolMin != variation.randomVolumeMin) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Random Volume Min"); variation.randomVolumeMin = newVolMin; if (variation.randomVolumeMax <= variation.randomVolumeMin) { variation.randomVolumeMax = variation.randomVolumeMin; } } var newVolMax = EditorGUILayout.Slider("Random Volume Max", variation.randomVolumeMax, volMin, 1f); if (newVolMax != variation.randomVolumeMax) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Random Volume Max"); variation.randomVolumeMax = newVolMax; if (variation.randomVolumeMin > variation.randomVolumeMax) { variation.randomVolumeMin = variation.randomVolumeMax; } } } EditorGUILayout.EndToggleGroup(); var newSilence = EditorGUILayout.BeginToggleGroup("Use Random Delay", variation.useIntroSilence); if (newSilence != variation.useIntroSilence) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "toggle Use Random Delay"); variation.useIntroSilence = newSilence; } if (variation.useIntroSilence) { var newSilenceMin = EditorGUILayout.Slider("Delay Min (sec)", variation.introSilenceMin, 0f, 100f); if (newSilenceMin != variation.introSilenceMin) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, 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) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Delay Max (sec)"); variation.introSilenceMax = newSilenceMax; if (variation.introSilenceMax < variation.introSilenceMin) { variation.introSilenceMin = newSilenceMax; } } } EditorGUILayout.EndToggleGroup(); var newFades = EditorGUILayout.BeginToggleGroup("Use Custom Fading", variation.useFades); if (newFades != variation.useFades) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "toggle Use Custom Fading"); variation.useFades = newFades; } if (variation.useFades) { var newFadeIn = EditorGUILayout.Slider("Fade In Time (sec)", variation.fadeInTime, 0f, 10f); if (newFadeIn != variation.fadeInTime) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Fade In Time"); variation.fadeInTime = newFadeIn; } var newFadeOut = EditorGUILayout.Slider("Fade Out time (sec)", variation.fadeOutTime, 0f, 10f); if (newFadeOut != variation.fadeOutTime) { UndoHelper.RecordObjectPropertyForUndo(ref varIsDirty, variation, "change Fade Out Time"); variation.fadeOutTime = newFadeOut; } } EditorGUILayout.EndToggleGroup(); EditorGUILayout.Separator(); if (varIsDirty) { EditorUtility.SetDirty(variation.VarAudio); EditorUtility.SetDirty(variation); } } } if (deadChildIndex.HasValue) { var deadVar = _group.groupVariations[deadChildIndex.Value]; if (deadVar != null) { // delete variation from Hierarchy UndoHelper.DestroyForUndo(deadVar.gameObject); } // delete group. _group.groupVariations.RemoveAt(deadChildIndex.Value); } if (GUI.changed || isDirty) { EditorUtility.SetDirty(target); } //DrawDefaultInspector(); }
private void PreviewGroup(DynamicSoundGroup aGroup) { var rndIndex = UnityEngine.Random.Range(0, aGroup.groupVariations.Count); var rndVar = aGroup.groupVariations[rndIndex]; if (rndVar.audLocation == MasterAudio.AudioLocation.ResourceFile) { _creator.PreviewerInstance.Stop(); var fileName = AudioResourceOptimizer.GetLocalizedDynamicSoundGroupFileName(_creator, rndVar.useLocalization, rndVar.resourceFileName); var clip = Resources.Load(fileName) as AudioClip; if (clip != null) { _creator.PreviewerInstance.PlayOneShot(clip, rndVar.VarAudio.volume); } else { DTGUIHelper.ShowAlert("Could not find Resource file: " + fileName); } } else { _creator.PreviewerInstance.PlayOneShot(rndVar.VarAudio.clip, rndVar.VarAudio.volume); } }
public static DTFunctionButtons AddDynamicGroupButtons(DynamicSoundGroup _group) { if (GUILayout.Button(new GUIContent(_group.playTexture, "Click to preview Variation"), EditorStyles.toolbarButton, GUILayout.Width(40))) { return DTFunctionButtons.Play; } if (GUILayout.Button(new GUIContent(_group.stopTrackTexture, "Click to stop audio preview"), EditorStyles.toolbarButton, GUILayout.Width(40))) { return DTFunctionButtons.Stop; } return DTFunctionButtons.None; }
public override void OnInspectorGUI() { EditorGUIUtility.LookLikeControls(); EditorGUI.indentLevel = 0; var isDirty = false; _group = (DynamicSoundGroup)target; _group = RescanChildren(_group); var dsgc = _group.transform.parent; DynamicSoundGroupCreator creator = null; if (dsgc != null) { creator = dsgc.GetComponent <DynamicSoundGroupCreator>(); } if (creator == null) { isValid = false; } if (!isValid) { return; } var isInProjectView = DTGUIHelper.IsPrefabInProjectView(_group); if (MasterAudioInspectorResources.logoTexture != null) { DTGUIHelper.ShowHeaderTexture(MasterAudioInspectorResources.logoTexture); } EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); GUI.contentColor = Color.green; if (GUILayout.Button(new GUIContent("Back to Dynamic Sound Group Creator", "Select Group in Hierarchy"), EditorStyles.toolbarButton, GUILayout.Width(220))) { Selection.activeObject = _group.transform.parent.gameObject; } GUI.contentColor = Color.white; GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); var newVol = EditorGUILayout.Slider("Group Master Volume", _group.groupMasterVolume, 0f, 1f); if (newVol != _group.groupMasterVolume) { UndoHelper.RecordObjectPropertyForUndo(_group, "change Group Master Volume"); _group.groupMasterVolume = newVol; } var newVarSequence = (MasterAudioGroup.VariationSequence)EditorGUILayout.EnumPopup("Variation Sequence", _group.curVariationSequence); if (newVarSequence != _group.curVariationSequence) { UndoHelper.RecordObjectPropertyForUndo(_group, "change Variation Sequence"); _group.curVariationSequence = newVarSequence; } if (_group.curVariationSequence == MasterAudioGroup.VariationSequence.TopToBottom) { var newUseInactive = EditorGUILayout.BeginToggleGroup("Refill Variation Pool After Inactive Time", _group.useInactivePeriodPoolRefill); if (newUseInactive != _group.useInactivePeriodPoolRefill) { UndoHelper.RecordObjectPropertyForUndo(_group, "toggle Inactive Refill"); _group.useInactivePeriodPoolRefill = newUseInactive; } EditorGUI.indentLevel = 1; var newInactivePeriod = EditorGUILayout.Slider("Inactive Time (sec)", _group.inactivePeriodSeconds, .2f, 30f); if (newInactivePeriod != _group.inactivePeriodSeconds) { UndoHelper.RecordObjectPropertyForUndo(_group, "change Inactive Time"); _group.inactivePeriodSeconds = newInactivePeriod; } EditorGUILayout.EndToggleGroup(); } EditorGUI.indentLevel = 0; var newVarMode = (MasterAudioGroup.VariationMode)EditorGUILayout.EnumPopup("Variation Mode", _group.curVariationMode); if (newVarMode != _group.curVariationMode) { UndoHelper.RecordObjectPropertyForUndo(_group, "change Variation Mode"); _group.curVariationMode = newVarMode; } EditorGUI.indentLevel = 1; switch (_group.curVariationMode) { case MasterAudioGroup.VariationMode.LoopedChain: DTGUIHelper.ShowColorWarning("*In this mode, only one Variation can be played at a time."); var newLoopMode = (MasterAudioGroup.ChainedLoopLoopMode)EditorGUILayout.EnumPopup("Loop Mode", _group.chainLoopMode); if (newLoopMode != _group.chainLoopMode) { UndoHelper.RecordObjectPropertyForUndo(_group, "change Loop Mode"); _group.chainLoopMode = newLoopMode; } if (_group.chainLoopMode == MasterAudioGroup.ChainedLoopLoopMode.NumberOfLoops) { var newLoopCount = EditorGUILayout.IntSlider("Number of Loops", _group.chainLoopNumLoops, 1, 500); if (newLoopCount != _group.chainLoopNumLoops) { UndoHelper.RecordObjectPropertyForUndo(_group, "change Number of Loops"); _group.chainLoopNumLoops = newLoopCount; } } var newDelayMin = EditorGUILayout.Slider("Clip Change Delay Min", _group.chainLoopDelayMin, 0f, 20f); if (newDelayMin != _group.chainLoopDelayMin) { if (_group.chainLoopDelayMax < newDelayMin) { _group.chainLoopDelayMax = newDelayMin; } UndoHelper.RecordObjectPropertyForUndo(_group, "change Chained Clip Delay Min"); _group.chainLoopDelayMin = newDelayMin; } var newDelayMax = EditorGUILayout.Slider("Clip Change Delay Max", _group.chainLoopDelayMax, 0f, 20f); if (newDelayMax != _group.chainLoopDelayMax) { if (newDelayMax < _group.chainLoopDelayMin) { newDelayMax = _group.chainLoopDelayMin; } UndoHelper.RecordObjectPropertyForUndo(_group, "change Chained Clip Delay Max"); _group.chainLoopDelayMax = newDelayMax; } break; case MasterAudioGroup.VariationMode.Normal: var newRetrigger = EditorGUILayout.IntSlider("Retrigger Percentage", _group.retriggerPercentage, 0, 100); if (newRetrigger != _group.retriggerPercentage) { UndoHelper.RecordObjectPropertyForUndo(_group, "change Retrigger Percentage"); _group.retriggerPercentage = newRetrigger; } var newLimitPoly = EditorGUILayout.Toggle("Limit Polyphony", _group.limitPolyphony); if (newLimitPoly != _group.limitPolyphony) { UndoHelper.RecordObjectPropertyForUndo(_group, "toggle Limit Polyphony"); _group.limitPolyphony = newLimitPoly; } if (_group.limitPolyphony) { int maxVoices = 0; for (var i = 0; i < _group.groupVariations.Count; i++) { var variation = _group.groupVariations[i]; maxVoices += variation.weight; } var newVoiceLimit = EditorGUILayout.IntSlider("Polyphony Voice Limit", _group.voiceLimitCount, 1, maxVoices); if (newVoiceLimit != _group.voiceLimitCount) { UndoHelper.RecordObjectPropertyForUndo(_group, "change Polyphony Voice Limit"); _group.voiceLimitCount = newVoiceLimit; } } var newLimitMode = (MasterAudioGroup.LimitMode)EditorGUILayout.EnumPopup("Replay Limit Mode", _group.limitMode); if (newLimitMode != _group.limitMode) { UndoHelper.RecordObjectPropertyForUndo(_group, "change Replay Limit Mode"); _group.limitMode = newLimitMode; } switch (_group.limitMode) { case MasterAudioGroup.LimitMode.FrameBased: var newFrameLimit = EditorGUILayout.IntSlider("Min Frames Between", _group.limitPerXFrames, 1, 120); if (newFrameLimit != _group.limitPerXFrames) { UndoHelper.RecordObjectPropertyForUndo(_group, "change Min Frames Between"); _group.limitPerXFrames = newFrameLimit; } break; case MasterAudioGroup.LimitMode.TimeBased: var newMinTime = EditorGUILayout.Slider("Min Seconds Between", _group.minimumTimeBetween, 0.1f, 10f); if (newMinTime != _group.minimumTimeBetween) { UndoHelper.RecordObjectPropertyForUndo(_group, "change Min Seconds Between"); _group.minimumTimeBetween = newMinTime; } break; } break; case MasterAudioGroup.VariationMode.Dialog: DTGUIHelper.ShowColorWarning("*In this mode, only one Variation can be played at a time."); var newUseDialog = EditorGUILayout.Toggle("Dialog Custom Fade?", _group.useDialogFadeOut); if (newUseDialog != _group.useDialogFadeOut) { UndoHelper.RecordObjectPropertyForUndo(_group, "toggle Dialog Custom Fade?"); _group.useDialogFadeOut = newUseDialog; } if (_group.useDialogFadeOut) { var newFadeTime = EditorGUILayout.Slider("Custom Fade Out Time", _group.dialogFadeOutTime, 0.1f, 20f); if (newFadeTime != _group.dialogFadeOutTime) { UndoHelper.RecordObjectPropertyForUndo(_group, "change Custom Fade Out Time"); _group.dialogFadeOutTime = newFadeTime; } } break; } EditorGUI.indentLevel = 0; var newBulkMode = (MasterAudio.AudioLocation)EditorGUILayout.EnumPopup("Variation Create Mode", _group.bulkVariationMode); if (newBulkMode != _group.bulkVariationMode) { UndoHelper.RecordObjectPropertyForUndo(_group, "change Bulk Variation Mode"); _group.bulkVariationMode = newBulkMode; } if (_group.bulkVariationMode == MasterAudio.AudioLocation.ResourceFile) { DTGUIHelper.ShowColorWarning("*Resource mode: make sure to drag from Resource folders only."); } var newLog = EditorGUILayout.Toggle("Log Sounds", _group.logSound); if (newLog != _group.logSound) { UndoHelper.RecordObjectPropertyForUndo(_group, "toggle Log Sounds"); _group.logSound = newLog; } int?deadChildIndex = null; if (!Application.isPlaying) { EditorGUILayout.BeginHorizontal(); GUILayout.Space(4); GUILayout.Label("Actions", EditorStyles.wordWrappedLabel, GUILayout.Width(50f)); GUILayout.Space(96); GUI.contentColor = Color.green; if (GUILayout.Button(new GUIContent("Equalize Weights", "Reset Weights to one"), EditorStyles.toolbarButton, GUILayout.Width(120))) { isDirty = true; EqualizeWeights(_group); } GUILayout.Space(10); if (GUILayout.Button(new GUIContent("Equalize Variation Volumes"), EditorStyles.toolbarButton, GUILayout.Width(150))) { EqualizeVariationVolumes(_group.groupVariations); } GUI.contentColor = Color.white; EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); } if (!Application.isPlaying) { // new variation settings EditorGUILayout.BeginVertical(); var anEvent = Event.current; if (isInProjectView) { DTGUIHelper.ShowLargeBarAlert("*You are in Project View and cannot create Variations."); DTGUIHelper.ShowLargeBarAlert("*Pull this prefab into the Scene to create Variations."); } else { GUI.color = Color.yellow; var dragArea = GUILayoutUtility.GetRect(0f, 35f, GUILayout.ExpandWidth(true)); GUI.Box(dragArea, "Drag Audio clips here to create Variations!"); GUI.color = Color.white; 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; } CreateVariation(_group, aClip); } } Event.current.Use(); break; } } EditorGUILayout.EndVertical(); // end new variation settings } if (_group.groupVariations.Count == 0) { DTGUIHelper.ShowRedError("You currently have no Variations."); } else { _group.groupVariations.Sort(delegate(DynamicGroupVariation x, DynamicGroupVariation y) { return(x.name.CompareTo(y.name)); }); for (var i = 0; i < _group.groupVariations.Count; i++) { var variation = _group.groupVariations[i]; EditorGUILayout.BeginHorizontal(EditorStyles.objectFieldThumb); EditorGUILayout.LabelField(variation.name, EditorStyles.boldLabel); GUILayout.FlexibleSpace(); if (GUILayout.Button(new GUIContent(MasterAudioInspectorResources.gearTexture, "Click to goto Variation"), EditorStyles.toolbarButton, GUILayout.Width(40))) { Selection.activeObject = variation; } if (!Application.isPlaying) { if (GUILayout.Button(new GUIContent(MasterAudioInspectorResources.deleteTexture, "Click to delete this Variation"), EditorStyles.toolbarButton, GUILayout.Width(40))) { deadChildIndex = i; isDirty = true; } } var buttonPressed = DTGUIHelper.AddDynamicGroupButtons(_group); switch (buttonPressed) { case DTGUIHelper.DTFunctionButtons.Play: if (variation.audLocation == MasterAudio.AudioLocation.ResourceFile) { creator.PreviewerInstance.Stop(); creator.PreviewerInstance.PlayOneShot(Resources.Load(variation.resourceFileName) as AudioClip); } else { variation.audio.Stop(); variation.audio.Play(); } isDirty = true; break; case DTGUIHelper.DTFunctionButtons.Stop: if (variation.audLocation == MasterAudio.AudioLocation.ResourceFile) { creator.PreviewerInstance.Stop(); } else { variation.audio.Stop(); } isDirty = true; break; } EditorGUILayout.EndHorizontal(); if (!Application.isPlaying) { DTGUIHelper.ShowColorWarning("*Fading & random settings are ignored by preview in edit mode."); } if (variation.audio == null) { DTGUIHelper.ShowRedError(string.Format("The Variation: '{0}' has no Audio Source.", variation.name)); break; } var oldLocation = variation.audLocation; var newLocation = (MasterAudio.AudioLocation)EditorGUILayout.EnumPopup("Audio Origin", variation.audLocation); if (newLocation != variation.audLocation) { UndoHelper.RecordObjectPropertyForUndo(variation, "change Audio Origin"); variation.audLocation = newLocation; } switch (variation.audLocation) { case MasterAudio.AudioLocation.Clip: var newClip = (AudioClip)EditorGUILayout.ObjectField("Audio Clip", variation.audio.clip, typeof(AudioClip), false); if (newClip != variation.audio.clip) { UndoHelper.RecordObjectPropertyForUndo(variation.audio, "change Audio Clip"); variation.audio.clip = newClip; } break; case MasterAudio.AudioLocation.ResourceFile: if (oldLocation != variation.audLocation) { if (variation.audio.clip != null) { Debug.Log("Audio clip removed to prevent unnecessary memory usage on Resource file Variation."); } variation.audio.clip = null; } EditorGUILayout.BeginVertical(); var anEvent = Event.current; GUI.color = Color.yellow; 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; 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; } UndoHelper.RecordObjectPropertyForUndo(variation, "change Resource Filename"); variation.resourceFileName = aClip.name; } } Event.current.Use(); break; } EditorGUILayout.EndVertical(); var newFilename = EditorGUILayout.TextField("Resource Filename", variation.resourceFileName); if (newFilename != variation.resourceFileName) { UndoHelper.RecordObjectPropertyForUndo(variation, "change Resource Filename"); variation.resourceFileName = newFilename; } break; } var newVolume = EditorGUILayout.Slider("Volume", variation.audio.volume, 0f, 1f); if (newVolume != variation.audio.volume) { UndoHelper.RecordObjectPropertyForUndo(variation.audio, "change Volume"); variation.audio.volume = newVolume; } var newPitch = EditorGUILayout.Slider("Pitch", variation.audio.pitch, -3f, 3f); if (newPitch != variation.audio.pitch) { UndoHelper.RecordObjectPropertyForUndo(variation.audio, "change Pitch"); variation.audio.pitch = newPitch; } var newLoop = EditorGUILayout.Toggle("Loop Clip", variation.audio.loop); if (newLoop != variation.audio.loop) { UndoHelper.RecordObjectPropertyForUndo(variation.audio, "toggle Loop Clip"); variation.audio.loop = newLoop; } EditorUtility.SetDirty(variation.audio); var newWeight = EditorGUILayout.IntSlider("Weight (Instances)", variation.weight, 0, 100); if (newWeight != variation.weight) { UndoHelper.RecordObjectPropertyForUndo(variation, "change Weight"); variation.weight = newWeight; } if (variation.HasActiveFXFilter) { var newFxTailTime = EditorGUILayout.Slider("FX Tail Time", variation.fxTailTime, 0f, 10f); if (newFxTailTime != variation.fxTailTime) { UndoHelper.RecordObjectPropertyForUndo(variation, "change FX Tail Time"); variation.fxTailTime = newFxTailTime; } } var newUseRndPitch = EditorGUILayout.BeginToggleGroup("Use Random Pitch", variation.useRandomPitch); if (newUseRndPitch != variation.useRandomPitch) { UndoHelper.RecordObjectPropertyForUndo(variation, "toggle Use Random Pitch"); variation.useRandomPitch = newUseRndPitch; } if (variation.useRandomPitch) { var newMode = (SoundGroupVariation.RandomPitchMode)EditorGUILayout.EnumPopup("Pitch Compute Mode", variation.randomPitchMode); if (newMode != variation.randomPitchMode) { UndoHelper.RecordObjectPropertyForUndo(variation, "change Pitch Compute Mode"); variation.randomPitchMode = newMode; } var newPitchMin = EditorGUILayout.Slider("Random Pitch Min", variation.randomPitchMin, -3f, 3f); if (newPitchMin != variation.randomPitchMin) { UndoHelper.RecordObjectPropertyForUndo(variation, "change Random Pitch Min"); variation.randomPitchMin = newPitchMin; if (variation.randomPitchMax <= variation.randomPitchMin) { variation.randomPitchMax = variation.randomPitchMin; } } var newPitchMax = EditorGUILayout.Slider("Random Pitch Max", variation.randomPitchMax, -3f, 3f); if (newPitchMax != variation.randomPitchMax) { UndoHelper.RecordObjectPropertyForUndo(variation, "change Random Pitch Max"); variation.randomPitchMax = newPitchMax; if (variation.randomPitchMin > variation.randomPitchMax) { variation.randomPitchMin = variation.randomPitchMax; } } } EditorGUILayout.EndToggleGroup(); var newUseRndVol = EditorGUILayout.BeginToggleGroup("Use Random Volume", variation.useRandomVolume); if (newUseRndVol != variation.useRandomVolume) { UndoHelper.RecordObjectPropertyForUndo(variation, "toggle Use Random Volume"); variation.useRandomVolume = newUseRndVol; } if (variation.useRandomVolume) { var newMode = (SoundGroupVariation.RandomVolumeMode)EditorGUILayout.EnumPopup("Volume Compute Mode", variation.randomVolumeMode); if (newMode != variation.randomVolumeMode) { UndoHelper.RecordObjectPropertyForUndo(variation, "change Volume Compute Mode"); variation.randomVolumeMode = newMode; } var volMin = 0f; if (variation.randomVolumeMode == SoundGroupVariation.RandomVolumeMode.AddToClipVolume) { volMin = -1f; } var newVolMin = EditorGUILayout.Slider("Random Volume Min", variation.randomVolumeMin, volMin, 1f); if (newVolMin != variation.randomVolumeMin) { UndoHelper.RecordObjectPropertyForUndo(variation, "change Random Volume Min"); variation.randomVolumeMin = newVolMin; if (variation.randomVolumeMax <= variation.randomVolumeMin) { variation.randomVolumeMax = variation.randomVolumeMin; } } var newVolMax = EditorGUILayout.Slider("Random Volume Max", variation.randomVolumeMax, volMin, 1f); if (newVolMax != variation.randomVolumeMax) { UndoHelper.RecordObjectPropertyForUndo(variation, "change Random Volume Max"); variation.randomVolumeMax = newVolMax; if (variation.randomVolumeMin > variation.randomVolumeMax) { variation.randomVolumeMin = variation.randomVolumeMax; } } } EditorGUILayout.EndToggleGroup(); var newSilence = EditorGUILayout.BeginToggleGroup("Use Random Delay", variation.useIntroSilence); if (newSilence != variation.useIntroSilence) { UndoHelper.RecordObjectPropertyForUndo(variation, "toggle Use Random Delay"); variation.useIntroSilence = newSilence; } if (variation.useIntroSilence) { var newSilenceMin = EditorGUILayout.Slider("Delay Min (sec)", variation.introSilenceMin, 0f, 100f); if (newSilenceMin != variation.introSilenceMin) { UndoHelper.RecordObjectPropertyForUndo(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) { UndoHelper.RecordObjectPropertyForUndo(variation, "change Delay Max (sec)"); variation.introSilenceMax = newSilenceMax; if (variation.introSilenceMax < variation.introSilenceMin) { variation.introSilenceMin = newSilenceMax; } } } EditorGUILayout.EndToggleGroup(); var newFades = EditorGUILayout.BeginToggleGroup("Use Custom Fading", variation.useFades); if (newFades != variation.useFades) { UndoHelper.RecordObjectPropertyForUndo(variation, "toggle Use Custom Fading"); variation.useFades = newFades; } if (variation.useFades) { var newFadeIn = EditorGUILayout.Slider("Fade In Time (sec)", variation.fadeInTime, 0f, 10f); if (newFadeIn != variation.fadeInTime) { UndoHelper.RecordObjectPropertyForUndo(variation, "change Fade In Time"); variation.fadeInTime = newFadeIn; } var newFadeOut = EditorGUILayout.Slider("Fade Out time (sec)", variation.fadeOutTime, 0f, 10f); if (newFadeOut != variation.fadeOutTime) { UndoHelper.RecordObjectPropertyForUndo(variation, "change Fade Out Time"); variation.fadeOutTime = newFadeOut; } } EditorGUILayout.EndToggleGroup(); EditorGUILayout.Separator(); } } if (deadChildIndex.HasValue) { var deadVar = _group.groupVariations[deadChildIndex.Value]; if (deadVar != null) { // delete variation from Hierarchy UndoHelper.DestroyForUndo(deadVar.gameObject); } // delete group. _group.groupVariations.RemoveAt(deadChildIndex.Value); } if (GUI.changed || isDirty) { EditorUtility.SetDirty(target); } //DrawDefaultInspector(); }