[Unity] 랭킹 알고리즘, 순위 구현하기

2019. 6. 10. 13:13개발 달리기/Unity 개발달리기

안녕하세요. 달빠입니다.

 

안녕하세요. 달빠 입니다.

Unity 에서 많이 사용하는 랭킹, 순위 구현하기 알고리즘을 구현 해보겠습니다.

아래 결과 화면에서 보시다 시피 구현되어야할 사항은, 1. 순위, 2.이름, 3. 점수 입니다.

매월 랭킹의 초기화가 이루어 지게되며 확장성에 용이하도록 구현해보았습니다.

게임내 결과화면

 

 

[Unity]PlayerPrefs 을 이용한 저장, 불러오기 구현하기 - 참조

 

//1. 저장Pref을 하기위함 함수 구현 [[

 public virtual bool SavePref(string key, object dataPack) 

 { 
        string saveData = ObjectToStringSerialize(dataPack); 

        PlayerPrefs.SetString(key, saveData); 
        return true; 
 }

//오브젝트 시리얼라이즈 후 결과 값을 스트링으로 변환하여 반환 
public static string ObjectToStringSerialize(object obj) 
{ 
  using (var memoryStream = new MemoryStream()) 
  { 
      BinaryFormatter bf = new BinaryFormatter(); 
      bf.Serialize(memoryStream, obj); 
      memoryStream.Flush(); 
      memoryStream.Position = 0; 

      return Convert.ToBase64String(memoryStream.ToArray()); 
  } 
}

//]]

//2. 게임별 랭킹시스템 적용할수 있도록 구현  (디펜스게임)[[

// 게임외 환경 저장 값 KEY 
public static string Defence = "Defence"; 

//-------------------------------------------------------------------------------- 
// 저장 멤버 변수 : Serializable 
//-------------------------------------------------------------------------------- 

[Serializable()]  
public class omSerializable  
 
  public List rank_Name = new List();  
  public List rank_Score = new List(); 
  public DateTime saveDay;             

public omSerializable Data = new omSerializable();

public override void Save() 
{ 
        SavePref(Defence, Data); 
}

//]]

 

 

 

 

//3. 게임내 결과화면 제공전 비교 알고리즘 구현[[

public int m_CurrentScore = 0;

// 플레이어의 새로운 레코드 발생시  
public int newScore = 0; 
public int newRank = int.MaxValue;

public void SaveScore() 
{

  List name = new List() { "Emma", "Olivia", "Ava", "Aiden", "Aaron", "Daniel" }; 
  int random = UnityEngine.Random.Range(0, name.Count); 

  // 점수 비교 
  if (m_CurrentScore != 0) 
  { 
    newScore = m_CurrentScore;


    //100위까지의 스코어 비교  
    for (int r = 0; r < 100; ++r) 
    { 
        if (r < m_Cache.Data.rank_Score.Count) 
        { 
          if (newScore > m_Cache.Data.rank_Score[r]) 
          { 
              newRank = r; 
              m_Cache.Data.rank_Score.Insert(newRank, newScore); 
              m_Cache.Data.rank_Name.Insert(newRank, name[random]); 

              m_Cache.Data.my_Name = name[random]; 
              m_Cache.Data.my_Score = newScore; 
              m_Cache.Data.my_Rank = newRank+1; 
              m_Cache.Data.saveDay = DateTime.Now; 

          // 늘어난 Item 제거. 
          if (m_Cache.Data.rank_Score.Count > 100) 
                  m_Cache.Data.rank_Score.RemoveAt(m_Cache.Data.rank_Score.Count - 1); 
          if (m_Cache.Data.rank_Name.Count > 100) 
                  m_Cache.Data.rank_Name.RemoveAt(m_Cache.Data.rank_Name.Count - 1); 

          break; 
          } 
      } 
      else 
      { 
          newRank = r; 
          m_Cache.Data.rank_Score.Insert(newRank, newScore); 
          m_Cache.Data.rank_Name.Insert(newRank, name[random]); 

          m_Cache.Data.my_Name = name[random]; 
          m_Cache.Data.my_Score = newScore; 
          m_Cache.Data.my_Rank = newRank + 1; 
          m_Cache.Data.saveDay = DateTime.Now; 

          break; 
      } 
    } 
  } 
}

 

미약하게나마 유용한 정보가 되었다면 구독 공감 버튼은 작성자에게 큰 힘이 됩니다. 감사합니다 ^^