mob-sakai / mob-sakai/ParticleEffectForUGUI

When using sharemesh mode, same effect will display errors at different scales

Open
#333 2 comments 0 reactions 1 assignee View on GitHub

@mob-sakai is already working on this.

Since Sep 23, 2024.

bug v5 feature
Dominant language
C#
Stars
6k
Forks
762
PR merge metrics
No merged PRs in 30d

Description

When using sharemesh mode, same effect will display errors at different scales.

I have made modifications to the UIParticleUpdater and UIParticle script, tested and fixed this issue. If deemed appropriate, I can consider submitting them to the repository.
The function is modified as follows:

UIParticleUpdater.Refresh
private static void Refresh()
{
    // Do not allow it to be called in the same frame.
    if (s_FrameCount == Time.frameCount) return;
    s_FrameCount = Time.frameCount;
	s_PrimaryParentScales.Clear();
	// Simulate -> Primary
	for (var i = 0; i < s_ActiveParticles.Count; i++)
    {
        var uip = s_ActiveParticles[i];
        if (!uip || !uip.canvas || !uip.isPrimary || !s_UpdatedGroupIds.Add(uip.groupId)) continue;
		var parentLossyScale = uip.transform.parent.lossyScale;
		s_PrimaryParentScales.Add(uip.groupId, parentLossyScale);
		uip.UpdateTransformScale(Vector3.one);
        uip.UpdateRenderers();
    }

    // Simulate -> Others
    for (var i = 0; i < s_ActiveParticles.Count; i++)
    {
        var uip = s_ActiveParticles[i];
        if (!uip || !uip.canvas) continue;

		if (uip.useMeshSharing && s_PrimaryParentScales.TryGetValue(uip.groupId, out var primaryScale))
		{
			var myScale = uip.transform.parent.lossyScale;
			if ((myScale.x < 0.0001 && myScale.x > -0.0001f) ||
				(myScale.y < 0.0001 && myScale.y > -0.0001f) ||
				(myScale.z < 0.0001 && myScale.z > -0.0001f))
			{
				uip.UpdateTransformScale(Vector3.one);
			}
			else
			{
				var ratio = new Vector3(primaryScale.x / myScale.x, primaryScale.y / myScale.y, primaryScale.z / myScale.z);
				uip.UpdateTransformScale(ratio);
			}
		}
		else
		{
			uip.UpdateTransformScale(Vector3.one);
		}


		if (!uip.useMeshSharing)
        {
            uip.UpdateRenderers();
        }
        else if (s_UpdatedGroupIds.Add(uip.groupId))
        {
			s_UpdatedGroupIds.Add(uip.groupId);
			var parentLossyScale = uip.transform.parent.lossyScale;
			s_PrimaryParentScales.Add(uip.groupId, parentLossyScale);
			uip.UpdateRenderers();
        }
    }

    s_UpdatedGroupIds.Clear();

    // Attract
    for (var i = 0; i < s_ActiveAttractors.Count; i++)
    {
        s_ActiveAttractors[i].Attract();
    }
}
UIParticle.UpdateTransformScale
internal void UpdateTransformScale(Vector3 ratio)
{
    _tracker.Clear();
    canvasScale = canvas.rootCanvas.transform.localScale.Inverse();
    parentScale = transform.parent.lossyScale;
    if (autoScalingMode != AutoScalingMode.Transform)
    {
        if (_isScaleStored)
        {
            transform.localScale = _storedScale;
        }

        _isScaleStored = false;
        return;
    }

    var currentScale = transform.localScale;
    if (!_isScaleStored)
    {
        _storedScale = currentScale.IsVisible() ? currentScale : Vector3.one;
        _isScaleStored = true;
    }

    _tracker.Add(this, rectTransform, DrivenTransformProperties.Scale);
	var tempScale = parentScale;
	tempScale.x *= ratio.x;
	tempScale.y *= ratio.y;
	tempScale.z *= ratio.z;
	var newScale = tempScale.Inverse();
    if (currentScale != newScale)
    {
        transform.localScale = newScale;
    }
}

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.