public override void OnInspectorGUI() { MasterAudio.Instance = null; var _ma = MasterAudio.Instance; var _maInScene = _ma != null; if (_maInScene) { DTGUIHelper.ShowHeaderTexture(MasterAudioInspectorResources.LogoTexture); } _isDirty = false; DTGUIHelper.HelpHeader("http://www.dtdevtools.com/docs/masteraudio/AmbientSound.htm"); var _sounds = (AmbientSound)target; var _groupNames = new List <string>(); if (_maInScene) { // ReSharper disable once PossibleNullReferenceException _groupNames = _ma.GroupNames; } PopulateItemNames(_groupNames); if (GUI.changed || _isDirty) { EditorUtility.SetDirty(target); } if (_maInScene) { var existingIndex = _groupNames.IndexOf(_sounds.AmbientSoundGroup); int?groupIndex = null; var noGroup = false; var noMatch = false; if (existingIndex >= 1) { EditorGUILayout.BeginHorizontal(); groupIndex = EditorGUILayout.Popup("Ambient Sound Group", existingIndex, _groupNames.ToArray()); if (existingIndex == 1) { noGroup = true; } if (groupIndex > MasterAudio.HardCodedBusOptions - 1) { var button = DTGUIHelper.AddSettingsButton("Ambient Sound Group"); switch (button) { case DTGUIHelper.DTFunctionButtons.Go: var grp = _groupNames[existingIndex]; var trs = MasterAudio.FindGroupTransform(grp); if (trs != null) { Selection.activeObject = trs; } break; } var buttonPress = DTGUIHelper.AddDynamicVariationButtons(); var sType = _groupNames[existingIndex]; switch (buttonPress) { case DTGUIHelper.DTFunctionButtons.Play: DTGUIHelper.PreviewSoundGroup(sType); break; case DTGUIHelper.DTFunctionButtons.Stop: DTGUIHelper.StopPreview(sType); break; } } EditorGUILayout.EndHorizontal(); } else if (existingIndex == -1 && _sounds.AmbientSoundGroup == MasterAudio.NoGroupName) { groupIndex = EditorGUILayout.Popup("Ambient Sound Group", existingIndex, _groupNames.ToArray()); } else // non-match { noMatch = true; var newSound = EditorGUILayout.TextField("Ambient Sound Group", _sounds.AmbientSoundGroup); if (newSound != _sounds.AmbientSoundGroup) { AudioUndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _sounds, "change Ambient Sound Group"); _sounds.AmbientSoundGroup = newSound; _sounds.CalculateRadius(); } var newIndex = EditorGUILayout.Popup("All Sound Groups", -1, _groupNames.ToArray()); if (newIndex >= 0) { groupIndex = newIndex; } } if (noGroup) { DTGUIHelper.ShowRedError("No Ambient Sound Group specified."); } else if (noMatch) { DTGUIHelper.ShowRedError("Ambient Sound Group found no match. Type in or choose one."); } if (groupIndex.HasValue) { if (existingIndex != groupIndex.Value) { AudioUndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _sounds, "change Ambient Sound Group"); } switch (groupIndex.Value) { case -1: _sounds.AmbientSoundGroup = MasterAudio.NoGroupName; break; default: _sounds.AmbientSoundGroup = _groupNames[groupIndex.Value]; break; } _sounds.CalculateRadius(); } } else { var newSType = EditorGUILayout.TextField("Ambient Sound Group", _sounds.AmbientSoundGroup); if (newSType != _sounds.AmbientSoundGroup) { AudioUndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _sounds, "change Ambient Sound Group"); _sounds.CalculateRadius(); _sounds.AmbientSoundGroup = newSType; } } var newVol = DTGUIHelper.DisplayVolumeField(_sounds.playVolume, DTGUIHelper.VolumeFieldType.None, MasterAudio.MixerWidthMode.Normal, 0f, true); if (newVol != _sounds.playVolume) { AudioUndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _sounds, "change Volume"); _sounds.playVolume = newVol; } var newVarType = (EventSounds.VariationType)EditorGUILayout.EnumPopup("Variation Mode", _sounds.variationType); if (newVarType != _sounds.variationType) { AudioUndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _sounds, "change Variation Mode"); _sounds.CalculateRadius(); _sounds.variationType = newVarType; } if (_sounds.variationType == EventSounds.VariationType.PlaySpecific) { var newVarName = EditorGUILayout.TextField("Variation Name", _sounds.variationName); if (newVarName != _sounds.variationName) { AudioUndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _sounds, "change Variation Name"); _sounds.CalculateRadius(); _sounds.variationName = newVarName; } if (string.IsNullOrEmpty(_sounds.variationName)) { DTGUIHelper.ShowRedError("Variation Name is empty. No sound will play."); } } var newExitMode = (MasterAudio.AmbientSoundExitMode)EditorGUILayout.EnumPopup("Trigger Exit Behavior", _sounds.exitMode); if (newExitMode != _sounds.exitMode) { AudioUndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _sounds, "change Trigger Exit Behavior"); _sounds.exitMode = newExitMode; } if (_sounds.exitMode == MasterAudio.AmbientSoundExitMode.FadeSound) { var newFadeTime = EditorGUILayout.Slider("Fade Time (sec)", _sounds.exitFadeTime, .2f, 10f); if (newFadeTime != _sounds.exitFadeTime) { AudioUndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _sounds, "change Fade Time (sec)"); _sounds.exitFadeTime = newFadeTime; } var reEnterMode = (MasterAudio.AmbientSoundReEnterMode)EditorGUILayout.EnumPopup("Trigger Re-Enter Behavior", _sounds.reEnterMode); if (reEnterMode != _sounds.reEnterMode) { AudioUndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _sounds, "change Trigger Re-Enter Behavior"); _sounds.reEnterMode = reEnterMode; } if (_sounds.reEnterMode == MasterAudio.AmbientSoundReEnterMode.FadeInSameSound) { var newFadeIn = EditorGUILayout.Slider("Fade In Time (sec)", _sounds.reEnterFadeTime, .2f, 10f); if (newFadeIn != _sounds.reEnterFadeTime) { AudioUndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _sounds, "change Fade In Time (sec)"); _sounds.reEnterFadeTime = newFadeIn; } } } var aud = _sounds.GetNamedOrFirstAudioSource(); if (aud != null) { var newMax = EditorGUILayout.Slider("Max Distance", aud.maxDistance, .1f, 1000000f); if (newMax != aud.maxDistance) { AudioUndoHelper.RecordObjectPropertyForUndo(ref _isDirty, aud, "change Max Distance"); switch (_sounds.variationType) { case EventSounds.VariationType.PlayRandom: var sources = _sounds.GetAllVariationAudioSources(); if (sources != null) { for (var i = 0; i < sources.Count; i++) { var src = sources[i]; src.maxDistance = newMax; EditorUtility.SetDirty(src); } } break; case EventSounds.VariationType.PlaySpecific: aud.maxDistance = newMax; EditorUtility.SetDirty(aud); break; } } switch (_sounds.variationType) { case EventSounds.VariationType.PlayRandom: DTGUIHelper.ShowLargeBarAlert("Adjusting the Max Distance field will change the Max Distance on the Audio Source of every Variation in the selected Sound Group."); break; case EventSounds.VariationType.PlaySpecific: DTGUIHelper.ShowLargeBarAlert("Adjusting the Max Distance field will change the Max Distance on the Audio Source for the selected Variation in the selected Sound Group."); break; } DTGUIHelper.ShowColorWarning("You can also bulk apply Max Distance and other Audio Source properties with Audio Source Templates using the Master Audio Mixer."); } #if UNITY_5_6_OR_NEWER DTGUIHelper.StartGroupHeader(); var newClosest = GUILayout.Toggle(_sounds.UseClosestColliderPosition, new GUIContent(" Use Closest Collider Position", "Using this option, the Audio Source will be updated every frame to the closest position on the caller's collider(s).")); if (newClosest != _sounds.UseClosestColliderPosition) { AudioUndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _sounds, "toggle Follow Caller"); _sounds.UseClosestColliderPosition = newClosest; } EditorGUILayout.EndVertical(); if (_sounds.UseClosestColliderPosition) { var newTop = EditorGUILayout.Toggle("Use Top Collider", _sounds.UseTopCollider); if (newTop != _sounds.UseTopCollider) { AudioUndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _sounds, "toggle Use Top Collider"); _sounds.UseTopCollider = newTop; } var newChild = EditorGUILayout.Toggle("Use Child G.O. Colliders", _sounds.IncludeChildColliders); if (newChild != _sounds.IncludeChildColliders) { AudioUndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _sounds, "toggle Use Child G.O. Colliders"); _sounds.IncludeChildColliders = newChild; } var colliderObjects = new List <GameObject>(); if (_sounds.UseTopCollider) { var collider = _sounds.GetComponent <Collider>(); var collider2d = _sounds.GetComponent <Collider2D>(); if (collider != null) { colliderObjects.Add(collider.gameObject); } else if (collider2d != null) { colliderObjects.Add(collider2d.gameObject); } } if (_sounds.IncludeChildColliders) { for (var i = 0; i < _sounds.transform.childCount; i++) { var child = _sounds.transform.GetChild(i); var collider = child.GetComponent <Collider>(); var collider2d = child.GetComponent <Collider2D>(); if (collider != null) { colliderObjects.Add(collider.gameObject); } else if (collider2d != null) { colliderObjects.Add(collider2d.gameObject); } } } if (colliderObjects.Count == 0) { DTGUIHelper.ShowRedError("You have zero Colliders selected, so this functionality will not work."); } else { EditorGUILayout.BeginHorizontal(); DTGUIHelper.ShowColorWarning("Colliders used: " + colliderObjects.Count); if (GUILayout.Button("Select\nColliders", GUILayout.Width(70))) { Selection.objects = colliderObjects.ToArray(); } EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndVertical(); } else { EditorGUILayout.EndVertical(); DTGUIHelper.StartGroupHeader(); var newFollow = GUILayout.Toggle(_sounds.FollowCaller, new GUIContent(" Follow Caller", "This option is useful if your caller ever moves, as it will make the Audio Source follow to the location of the caller every frame.")); if (newFollow != _sounds.FollowCaller) { AudioUndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _sounds, "toggle Follow Caller"); _sounds.FollowCaller = newFollow; } EditorGUILayout.EndVertical(); if (_sounds.FollowCaller) { DTGUIHelper.ShowColorWarning("Will follow caller at runtime."); } EditorGUILayout.EndVertical(); } #else DTGUIHelper.StartGroupHeader(); var newFollow = GUILayout.Toggle(_sounds.FollowCaller, new GUIContent(" Follow Caller", "This option is useful if your caller ever moves, as it will make the Audio Source follow to the location of the caller every frame.")); if (newFollow != _sounds.FollowCaller) { AudioUndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _sounds, "toggle Follow Caller"); _sounds.FollowCaller = newFollow; } EditorGUILayout.EndVertical(); if (_sounds.FollowCaller) { DTGUIHelper.ShowColorWarning("Will follow caller at runtime."); } EditorGUILayout.EndVertical(); #endif if (Application.isPlaying) { EditorGUILayout.BeginHorizontal(); GUILayout.Label("Follower Object"); EditorGUILayout.ObjectField(_sounds.RuntimeFollower, typeof(Transform), false); EditorGUILayout.EndHorizontal(); } //DrawDefaultInspector(); }