diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c0bcf8..d2c8cf4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Thread-Dispatcher will be removed as a dependency in a future release. +## [3.4.1] - 2022-11-13 + +### Fixed +- Runtime Monitoring now works properly with Disabled Domain and Scene reloads in Enter Play Mode Options. + +### Deprecated (Removing in [4.0.0]) +- ISettableValue is now deprecated. + + ## [3.4.0] - 2022-10-30 ### Added diff --git a/Runtime/Scripts/Core/Profiles/MonitorProfile.cs b/Runtime/Scripts/Core/Profiles/MonitorProfile.cs index b2f9477..79e721b 100644 --- a/Runtime/Scripts/Core/Profiles/MonitorProfile.cs +++ b/Runtime/Scripts/Core/Profiles/MonitorProfile.cs @@ -113,7 +113,7 @@ protected MonitorProfile( if (TryGetMetaAttribute(out var fontAttribute)) { - MonitoringRegistry.Singleton.AddUsedFont(fontAttribute.FontName); + Monitor.InternalRegistry.AddUsedFont(fontAttribute.FontName); } if (TryGetMetaAttribute(out var enabledAttribute)) @@ -158,7 +158,7 @@ protected MonitorProfile( { var readableString = MonitoredMemberType.HumanizedName(); tags.Add(readableString); - MonitoringRegistry.Singleton.AddUsedType(MonitoredMemberType); + Monitor.InternalRegistry.AddUsedType(MonitoredMemberType); } if (settings.FilterTags) @@ -169,7 +169,7 @@ protected MonitorProfile( foreach (var tag in optionsAttribute.Tags) { customTags.Add(tag); - MonitoringRegistry.Singleton.AddUsedTag(tag); + Monitor.InternalRegistry.AddUsedTag(tag); tags.Add(tag); } } @@ -178,7 +178,7 @@ protected MonitorProfile( foreach (var tag in memberTags.Tags) { customTags.Add(tag); - MonitoringRegistry.Singleton.AddUsedTag(tag); + Monitor.InternalRegistry.AddUsedTag(tag); tags.Add(tag); } } @@ -187,7 +187,7 @@ protected MonitorProfile( foreach (var tag in classTags.Tags) { customTags.Add(tag); - MonitoringRegistry.Singleton.AddUsedTag(tag); + Monitor.InternalRegistry.AddUsedTag(tag); tags.Add(tag); } } diff --git a/Runtime/Scripts/Core/Systems/MonitoringDisplay.cs b/Runtime/Scripts/Core/Systems/MonitoringDisplay.cs index 9381f66..d3dac3b 100644 --- a/Runtime/Scripts/Core/Systems/MonitoringDisplay.cs +++ b/Runtime/Scripts/Core/Systems/MonitoringDisplay.cs @@ -8,7 +8,7 @@ namespace Baracuda.Monitoring.Systems { - internal sealed class MonitoringDisplay : LazySingleton, IMonitoringUI + internal sealed class MonitoringDisplay : IMonitoringUI { #region Data diff --git a/Runtime/Scripts/Core/Systems/MonitoringEvents.cs b/Runtime/Scripts/Core/Systems/MonitoringEvents.cs index 88484c2..4b2348c 100644 --- a/Runtime/Scripts/Core/Systems/MonitoringEvents.cs +++ b/Runtime/Scripts/Core/Systems/MonitoringEvents.cs @@ -4,7 +4,7 @@ namespace Baracuda.Monitoring { - internal class MonitoringEvents : LazySingleton, IMonitoringEvents + internal class MonitoringEvents : IMonitoringEvents { /// /// Event is invoked when profiling process for the current system has been completed. @@ -59,7 +59,9 @@ internal void RaiseMonitorHandleDisposed(IMonitorHandle handle) #pragma warning disable CS0612 [Obsolete] +#pragma warning disable CS0618 public event ProfilingCompletedListener __ProfilingCompleted +#pragma warning restore CS0618 { add { @@ -90,7 +92,9 @@ public event ProfilingCompletedListener __ProfilingCompleted } [Obsolete] +#pragma warning disable CS0618 private ProfilingCompletedListener __completed; +#pragma warning restore CS0618 #pragma warning restore CS0612 #endregion diff --git a/Runtime/Scripts/Core/Systems/MonitoringProfiler.cs b/Runtime/Scripts/Core/Systems/MonitoringProfiler.cs index 38b5d2e..b64feb4 100644 --- a/Runtime/Scripts/Core/Systems/MonitoringProfiler.cs +++ b/Runtime/Scripts/Core/Systems/MonitoringProfiler.cs @@ -84,7 +84,7 @@ public async Task ProfileAsync() ProfileInternalAsync(Dispatcher.RuntimeToken).Wait(Dispatcher.RuntimeToken); } - MonitoringRegistry.Singleton.RegisterProfiles(_instanceProfiles, _staticProfiles); + Monitor.InternalRegistry.RegisterProfiles(_instanceProfiles, _staticProfiles); return true; } catch (OperationCanceledException oce) diff --git a/Runtime/Scripts/Core/Systems/MonitoringRegistry.cs b/Runtime/Scripts/Core/Systems/MonitoringRegistry.cs index a70d1c0..e211b5d 100644 --- a/Runtime/Scripts/Core/Systems/MonitoringRegistry.cs +++ b/Runtime/Scripts/Core/Systems/MonitoringRegistry.cs @@ -14,7 +14,7 @@ namespace Baracuda.Monitoring { #pragma warning disable CS0067 - internal class MonitoringRegistry : LazySingleton, IMonitoringRegistry + internal class MonitoringRegistry : IMonitoringRegistry { #region Data @@ -35,6 +35,7 @@ internal class MonitoringRegistry : LazySingleton, IMonitori #endregion + #region Public /// @@ -94,6 +95,7 @@ public IMonitorHandle[] GetMonitorHandlesForTarget(T target) where T : class #endregion + #region Internal internal void AddUsedTag(string tag) @@ -140,11 +142,12 @@ internal void RegisterProfiles(Dictionary> instancePr _staticProfiles = staticProfiles; CreateInitialInstanceMonitorHandles(); CreateStaticMonitorHandles(); - MonitoringEvents.Singleton.RaiseProfilingCompleted(_staticMonitorHandles, _instanceMonitorHandles); + Monitor.InternalEvents.RaiseProfilingCompleted(_staticMonitorHandles, _instanceMonitorHandles); } #endregion + #region Instance Monitor Handles private void CreateInitialInstanceMonitorHandles() @@ -187,7 +190,7 @@ private void CreateInstanceMonitorHandles(object target, Type type) units.Add(unit); _instanceMonitorHandles.Add(unit); _monitorHandles.Add(unit); - MonitoringEvents.Singleton.RaiseMonitorHandleCreated(unit); + Monitor.InternalEvents.RaiseMonitorHandleCreated(unit); } } @@ -214,7 +217,7 @@ private void DestroyMonitorHandleForTarget(object target) unit.Dispose(); _instanceMonitorHandles.Remove(unit); _monitorHandles.Remove(unit); - MonitoringEvents.Singleton.RaiseMonitorHandleDisposed(unit); + Monitor.InternalEvents.RaiseMonitorHandleDisposed(unit); } _activeInstanceHandles.Remove(target); @@ -222,6 +225,7 @@ private void DestroyMonitorHandleForTarget(object target) #endregion + #region Static Monitor Handles private void CreateStaticMonitorHandles() @@ -240,5 +244,22 @@ private void CreateStaticMonitorHandle(MonitorProfile staticProfile) } #endregion + + + #region Ctor + + internal MonitoringRegistry(MonitoringRegistry old) + { + if (old == null) + { + return; + } + foreach (var target in old._registeredTargets) + { + _registeredTargets.AddUnique(target); + } + } + + #endregion } } \ No newline at end of file diff --git a/Runtime/Scripts/Core/Systems/MonitoringTicker.cs b/Runtime/Scripts/Core/Systems/MonitoringTicker.cs index 3ed4292..bbbc2b2 100644 --- a/Runtime/Scripts/Core/Systems/MonitoringTicker.cs +++ b/Runtime/Scripts/Core/Systems/MonitoringTicker.cs @@ -8,7 +8,7 @@ namespace Baracuda.Monitoring.Systems { - internal class MonitoringTicker + internal class MonitoringTicker : MonitoredObject { public bool ValidationTickEnabled { get; set; } = true; @@ -25,7 +25,6 @@ internal class MonitoringTicker internal MonitoringTicker() { Monitor.Events.ProfilingCompleted += MonitoringEventsOnProfilingCompleted; - Monitor.StartMonitoring(this); } private void MonitoringEventsOnProfilingCompleted(IReadOnlyList staticUnits, IReadOnlyList instanceUnits) diff --git a/Runtime/Scripts/Core/Systems/ValueProcessorFactory.Initialization.cs b/Runtime/Scripts/Core/Systems/ValueProcessorFactory.Initialization.cs index 07e6c92..0dc1944 100644 --- a/Runtime/Scripts/Core/Systems/ValueProcessorFactory.Initialization.cs +++ b/Runtime/Scripts/Core/Systems/ValueProcessorFactory.Initialization.cs @@ -51,8 +51,6 @@ private const BindingFlags INSTANCE_FLAGS * Setup */ - - internal ValueProcessorFactory() { var settings = Monitor.Settings; diff --git a/Runtime/Scripts/Core/Types/LazySingleton.cs b/Runtime/Scripts/Core/Types/LazySingleton.cs deleted file mode 100644 index 62a0f6f..0000000 --- a/Runtime/Scripts/Core/Types/LazySingleton.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) 2022 Jonathan Lang - -using System; - -namespace Baracuda.Monitoring.Types -{ - internal class LazySingleton where T : LazySingleton, new() - { - internal static T Singleton => lazySingleton.Value; - - private static readonly Lazy lazySingleton = new Lazy(() => new T()); - } -} diff --git a/Runtime/Scripts/Core/Types/LazySingleton.cs.meta b/Runtime/Scripts/Core/Types/LazySingleton.cs.meta deleted file mode 100644 index 610e789..0000000 --- a/Runtime/Scripts/Core/Types/LazySingleton.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 06761c77b60983f49a6e788b30a5b895 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Runtime/Scripts/Core/Units/ValueHandle.cs b/Runtime/Scripts/Core/Units/ValueHandle.cs index 0d62a74..5934d44 100644 --- a/Runtime/Scripts/Core/Units/ValueHandle.cs +++ b/Runtime/Scripts/Core/Units/ValueHandle.cs @@ -15,7 +15,7 @@ namespace Baracuda.Monitoring.Units /// /// /// - internal abstract class ValueHandle : MonitorHandle, ISettableValue, IGettableValue where TTarget : class + internal abstract class ValueHandle : MonitorHandle, IGettableValue where TTarget : class { #region Fields @@ -207,23 +207,6 @@ public void SetValue(TValue value) RaiseValueChanged(state); } - public void SetValue(object value) - { - _setValue?.Invoke(_target, (TValue) value); - _lastValue = (TValue) value; - var state = GetState(); - RaiseValueChanged(state); - } - - public void SetValueStruct(TStruct value) where TStruct : struct - { - var converted = value.ConvertFast(); - _setValue?.Invoke(_target, converted); - _lastValue = converted; - var state = GetState(); - RaiseValueChanged(state); - } - #endregion //-------------------------------------------------------------------------------------------------------------- diff --git a/Runtime/Scripts/Interfaces/ISettableValue.cs b/Runtime/Scripts/Interfaces/ISettableValue.cs index 05c35d1..9f3e307 100644 --- a/Runtime/Scripts/Interfaces/ISettableValue.cs +++ b/Runtime/Scripts/Interfaces/ISettableValue.cs @@ -1,31 +1,24 @@ // Copyright (c) 2022 Jonathan Lang +using System; + namespace Baracuda.Monitoring { - /// - /// Interface is not yet in use. - /// + [Obsolete("This API will be removed in 4.0.0")] public interface ISettableValue : ISettableValue { - /// - /// Interface is not yet in use. - /// + [Obsolete("This API will be removed in 4.0.0")] void SetValue(TValue value); } - /// - /// Interface is not yet in use. - /// + [Obsolete("This API will be removed in 4.0.0")] public interface ISettableValue { - /// - /// Interface is not yet in use. - /// + + [Obsolete("This API will be removed in 4.0.0")] void SetValue(object value); - /// - /// Interface is not yet in use. - /// + [Obsolete("This API will be removed in 4.0.0")] void SetValueStruct(TStruct value) where TStruct : struct; } } \ No newline at end of file diff --git a/Runtime/Scripts/Modules/ConsoleMonitor.cs b/Runtime/Scripts/Modules/ConsoleMonitor.cs index 8bb9708..e76b628 100644 --- a/Runtime/Scripts/Modules/ConsoleMonitor.cs +++ b/Runtime/Scripts/Modules/ConsoleMonitor.cs @@ -24,10 +24,10 @@ public class ConsoleMonitor : MonitorModuleBase private static int messageCacheSize = 10; private static readonly char[] trimValues = {'\r', '\n'}; - private static readonly Color errorColor = new Color(1f, 0.5f, 0.52f); - private static readonly Color logColor = new Color(0.8f, 0.75f, 1f); - private static readonly Color warningColor = new Color(1f, 0.96f, 0.56f); - private static readonly Color stackTraceColor = new Color(0.65f, 0.7f, 0.75f); + private static Color ErrorColor => new Color(1f, 0.5f, 0.52f); + private static Color LogColor => new Color(0.8f, 0.75f, 1f); + private static Color WarningColor => new Color(1f, 0.96f, 0.56f); + private static Color StackTraceColor => new Color(0.65f, 0.7f, 0.75f); private static event Action UpdateDisplayedLogs; @@ -121,6 +121,8 @@ static ConsoleMonitor() [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] private static void Setup() { + messageLogCache.Clear(); + lastLogStacktrace = null; Application.logMessageReceivedThreaded -= OnLogMessageReceived; Application.logMessageReceivedThreaded += OnLogMessageReceived; } @@ -169,7 +171,7 @@ private string StacktraceProcessor(string stacktrace) if (truncateStacktrace && stacktrace.Length > maxStacktraceLenght) { sb.Append("'); sb.Append(stacktrace.Substring(0, maxStacktraceLenght)); sb.Append(""); @@ -178,7 +180,7 @@ private string StacktraceProcessor(string stacktrace) else { sb.Append("'); sb.Append(stacktrace); sb.Append(""); @@ -198,15 +200,15 @@ private static Color GetColor(LogType logType) switch (logType) { case LogType.Log: - return logColor; + return LogColor; case LogType.Error: - return errorColor; + return ErrorColor; case LogType.Assert: - return warningColor; + return WarningColor; case LogType.Warning: - return warningColor; + return WarningColor; case LogType.Exception: - return errorColor; + return ErrorColor; default: throw new ArgumentOutOfRangeException(nameof(logType), logType, null); } diff --git a/Runtime/Scripts/Monitor.cs b/Runtime/Scripts/Monitor.cs index f15bd21..82a633d 100644 --- a/Runtime/Scripts/Monitor.cs +++ b/Runtime/Scripts/Monitor.cs @@ -11,8 +11,13 @@ namespace Baracuda.Monitoring /// /// Primary access to monitoring API and systems. /// +#if UNITY_EDITOR + [UnityEditor.InitializeOnLoad] +#endif public static class Monitor { + #region API + /// /// Returns true once the system has been initialized. /// @@ -21,29 +26,29 @@ public static class Monitor /// /// Access to the monitoring settings asset. (Edit settings via: Tools > Runtime Monitoring) /// - public static IMonitoringSettings Settings { get; } + public static IMonitoringSettings Settings { get; private set; } /// /// Access monitoring UI API. /// - public static IMonitoringUI UI { get; } + public static IMonitoringUI UI { get; private set; } /// /// Access monitoring event handlers. /// - public static IMonitoringEvents Events { get; } + public static IMonitoringEvents Events { get; private set; } /// /// Primary interface to access cached data. /// - public static IMonitoringRegistry Registry { get; } + public static IMonitoringRegistry Registry { get; private set; } /// /// Register an object that is monitored. /// public static void StartMonitoring(T target) where T : class { - MonitoringRegistry.Singleton.RegisterTargetInternal(target); + InternalRegistry.RegisterTargetInternal(target); } /// @@ -51,30 +56,50 @@ public static void StartMonitoring(T target) where T : class /// public static void StopMonitoring(T target) where T : class { - MonitoringRegistry.Singleton.UnregisterTargetInternal(target); + InternalRegistry.UnregisterTargetInternal(target); } - internal static MonitoringLogger Logger { get; } - internal static MonitoringTicker Ticker { get; } - internal static ValidatorFactory ValidatorFactory { get; } - internal static ValueProcessorFactory ProcessorFactory { get; } + #endregion + + + #region Internal + + internal static MonitoringLogger Logger { get; private set; } + internal static MonitoringTicker Ticker { get; private set; } + internal static ValidatorFactory ValidatorFactory { get; private set; } + internal static ValueProcessorFactory ProcessorFactory { get; private set; } + + internal static MonitoringRegistry InternalRegistry { get; private set; } + internal static MonitoringDisplay InternalUI { get; private set; } + internal static MonitoringEvents InternalEvents { get; private set; } + + #endregion #region Installation static Monitor() + { + Application.quitting += OnApplicationQuit; + Initialize(); + } + + private static void Initialize() { Settings = MonitoringSettings.Singleton; if (Settings.IsMonitoringEnabled) { - Events = MonitoringEvents.Singleton; + InternalEvents = new MonitoringEvents(); + InternalRegistry = new MonitoringRegistry(InternalRegistry); + InternalUI = new MonitoringDisplay(); + Events = InternalEvents; Ticker = new MonitoringTicker(); Logger = new MonitoringLogger(); ValidatorFactory = new ValidatorFactory(); ProcessorFactory = new ValueProcessorFactory(); - UI = MonitoringDisplay.Singleton; - Registry = MonitoringRegistry.Singleton; + UI = InternalUI; + Registry = InternalRegistry; } else { @@ -88,6 +113,10 @@ static Monitor() [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] private static async void InitializeProfiling() { + if (!Initialized) + { + Initialize(); + } if (Settings.IsMonitoringEnabled) { var profiler = new MonitoringProfiler(); @@ -95,6 +124,12 @@ private static async void InitializeProfiling() } } + private static void OnApplicationQuit() + { + Ticker.Dispose(); + Initialized = false; + } + #endregion } } diff --git a/package.json b/package.json index 59a9c70..a1772ab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.baracuda.runtime-monitoring", - "version": "3.4.0", + "version": "3.4.1", "displayName": "Runtime Monitoring", "description": "Runtime Monitoring is an easy way for you to debug the state of your C# classes and objects during runtime.\n\nNote: when updating Major versions of Runtime Monitoring from the Package Manager, don't forget to remove the old version from the project before importing the new one! :)", "unity": "2019.4",