diff --git a/Packages/com.chark.game-management/CHANGELOG.md b/Packages/com.chark.game-management/CHANGELOG.md index 8992688..7084eef 100644 --- a/Packages/com.chark.game-management/CHANGELOG.md +++ b/Packages/com.chark.game-management/CHANGELOG.md @@ -14,6 +14,7 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - `GameManager.ReadResourceAsync` and `GameManager.ReadResourceStreamAsync` methods which can be used to retrieve resources from StreamingAssets directory. - `GameManager.ReadDataStream` and `GameManager.ReadDataStreamAsync` methods which can be used to read a `Stream` from a file on disk. - `GameManager.SaveDataStream` and `GameManager.SaveDataStreamAsync` methods which can be used to persist a `Stream` to disk. +- `GameManager.IsDebuggingEnabled` flag which can be used to turn on if debug mode is on for the game manager. ### Changed diff --git a/Packages/com.chark.game-management/Documentation~/README.md b/Packages/com.chark.game-management/Documentation~/README.md index 6a31f5f..12a8389 100644 --- a/Packages/com.chark.game-management/Documentation~/README.md +++ b/Packages/com.chark.game-management/Documentation~/README.md @@ -196,6 +196,13 @@ GameManager.SetEditorValue("some-key", value); // Delete an Editor value synchronously GameManager.DeleteEditorValue("some-key"); + +// Change debugging mode state +GameManager.IsDebuggingEnabled = true; +GameManager.IsDebuggingEnabled = false; + +// Check for debug mode state changes and react accordingly +GameManager.AddListener(message => { }); ``` ### Systems diff --git a/Packages/com.chark.game-management/Runtime/AssemblyInfo.cs b/Packages/com.chark.game-management/Runtime/AssemblyInfo.cs index 1c1f9af..257c169 100644 --- a/Packages/com.chark.game-management/Runtime/AssemblyInfo.cs +++ b/Packages/com.chark.game-management/Runtime/AssemblyInfo.cs @@ -1,4 +1,5 @@ using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("CHARK.GameManagement.Tests.Editor")] +[assembly: InternalsVisibleTo("CHARK.GameManagement.Tests.Runtime")] [assembly: InternalsVisibleTo("CHARK.GameManagement.Editor")] diff --git a/Packages/com.chark.game-management/Runtime/GameManager.External.cs b/Packages/com.chark.game-management/Runtime/GameManager.External.cs index b434824..5122d85 100644 --- a/Packages/com.chark.game-management/Runtime/GameManager.External.cs +++ b/Packages/com.chark.game-management/Runtime/GameManager.External.cs @@ -8,12 +8,62 @@ using CHARK.GameManagement.Serialization; using CHARK.GameManagement.Storage; using CHARK.GameManagement.Systems; +using UnityEngine; using Object = UnityEngine.Object; namespace CHARK.GameManagement { public abstract partial class GameManager { + /// + /// true if debug mode is enabled or false otherwise. When this value changes, a + /// is raised. + /// + public static bool IsDebuggingEnabled + { + get + { +#if UNITY_EDITOR + if (Application.isPlaying) + { + return isDebuggingEnabled; + } + + if (TryReadEditorData(IsDebuggingEnabledKey, out var value)) + { + return value; + } +#endif + return isDebuggingEnabled; + } + set + { + var oldValue = IsDebuggingEnabled; + var newValue = value; + +#if UNITY_EDITOR + SaveEditorData(IsDebuggingEnabledKey, newValue); +#endif + + isDebuggingEnabled = newValue; + +#if UNITY_EDITOR + if (Application.isPlaying == false) + { + return; + } +#endif + + if (oldValue == newValue) + { + return; + } + + var message = new DebuggingChangedMessage(oldValue, newValue); + Publish(message); + } + } + /// public static IEnumerable GetResources(string path = null) where TResource : Object diff --git a/Packages/com.chark.game-management/Runtime/GameManager.cs b/Packages/com.chark.game-management/Runtime/GameManager.cs index 399ad23..6027707 100644 --- a/Packages/com.chark.game-management/Runtime/GameManager.cs +++ b/Packages/com.chark.game-management/Runtime/GameManager.cs @@ -26,6 +26,9 @@ public abstract partial class GameManager : MonoBehaviour private static GameManagerSettings Settings => GameManagerSettings.Instance; + private const string IsDebuggingEnabledKey = nameof(GameManager) + "." + nameof(IsDebuggingEnabled); + private static bool isDebuggingEnabled; + private bool isSystemsInitialized; private ISerializer serializer; @@ -44,6 +47,15 @@ private void Awake() return; } +#if UNITY_EDITOR + if (TryReadEditorData(IsDebuggingEnabledKey, out bool value)) + { + isDebuggingEnabled = value; + } +#else + isDebuggingEnabled = Debug.isDebugBuild; +#endif + var isInitialized = currentGameManager == true; currentGameManager = this; diff --git a/Packages/com.chark.game-management/Runtime/Messages.cs b/Packages/com.chark.game-management/Runtime/Messages.cs new file mode 100644 index 0000000..843a2b5 --- /dev/null +++ b/Packages/com.chark.game-management/Runtime/Messages.cs @@ -0,0 +1,26 @@ +using CHARK.GameManagement.Messaging; + +namespace CHARK.GameManagement +{ + /// + /// Raised when changes. + /// + public readonly struct DebuggingChangedMessage : IMessage + { + /// + /// Debugging mode state the game manager transitioned from. + /// + public bool IsDebuggingEnabledPrev { get; } + + /// + /// Debugging mode state the game manager is currently in. + /// + public bool IsDebuggingEnabled { get; } + + public DebuggingChangedMessage(bool isDebuggingEnabledPrev, bool isDebuggingEnabledNew) + { + IsDebuggingEnabledPrev = isDebuggingEnabledPrev; + IsDebuggingEnabled = isDebuggingEnabledNew; + } + } +} diff --git a/Packages/com.chark.game-management/Runtime/Messages.cs.meta b/Packages/com.chark.game-management/Runtime/Messages.cs.meta new file mode 100644 index 0000000..5b55a6b --- /dev/null +++ b/Packages/com.chark.game-management/Runtime/Messages.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4e6e9126921d4a96a47b9cfda83df088 +timeCreated: 1725800949 \ No newline at end of file diff --git a/Packages/com.chark.game-management/Runtime/Settings/GameManagerSettings.cs b/Packages/com.chark.game-management/Runtime/Settings/GameManagerSettings.cs index 87b2eaf..f317455 100644 --- a/Packages/com.chark.game-management/Runtime/Settings/GameManagerSettings.cs +++ b/Packages/com.chark.game-management/Runtime/Settings/GameManagerSettings.cs @@ -8,12 +8,13 @@ namespace CHARK.GameManagement.Settings internal sealed class GameManagerSettings : ScriptableObject { [Tooltip( - "List of available settings profiles, the first active profile will be picked during " + - "Game Manager initialization" + "List of available settings profiles, the first active profile will be picked during " + + "Game Manager initialization" )] [SerializeField] private List profiles = new(); + private IGameManagerSettingsProfile profileOverride; private static GameManagerSettings currentSettings; /// @@ -31,7 +32,11 @@ internal static GameManagerSettings Instance /// /// Currently active settings instance. Never null. /// - internal IGameManagerSettingsProfile ActiveProfile => GetActiveProfile(); + internal IGameManagerSettingsProfile ActiveProfile + { + get => GetActiveProfile(); + set => profileOverride = value; + } /// /// Add a set of new profiles to the list. Duplicated profiles will @@ -90,6 +95,11 @@ private static bool TryGetSettings(out GameManagerSettings settings) private IGameManagerSettingsProfile GetActiveProfile() { + if (profileOverride != default) + { + return profileOverride; + } + if (profiles.Count == 0) { return DefaultGameManagerSettingsProfile.Instance;