Skip to content

Commit

Permalink
feat: added 'autoScalingMode (None, Transform.localScale, UIParticle.…
Browse files Browse the repository at this point in the history
…scale)' instead of 'autoScaling'

fixed issue when upgrading from 3.x to 4.x
  • Loading branch information
mob-sakai committed Nov 7, 2023
1 parent 447996c commit 107f901
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 23 deletions.
13 changes: 7 additions & 6 deletions Scripts/Editor/UIParticleEditor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ public override void OnGUI()
private SerializedProperty _groupId;
private SerializedProperty _groupMaxId;
private SerializedProperty _positionMode;
private SerializedProperty _autoScaling;
private SerializedProperty _autoScalingMode;
private ReorderableList _ro;
private bool _showMax;

Expand Down Expand Up @@ -153,7 +153,7 @@ protected override void OnEnable()
_groupId = serializedObject.FindProperty("m_GroupId");
_groupMaxId = serializedObject.FindProperty("m_GroupMaxId");
_positionMode = serializedObject.FindProperty("m_PositionMode");
_autoScaling = serializedObject.FindProperty("m_AutoScaling");
_autoScalingMode = serializedObject.FindProperty("m_AutoScalingMode");

var sp = serializedObject.FindProperty("m_Particles");
_ro = new ReorderableList(sp.serializedObject, sp, true, true, true, true)
Expand Down Expand Up @@ -271,7 +271,7 @@ public override void OnInspectorGUI()
EditorGUILayout.PropertyField(_positionMode);

// Auto Scaling
DrawAutoScaling(_autoScaling, targets.OfType<UIParticle>());
DrawAutoScaling(_autoScalingMode, targets.OfType<UIParticle>());

// Target ParticleSystems.
EditorGUI.BeginChangeCheck();
Expand Down Expand Up @@ -478,16 +478,17 @@ private static int GetUsedComponentCount(ParticleSystemVertexStream s)

private static void DrawAutoScaling(SerializedProperty prop, IEnumerable<UIParticle> uiParticles)
{
var isTransformMode = prop.intValue == (int)UIParticle.AutoScalingMode.Transform;
EditorGUI.BeginChangeCheck();
EditorGUILayout.PropertyField(prop);
if (!EditorGUI.EndChangeCheck()) return;
if (!EditorGUI.EndChangeCheck() || !isTransformMode) return;

// on changed true->false, reset scale.
EditorApplication.delayCall += () =>
{
foreach (var uip in uiParticles)
{
if (!uip || uip.autoScaling) continue;
if (!uip) continue;
uip.transform.localScale = Vector3.one;
}
};
Expand All @@ -509,7 +510,7 @@ private static void WindowFunction(Object target, SceneView sceneView)
EditorGUILayout.PropertyField(s_SerializedObject.FindProperty("m_Enabled"));
s_XYZMode = DrawFloatOrVector3Field(s_SerializedObject.FindProperty("m_Scale3D"), s_XYZMode);
EditorGUILayout.PropertyField(s_SerializedObject.FindProperty("m_PositionMode"));
DrawAutoScaling(s_SerializedObject.FindProperty("m_AutoScaling"), uiParticles);
DrawAutoScaling(s_SerializedObject.FindProperty("m_AutoScalingMode"), uiParticles);
EditorGUIUtility.labelWidth = labelWidth;
}

Expand Down
62 changes: 51 additions & 11 deletions Scripts/UIParticle.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using Coffee.UIParticleExtensions;
using UnityEditor;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Serialization;
using UnityEngine.UI;
using Random = UnityEngine.Random;

[assembly: InternalsVisibleTo("Coffee.UIParticle.Editor")]

Expand Down Expand Up @@ -33,6 +36,13 @@ public enum PositionMode
Absolute
}

public enum AutoScalingMode
{
None,
UIParticle,
Transform
}

[HideInInspector]
[SerializeField]
internal bool m_IsTrail;
Expand Down Expand Up @@ -82,10 +92,14 @@ public enum PositionMode
private PositionMode m_PositionMode = PositionMode.Relative;

[SerializeField]
[Tooltip("Transform.lossyScale (=world scale) is automatically set to (1, 1, 1), " +
"to prevent the root-Canvas scale from affecting the hierarchy-scaled ParticleSystem.")]
[Tooltip("Prevent the root-Canvas scale from affecting the hierarchy-scaled ParticleSystem.")]
private bool m_AutoScaling = true;


[SerializeField]
[Tooltip("Transform: Transform.lossyScale (=world scale) will be set to (1, 1, 1)." +
"UIParticle: UIParticle.scale will be adjusted.")]
private AutoScalingMode m_AutoScalingMode = AutoScalingMode.Transform;

private readonly List<UIParticleRenderer> _renderers = new List<UIParticleRenderer>();
private int _groupId;
private Camera _orthoCamera;
Expand Down Expand Up @@ -166,16 +180,30 @@ public bool absoluteMode
}

/// <summary>
/// Transform.lossyScale (=world scale) will be set to (1, 1, 1) on update.
/// It prevents the root-Canvas scale from affecting the hierarchy-scaled ParticleSystem.
/// Prevents the root-Canvas scale from affecting the hierarchy-scaled ParticleSystem.
/// </summary>
[Obsolete("The autoScaling is now obsolete. Please use the autoScalingMode instead.", false)]
public bool autoScaling
{
get { return m_AutoScaling; }
get { return m_AutoScalingMode != AutoScalingMode.None; }
set
{
autoScalingMode = value ? AutoScalingMode.Transform : AutoScalingMode.None;
}
}

