72 lines
1.5 KiB
C#
72 lines
1.5 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;
|
|
|
|
public void Initialize()
|
|
{
|
|
if(Ranks == null || Ranks.Count == 0)
|
|
{
|
|
Debug.LogError("Ранги не заданы", this);
|
|
return;
|
|
}
|
|
SortRanks();
|
|
currentRank = Ranks[0];
|
|
GameState.ScoreModel.OnUpdate += Refresh;
|
|
}
|
|
|
|
private void Refresh(ScoreModel model)
|
|
{
|
|
RankInfo RankByScore = GetActualRank(model.Score);
|
|
|
|
if(RankByScore != currentRank)
|
|
{
|
|
currentRank = RankByScore;
|
|
OnNewRank?.Invoke(currentRank);
|
|
}
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
GameState.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);
|
|
}
|
|
}
|
|
}
|