109 lines
2.9 KiB
C#
109 lines
2.9 KiB
C#
using Cysharp.Threading.Tasks;
|
|
using System.Threading;
|
|
using TMPro;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
namespace Learn
|
|
{
|
|
public class TipView : MonoBehaviour
|
|
{
|
|
[SerializeField] private CanvasGroup group;
|
|
[SerializeField]
|
|
private CanvasGroup
|
|
tlButton,
|
|
trButton,
|
|
blButton,
|
|
brButton;
|
|
[SerializeField] TextMeshProUGUI tipLabel;
|
|
[SerializeField] private Image tipImage;
|
|
private CancellationTokenSource animationCts;
|
|
|
|
public void Configure(Tip tip)
|
|
{
|
|
group.alpha = 0;
|
|
|
|
tlButton.alpha = 0;
|
|
trButton.alpha = 0;
|
|
blButton.alpha = 0;
|
|
brButton.alpha = 0;
|
|
|
|
tipLabel.text = tip.text;
|
|
|
|
CanvasGroup btn = tip.signal switch
|
|
{
|
|
InSignal.UpLeft => tlButton,
|
|
InSignal.UpRight => trButton,
|
|
InSignal.DownLeft => blButton,
|
|
InSignal.DownRight => brButton,
|
|
_ => null
|
|
};
|
|
btn.alpha = 1;
|
|
|
|
if (tip.voiceClip != null)
|
|
{
|
|
SoundManager.PlayReplica(tip.voiceClip);
|
|
}
|
|
|
|
}
|
|
|
|
private async UniTask AnimateImage()
|
|
{
|
|
animationCts?.Cancel();
|
|
animationCts = new CancellationTokenSource();
|
|
|
|
float time = 0;
|
|
while (!animationCts.Token.IsCancellationRequested)
|
|
{
|
|
time += Time.deltaTime * 2f;
|
|
float scale = 1f + Mathf.Sin(time) * 0.05f;
|
|
tipImage.transform.localScale = Vector3.one * scale;
|
|
await UniTask.Yield(animationCts.Token);
|
|
}
|
|
}
|
|
|
|
public async UniTask Show(CancellationToken ct)
|
|
{
|
|
StopAnimation();
|
|
float t = Mathf.InverseLerp(0, 1, group.alpha);
|
|
await LerpAlpha(0, 1, 1.5f, group, ct, t);
|
|
}
|
|
|
|
public async UniTask Hide(CancellationToken ct)
|
|
{
|
|
StopAnimation();
|
|
float t = Mathf.InverseLerp(1, 0, group.alpha);
|
|
await LerpAlpha(1, 0, 1.5f, group, ct, t);
|
|
}
|
|
|
|
public void Hide()
|
|
{
|
|
group.alpha = 0;
|
|
}
|
|
|
|
private void StopAnimation()
|
|
{
|
|
animationCts?.Cancel();
|
|
animationCts?.Dispose();
|
|
animationCts = null;
|
|
}
|
|
|
|
private async UniTask LerpAlpha(float from, float to, float speed, CanvasGroup cg, CancellationToken ct, float initialT = 0)
|
|
{
|
|
float t = initialT;
|
|
while (t < 1 && !ct.IsCancellationRequested)
|
|
{
|
|
t += Time.deltaTime * speed;
|
|
t = Mathf.Min(t, 1);
|
|
|
|
cg.alpha = Mathf.Lerp(from, to, t);
|
|
await UniTask.Yield(ct);
|
|
}
|
|
cg.alpha = to;
|
|
}
|
|
private void OnDestroy()
|
|
{
|
|
StopAnimation();
|
|
}
|
|
}
|
|
} |