From 2a66393cb07c471d2eaba0902cfd9fa481b98446 Mon Sep 17 00:00:00 2001
From: mob-sakai <12690315+mob-sakai@users.noreply.github.com>
Date: Thu, 21 Nov 2024 01:36:51 +0900
Subject: [PATCH] refactor: update coffee.internal

---
 .../Extensions/ComponentExtensions.cs         | 29 +++++++++++++++++++
 .../{Extensions => Utilities}/Misc.cs         |  9 ++++++
 .../{Extensions => Utilities}/Misc.cs.meta    |  2 +-
 .../Internal/Utilities/UIExtraCallbacks.cs    | 22 ++++++++++++++
 Runtime/UIParticle.cs                         |  2 ++
 Samples~/Demo/Scripts/UIParticle_Demo.cs      | 25 ++++------------
 6 files changed, 68 insertions(+), 21 deletions(-)
 rename Runtime/Internal/{Extensions => Utilities}/Misc.cs (78%)
 rename Runtime/Internal/{Extensions => Utilities}/Misc.cs.meta (83%)

diff --git a/Runtime/Internal/Extensions/ComponentExtensions.cs b/Runtime/Internal/Extensions/ComponentExtensions.cs
index b45f016..d65be22 100644
--- a/Runtime/Internal/Extensions/ComponentExtensions.cs
+++ b/Runtime/Internal/Extensions/ComponentExtensions.cs
@@ -134,6 +134,35 @@ namespace Coffee.UIParticleInternal
             Profiler.EndSample();
         }
 
