Unity 게임의 리더보드

이 주제에서는 Unity 게임에서 Play 게임즈 서비스 리더보드를 사용하는 방법을 설명합니다.

시작하기 전에

Unity 프로젝트와 Unity용 Google Play 게임즈 플러그인을 설정합니다. 자세한 내용은 시작 가이드를 참고하세요.

이벤트 만들기

Google Play Console에서 리더보드를 만듭니다. 자세한 내용은 Play 게임즈 서비스의 리더보드 가이드를 참고하세요. 리더보드를 만든 후 시작 가이드의 설명에 따라 Android 리소스를 플러그인에 추가합니다.

리더보드에 점수 게시

리더보드에 점수를 게시하려면 Social.ReportScore를 호출하세요.

    using GooglePlayGames;
    using UnityEngine.SocialPlatforms;
    ...
    // Post score 12345 to leaderboard ID "Cfji293fjsie_QA")
    Social.ReportScore(12345, "Cfji293fjsie_QA", (bool success) => {
        // Handle success or failure
    });

점수를 게시하고 메타데이터 태그를 포함하려면 PlayGamesPlatform 인스턴스를 직접 사용합니다.

    using GooglePlayGames;
    using UnityEngine.SocialPlatforms;
    ...
    // Post score 12345 to leaderboard ID "Cfji293fjsie_QA" and tag "FirstDaily")
    PlayGamesPlatform.Instance.ReportScore(12345, "Cfji293fjsie_QA", "FirstDaily", (bool success) => {
        // Handle success or failure
    });

플랫폼과 서버에서는 플레이어의 기존 최고점수보다 낮은 점수를 자동으로 삭제하므로 점수가 플레이어의 기존 점수보다 높은지 확인하지 않고도 언제든지 점수를 제출할 수 있습니다.

리더보드 UI 표시

모든 리더보드의 내장 UI를 표시하려면 Social.ShowLeaderboardUI를 호출합니다.

    using GooglePlayGames;
    using UnityEngine.SocialPlatforms;
    ...
    // Show leaderboard UI
    Social.ShowLeaderboardUI();

모든 리더보드가 아닌 특정 리더보드를 표시하려면 리더보드 ID를 메서드에 전달하면 됩니다. 그러나 이는 Play 게임즈 확장 프로그램이므로 먼저 Social.Active 객체를 PlayGamesPlatform 객체로 변환해야 합니다.

    using GooglePlayGames;
    using UnityEngine.SocialPlatforms;
    ...
    // Show leaderboard UI
    PlayGamesPlatform.Instance.ShowLeaderboardUI("Cfji293fjsie_QA");

리더보드 데이터 액세스

리더보드 점수 데이터를 가져오는 메서드에는 두 가지가 있습니다.

Social.ILeaderboard 사용

이 메서드는 ILeaderboard 인터페이스를 사용하여 데이터를 가져오는 범위와 필터를 정의합니다. 이 접근 방식을 사용하면 다음을 구성할 수 있습니다. 1. 리더보드 ID 2. 컬렉션(소셜 또는 공개) 3. 기간(일간, 주간, 전체 기간) 4. 점수를 가져오기 시작하는 순위 위치 5. 점수 개수(기본값은 25) 6. 사용자 ID로 필터링

from 매개변수가 양수가 아닌 경우 반환된 결과는 플레이어 중심이므로 현재 플레이어 점수 주변의 점수가 반환됩니다.

    ILeaderboard lb = PlayGamesPlatform.Instance.CreateLeaderboard();
    lb.id = "MY_LEADERBOARD_ID";
    lb.LoadScores(ok =>
        {
            if (ok) {
                LoadUsersAndDisplay(lb);
            }
            else {
                Debug.Log("Error retrieving leaderboardi");
            }
        });

PlayGamesPlatform.LoadScores() 사용

이 메서드는 리더보드 데이터에 액세스할 때 추가 유연성과 정보를 제공하는 PlayGamesPlatform을 직접 사용합니다.

    PlayGamesPlatform.Instance.LoadScores(
            GPGSIds.leaderboard_leaders_in_smoketesting,
            LeaderboardStart.PlayerCentered,
            100,
            LeaderboardCollection.Public,
            LeaderboardTimeSpan.AllTime,
            (data) =>
            {
                mStatus = "Leaderboard data valid: " + data.Valid;
                mStatus += "\n approx:" +data.ApproximateCount + " have " + data.Scores.Length;
            });

LoadScores()의 매개변수는 다음과 같습니다.

  1. leaderboardId
  2. 시작 위치(최고 점수 또는 플레이어 중심)
  3. 행 수
  4. 리더보드 컬렉션(소셜 또는 공개)
  5. 기간(일간, 주간, 전체 기간)
  6. LeaderboardScoreData 객체를 허용하는 콜백

LeaderboardScoreData 클래스는 점수를 로드할 때 호출자에 정보를 다시 반환하는 데 사용됩니다. 멤버는 다음과 같습니다. 1. ID: 리더보드 ID 2. 유효: 반환된 데이터가 유효하면 true(호출이 성공함) 3. 상태: 호출의 ResponseStatus 4. ApproximateCount: 리더보드의 대략적인 점수 개수 5. 제목: 리더보드 제목 6. PlayerScore: 현재 플레이어의 점수 7. 점수: 점수 목록 8. PrevPageToken: LoadMoreScores()를 호출하여 이전 점수 페이지를 가져오는 데 사용할 수 있는 토큰 9. NextPageToken: LoadMoreScores()를 호출하여 다음 점수 페이지를 가져오는 데 사용할 수 있는 토큰

    void GetNextPage(LeaderboardScoreData data)
    {
        PlayGamesPlatform.Instance.LoadMoreScores(data.NextPageToken, 10,
            (results) =>
            {
                mStatus = "Leaderboard data valid: " + data.Valid;
                mStatus += "\n approx:" +data.ApproximateCount + " have " + data.Scores.Length;
            });
    }

이 호출은 사용자가 친구 목록을 게임과 공유하지 않은 경우 ResponseCode.ResolutionRequired로 친구를 로드하려고 하면 실패할 수 있습니다. 이 경우 AskForLoadFriendsResolution을 사용하여 액세스를 요청하세요.

플레이어 이름 가져오기

각 점수에는 점수를 얻은 플레이어의 userId가 있습니다. Social.LoadUsers()를 사용하여 플레이어 프로필을 로드할 수 있습니다. 플레이어 프로필의 내용에는 플레이어의 개인 정보 보호 설정이 적용됩니다.

    internal void LoadUsersAndDisplay(ILeaderboard lb)
    {
        // Get the user ids
        List<string> userIds = new List<string>();

        foreach(IScore score in lb.scores) {
            userIds.Add(score.userID);
        }
        // Load the profiles and display (or in this case, log)
        Social.LoadUsers(userIds.ToArray(), (users) =>
            {
                string status = "Leaderboard loading: " + lb.title + " count = " +
                    lb.scores.Length;
                foreach(IScore score in lb.scores) {
                    IUserProfile user = FindUser(users, score.userID);
                    status += "\n" + score.formattedValue + " by " +
                        (string)(
                            (user != null) ? user.userName : "**unk_" + score.userID + "**");
                }
                Debug.log(status);
            });
    }