diff --git a/Scripts/Editor/UIParticleEditor.cs b/Scripts/Editor/UIParticleEditor.cs index f553e12..7a2c41a 100644 --- a/Scripts/Editor/UIParticleEditor.cs +++ b/Scripts/Editor/UIParticleEditor.cs @@ -52,6 +52,7 @@ namespace Coffee.UIExtensions private static readonly GUIContent s_Content3D = new GUIContent("3D"); private static readonly GUIContent s_ContentRandom = new GUIContent("Random"); private static readonly GUIContent s_ContentScale = new GUIContent("Scale"); + private static readonly GUIContent s_ContentAutoScaling = new GUIContent("Auto Scaling", "Transform.lossyScale (=world scale) is automatically set to (1, 1, 1), to prevent the root-Canvas scale from affecting the hierarchy-scaled ParticleSystem."); private static SerializedObject s_SerializedObject; #if !SERIALIZE_FIELD_MASKABLE @@ -63,6 +64,7 @@ namespace Coffee.UIExtensions private SerializedProperty m_GroupId; private SerializedProperty m_GroupMaxId; private SerializedProperty m_AbsoluteMode; + private SerializedProperty m_IgnoreCanvasScaler; private ReorderableList _ro; @@ -152,6 +154,7 @@ namespace Coffee.UIExtensions m_GroupId = serializedObject.FindProperty("m_GroupId"); m_GroupMaxId = serializedObject.FindProperty("m_GroupMaxId"); m_AbsoluteMode = serializedObject.FindProperty("m_AbsoluteMode"); + m_IgnoreCanvasScaler = serializedObject.FindProperty("m_IgnoreCanvasScaler"); var sp = serializedObject.FindProperty("m_Particles"); _ro = new ReorderableList(sp.serializedObject, sp, true, true, true, true); @@ -262,6 +265,18 @@ namespace Coffee.UIExtensions // Absolute Mode EditorGUILayout.PropertyField(m_AbsoluteMode); + // Auto Scaling + DrawInversedToggle(m_IgnoreCanvasScaler, s_ContentAutoScaling, () => + { + foreach (var uip in targets.OfType()) + { + if (uip && !uip.autoScaling) + { + uip.transform.localScale = Vector3.one; + } + } + }); + // Target ParticleSystems. EditorGUI.BeginChangeCheck(); EditorGUI.BeginDisabledGroup(targets.OfType().Any(x => !x.canvas)); @@ -426,6 +441,24 @@ namespace Coffee.UIExtensions return showMax; } + private static void DrawInversedToggle(SerializedProperty inversedProperty, GUIContent label, Action onChanged) + { + EditorGUI.showMixedValue = inversedProperty.hasMultipleDifferentValues; + var autoScaling = !inversedProperty.boolValue; + EditorGUI.BeginChangeCheck(); + if (autoScaling != EditorGUILayout.Toggle(label, autoScaling)) + { + inversedProperty.boolValue = autoScaling; + } + + if (EditorGUI.EndChangeCheck()) + { + EditorApplication.delayCall += onChanged.Invoke; + } + + EditorGUI.showMixedValue = false; + } + private static void WindowFunction(UnityEngine.Object target, SceneView sceneView) { try @@ -441,6 +474,17 @@ namespace Coffee.UIExtensions EditorGUILayout.PropertyField(s_SerializedObject.FindProperty("m_Enabled")); _xyzMode = DrawFloatOrVector3Field(s_SerializedObject.FindProperty("m_Scale3D"), _xyzMode); EditorGUILayout.PropertyField(s_SerializedObject.FindProperty("m_AbsoluteMode")); + DrawInversedToggle(s_SerializedObject.FindProperty("m_IgnoreCanvasScaler"), s_ContentAutoScaling, + () => + { + foreach (var uip in s_SerializedObject.targetObjects.OfType()) + { + if (uip && !uip.autoScaling) + { + uip.transform.localScale = Vector3.one; + } + } + }); EditorGUIUtility.labelWidth = labelWidth; } s_SerializedObject.ApplyModifiedProperties(); diff --git a/Scripts/UIParticle.cs b/Scripts/UIParticle.cs index 5ca6a15..1cdd2d6 100644 --- a/Scripts/UIParticle.cs +++ b/Scripts/UIParticle.cs @@ -7,6 +7,7 @@ using System.Runtime.CompilerServices; using Coffee.UIParticleExtensions; using UnityEngine; using UnityEngine.Rendering; +using UnityEngine.Serialization; using UnityEngine.UI; [assembly: InternalsVisibleTo("Coffee.UIParticle.Editor")] @@ -59,6 +60,13 @@ namespace Coffee.UIExtensions [Tooltip("The particles will be emitted at the ParticleSystem position.\nMove the UIParticle/ParticleSystem to move the particle.")] private bool m_AbsoluteMode = false; + /// + /// This field uses the inverted value as "AutoScaling". + /// + [SerializeField] + [FormerlySerializedAs("m_IgnoreParent")] + private bool m_IgnoreCanvasScaler = false; + private List m_Renderers = new List(); #if !SERIALIZE_FIELD_MASKABLE @@ -128,6 +136,17 @@ namespace Coffee.UIExtensions set { m_AbsoluteMode = value; } } + public bool autoScaling + { + get { return !m_IgnoreCanvasScaler; } + set + { + if (m_IgnoreCanvasScaler != value) return; + m_IgnoreCanvasScaler = !value; + UpdateTracker(); + } + } + internal bool useMeshSharing { get { return m_MeshSharing != MeshSharing.None; } @@ -197,6 +216,8 @@ namespace Coffee.UIExtensions /// public bool isPaused { get; internal set; } + public Vector3 parentScale { get; private set; } + public void Play() { particles.Exec(p => p.Simulate(0, false, true)); @@ -335,12 +356,10 @@ namespace Coffee.UIExtensions internal void UpdateTransformScale() { - //var newScale = Vector3.one; - //if (uiScaling) - //{ - // newScale = transform.parent.lossyScale.Inverse(); - //} - var newScale = transform.parent.lossyScale.Inverse(); + parentScale = transform.parent.lossyScale; + if (!autoScaling) return; + + var newScale = parentScale.Inverse(); if (transform.localScale != newScale) { transform.localScale = newScale; @@ -383,7 +402,7 @@ namespace Coffee.UIExtensions maskable = m_Maskable; #endif ResetGroupId(); - _tracker.Add(this, rectTransform, DrivenTransformProperties.Scale); + UpdateTracker(); UIParticleUpdater.Register(this); RegisterDirtyMaterialCallback(UpdateRendererMaterial); @@ -416,7 +435,7 @@ namespace Coffee.UIExtensions /// protected override void OnDisable() { - _tracker.Clear(); + UpdateTracker(); UIParticleUpdater.Unregister(this); m_Renderers.ForEach(r => r.Reset()); UnregisterDirtyMaterialCallback(UpdateRendererMaterial); @@ -499,5 +518,25 @@ namespace Coffee.UIExtensions return _orthoCamera; } + + private void UpdateTracker() + { + if (!enabled || !autoScaling) + { + _tracker.Clear(); + } + else + { + _tracker.Add(this, rectTransform, DrivenTransformProperties.Scale); + } + } + +#if UNITY_EDITOR + protected override void OnValidate() + { + base.OnValidate(); + UpdateTracker(); + } +#endif } } diff --git a/Scripts/UIParticleRenderer.cs b/Scripts/UIParticleRenderer.cs index 1d19774..583ba32 100644 --- a/Scripts/UIParticleRenderer.cs +++ b/Scripts/UIParticleRenderer.cs @@ -430,16 +430,7 @@ namespace Coffee.UIExtensions private Vector3 GetWorldScale() { Profiler.BeginSample("[UIParticleRenderer] GetWorldScale"); - var scale = _parent.scale3D; - //if (_parent.uiScaling) - { - scale.Scale(_parent.transform.localScale.Inverse()); - } - //else if (_parent.scalingMode == UIParticle.ScalingMode.UI && _particleSystem.main.scalingMode != ParticleSystemScalingMode.Hierarchy) - //{ - // var gscale = _parent.transform.lossyScale.GetScaled(canvas.transform.lossyScale.Inverse()); - // scale.Scale(gscale * canvas.scaleFactor); - //} + var scale = _parent.scale3D.GetScaled(_parent.parentScale); Profiler.EndSample(); return scale; }