diff --git a/Assets/Fungus/Scripts/Commands/PlayAmbianceSound.cs b/Assets/Fungus/Scripts/Commands/PlayAmbianceSound.cs
new file mode 100644
index 00000000..de01f162
--- /dev/null
+++ b/Assets/Fungus/Scripts/Commands/PlayAmbianceSound.cs
@@ -0,0 +1,69 @@
+// This code is part of the Fungus library (http://fungusgames.com) maintained by Chris Gregan (http://twitter.com/gofungus).
+// It is released for free under the MIT open source license (https://github.com/snozbot/fungus/blob/master/LICENSE)
+
+using UnityEngine;
+
+namespace Fungus
+{
+ ///
+ /// Plays a once-off sound effect. Multiple sound effects can be played at the same time.
+ ///
+ [CommandInfo("Audio",
+ "Play Ambiance Sound",
+ "Plays a background sound to be overlayed on top of the music. Only one Ambiance can be played at a time.")]
+ [AddComponentMenu("")]
+ public class PlayAmbianceSound : Command
+ {
+ [Tooltip("Sound effect clip to play")]
+ [SerializeField]
+ protected AudioClip soundClip;
+
+ [Range(0, 1)]
+ [Tooltip("Volume level of the sound effect")]
+ [SerializeField]
+ protected float volume = 1;
+
+ [Tooltip("Sound effect clip to play")]
+ [SerializeField]
+ protected bool loop;
+
+ protected virtual void DoWait()
+ {
+ Continue();
+ }
+
+ #region Public members
+
+ public override void OnEnter()
+ {
+ if (soundClip == null)
+ {
+ Continue();
+ return;
+ }
+
+ var musicManager = FungusManager.Instance.MusicManager;
+
+ musicManager.PlayAmbianceSound(soundClip, loop, volume);
+
+ Continue();
+ }
+
+ public override string GetSummary()
+ {
+ if (soundClip == null)
+ {
+ return "Error: No sound clip selected";
+ }
+
+ return soundClip.name;
+ }
+
+ public override Color GetButtonColor()
+ {
+ return new Color32(242, 209, 176, 255);
+ }
+
+ #endregion
+ }
+}
diff --git a/Assets/Fungus/Scripts/Commands/PlayAmbianceSound.cs.meta b/Assets/Fungus/Scripts/Commands/PlayAmbianceSound.cs.meta
new file mode 100644
index 00000000..6465ec8e
--- /dev/null
+++ b/Assets/Fungus/Scripts/Commands/PlayAmbianceSound.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 831c208af3cccf24b80cc6f3768919bc
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Fungus/Scripts/Commands/PlayRandomSound.cs b/Assets/Fungus/Scripts/Commands/PlayRandomSound.cs
new file mode 100644
index 00000000..3b1e2daf
--- /dev/null
+++ b/Assets/Fungus/Scripts/Commands/PlayRandomSound.cs
@@ -0,0 +1,84 @@
+// This code is part of the Fungus library (http://fungusgames.com) maintained by Chris Gregan (http://twitter.com/gofungus).
+// It is released for free under the MIT open source license (https://github.com/snozbot/fungus/blob/master/LICENSE)
+
+using UnityEngine;
+
+namespace Fungus
+{
+ ///
+ /// Plays a once-off sound effect. Multiple sound effects can be played at the same time.
+ ///
+ [CommandInfo("Audio",
+ "Play Random Sound",
+ "Plays a once-off sound effect from a list of available sound effects. Multiple sound effects can be played at the same time.")]
+ [AddComponentMenu("")]
+ public class PlayRandomSound : Command
+ {
+ [Tooltip("Sound effect clip to play")]
+ [SerializeField]
+ protected AudioClip[] soundClip;
+
+ [Range(0, 1)]
+ [Tooltip("Volume level of the sound effect")]
+ [SerializeField]
+ protected float volume = 1;
+
+ [Tooltip("Wait until the sound has finished playing before continuing execution.")]
+ [SerializeField]
+ protected bool waitUntilFinished;
+
+ protected virtual void DoWait()
+ {
+ Continue();
+ }
+
+ #region Public members
+
+ public override void OnEnter()
+ {
+ int rand = Random.Range(0, soundClip.Length);
+ if (soundClip == null)
+ {
+ Continue();
+ return;
+ }
+
+ var musicManager = FungusManager.Instance.MusicManager;
+
+ musicManager.PlaySound(soundClip[rand], volume);
+
+ if (waitUntilFinished)
+ {
+ Invoke("DoWait", soundClip[rand].length);
+ }
+ else
+ {
+ Continue();
+ }
+ }
+
+ public override string GetSummary()
+ {
+ if (soundClip == null)
+ {
+ return "Error: No sound clip selected";
+ }
+
+ string sounds = "[";
+ foreach (AudioClip ac in soundClip) {
+ if(ac!=null)
+ sounds+=ac.name+" ,";
+ }
+ sounds = sounds.TrimEnd(' ', ',');
+ sounds += "]";
+ return "Random sounds "+sounds;
+ }
+
+ public override Color GetButtonColor()
+ {
+ return new Color32(242, 209, 176, 255);
+ }
+
+ #endregion
+ }
+}
diff --git a/Assets/Fungus/Scripts/Commands/PlayRandomSound.cs.meta b/Assets/Fungus/Scripts/Commands/PlayRandomSound.cs.meta
new file mode 100644
index 00000000..a5c778b3
--- /dev/null
+++ b/Assets/Fungus/Scripts/Commands/PlayRandomSound.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 04659f7200983fe40b49cc144086844b
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Fungus/Scripts/Commands/StopAmbiance.cs b/Assets/Fungus/Scripts/Commands/StopAmbiance.cs
new file mode 100644
index 00000000..b3130c06
--- /dev/null
+++ b/Assets/Fungus/Scripts/Commands/StopAmbiance.cs
@@ -0,0 +1,35 @@
+// This code is part of the Fungus library (http://fungusgames.com) maintained by Chris Gregan (http://twitter.com/gofungus).
+// It is released for free under the MIT open source license (https://github.com/snozbot/fungus/blob/master/LICENSE)
+
+using UnityEngine;
+
+namespace Fungus
+{
+ ///
+ /// Stops the currently playing game music.
+ ///
+ [CommandInfo("Audio",
+ "Stop Ambiance",
+ "Stops the currently playing game ambiance.")]
+ [AddComponentMenu("")]
+ public class StopAmbiance : Command
+ {
+ #region Public members
+
+ public override void OnEnter()
+ {
+ var musicManager = FungusManager.Instance.MusicManager;
+
+ musicManager.StopAmbiance();
+
+ Continue();
+ }
+
+ public override Color GetButtonColor()
+ {
+ return new Color32(242, 209, 176, 255);
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/Assets/Fungus/Scripts/Commands/StopAmbiance.cs.meta b/Assets/Fungus/Scripts/Commands/StopAmbiance.cs.meta
new file mode 100644
index 00000000..b4e0d210
--- /dev/null
+++ b/Assets/Fungus/Scripts/Commands/StopAmbiance.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 4bce3bd679be2c94196f3f6aaeb33f0b
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Fungus/Scripts/Components/MusicManager.cs b/Assets/Fungus/Scripts/Components/MusicManager.cs
index c89744e8..8ea094d9 100644
--- a/Assets/Fungus/Scripts/Components/MusicManager.cs
+++ b/Assets/Fungus/Scripts/Components/MusicManager.cs
@@ -1,7 +1,7 @@
// This code is part of the Fungus library (http://fungusgames.com) maintained by Chris Gregan (http://twitter.com/gofungus).
// It is released for free under the MIT open source license (https://github.com/snozbot/fungus/blob/master/LICENSE)
-using UnityEngine;
+using UnityEngine;
namespace Fungus
{
@@ -9,14 +9,25 @@ namespace Fungus
/// Music manager which provides basic music and sound effect functionality.
/// Music playback persists across scene loads.
///
- [RequireComponent(typeof(AudioSource))]
+ //[RequireComponent(typeof(AudioSource))]
public class MusicManager : MonoBehaviour
{
protected AudioSource audioSource;
+ protected AudioSource audioSourceAmbiance;
+
+ void Reset()
+ {
+ int audioSourceCount = this.GetComponents().Length;
+ for (int i = 0; i < 2 - audioSourceCount; i++)
+ gameObject.AddComponent();
+
+ }
protected virtual void Awake()
{
- audioSource = GetComponent();
+ Reset();
+ audioSource = GetComponents()[0];
+ audioSourceAmbiance = GetComponents()[1];
}
protected virtual void Start()
@@ -50,10 +61,10 @@ namespace Fungus
float startVolume = audioSource.volume;
LeanTween.value(gameObject, startVolume, 0f, fadeDuration)
- .setOnUpdate( (v) => {
+ .setOnUpdate((v) => {
// Fade out current music
audioSource.volume = v;
- }).setOnComplete( () => {
+ }).setOnComplete(() => {
// Play new music
audioSource.volume = startVolume;
audioSource.clip = musicClip;
@@ -74,6 +85,20 @@ namespace Fungus
audioSource.PlayOneShot(soundClip, volume);
}
+ ///
+ /// Plays a sound effect with optional looping values, at the specified volume.
+ ///
+ /// The sound effect clip to play.
+ /// If the audioclip should loop or not.
+ /// The volume level of the sound effect.
+ public virtual void PlayAmbianceSound(AudioClip soundClip, bool loop, float volume)
+ {
+ audioSourceAmbiance.loop = loop;
+ audioSourceAmbiance.clip = soundClip;
+ audioSourceAmbiance.volume = volume;
+ audioSourceAmbiance.Play();
+ }
+
///
/// Shifts the game music pitch to required value over a period of time.
///
@@ -85,6 +110,7 @@ namespace Fungus
if (Mathf.Approximately(duration, 0f))
{
audioSource.pitch = pitch;
+ audioSourceAmbiance.pitch = pitch;
if (onComplete != null)
{
onComplete();
@@ -92,12 +118,15 @@ namespace Fungus
return;
}
- LeanTween.value(gameObject,
- audioSource.pitch,
- pitch,
- duration).setOnUpdate( (p) => {
+ LeanTween.value(gameObject,
+ audioSource.pitch,
+ pitch,
+ duration).setOnUpdate((p) =>
+ {
audioSource.pitch = p;
- }).setOnComplete( () => {
+ audioSourceAmbiance.pitch = p;
+ }).setOnComplete(() =>
+ {
if (onComplete != null)
{
onComplete();
@@ -115,20 +144,22 @@ namespace Fungus
{
if (Mathf.Approximately(duration, 0f))
{
- if (onComplete != null)
- {
- onComplete();
- }
+ if (onComplete != null)
+ {
+ onComplete();
+ }
audioSource.volume = volume;
+ audioSourceAmbiance.volume = volume;
return;
}
- LeanTween.value(gameObject,
- audioSource.volume,
- volume,
- duration).setOnUpdate( (v) => {
+ LeanTween.value(gameObject,
+ audioSource.volume,
+ volume,
+ duration).setOnUpdate((v) => {
audioSource.volume = v;
- }).setOnComplete( () => {
+ audioSourceAmbiance.volume = v;
+ }).setOnComplete(() => {
if (onComplete != null)
{
onComplete();
@@ -145,6 +176,15 @@ namespace Fungus
audioSource.clip = null;
}
+ ///
+ /// Stops playing game ambiance.
+ ///
+ public virtual void StopAmbiance()
+ {
+ audioSourceAmbiance.Stop();
+ audioSourceAmbiance.clip = null;
+ }
+
#endregion
}
}
\ No newline at end of file