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()); var newRankFrame = newRankGO.GetComponent(); newRankFrame.SetAlpha(0); newRankFrame.SetRank(rankInfo); var rect = newRankGO.GetComponent(); 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; } }