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(); } + /// + /// Add a component of a specific type to the children of a GameObject. + /// + public static void AddComponentOnChildren(this Component self, bool includeSelf) + where T : Component + { + if (self == null) return; + + Profiler.BeginSample("(COF)[ComponentExt] AddComponentOnChildren > Self"); + if (includeSelf && !self.TryGetComponent(out _)) + { + self.gameObject.AddComponent(); + } + + 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(out _)) continue; + + child.gameObject.AddComponent(); + } + + 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(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() where T : Object + { +#if UNITY_2023_1_OR_NEWER + return Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None); +#else + return Object.FindObjectsOfType(); +#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); } + /// + /// 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. /// @@ -77,6 +88,17 @@ namespace Coffee.UIParticleInternal /// 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(FindObjectsInactive.Include, FindObjectsSortMode.None)) -#else - foreach (var animator in FindObjectsOfType()) -#endif + foreach (var animator in Misc.FindObjectsOfType()) { 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(FindObjectsInactive.Include, FindObjectsSortMode.None)) -#else - foreach (var uip in FindObjectsOfType()) -#endif + foreach (var uip in Misc.FindObjectsOfType()) { 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(FindObjectsInactive.Include, FindObjectsSortMode.None)) -#else - foreach (var p in FindObjectsOfType()) -#endif + foreach (var p in Misc.FindObjectsOfType()) { 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(FindObjectsInactive.Include, FindObjectsSortMode.None)) -#else - foreach (var ps in FindObjectsOfType()) -#endif + foreach (var ps in Misc.FindObjectsOfType()) { ps.transform.localScale = new Vector3(scale, scale, scale); }