Files
Continentis/Assets/OtherPlugins/Kamgam/UGUIParticles/Examples/Scripts/UGUIParticlesProgressBarDemo.cs
SoulliesOfficial 9b1b5ca93f initial
2025-10-03 00:02:43 -04:00

107 lines
3.1 KiB
C#

using System;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
namespace Kamgam.UGUIParticles
{
public class UGUIParticlesProgressBarDemo : MonoBehaviour
{
public Image ProgressFill;
protected ParticleImage _particleImage;
public ParticleImage ParticleImage
{
get
{
if (_particleImage == null)
{
_particleImage = this.GetComponentInChildren<ParticleImage>();
}
return _particleImage;
}
}
protected Coroutine _progressAnimation;
public IEnumerator Start()
{
// Wait a bit before animation the progress
yield return new WaitForSeconds(1f);
_progressAnimation = StartCoroutine(animateProgress());
}
private IEnumerator animateProgress()
{
ParticleImage.Stop(stopBehaviour: ParticleSystemStopBehavior.StopEmittingAndClear);
SetProgress(0f);
// 0 - 100% progress animation
float speed = 1f;
while (GetProgress() < 1f)
{
yield return null;
// Add some fake pauses in the middle to make it feel a bit more realistic
if (GetProgress() > 0.3f && GetProgress() < 0.5f)
{
if (UnityEngine.Random.value > 0.9f)
{
yield return new WaitForSeconds(UnityEngine.Random.value * 0.2f);
}
}
// Make it faster in the second half
if (GetProgress() > 0.5f)
speed = 2f;
SetProgress(GetProgress() + (speed * Time.deltaTime / 3f));
}
_progressAnimation = null;
}
public void OnClick()
{
if (_progressAnimation != null)
{
StopCoroutine(_progressAnimation);
}
_progressAnimation = StartCoroutine(animateProgress());
}
public void SetProgress(float value)
{
if (value != ProgressFill.fillAmount)
{
ProgressFill.fillAmount = value;
onProgressChanged(value);
}
}
public float GetProgress()
{
return ProgressFill.fillAmount;
}
private void onProgressChanged(float value)
{
// +2f to have the particle positioned a bit inside the end of the progress fill.
ParticleImage.PositionXUnit = ParticlesLengthUnit.Percent;
ParticleImage.PositionX = Mathf.Clamp((value * 100f) + 2f, 0f, 100f);
// Stop particles once we are done.
if (value >= 1f)
{
ParticleImage.PositionX = 100f;
ParticleImage.Stop();
}
// Make sure particles are playing.
else if (value > 0.01f && !ParticleImage.IsPlaying)
{
ParticleImage.Play();
}
}
}
}