using System; using UnityEngine; using UnityEngine.Audio; using MoreMountains.Tools; namespace MoreMountains.Feedbacks { /// /// A scriptable object used to store data for MMSoundManager play /// [Serializable] [CreateAssetMenu(menuName = "MoreMountains/Audio/MMF_SoundData")] public class MMF_MMSoundManagerSoundData : ScriptableObject { [Header("Sound")] /// the sound clip to play [Tooltip("the sound clip to play")] public AudioClip Sfx; [Header("Random Sound")] /// an array to pick a random sfx from [Tooltip("an array to pick a random sfx from")] public AudioClip[] RandomSfx; /// if this is true, random sfx audio clips will be played in sequential order instead of at random [Tooltip("if this is true, random sfx audio clips will be played in sequential order instead of at random")] public bool SequentialOrder = false; /// if we're in sequential order, determines whether or not to hold at the last index, until either a cooldown is met, or the ResetSequentialIndex method is called [Tooltip("if we're in sequential order, determines whether or not to hold at the last index, until either a cooldown is met, or the ResetSequentialIndex method is called")] [MMFCondition("SequentialOrder", true)] public bool SequentialOrderHoldLast = false; /// if we're in sequential order hold last mode, index will reset to 0 automatically after this duration, unless it's 0, in which case it'll be ignored [Tooltip("if we're in sequential order hold last mode, index will reset to 0 automatically after this duration, unless it's 0, in which case it'll be ignored")] [MMFCondition("SequentialOrderHoldLast", true)] public float SequentialOrderHoldCooldownDuration = 2f; /// if this is true, sfx will be picked at random until all have been played. once this happens, the list is shuffled again, and it starts over [Tooltip("if this is true, sfx will be picked at random until all have been played. once this happens, the list is shuffled again, and it starts over")] public bool RandomUnique = false; [Header("Sound Properties")] [Header("Volume")] /// the minimum volume to play the sound at [Tooltip("the minimum volume to play the sound at")] [Range(0f,2f)] public float MinVolume = 1f; /// the maximum volume to play the sound at [Tooltip("the maximum volume to play the sound at")] [Range(0f,2f)] public float MaxVolume = 1f; [Header("Pitch")] /// the minimum pitch to play the sound at [Tooltip("the minimum pitch to play the sound at")] [Range(-3f,3f)] public float MinPitch = 1f; /// the maximum pitch to play the sound at [Tooltip("the maximum pitch to play the sound at")] [Range(-3f,3f)] public float MaxPitch = 1f; [Header("Time")] /// a timestamp (in seconds, randomized between the defined min and max) at which the sound will start playing, equivalent to the Audiosource API's Time) [Tooltip("a timestamp (in seconds, randomized between the defined min and max) at which the sound will start playing, equivalent to the Audiosource API's Time)")] [MMFVector("Min", "Max")] public Vector2 PlaybackTime = new Vector2(0f, 0f); /// a duration (in seconds, randomized between the defined min and max) for which the sound will play before stopping. Ignored if min and max are zero. [Tooltip("a duration (in seconds, randomized between the defined min and max) for which the sound will play before stopping. Ignored if min and max are zero.")] [MMVector("Min", "Max")] public Vector2 PlaybackDuration = new Vector2(0f, 0f); [Header("Sound Manager Options")] /// the track on which to play the sound. Pick the one that matches the nature of your sound [Tooltip("the track on which to play the sound. Pick the one that matches the nature of your sound")] public MMSoundManager.MMSoundManagerTracks MmSoundManagerTrack = MMSoundManager.MMSoundManagerTracks.Sfx; /// the ID of the sound. This is useful if you plan on using sound control feedbacks on it afterwards. [Tooltip("the ID of the sound. This is useful if you plan on using sound control feedbacks on it afterwards.")] public int ID = 0; /// the AudioGroup on which to play the sound. If you're already targeting a preset track, you can leave it blank, otherwise the group you specify here will override it. [Tooltip("the AudioGroup on which to play the sound. If you're already targeting a preset track, you can leave it blank, otherwise the group you specify here will override it.")] public AudioMixerGroup AudioGroup = null; /// if (for some reason) you've already got an audiosource and wouldn't like to use the built-in pool system, you can specify it here [Tooltip("if (for some reason) you've already got an audiosource and wouldn't like to use the built-in pool system, you can specify it here")] public AudioSource RecycleAudioSource = null; /// whether or not this sound should loop [Tooltip("whether or not this sound should loop")] public bool Loop = false; /// whether or not this sound should continue playing when transitioning to another scene [Tooltip("whether or not this sound should continue playing when transitioning to another scene")] public bool Persistent = false; /// whether or not this sound should play if the same sound clip is already playing [Tooltip("whether or not this sound should play if the same sound clip is already playing")] public bool DoNotPlayIfClipAlreadyPlaying = false; /// if this is true, this sound will stop playing when stopping the feedback [Tooltip("if this is true, this sound will stop playing when stopping the feedback")] public bool StopSoundOnFeedbackStop = false; [Header("Fade")] /// whether or not to fade this sound in when playing it [Tooltip("whether or not to fade this sound in when playing it")] public bool Fade = false; /// if fading, the volume at which to start the fade [Tooltip("if fading, the volume at which to start the fade")] [MMCondition("Fade", true)] public float FadeInitialVolume = 0f; /// if fading, the duration of the fade, in seconds [Tooltip("if fading, the duration of the fade, in seconds")] [MMCondition("Fade", true)] public float FadeDuration = 1f; /// if fading, the tween over which to fade the sound [Tooltip("if fading, the tween over which to fade the sound ")] [MMCondition("Fade", true)] public MMTweenType FadeTween = new MMTweenType(MMTween.MMTweenCurve.EaseInOutQuartic); [Header("Solo")] /// whether or not this sound should play in solo mode over its destination track. If yes, all other sounds on that track will be muted when this sound starts playing [Tooltip("whether or not this sound should play in solo mode over its destination track. If yes, all other sounds on that track will be muted when this sound starts playing")] public bool SoloSingleTrack = false; /// whether or not this sound should play in solo mode over all other tracks. If yes, all other tracks will be muted when this sound starts playing [Tooltip("whether or not this sound should play in solo mode over all other tracks. If yes, all other tracks will be muted when this sound starts playing")] public bool SoloAllTracks = false; /// if in any of the above solo modes, AutoUnSoloOnEnd will unmute the track(s) automatically once that sound stops playing [Tooltip("if in any of the above solo modes, AutoUnSoloOnEnd will unmute the track(s) automatically once that sound stops playing")] public bool AutoUnSoloOnEnd = false; [Header("Spatial Settings")] /// Pans a playing sound in a stereo way (left or right). This only applies to sounds that are Mono or Stereo. [Tooltip("Pans a playing sound in a stereo way (left or right). This only applies to sounds that are Mono or Stereo.")] [Range(-1f,1f)] public float PanStereo; /// Sets how much this AudioSource is affected by 3D spatialisation calculations (attenuation, doppler etc). 0.0 makes the sound full 2D, 1.0 makes it full 3D. [Tooltip("Sets how much this AudioSource is affected by 3D spatialisation calculations (attenuation, doppler etc). 0.0 makes the sound full 2D, 1.0 makes it full 3D.")] [Range(0f,1f)] public float SpatialBlend; /// a Transform this sound can 'attach' to and follow it along as it plays [Tooltip("a Transform this sound can 'attach' to and follow it along as it plays")] public Transform AttachToTransform; [Header("Effects")] /// Bypass effects (Applied from filter components or global listener filters). [Tooltip("Bypass effects (Applied from filter components or global listener filters).")] public bool BypassEffects = false; /// When set global effects on the AudioListener will not be applied to the audio signal generated by the AudioSource. Does not apply if the AudioSource is playing into a mixer group. [Tooltip("When set global effects on the AudioListener will not be applied to the audio signal generated by the AudioSource. Does not apply if the AudioSource is playing into a mixer group.")] public bool BypassListenerEffects = false; /// When set doesn't route the signal from an AudioSource into the global reverb associated with reverb zones. [Tooltip("When set doesn't route the signal from an AudioSource into the global reverb associated with reverb zones.")] public bool BypassReverbZones = false; /// Sets the priority of the AudioSource. [Tooltip("Sets the priority of the AudioSource.")] [Range(0, 256)] public int Priority = 128; /// The amount by which the signal from the AudioSource will be mixed into the global reverb associated with the Reverb Zones. [Tooltip("The amount by which the signal from the AudioSource will be mixed into the global reverb associated with the Reverb Zones.")] [Range(0f,1.1f)] public float ReverbZoneMix = 1f; [Header("3D Sound Settings")] /// Sets the Doppler scale for this AudioSource. [Tooltip("Sets the Doppler scale for this AudioSource.")] [Range(0f,5f)] public float DopplerLevel = 1f; /// Sets the spread angle (in degrees) of a 3d stereo or multichannel sound in speaker space. [Tooltip("Sets the spread angle (in degrees) of a 3d stereo or multichannel sound in speaker space.")] [Range(0,360)] public int Spread = 0; /// Sets/Gets how the AudioSource attenuates over distance. [Tooltip("Sets/Gets how the AudioSource attenuates over distance.")] public AudioRolloffMode RolloffMode = AudioRolloffMode.Logarithmic; /// Within the Min distance the AudioSource will cease to grow louder in volume. [Tooltip("Within the Min distance the AudioSource will cease to grow louder in volume.")] public float MinDistance = 1f; /// (Logarithmic rolloff) MaxDistance is the distance a sound stops attenuating at. [Tooltip("(Logarithmic rolloff) MaxDistance is the distance a sound stops attenuating at.")] public float MaxDistance = 500f; /// whether or not to use a custom curve for custom volume rolloff [Tooltip("whether or not to use a custom curve for custom volume rolloff")] public bool UseCustomRolloffCurve = false; /// the curve to use for custom volume rolloff if UseCustomRolloffCurve is true [Tooltip("the curve to use for custom volume rolloff if UseCustomRolloffCurve is true")] [MMCondition("UseCustomRolloffCurve", true)] public AnimationCurve CustomRolloffCurve; /// whether or not to use a custom curve for spatial blend [Tooltip("whether or not to use a custom curve for spatial blend")] public bool UseSpatialBlendCurve = false; /// the curve to use for custom spatial blend if UseSpatialBlendCurve is true [Tooltip("the curve to use for custom spatial blend if UseSpatialBlendCurve is true")] [MMCondition("UseSpatialBlendCurve", true)] public AnimationCurve SpatialBlendCurve; /// whether or not to use a custom curve for reverb zone mix [Tooltip("whether or not to use a custom curve for reverb zone mix")] public bool UseReverbZoneMixCurve = false; /// the curve to use for custom reverb zone mix if UseReverbZoneMixCurve is true [Tooltip("the curve to use for custom reverb zone mix if UseReverbZoneMixCurve is true")] [MMCondition("UseReverbZoneMixCurve", true)] public AnimationCurve ReverbZoneMixCurve; /// whether or not to use a custom curve for spread [Tooltip("whether or not to use a custom curve for spread")] public bool UseSpreadCurve = false; /// the curve to use for custom spread if UseSpreadCurve is true [Tooltip("the curve to use for custom spread if UseSpreadCurve is true")] [MMCondition("UseSpreadCurve", true)] public AnimationCurve SpreadCurve; } }