79 lines
2.3 KiB
C#

using System.Collections;
using UnityEngine;
public class RankView : MonoBehaviour
{
[SerializeField] private RectTransform RankSpawnPoint;
[SerializeField] private RectTransform RankEndPoint;
[SerializeField] private RankFrame RankFramePrefab;
[SerializeField] private RankFrame CurrentRankFrame;
[SerializeField] private float AnimationSpeed;
[SerializeField] private AnimationCurve Curve;
[SerializeField] private CanvasGroup NewRankLabel;
public void Initialize()
{
NewRankLabel.alpha = 0;
RankSystem.OnNewRank += RankSystem_OnNewRank;
}
private void OnDestroy()
{
RankSystem.OnNewRank -= RankSystem_OnNewRank;
}
private void RankSystem_OnNewRank(RankSystem.RankInfo rankInfo)
{
StartCoroutine(ShowNewRank(rankInfo));
}
IEnumerator ShowNewRank(RankSystem.RankInfo rankInfo)
{
//Заспавнить и настроить новый ранг
var newRankGO = Instantiate(RankFramePrefab.gameObject, RankSpawnPoint.position, Quaternion.identity, GetComponent<RectTransform>());
var newRankFrame = newRankGO.GetComponent<RankFrame>();
newRankFrame.SetAlpha(0);
newRankFrame.SetRank(rankInfo);
var rect = newRankGO.GetComponent<RectTransform>();
rect.localRotation = Quaternion.identity;
//проявить новый ранг
float t = 0;
while (t < 1)
{
t += Time.deltaTime * AnimationSpeed*2;
t = Mathf.Clamp01(t);
NewRankLabel.alpha = t;
newRankFrame.SetAlpha(t);
yield return null;
}
yield return new WaitForSeconds(3);
//переместить новый на место старого + растворить старый
t = 0;
while (t < 1)
{
t += Time.deltaTime * AnimationSpeed;
t = Mathf.Clamp01(t);
float t1 = Curve.Evaluate(t);
rect.anchoredPosition = Vector2.Lerp(RankSpawnPoint.anchoredPosition, RankEndPoint.anchoredPosition, t1);
NewRankLabel.alpha = 1-t1;
CurrentRankFrame.SetAlpha(1-t);
yield return null;
}
Destroy(CurrentRankFrame.gameObject);
CurrentRankFrame = newRankFrame;
yield return null;
}
}