+        /// <summary>
+        /// Add a component of a specific type to the children of a GameObject.
+        /// </summary>
+        public static void AddComponentOnChildren<T>(this Component self, bool includeSelf)
+            where T : Component
+        {
+            if (self == null) return;
+
+            Profiler.BeginSample("(COF)[ComponentExt] AddComponentOnChildren > Self");
+            if (includeSelf && !self.TryGetComponent<T>(out _))
+            {
+                self.gameObject.AddComponent<T>();
+            }
+
+            Profiler.EndSample();
+
+            Profiler.BeginSample("(COF)[ComponentExt] AddComponentOnChildren > Child");
+            var childCount = self.transform.childCount;
+            for (var i = 0; i < childCount; i++)
+            {
+                var child = self.transform.GetChild(i);
+                if (child.TryGetComponent<T>(out _)) continue;
+
+                child.gameObject.AddComponent<T>();
+            }
+
+            Profiler.EndSample();
+        }
+
 #if !UNITY_2021_2_OR_NEWER && !UNITY_2020_3_45 && !UNITY_2020_3_46 && !UNITY_2020_3_47 && !UNITY_2020_3_48
         public static T GetComponentInParent<T>(this Component self, bool includeInactive) where T : Component
         {
diff --git a/Runtime/Internal/Extensions/Misc.cs b/Runtime/Internal/Utilities/Misc.cs
similarity index 78%
rename from Runtime/Internal/Extensions/Misc.cs
rename to Runtime/Internal/Utilities/Misc.cs
index 66d0b4e..fb1a210 100644
--- a/Runtime/Internal/Extensions/Misc.cs
+++ b/Runtime/Internal/Utilities/Misc.cs
@@ -6,6 +6,15 @@ namespace Coffee.UIParticleInternal
 {
     internal static class Misc
     {
+        public static T[] FindObjectsOfType<T>() where T : Object
+        {
+#if UNITY_2023_1_OR_NEWER
+            return Object.FindObjectsByType<T>(FindObjectsInactive.Include, FindObjectsSortMode.None);
+#else
+            return Object.FindObjectsOfType<T>();
+#endif
+        }
+
         public static void Destroy(Object obj)
         {
             if (!obj) return;
diff --git a/Runtime/Internal/Extensions/Misc.cs.meta b/Runtime/Internal/Utilities/Misc.cs.meta
similarity index 83%
rename from Runtime/Internal/Extensions/Misc.cs.meta
rename to Runtime/Internal/Utilities/Misc.cs.meta
index 5668392..e9f550c 100644
--- a/Runtime/Internal/Extensions/Misc.cs.meta
+++ b/Runtime/Internal/Utilities/Misc.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 39ed6a6b0a72e482488bd298b2ae762e
+guid: 182319ecc315e4858b119764af0fbcb0
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Runtime/Internal/Utilities/UIExtraCallbacks.cs b/Runtime/Internal/Utilities/UIExtraCallbacks.cs
index be9e7ee..6ad33ed 100755
--- a/Runtime/Internal/Utilities/UIExtraCallbacks.cs
+++ b/Runtime/Internal/Utilities/UIExtraCallbacks.cs
@@ -14,6 +14,8 @@ namespace Coffee.UIParticleInternal
         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()
         {
@@ -48,6 +50,15 @@ namespace Coffee.UIParticleInternal
             remove => s_AfterCanvasRebuildAction.Remove(value);
         }
 
+        /// <summary>
+        /// Event that occurs when the screen size changes.
+        /// </summary>
+        public static event Action onScreenSizeChanged
+        {
+            add => s_OnScreenSizeChangedAction.Add(value);
+            remove => s_OnScreenSizeChangedAction.Remove(value);
+        }
+
         /// <summary>
         /// Initializes the UIExtraCallbacks to ensure proper event handling.
         /// </summary>
@@ -77,6 +88,17 @@ namespace Coffee.UIParticleInternal
         /// </summary>
         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();
         }
diff --git a/Runtime/UIParticle.cs b/Runtime/UIParticle.cs
index 40133d6..5ad390d 100644
--- a/Runtime/UIParticle.cs
+++ b/Runtime/UIParticle.cs
@@ -9,6 +9,8 @@ using UnityEngine.UI;
 using Random = UnityEngine.Random;
 
 [assembly: InternalsVisibleTo("Coffee.UIParticle.Editor")]
+[assembly: InternalsVisibleTo("Coffee.UIParticle.PerformanceDemo")]
+[assembly: InternalsVisibleTo("Coffee.UIParticle.Demo")]
 
 namespace Coffee.UIExtensions
 {
diff --git a/Samples~/Demo/Scripts/UIParticle_Demo.cs b/Samples~/Demo/Scripts/UIParticle_Demo.cs
index 266eda3..68e8993 100644
--- a/Samples~/Demo/Scripts/UIParticle_Demo.cs
+++ b/Samples~/Demo/Scripts/UIParticle_Demo.cs
@@ -1,3 +1,4 @@
+using Coffee.UIParticleInternal;
 using UnityEngine;
 using UnityEngine.Serialization;
 using UnityEngine.UI;
@@ -51,11 +52,7 @@ namespace Coffee.UIExtensions.Demo
 
         public void EnableAnimations(bool flag)
         {
-#if UNITY_2023_1_OR_NEWER
-            foreach (var animator in FindObjectsByType<Animator>(FindObjectsInactive.Include, FindObjectsSortMode.None))
-#else
-            foreach (var animator in FindObjectsOfType<Animator>())
-#endif
+            foreach (var animator in Misc.FindObjectsOfType<Animator>())
             {
                 animator.enabled = flag;
             }
@@ -83,11 +80,7 @@ namespace Coffee.UIExtensions.Demo
 
         public void UIParticle_Scale(float scale)
         {
-#if UNITY_2023_1_OR_NEWER
-            foreach (var uip in FindObjectsByType<UIParticle>(FindObjectsInactive.Include, FindObjectsSortMode.None))
-#else
-            foreach (var uip in FindObjectsOfType<UIParticle>())
-#endif
+            foreach (var uip in Misc.FindObjectsOfType<UIParticle>())
             {
                 uip.scale = scale;
             }
@@ -95,11 +88,7 @@ namespace Coffee.UIExtensions.Demo
 
         public void ParticleSystem_WorldSpaseSimulation(bool flag)
         {
-#if UNITY_2023_1_OR_NEWER
-            foreach (var p in FindObjectsByType<ParticleSystem>(FindObjectsInactive.Include, FindObjectsSortMode.None))
-#else
-            foreach (var p in FindObjectsOfType<ParticleSystem>())
-#endif
+            foreach (var p in Misc.FindObjectsOfType<ParticleSystem>())
             {
                 var main = p.main;
                 main.simulationSpace = flag
@@ -135,11 +124,7 @@ namespace Coffee.UIExtensions.Demo
 
         public void ParticleSystem_SetScale(float scale)
         {
-#if UNITY_2023_1_OR_NEWER
-            foreach (var ps in FindObjectsByType<ParticleSystem>(FindObjectsInactive.Include, FindObjectsSortMode.None))
-#else
-            foreach (var ps in FindObjectsOfType<ParticleSystem>())
-#endif
+            foreach (var ps in Misc.FindObjectsOfType<ParticleSystem>())
             {
                 ps.transform.localScale = new Vector3(scale, scale, scale);
             }