/// <summary>
/// Auto scaling mode.
/// Transform: Transform.lossyScale (=world scale) will be set to (1, 1, 1).
/// UIParticle: UIParticle.scale will be adjusted.
/// </summary>
public AutoScalingMode autoScalingMode
{
get { return m_AutoScalingMode; }
set
{
if (m_AutoScaling == value) return;
m_AutoScaling = value;
if (m_AutoScalingMode == value) return;
m_AutoScalingMode = value;
UpdateTracker();
}
}
Expand Down Expand Up @@ -234,6 +262,14 @@ public Vector3 scale3D
set { m_Scale3D = value; }
}

/// <summary>
/// Particle effect scale.
/// </summary>
public Vector3 scale3DForCalc
{
get { return autoScalingMode == AutoScalingMode.UIParticle ? m_Scale3D.GetScaled(canvasScale) : m_Scale3D; }
}

public List<ParticleSystem> particles
{
get { return m_Particles; }
Expand Down Expand Up @@ -267,6 +303,8 @@ public override Material materialForRendering

public Vector3 parentScale { get; private set; }

public Vector3 canvasScale { get; private set; }

protected override void OnEnable()
{
ResetGroupId();
Expand Down Expand Up @@ -320,10 +358,11 @@ void ISerializationCallbackReceiver.OnBeforeSerialize()

void ISerializationCallbackReceiver.OnAfterDeserialize()
{
if (m_IgnoreCanvasScaler)
if (m_IgnoreCanvasScaler || m_AutoScaling)
{
m_IgnoreCanvasScaler = false;
m_AutoScaling = false;
m_AutoScalingMode = AutoScalingMode.Transform;
}

if (m_AbsoluteMode)
Expand Down Expand Up @@ -471,8 +510,9 @@ public void RefreshParticles(List<ParticleSystem> particles)

internal void UpdateTransformScale()
{
canvasScale = canvas.rootCanvas.transform.localScale.Inverse();
parentScale = transform.parent.lossyScale;
if (!autoScaling) return;
if (autoScalingMode != AutoScalingMode.Transform) return;

var newScale = parentScale.Inverse();
if (transform.localScale != newScale)
Expand Down Expand Up @@ -606,7 +646,7 @@ private Camera GetBakeCamera()

private void UpdateTracker()
{
if (!enabled || !autoScaling)
if (!enabled || !autoScaling || autoScalingMode != AutoScalingMode.Transform)
{
_tracker.Clear();
}
Expand Down
9 changes: 5 additions & 4 deletions Scripts/UIParticleAttractor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -182,21 +182,22 @@ private Vector3 GetDestinationPosition()
if (isUI)
{
var inverseScale = _uiParticle.parentScale.Inverse();
dstPos = dstPos.GetScaled(inverseScale, _uiParticle.scale3D.Inverse());
var scale3d = _uiParticle.scale3DForCalc;
dstPos = dstPos.GetScaled(inverseScale, scale3d.Inverse());

// Relative mode
if (_uiParticle.positionMode == UIParticle.PositionMode.Relative)
{
var diff = _uiParticle.transform.position - psPos;
diff.Scale(_uiParticle.scale3D - inverseScale);
diff.Scale(_uiParticle.scale3D.Inverse());
diff.Scale(scale3d - inverseScale);
diff.Scale(scale3d.Inverse());
dstPos += diff;
}

#if UNITY_EDITOR
if (!Application.isPlaying && !isLocalSpace)
{
dstPos += psPos - psPos.GetScaled(inverseScale, _uiParticle.scale3D.Inverse());
dstPos += psPos - psPos.GetScaled(inverseScale, scale3d.Inverse());
}
#endif
}
Expand Down
4 changes: 2 additions & 2 deletions Scripts/UIParticleRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ public void UpdateMesh(Camera bakeCamera)
!isActiveAndEnabled || !_particleSystem || !_parent
|| !canvasRenderer || !canvas || !bakeCamera
|| _parent.meshSharing == UIParticle.MeshSharing.Replica
|| !transform.lossyScale.GetScaled(_parent.scale3D).IsVisible() // Scale is not visible.
|| !transform.lossyScale.GetScaled(_parent.scale3DForCalc).IsVisible() // Scale is not visible.
|| (!_particleSystem.IsAlive() && !_particleSystem.isPlaying) // No particle.
|| (_isTrail && !_particleSystem.trails.enabled) // Trail, but it is not enabled.
#if UNITY_2018_3_OR_NEWER
Expand Down Expand Up @@ -462,7 +462,7 @@ public override void Cull(Rect clipRect, bool validRect)
private Vector3 GetWorldScale()
{
Profiler.BeginSample("[UIParticleRenderer] GetWorldScale");
var scale = _parent.scale3D.GetScaled(_parent.parentScale);
var scale = _parent.scale3DForCalc.GetScaled(_parent.parentScale);
Profiler.EndSample();
return scale;
}
Expand Down

0 comments on commit 107f901

Please sign in to comment.