diff --git a/Scripts/Editor/UIParticleEditor.cs b/Scripts/Editor/UIParticleEditor.cs index 76482c2..a15ba2c 100644 --- a/Scripts/Editor/UIParticleEditor.cs +++ b/Scripts/Editor/UIParticleEditor.cs @@ -29,6 +29,7 @@ namespace Coffee.UIExtensions private SerializedProperty _spScale; private SerializedProperty _spIgnoreCanvasScaler; private SerializedProperty _spAnimatableProperties; + private SerializedProperty _spShrinkByMaterial; private ReorderableList _ro; private bool _xyzMode; @@ -57,6 +58,7 @@ namespace Coffee.UIExtensions _spScale = serializedObject.FindProperty("m_Scale3D"); _spIgnoreCanvasScaler = serializedObject.FindProperty("m_IgnoreCanvasScaler"); _spAnimatableProperties = serializedObject.FindProperty("m_AnimatableProperties"); + _spShrinkByMaterial = serializedObject.FindProperty("m_ShrinkByMaterial"); var sp = serializedObject.FindProperty("m_Particles"); _ro = new ReorderableList(sp.serializedObject, sp, true, true, true, true); @@ -164,6 +166,9 @@ namespace Coffee.UIExtensions t.SetMaterialDirty(); } + // ShrinkByMaterial + EditorGUILayout.PropertyField(_spShrinkByMaterial); + // Target ParticleSystems. _ro.DoLayoutList(); diff --git a/Scripts/UIParticle.cs b/Scripts/UIParticle.cs index 7b20ad9..7fb235a 100755 --- a/Scripts/UIParticle.cs +++ b/Scripts/UIParticle.cs @@ -41,6 +41,9 @@ namespace Coffee.UIExtensions [Tooltip("Particles")] [SerializeField] private List m_Particles = new List(); + [Tooltip("Shrink rendering by material on refresh.\nNOTE: Performance will be improved, but in some cases the rendering is not correct.")] [SerializeField] + bool m_ShrinkByMaterial = false; + #if !SERIALIZE_FIELD_MASKABLE [SerializeField] private bool m_Maskable = true; #endif @@ -81,6 +84,17 @@ namespace Coffee.UIExtensions } } + public bool shrinkByMaterial + { + get { return m_ShrinkByMaterial; } + set + { + if (m_ShrinkByMaterial == value) return; + m_ShrinkByMaterial = value; + RefreshParticles(); + } + } + /// /// Particle effect scale. /// @@ -217,7 +231,7 @@ namespace Coffee.UIExtensions } particles.Exec(p => p.GetComponent().enabled = !enabled); - particles.SortForRendering(transform); + particles.SortForRendering(transform, m_ShrinkByMaterial); SetMaterialDirty(); } diff --git a/Scripts/Utils.cs b/Scripts/Utils.cs index 87e9fa5..00d2240 100644 --- a/Scripts/Utils.cs +++ b/Scripts/Utils.cs @@ -185,7 +185,7 @@ namespace Coffee.UIParticleExtensions internal static class ParticleSystemExtensions { - public static void SortForRendering(this List self, Transform transform) + public static void SortForRendering(this List self, Transform transform, bool sortByMaterial) { self.Sort((a, b) => { @@ -200,6 +200,9 @@ namespace Coffee.UIParticleExtensions if (!aMat) return -1; if (!bMat) return 1; + if (sortByMaterial) + return aMat.GetInstanceID() - bMat.GetInstanceID(); + if (aMat.renderQueue != bMat.renderQueue) return aMat.renderQueue - bMat.renderQueue;