diff --git a/Runtime/Scripts/Effects/UIParticleSystem.cs b/Runtime/Scripts/Effects/UIParticleSystem.cs index 6c1f468..4083b02 100644 --- a/Runtime/Scripts/Effects/UIParticleSystem.cs +++ b/Runtime/Scripts/Effects/UIParticleSystem.cs @@ -43,6 +43,22 @@ namespace UnityEngine.UI.Extensions } } + public ParticleSystem.Particle[] Particles + { + get + { + if (particles == null) + { +#if UNITY_5_5_OR_NEWER + particles = new ParticleSystem.Particle[pSystem.main.maxParticles]; +#else + particles = new ParticleSystem.Particle[pSystem.maxParticles]; +#endif + } + return particles; + } + } + protected bool Initialize() { // initialize members @@ -66,8 +82,10 @@ namespace UnityEngine.UI.Extensions mainModule.maxParticles = 14000; } #else - if (pSystem.maxParticles > 14000) - pSystem.maxParticles = 14000; + if (pSystem.maxParticles > 14000) + { + pSystem.maxParticles = 14000; + } #endif pRenderer = pSystem.GetComponent(); @@ -95,18 +113,9 @@ namespace UnityEngine.UI.Extensions #if UNITY_5_5_OR_NEWER mainModule.scalingMode = ParticleSystemScalingMode.Hierarchy; #else - pSystem.scalingMode = ParticleSystemScalingMode.Hierarchy; + pSystem.scalingMode = ParticleSystemScalingMode.Hierarchy; #endif - - particles = null; } -#if UNITY_5_5_OR_NEWER - if (particles == null) - particles = new ParticleSystem.Particle[pSystem.main.maxParticles]; -#else - if (particles == null) - particles = new ParticleSystem.Particle[pSystem.maxParticles]; -#endif imageUV = new Vector4(0, 0, 1, 1); @@ -127,7 +136,9 @@ namespace UnityEngine.UI.Extensions { base.Awake(); if (!Initialize()) + { enabled = false; + } } @@ -160,17 +171,17 @@ namespace UnityEngine.UI.Extensions Vector2 corner1 = Vector2.zero; Vector2 corner2 = Vector2.zero; // iterate through current particles - int count = pSystem.GetParticles(particles); + int count = pSystem.GetParticles(Particles); for (int i = 0; i < count; ++i) { - ParticleSystem.Particle particle = particles[i]; + ParticleSystem.Particle particle = Particles[i]; // get particle properties #if UNITY_5_5_OR_NEWER Vector2 position = (mainModule.simulationSpace == ParticleSystemSimulationSpace.Local ? particle.position : _transform.InverseTransformPoint(particle.position)); #else - Vector2 position = (pSystem.simulationSpace == ParticleSystemSimulationSpace.Local ? particle.position : _transform.InverseTransformPoint(particle.position)); + Vector2 position = (pSystem.simulationSpace == ParticleSystemSimulationSpace.Local ? particle.position : _transform.InverseTransformPoint(particle.position)); #endif float rotation = -particle.rotation * Mathf.Deg2Rad; float rotation90 = rotation + Mathf.PI / 2; @@ -182,8 +193,8 @@ namespace UnityEngine.UI.Extensions if (mainModule.scalingMode == ParticleSystemScalingMode.Shape) position /= canvas.scaleFactor; #else - if (pSystem.scalingMode == ParticleSystemScalingMode.Shape) - position /= canvas.scaleFactor; + if (pSystem.scalingMode == ParticleSystemScalingMode.Shape) + position /= canvas.scaleFactor; #endif // apply texture sheet animation @@ -378,8 +389,7 @@ namespace UnityEngine.UI.Extensions } } } - if (material == currentMaterial) - return; + if (material == currentMaterial) { return; } pSystem = null; Initialize(); } @@ -408,4 +418,4 @@ namespace UnityEngine.UI.Extensions } } #endif - } \ No newline at end of file +} \ No newline at end of file diff --git a/Runtime/Scripts/Utilities/ExtensionMethods.cs b/Runtime/Scripts/Utilities/ExtensionMethods.cs index fb20ec0..8afe3f0 100644 --- a/Runtime/Scripts/Utilities/ExtensionMethods.cs +++ b/Runtime/Scripts/Utilities/ExtensionMethods.cs @@ -29,5 +29,27 @@ namespace UnityEngine.UI.Extensions !gameObject.hideFlags.HasFlag(HideFlags.HideInHierarchy); // I don't care about GameObjects *inside* prefabs, just the overall prefab. } + + /// + /// Generic clamp method to limt a value between a range of values + /// + /// data type + /// Value to clamp + /// Minimum value + /// Maximum value + /// + public static T Clamp(this T value, T min, T max) where T : IComparable + { + if (value.CompareTo(min) < 0) + { + value = min; + } + if (value.CompareTo(max) > 0) + { + value = max; + } + + return value; + } } } diff --git a/Runtime/Scripts/Utilities/UIExtensionMethods.cs b/Runtime/Scripts/Utilities/UIExtensionMethods.cs index 2b2f10a..3472139 100644 --- a/Runtime/Scripts/Utilities/UIExtensionMethods.cs +++ b/Runtime/Scripts/Utilities/UIExtensionMethods.cs @@ -15,6 +15,10 @@ namespace UnityEngine.UI.Extensions parentCanvas = rt.GetComponentInParent(); if (parentCanvas == null) { + if (parent.parent == null) + { + return null; + } parent = parent.parent.GetComponent(); SearchIndex++; } diff --git a/Runtime/Scripts/Utilities/UILineConnector.cs b/Runtime/Scripts/Utilities/UILineConnector.cs index 6b18000..487dec5 100644 --- a/Runtime/Scripts/Utilities/UILineConnector.cs +++ b/Runtime/Scripts/Utilities/UILineConnector.cs @@ -18,7 +18,11 @@ namespace UnityEngine.UI.Extensions private void Awake() { - canvas = GetComponentInParent().GetParentCanvas().GetComponent(); + var canvasParent = GetComponentInParent().GetParentCanvas(); + if (canvasParent != null) + { + canvas = canvasParent.GetComponent(); + } rt = GetComponent(); lr = GetComponent(); }