-
Notifications
You must be signed in to change notification settings - Fork 0
/
Tween.cs
113 lines (99 loc) · 2.81 KB
/
Tween.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
using System;
using System.Collections;
using TMPro;
using UnityEngine;
public class TweenBase : MonoBehaviour
{
static TweenBase InstanceCache;
public static TweenBase Instance
{
get
{
if (InstanceCache) return InstanceCache;
var obj = new GameObject("TweenBase");
return InstanceCache = obj.AddComponent<TweenBase>();
}
}
}
public class TweenRunner
{
public TweenRunner(Coroutine coroutine)
{
this.coroutine = coroutine;
}
Coroutine coroutine;
public void Kill()
{
TweenBase.Instance.StopCoroutine(coroutine);
coroutine = null;
}
}
public static class Tween
{
public static TweenRunner Scale(this Transform target, float scale, float duration)
{
var tween = TweenBase.Instance.StartCoroutine(ScaleCoroutine(target, scale, duration));
return new TweenRunner(tween);
}
static IEnumerator ScaleCoroutine(Transform target, float scale, float duration)
{
var initial = target.localScale;
var startTime = Time.time;
var targetScale = Vector3.one * scale;
while (target.localScale != targetScale)
{
var lerpTime = (Time.time - startTime) / duration;
target.localScale = Vector3.Lerp(initial, targetScale, lerpTime);
yield return null;
}
}
public static TweenRunner FadeText(this TextMeshPro target, Color color, float duration)
{
var tween = TweenBase.Instance.StartCoroutine(FadeTextCoroutine(target, color, duration));
return new TweenRunner(tween);
}
static IEnumerator FadeTextCoroutine(TextMeshPro target, Color color, float duration)
{
var initial = target.color;
var startTime = Time.time;
while (target.color != color)
{
var lerpTime = (Time.time - startTime) / duration;
target.color = Color.Lerp(initial, color, lerpTime);
yield return null;
}
}
public static TweenRunner FadeMaterial(this Material target, Color color, float duration)
{
var tween = TweenBase.Instance.StartCoroutine(FadeMaterialCoroutine(target, color, duration));
return new TweenRunner(tween);
}
static IEnumerator FadeMaterialCoroutine(Material target, Color color, float duration)
{
var initial = target.color;
var startTime = Time.time;
while (target.color != color)
{
var lerpTime = (Time.time - startTime) / duration;
target.color = Color.Lerp(initial, color, lerpTime);
yield return null;
}
}
public static TweenRunner Float(float start, float end, float duration, Action<float> action)
{
var tween = TweenBase.Instance.StartCoroutine(FloatCoroutine(start, end, duration, action));
return new TweenRunner(tween);
}
static IEnumerator FloatCoroutine(float start, float end, float duration, Action<float> action)
{
var medium = start;
var startTime = Time.time;
while (medium != end)
{
var lerpTime = (Time.time - startTime) / duration;
medium = Mathf.Lerp(start, end, lerpTime);
action.Invoke(medium);
yield return null;
}
}
}