Skip to content

Instantly share code, notes, and snippets.

@arakaki-asdf
Created February 17, 2020 03:34
Show Gist options
  • Save arakaki-asdf/19dc796dd161359479a3a96410f182f0 to your computer and use it in GitHub Desktop.
Save arakaki-asdf/19dc796dd161359479a3a96410f182f0 to your computer and use it in GitHub Desktop.
unity playable text countup
using System;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Timeline;
using UnityEngine.UI;
using DG.Tweening;
class BaseTimeControl : MonoBehaviour, ITimeControl
{
Sequence sequence = default;
public void OnControlTimeStart() { }
public void OnControlTimeStop() { }
public void SetTime(double time)
{
sequence?.Goto((float)time);
}
protected void InitSequence(Tween tween)
{
if (sequence != null)
{
sequence.Goto(0);
sequence.Kill();
}
sequence = DOTween.Sequence();
sequence.Append(tween);
}
}
class CountUpTextTimeControl : BaseTimeControl
{
class CountUp
{
public Func<int, string> formatFunc = default;
Text text = default;
int current = default;
int end = default;
public CountUp(Text text, int count)
{
this.text = text;
this.current = 0;
this.end = count;
}
public Tween Tween(float duration, Ease ease)
{
return DOTween.To(
() => current,
(n) =>
{
current = n;
text.text = formatFunc?.Invoke(current) ?? current.ToString();
},
end,
duration
).SetEase(ease).SetAutoKill(true);
}
}
[SerializeField] Text text = default;
[SerializeField] int count = 10000;
[SerializeField] float duration = 0.7f;
[SerializeField] Ease ease = Ease.OutQuad;
public int Count
{
get;
private set;
}
public Func<int, string> FormatFunc
{
set
{
if (countUp == null) return;
countUp.formatFunc = value;
}
}
CountUp countUp = default;
public void Initialize(int count)
{
countUp = countUp ?? new CountUp(text, count);
InitSequence(countUp.Tween(duration, ease));
}
void OnValidate()
{
if (Application.isEditor) Initialize(count);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment