78 lines
1.7 KiB
C#

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