본문 바로가기
유니티 최고/유니티 구현

[Unity] 모바일 GPGS를 이용한 랭킹 리더보드와 업적 기능 구현하기

by Lee_story_.. 2024. 6. 16.
728x90

 

 

이번 글에서는 점수제 게임에 대해서 사용할 수 있는 랭킹 시스템에 대해서 구현해 보고자합니다

 

아래는 제가 만든 게임에서의 예시!

 

 

그럼 구현하기전!

먼저 랭킹 시스템에 대해서 구현하기 위해서 필요한 부분에 대해서 생각해봅시다.

 

1. 플레이어의 점수를 저장해줄 데이터 베이스

2. 저장된 점수들의 일부분과 자신의 랭킹에 대한 등수를 뽑아낼 수 있는 함수

 

 

이렇게 2가지만 준비되어있다면 구현하는것은 쉽게쉽게 가능할 것 같습니다. 

 

1번의 경우 데이터 베이스를 구축하는 방법에는 다양한 방법들이 존재합니다만...

 

 

 

이번글에서는! 

제목에 적어놓은것 처럼 GPGS(구글 플레이 게임 서비스)를 이용해서 구현해볼 예정입니다

물론 GPGS를 사용하기 위해서는 생각보다 많은 설정이 필요합니다... 하지만 그만한 가치가 있다고 생각합니다!

(계정 연동, 데이터 저장, 업적 등의 다양한 기능 지원!)

 

 

 

사용해보겠다고 생각되시면 먼저 아래글에서 GPGS관련 설정을 해주시고 이 글을 계속해서 봐주시면 될 것 같습니다!

 

 

모바일 Unity 게임에 GPGS(Google Play Games Services) 설정하기

(다른 글과 중복되는 내용이 생겨버렸지만.. 따로 정리해야 할 것 같아 따로 작성합니다.)   이번 글에서는 모바일에서의 유니티 게임 개발에서 사용할 수 있는 GPGS에 대해서 알아보고 설정하

ljhyunstory.tistory.com

 

 

 

그럼 위의 GPGS설정에 이어 리더보드와 업적에 대해서 구성해보도록 하겠습니다. 

 

 

 

구성


먼저 구글플레이 콘솔 사이트에 접속한뒤 

만들어준 어플리케이션을 선택해줍시다.

 

 

선택을 하게 되면 좌측에 다양한 메뉴들을 볼 수 있는데,

여기서 플레이 게임즈 서비스 - 설정 및 관리 탭에  리더보드와 업적, 이벤트 등의 메뉴를 설정 할 수 있습니다!

 

 

먼저 리더보드를 눌러보면 아래와 같이 생성할 수 있는 페이지가 열리게 됩니다. 

 

바로 생성!

 

생성하게 되면 이름, 데이터 형식, 정렬 순서, 제한 등의 설정을 위한 페이지가 만들어 집니다. 

어떤 데이터에 대한 리더보드를 만들것인지를 잘 생각하며 칸을 채워주어야 합니다! 

(... 리더보드 게시후에는 변경할 수 없습니다....)

 

 

 

모두 입력한 후 저장하고, 생성된 리더보드를 우측상단의 검토 및 게시로 적용시켜 주면 끝! 

 

 

 

업적 또한 동일한 순서로 진행하시면 됩니다!

 

 

 

리더보드와 업적에 대해서 생성/게시가 완료되었다면,

이제 플레이 게임즈 서비스 < 설정및 관리 < 설정 < 사용자 인증정보 에 있는 리소스보기 클릭

 

아래처럼 나타나는 리소스를 유니티에 적용시켜 주어야합니다. 

 

유니티에서는 위 참고글에서도 설명했지만 

구글 플레이 게임즈 < 셋업< 안드로이드 셋업

 

리소스 Definition 칸에 복붙해주시면 됩니다.

 

여기까지가 리더보드와 업적을 사용하기위한 설정 끝!

 

 

이제 코드를 통해 리더보드와 업적을 사용하는 방법에 대해서 알아보겠습니다. 

 

 

 

코드 시작!


가장 먼저 리더보드에 대한 코드!

//그냥 웹을 보는 스코어보드
    public void ShowLeaderBoardUI()
    {
        PlayGamesPlatform.Instance.ShowLeaderboardUI(GPGSIds.leaderboard_scoreboard);
    }

 

가장 간단한 ShowLeaderboardUI를 이용한 웹 리더보드입니다. 

이 함수를 이용하게 되면 모바일 상에서 아래와 같은 페이지로 넘어가 랭킹을 확인 할 수 있습니다.

 

 

사실상 코드 한줄이면 랭킹을 확인할 수 있는 기능이 구현되는부분...

 

 

여기다 점수를 등록하는 부분만 추가하면 끝! 

    // 점수 등록
    public void RecordScore(bool UI = false)
    {
        int MaxScore = 0;//  저장하려는 값!

        PlayGamesPlatform.Instance.ReportScore(MaxScore, GPGSIds.leaderboard_scoreboard, (bool success) => {

            if (success)
            {
                Debug.Log("Leader Good");
            }
        });
    }

 

 

 

하지만 여기서 좀 더 나아가!

랭킹보드를 유니티 상에서 확인하고 약간 꾸며가며 커스텀하게 리더보드를 만들고 싶으시다면!

 

아래와 같은 코드가 필요합니다. 

 

 

