상세 컨텐츠

본문 제목

유니티 랭킹시스템 Firebase를 이용한 RankingSystem

프로그래밍/유니티

by 개발자입니다 2021. 1. 12. 12:08

본문

728x90
반응형

안녕하세요 오늘은 지난 포스팅에서 주로 다루었던 Firebase를 이용하여 간단한 랭킹시스템을 구현해보았습니다. 이번 포스팅은 Firebase 보다는 랭킹시스템을 주로 다루기에 자세한 설명은 아래 url 지난 포스팅을 통해 확인해주시면 감사하겠습니다.


Firebase 데이터 베이스 연동 첫 번째 - 프로젝트 생성 : https://simpleneed.tistory.com/75

Firebase 데이터 베이스 연동 두 번째 - 데이터 저장 : https://simpleneed.tistory.com/76

Firebase 데이터 베이스 연동 세 번째 - 데이터 로드, 참조 : https://simpleneed.tistory.com/77


랭킹시스템은 먼저 데이터 저장이 가능한 상태라는 가정하에 포스팅하도록 하겠습니다.


아래 스크립트를 보시면 Firebase 데이터베이스 연동 포스팅에서 다루었던 내용을 변형하였는데, 

먼저 데이터를 불러들이는 DataLoad() 함수에서 Firebase를 참조해 데이터를 불어옵니다. 

각 데이터를 string 배열에 저장하고 모든 데이터가 저장되면, Text UI에 보여지도록 하기 위한 bool 변수 textLoadBool을 ture로 변형, LateUpdate()의 TextLoad() 함수를 실행합니다.

TextLoad()에서는 받아온 String 배열을 정렬을 통해 숫자 값 자리만 잘라내어 각각 비교하여 높은 수에서 낮은 수로 정렬을 하고 이후 Text UI 보다 작은 경우를 대비하여 string 배열의 크기를 비교, Text UI를 통해 화면에 가시화 하여 보여줍니다.



using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;
using Firebase.Database;


public class MyScript : MonoBehaviour
{
    DatabaseReference reference;

    public Text[] Rank = new Text[7];
    
    private string[] strRank;
    private long strLen;

    private bool textLoadBool = false;
    void Start()
    {
        reference = FirebaseDatabase.DefaultInstance.RootReference;
    }
    void Update()
    {
        //현재 첫번째 Text UI가 "Loading" 이면,
        //즉, 스크립트를 컴포넌트하고있는 게임 오브젝트가 Activeself(true) 이면.
        if(Rank[0].text == "Loading..")
        {
            DataLoad(); 
        }
    }
    void LateUpdate()
    {
        if (textLoadBool)
        {
            TextLoad();
        }
        if (Time.timeScale != 0.0fTime.timeScale = 0.0f;
    }
    void DataLoad()
    {
        //데이터 로드
        reference.Child("rank").GetValueAsync().ContinueWith(task =>
        {
            if (task.IsFaulted)
            {
                //에러 데이터로드 실패 시 다시 데이터 로드
                DataLoad();
            }
            else if (task.IsCompleted)
            {
                DataSnapshot snapshot = task.Result;
                
                int count = 0;
                strLen = snapshot.ChildrenCount;
                strRank = new string[strLen];
                
                foreach (DataSnapshot data in snapshot.Children)
                {
                    //받은 데이터들을 하나씩 잘라 string 배열에 저장
                    IDictionary rankInfo = (IDictionary)data.Value;
                    
                    strRank[count] = rankInfo["name"].ToString() + " | " 
string.Format("{0:N2}"rankInfo["score"]);
                    count++;
                }
                //LateUpdate의 TextLoad() 함수 실행
                textLoadBool = true;
            }
        });
    }
    void TextLoad()
    {
        textLoadBool = false;
        try
        {
            //받아온 데이터 정렬 = > 위에서부터 아래로
            Array.Sort(strRank, (xy) => string.Compare(
y.Substring(y.Length - 55).ToString() + x.Substring(x.Length - 55).ToString(),
          x.Substring(x.Length - 55).ToString() + y.Substring(y.Length - 55).ToString()));
        }
        catch (NullReferenceException e)
        {
            return;
        }

        for (int i = 0i < Rank.Lengthi++)
        {
//Text UI 에 현재 가지고있는 str 길이 까지만 보여주기 위함.
            if (strLen <= ireturn;      
            Rank[i].text = strRank[i];
        }
    }
}


아래는 위 스크립트를 참조하는 게임 오브젝트를 캡처한 화면입니다.

스크립트를 패널에 컴포넌트 한 후 각각의 Text UI를 참조하여 프로젝트를 진행하였습니다.



728x90
반응형

관련글 더보기

댓글 영역