using System; using UnityEditor; using UnityEngine; using UnityEngine.UI; namespace Coffee.UIParticleInternal { /// /// Provides additional callbacks related to canvas and UI system. /// internal static class UIExtraCallbacks { private static bool s_IsInitializedAfterCanvasRebuild; private static readonly FastAction s_AfterCanvasRebuildAction = new FastAction(); private static readonly FastAction s_LateAfterCanvasRebuildAction = new FastAction(); private static readonly FastAction s_BeforeCanvasRebuildAction = new FastAction(); private static readonly FastAction s_OnScreenSizeChangedAction = new FastAction(); private static Vector2Int s_LastScreenSize; static UIExtraCallbacks() { Canvas.willRenderCanvases += OnBeforeCanvasRebuild; Logging.LogMulticast(typeof(Canvas), "willRenderCanvases", message: "ctor"); } /// /// Event that occurs after canvas rebuilds. /// public static event Action onLateAfterCanvasRebuild { add => s_LateAfterCanvasRebuildAction.Add(value); remove => s_LateAfterCanvasRebuildAction.Remove(value); } /// /// Event that occurs before canvas rebuilds. /// public static event Action onBeforeCanvasRebuild { add => s_BeforeCanvasRebuildAction.Add(value); remove => s_BeforeCanvasRebuildAction.Remove(value); } /// /// Event that occurs after canvas rebuilds. /// public static event Action onAfterCanvasRebuild { add => s_AfterCanvasRebuildAction.Add(value); remove => s_AfterCanvasRebuildAction.Remove(value); } /// /// Event that occurs when the screen size changes. /// public static event Action onScreenSizeChanged { add => s_OnScreenSizeChangedAction.Add(value); remove => s_OnScreenSizeChangedAction.Remove(value); } /// /// Initializes the UIExtraCallbacks to ensure proper event handling. /// private static void InitializeAfterCanvasRebuild() { if (s_IsInitializedAfterCanvasRebuild) return; s_IsInitializedAfterCanvasRebuild = true; CanvasUpdateRegistry.IsRebuildingLayout(); Canvas.willRenderCanvases += OnAfterCanvasRebuild; Logging.LogMulticast(typeof(Canvas), "willRenderCanvases", message: "InitializeAfterCanvasRebuild"); } #if UNITY_EDITOR [InitializeOnLoadMethod] #endif [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] private static void InitializeOnLoad() { Canvas.willRenderCanvases -= OnAfterCanvasRebuild; s_IsInitializedAfterCanvasRebuild = false; } /// /// Callback method called before canvas rebuilds. /// private static void OnBeforeCanvasRebuild() { var screenSize = new Vector2Int(Screen.width, Screen.height); if (s_LastScreenSize != screenSize) { if (s_LastScreenSize != default) { s_OnScreenSizeChangedAction.Invoke(); } s_LastScreenSize = screenSize; } s_BeforeCanvasRebuildAction.Invoke(); InitializeAfterCanvasRebuild(); } /// /// Callback method called after canvas rebuilds. /// private static void OnAfterCanvasRebuild() { s_AfterCanvasRebuildAction.Invoke(); s_LateAfterCanvasRebuildAction.Invoke(); } } }