먼저 1등부터 10등까지의 점수를 위한 랭킹 조회 함수입니다.

코드를 살펴보면

 

1. "LoadScores" 함수를 통해 위에서 생성해주었던 리더보드에 접근

2. 상위 점수부터 10개의 플레이어 데이터를 불러옴

3. 해당 플레이어의 ID를 배열로 저장 

4. ID 배열을 "LoadUsers"함수에 전달하여 플레이어의 이름 (플레이어의 ID와 이름은 다릅니다! )

5. 각 데이터에 대한 처리 실행

 

public void LoadTopScores()
    {
        PlayGamesPlatform.Instance.LoadScores(
            GPGSIds.leaderboard_scoreboard, // 리더보드 ID
            LeaderboardStart.TopScores, // 상위 점수부터 시작
            10, // 불러올 점수의 개수
            LeaderboardCollection.Public, // 공개 리더보드
            LeaderboardTimeSpan.AllTime, // 전체 기간
            (LeaderboardScoreData data) => {
                if (data.Valid)
                {
                    Debug.Log("점수를 성공적으로 불러왔습니다.");
                    int numScores = data.Scores.Length;
                    string[] userIds = new string[numScores];

                    for (int i = 0; i < numScores; i++)
                    {
                        string playerId = data.Scores[i].userID;
                        userIds[i] = playerId;
                    }

                    PlayGamesPlatform.Instance.LoadUsers(userIds, (IUserProfile[] users) => {
                        if (users.Length > 0)
                        {
                            for (int i = 0; i < numScores; i++)
                            {
                                string playerId = data.Scores[i].userID;
                                long playerScore = data.Scores[i].value;
                                 string playerName = "";
                                 
                                foreach (var user in users)
                                {
                                    if (user.id == playerId)
                                    {
                                        playerName = user.userName;
                                        break;
                                    }
                                }
                                 // 데이터를 처리하는 부분!
                            }
                        }
                    });
                }
            });
    }

 

위 함수를 통해 받아온 데이터들을 랭킹보드 UI에 적용시켜 주면 1~10등까지의 플레이어 랭킹보드를 만들수 있습니다!

 

 

+ 여기서 자신의 랭킹또한 찾아 따로 표기하기 위해 MyRank 함수도 구성해주었습니다.

//나의 랭킹과 스코어 보기
    public void myRank()
    {
        PlayGamesPlatform.Instance.LoadScores(
        GPGSIds.leaderboard_scoreboard, // 리더보드 ID
        LeaderboardStart.PlayerCentered, // 플레이어 중심 모드
        1, // 플레이어의 점수만 불러오기 때문에 1개만 가져옵니다.
        LeaderboardCollection.Public, // 공개 리더보드
        LeaderboardTimeSpan.AllTime, // 전체 기간
        (LeaderboardScoreData data) => {
            if (data.Valid && data.Scores.Length > 0)
            {
                string playerId = GameManager.instance.UserData_Str.Name;
                long playerScore = data.Scores[0].value;
                int playerRank = data.PlayerScore.rank;
				
                // 데이터 최신화를 위한 코드 
                if (playerScore != GameManager.instance.UserData_Str.MaxScore)
                {
                    if(GameManager.instance.UserData_Str.MaxScore< playerScore)
                    {
                        GameManager.instance.UserData_Str.MaxScore = (int)playerScore;
                    }
                    RecordScore(true);// 저장
                    return;
                }
				// 데이터 처리
            }

        },true);
    }

 

+ 점수 등록 부분도 약간 수정

    // 점수 등록
    public void RecordScore(bool UI = false)
    {
        int MaxScore = 0; // 저장하려는 값!
        PlayGamesPlatform.Instance.ReportScore(MaxScore, GPGSIds.leaderboard_scoreboard, (bool success) => {

            if (success)
            {
                if (UI)
                {
                    myRank();
                }
            }
        });
    }

 

 

리더보드는 여기서 끝!

 


 

다음은 업적...

이건 정말 간단해서 ㅎㅎ

 

마찬가지로 "ShowAchievementsUI"를 통해 다른 웹창으로 달성한 업적을 확인할 수 있고, 

"UnlockAchievement"를 이용해서 해당 업적의 id이름을 통해 업적 달성에 대해 이벤트를 발생시킬 수 있습니다

    // 업적 확인
    public void ShowAchievementUI()
    {
        PlayGamesPlatform.Instance.ShowAchievementsUI();
    }


    // 업적 달성!
    public void IncrementGPGSAchievement() // 레벨 2....
    {
        PlayGamesPlatform.Instance.UnlockAchievement(GPGSIds.achievement_level_2, (bool success) => { }); // 함수호출도 됨 
    }

 

 

여기까지가 이번글의 끝입니다. 

랭킹 같은 기능은 데이터베이스가 무조건 필요하다고 생각했었는데

구글 게임즈에서 제공해주는 기능들로 충분히 구현 가능한 기능들이였네요... 굳굳

 

여기까지가 제 첫 모바일 게임에서 사용했던, 배운것들에 대해 정리하는 마지막 글이 될 것 같습니다!

물론 정리 못한것들도 많이 있지만, 그건 일단 정식으로 출시를 하고, 정리를 한 후에 돌아오겠습니다.

(14일동의 비공개 테스트.... 너무 긴 시간이네요..)

 

 

 


틀린점이 있다면 댓 달아주세요!

댓글