diff --git a/Assets/Fungus/Scripts/Commands/FadeScreen.cs b/Assets/Fungus/Scripts/Commands/FadeScreen.cs index e00a3b11..b44c35fd 100644 --- a/Assets/Fungus/Scripts/Commands/FadeScreen.cs +++ b/Assets/Fungus/Scripts/Commands/FadeScreen.cs @@ -35,7 +35,7 @@ namespace Fungus.Commands public override void OnEnter() { - var cameraController = CameraController.GetInstance(); + var cameraController = FungusManager.Instance.Camera; if (fadeTexture) { diff --git a/Assets/Fungus/Scripts/Commands/FadeToView.cs b/Assets/Fungus/Scripts/Commands/FadeToView.cs index d49d9e2a..a9363863 100644 --- a/Assets/Fungus/Scripts/Commands/FadeToView.cs +++ b/Assets/Fungus/Scripts/Commands/FadeToView.cs @@ -71,7 +71,7 @@ namespace Fungus.Commands return; } - var cameraController = CameraController.GetInstance(); + var cameraController = FungusManager.Instance.Camera; if (fadeTexture) { @@ -97,7 +97,9 @@ namespace Fungus.Commands public override void OnStopExecuting() { - CameraController.GetInstance().Stop(); + var cameraController = FungusManager.Instance.Camera; + + cameraController.Stop(); } public override string GetSummary() diff --git a/Assets/Fungus/Scripts/Commands/MoveToView.cs b/Assets/Fungus/Scripts/Commands/MoveToView.cs index ba14ce11..3521a9cb 100644 --- a/Assets/Fungus/Scripts/Commands/MoveToView.cs +++ b/Assets/Fungus/Scripts/Commands/MoveToView.cs @@ -58,7 +58,7 @@ namespace Fungus.Commands return; } - var cameraController = CameraController.GetInstance(); + var cameraController = FungusManager.Instance.Camera; Vector3 targetPosition = targetView.transform.position; Quaternion targetRotation = targetView.transform.rotation; @@ -79,7 +79,9 @@ namespace Fungus.Commands public override void OnStopExecuting() { - CameraController.GetInstance().Stop(); + var cameraController = FungusManager.Instance.Camera; + + cameraController.Stop(); } public override string GetSummary() diff --git a/Assets/Fungus/Scripts/Commands/PlayMusic.cs b/Assets/Fungus/Scripts/Commands/PlayMusic.cs index 3add80cd..69aab315 100644 --- a/Assets/Fungus/Scripts/Commands/PlayMusic.cs +++ b/Assets/Fungus/Scripts/Commands/PlayMusic.cs @@ -30,12 +30,10 @@ namespace Fungus.Commands public override void OnEnter() { - var musicController = MusicController.GetInstance(); - if (musicController != null) - { - float startTime = Mathf.Max(0, atTime); - musicController.PlayMusic(musicClip, loop, fadeDuration, startTime); - } + var musicController = FungusManager.Instance.Music; + + float startTime = Mathf.Max(0, atTime); + musicController.PlayMusic(musicClip, loop, fadeDuration, startTime); Continue(); } diff --git a/Assets/Fungus/Scripts/Commands/PlaySound.cs b/Assets/Fungus/Scripts/Commands/PlaySound.cs index 8478fa25..ad6c9446 100644 --- a/Assets/Fungus/Scripts/Commands/PlaySound.cs +++ b/Assets/Fungus/Scripts/Commands/PlaySound.cs @@ -39,11 +39,9 @@ namespace Fungus.Commands return; } - var musicController = MusicController.GetInstance(); - if (musicController != null) - { - musicController.PlaySound(soundClip, volume); - } + var musicController = FungusManager.Instance.Music; + + musicController.PlaySound(soundClip, volume); if (waitUntilFinished) { diff --git a/Assets/Fungus/Scripts/Commands/SetAudioPitch.cs b/Assets/Fungus/Scripts/Commands/SetAudioPitch.cs index 59002c0f..242fe901 100644 --- a/Assets/Fungus/Scripts/Commands/SetAudioPitch.cs +++ b/Assets/Fungus/Scripts/Commands/SetAudioPitch.cs @@ -36,11 +36,9 @@ namespace Fungus.Commands } }; - var musicController = MusicController.GetInstance(); - if (musicController != null) - { - musicController.SetAudioPitch(pitch, fadeDuration, onComplete); - } + var musicController = FungusManager.Instance.Music; + + musicController.SetAudioPitch(pitch, fadeDuration, onComplete); if (!waitUntilFinished) { diff --git a/Assets/Fungus/Scripts/Commands/SetAudioVolume.cs b/Assets/Fungus/Scripts/Commands/SetAudioVolume.cs index f492481c..9e4f3b9a 100644 --- a/Assets/Fungus/Scripts/Commands/SetAudioVolume.cs +++ b/Assets/Fungus/Scripts/Commands/SetAudioVolume.cs @@ -29,16 +29,14 @@ namespace Fungus.Commands public override void OnEnter() { - var musicController = MusicController.GetInstance(); - if (musicController != null) - { - musicController.SetAudioVolume(volume, fadeDuration, () => { - if (waitUntilFinished) - { - Continue(); - } - }); - } + var musicController = FungusManager.Instance.Music; + + musicController.SetAudioVolume(volume, fadeDuration, () => { + if (waitUntilFinished) + { + Continue(); + } + }); if (!waitUntilFinished) { diff --git a/Assets/Fungus/Scripts/Commands/StartSwipe.cs b/Assets/Fungus/Scripts/Commands/StartSwipe.cs index cd69e6a1..b6b12e63 100644 --- a/Assets/Fungus/Scripts/Commands/StartSwipe.cs +++ b/Assets/Fungus/Scripts/Commands/StartSwipe.cs @@ -53,7 +53,7 @@ namespace Fungus.Commands return; } - var cameraController = CameraController.GetInstance(); + var cameraController = FungusManager.Instance.Camera; cameraController.StartSwipePan(targetCamera, viewA, viewB, duration, speedMultiplier, () => Continue() ); } diff --git a/Assets/Fungus/Scripts/Commands/StopMusic.cs b/Assets/Fungus/Scripts/Commands/StopMusic.cs index 5e4abe27..9573721b 100644 --- a/Assets/Fungus/Scripts/Commands/StopMusic.cs +++ b/Assets/Fungus/Scripts/Commands/StopMusic.cs @@ -18,11 +18,9 @@ namespace Fungus.Commands public override void OnEnter() { - var musicController = MusicController.GetInstance(); - if (musicController != null) - { - musicController.StopMusic(); - } + var musicController = FungusManager.Instance.Music; + + musicController.StopMusic(); Continue(); } diff --git a/Assets/Fungus/Scripts/Commands/StopSwipe.cs b/Assets/Fungus/Scripts/Commands/StopSwipe.cs index 53863e5c..88205e19 100644 --- a/Assets/Fungus/Scripts/Commands/StopSwipe.cs +++ b/Assets/Fungus/Scripts/Commands/StopSwipe.cs @@ -18,7 +18,7 @@ namespace Fungus.Commands public override void OnEnter() { - var cameraController = CameraController.GetInstance(); + var cameraController = FungusManager.Instance.Camera; cameraController.StopSwipePan(); diff --git a/Assets/Fungus/Scripts/Components/CameraController.cs b/Assets/Fungus/Scripts/Components/CameraController.cs index b6824157..3bb4c6d0 100644 --- a/Assets/Fungus/Scripts/Components/CameraController.cs +++ b/Assets/Fungus/Scripts/Components/CameraController.cs @@ -51,8 +51,6 @@ namespace Fungus protected Dictionary storedViews = new Dictionary(); - protected static CameraController instance; - protected virtual void OnGUI() { if (swipePanActive) @@ -302,21 +300,6 @@ namespace Fungus #region Public members - /// - /// Returns the CameraController singleton instance. - /// Will create a CameraController game object if none currently exists. - /// - public static CameraController GetInstance() - { - if (instance == null) - { - GameObject go = new GameObject("CameraController"); - instance = go.AddComponent(); - } - - return instance; - } - /// /// Moves camera smoothly through a sequence of Views over a period of time. /// diff --git a/Assets/Fungus/Scripts/Components/FungusManager.cs b/Assets/Fungus/Scripts/Components/FungusManager.cs new file mode 100644 index 00000000..fb068120 --- /dev/null +++ b/Assets/Fungus/Scripts/Components/FungusManager.cs @@ -0,0 +1,78 @@ +using UnityEngine; +using System.Collections; + +namespace Fungus +{ + /// + /// Fungus manager singleton. Manages access to all Fungus singletons in a consistent manner. + /// + [RequireComponent(typeof(CameraController))] + [RequireComponent(typeof(MusicController))] + public sealed class FungusManager : MonoBehaviour + { + static FungusManager instance; + static bool applicationIsQuitting = false; + static object _lock = new object(); + + void Awake() + { + Camera = GetComponent(); + Music = GetComponent(); + } + + /// + /// When Unity quits, it destroys objects in a random order. + /// In principle, a Singleton is only destroyed when application quits. + /// If any script calls Instance after it have been destroyed, + /// it will create a buggy ghost object that will stay on the Editor scene + /// even after stopping playing the Application. Really bad! + /// So, this was made to be sure we're not creating that buggy ghost object. + /// + void OnDestroy () + { + applicationIsQuitting = true; + } + + #region Public methods + + /// + /// Gets the camera manager singleton instance. + /// + public CameraController Camera { get; private set; } + + /// + /// Gets the music manager singleton instance. + /// + public MusicController Music { get; private set; } + + /// + /// Gets the FungusManager singleton instance. + /// + public static FungusManager Instance + { + get + { + if (applicationIsQuitting) + { + Debug.LogWarning("FungusManager.Instance() was called while application is quitting. Returning null instead."); + return null; + } + + lock (_lock) + { + if (instance == null) + { + var go = new GameObject(); + go.name = "FungusManager"; + DontDestroyOnLoad(go); + instance = go.AddComponent(); + } + + return instance; + } + } + } + + #endregion + } +} \ No newline at end of file diff --git a/Assets/Fungus/Scripts/Components/FungusManager.cs.meta b/Assets/Fungus/Scripts/Components/FungusManager.cs.meta new file mode 100644 index 00000000..d643e8ac --- /dev/null +++ b/Assets/Fungus/Scripts/Components/FungusManager.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fa59a268bb22b4646bd9a89fa66582b1 +timeCreated: 1475164406 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Fungus/Scripts/Components/MusicController.cs b/Assets/Fungus/Scripts/Components/MusicController.cs index 8f0c655b..5bcb89b6 100644 --- a/Assets/Fungus/Scripts/Components/MusicController.cs +++ b/Assets/Fungus/Scripts/Components/MusicController.cs @@ -12,8 +12,6 @@ namespace Fungus [RequireComponent(typeof(AudioSource))] public class MusicController : MonoBehaviour { - protected static MusicController instance; - protected virtual void Start() { GetComponent().playOnAwake = false; @@ -22,22 +20,6 @@ namespace Fungus #region Public members - /// - /// Returns the MusicController singleton instance. - /// Will create a MusicController game object if none currently exists. - /// - public static MusicController GetInstance() - { - if (instance == null) - { - GameObject go = new GameObject("MusicController"); - DontDestroyOnLoad(go); - instance = go.AddComponent(); - } - - return instance; - } - /// /// Plays game music using an audio clip. /// One music clip may be played at a time. diff --git a/Assets/Fungus/Scripts/Components/Writer.cs b/Assets/Fungus/Scripts/Components/Writer.cs index 4ece9b15..905a128a 100644 --- a/Assets/Fungus/Scripts/Components/Writer.cs +++ b/Assets/Fungus/Scripts/Components/Writer.cs @@ -665,7 +665,8 @@ namespace Fungus protected virtual void Flash(float duration) { - var cameraController = CameraController.GetInstance(); + var cameraController = FungusManager.Instance.Camera; + cameraController.ScreenFadeTexture = CameraController.CreateColorTexture(new Color(1f,1f,1f,1f), 32, 32); cameraController.Fade(1f, duration, delegate { cameraController.ScreenFadeTexture = CameraController.CreateColorTexture(new Color(1f,1f,1f,1f), 32, 32);