using System; using System.Collections.Generic; using UnityEngine; public class RankSystem : MonoBehaviour { public static event Action OnNewRank; [SerializeField] private List Ranks; private RankInfo currentRank; public void Initialize() { if(Ranks == null || Ranks.Count == 0) { Debug.LogError("Ранги не заданы", this); return; } SortRanks(); currentRank = Ranks[0]; G.ScoreModel.OnUpdate += Refresh; } private void Refresh(ScoreModel model) { RankInfo RankByScore = GetActualRank(model.Score); if(RankByScore != currentRank) { currentRank = RankByScore; OnNewRank?.Invoke(currentRank); } } private void OnDestroy() { G.ScoreModel.OnUpdate -= Refresh; } private RankInfo GetActualRank(int score) { for (int i = Ranks.Count - 1; i >= 0; i--) { if (score >= Ranks[i].RequiredScore) { return Ranks[i]; } } return Ranks[0]; } private void SortRanks() { Ranks.Sort(); } [Serializable] public class RankInfo : IComparable { public string Name; public Sprite Sprite; public int RequiredScore; public int CompareTo(RankInfo other) { if (other == null) return 1; return RequiredScore.CompareTo(other.RequiredScore); } } }