-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFadeScriptableSceneTransition.cs
144 lines (123 loc) · 3.91 KB
/
FadeScriptableSceneTransition.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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
using System.Collections;
using System.Collections.Generic;
using CHARK.ScriptableScenes.Utilities;
using UnityEngine;
namespace CHARK.ScriptableScenes.Transitions
{
[CreateAssetMenu(
fileName = CreateAssetMenuConstants.BaseFileName + nameof(FadeScriptableSceneTransition),
menuName = CreateAssetMenuConstants.BaseMenuName + "/Fade Scriptable Scene Transition",
order = CreateAssetMenuConstants.TransitionOrder
)]
internal sealed class FadeScriptableSceneTransition : ScriptableSceneTransition
{
#if ODIN_INSPECTOR
[Sirenix.OdinInspector.FoldoutGroup("Alpha", Expanded = true)]
[Sirenix.OdinInspector.PropertyRange(0f, 1f)]
#else
[Header("Alpha")]
[Range(0f, 1f)]
#endif
[Tooltip("Canvas alpha which is used when the canvas is faded in")]
[SerializeField]
private float fadeInAlpha = 1.0f;
#if ODIN_INSPECTOR
[Sirenix.OdinInspector.FoldoutGroup("Alpha", Expanded = true)]
[Sirenix.OdinInspector.PropertyRange(0f, 1f)]
#else
[Range(0f, 1f)]
#endif
[Tooltip("Canvas alpha which is used when the canvas is faded out")]
[SerializeField]
private float fadeOutAlpha;
#if ODIN_INSPECTOR
[Sirenix.OdinInspector.FoldoutGroup("Timings", Expanded = true)]
#else
[Header("Timings")]
#endif
[Tooltip("Amount of seconds to wait before fading out the canvas")]
[Min(0f)]
[SerializeField]
private float transitionDelaySeconds = 2.0f;
#if ODIN_INSPECTOR
[Sirenix.OdinInspector.FoldoutGroup("Timings", Expanded = true)]
#endif
[Tooltip("Time taken to fade in the canvas")]
[Min(0f)]
[SerializeField]
private float fadeInDurationSeconds = 0.5f;
#if ODIN_INSPECTOR
[Sirenix.OdinInspector.FoldoutGroup("Timings", Expanded = true)]
#endif
[Tooltip("Time taken to fade out the canvas")]
[Min(0f)]
[SerializeField]
private float fadeOutDurationSeconds = 0.5f;
private readonly List<FadeCanvas> canvases = new();
protected override IEnumerator OnShowRoutine()
{
// Fade in the curtains.
ShowFadeCanvas();
yield return FadeRoutine(fadeOutAlpha, fadeInAlpha, fadeInDurationSeconds);
}
protected override IEnumerator OnDelayRoutine()
{
if (transitionDelaySeconds > 0.0f)
{
yield return new WaitForSeconds(transitionDelaySeconds);
}
}
protected override IEnumerator OnHideRoutine()
{
// Fade out the curtains.
yield return FadeRoutine(fadeInAlpha, fadeOutAlpha, fadeOutDurationSeconds);
HideFadeCanvas();
}
internal void AddCanvas(FadeCanvas canvas)
{
canvases.Add(canvas);
}
internal void RemoveCanvas(FadeCanvas canvas)
{
canvases.Remove(canvas);
}
private IEnumerator FadeRoutine(
float from,
float to,
float duration
)
{
var progress = 0f;
while (progress < 1f)
{
var value = Mathf.Lerp(from, to, progress);
SetAlpha(value);
progress += Time.unscaledDeltaTime / duration;
yield return null;
}
SetAlpha(to);
yield return null;
}
private void SetAlpha(float alpha)
{
foreach (var canvas in canvases)
{
canvas.SetAlpha(alpha);
}
}
private void ShowFadeCanvas()
{
foreach (var canvas in canvases)
{
canvas.ShowCanvas();
}
}
private void HideFadeCanvas()
{
foreach (var canvas in canvases)
{
canvas.HideCanvas();
}
}
}
}