플레이페이브에 등록된 높은 점수가 차트에 바로 반영되지 못하는 이유와 대책

10002 단어 PlayFabUnity

전제와 문제


Unity 게임의 백엔드에서 사용PlayFab하여 득점 랭킹 기능을 시도한다.
  • Using Player Statistics
  • Using Resettable Statistics and Leaderboards
  • 이쪽을 보면 1게임이 끝난 후UpdatePlayerStatistics() 높은 점수(Play Statics)를 갱신했고, 그 반응이 돌아온 후GetLeaderboard() 차트(Leaderboard)를 땄지만, 지금 막 보낸 점수는 차트에 반영되지 않았다.
    하지만 시간이 지나고GetLeaderboard() 반영되면서 플레이팹 관리 화면도 업데이트됐다.

    Unity 가상 코드

    void Start()
    {
        PlayFabClientAPI.UpdatePlayerStatistics(
            new UpdatePlayerStatisticsRequest() {
                Statistics = new List<StatisticUpdate>() {
                    new StatisticUpdate() {
                        StatisticName = myStatisticName,
                        Value = myScore
                    }
                }
            }, OnUpdatePlayerStatisticsSuccess, OnFailure);
    }
    
    void OnUpdatePlayerStatisticsSuccess(UpdatePlayerStatisticsResult result)
    {
        GetLeaderboard();
    }
    
    void GetLeaderboard()
    {
        PlayFabClientAPI.GetLeaderboard(
            new GetLeaderboardRequest() {
                StatisticName = myStatisticName,
            }, OnGetLeaderboardSuccess, OnFailure);
    }
    
    void OnGetLeaderboardSuccess(GetLeaderboardResult result)
    {
        var entries = result.Leaderboard; // これにmyScoreが反映されていないことがある
    
        // entries を画面に表示する処理など
    }
    

    컨디션

  • Unity 2018.2.19f1
  • PlayFab
  • forum 검색해 보기 (영어)

  • UpdatePlayerStatistics is an asynchronously call?
  • Update Statics에서 Leaderboard로 최신 상태로 전환하는 데 1초 이상 걸리기 때문에 클라우드 스크립트에서 Statics의 Update를 진행하고 클라우드 스크립트가 되돌아온 후에 리더보드의 클라이언트 조회를 받는 것을 추천합니다.
    그러나 서버의 API 참조를 봐도 Update Leaderboard 방법을 찾을 수 없습니다.
  • Leaderboard update time
  • Realtime leaderboard solution?
  • Safe time between statstics update and leaderboard download
  • 이 부근에는 몇 초를 기다리라고 쓰여 있다.
    네.

    대책

  • 득점이 확정되면 바로 호출UpdatePlayerStatistics()하여 GetLeaderboard()까지 시간을 비우는 화면, UX 디자인
  • 다음 중 하나에서 반영되지 않은 상태로 간주(시간을 조금 비운 후) 다시 가져오기
  • 획득한 Leaderboard의 범위 내에 자신의 PlayFabId의 LeaderboardEntry가 있고 점수는 갱신되어야 하는데 갱신되지 않았다
  • 수령 범위 내에 LeaderboardEntry가 없지만 LeaderboardEntry의 수량은 Request를 수령하는 수량보다 적지 않다(반영되면 Leaderboard를 포함해야 한다)
  • 획득 범위 내에 자신의 Leaderboard가 없지만 그 점수는 범위 내의 최저점
  • 보다 높다
  • PlayFabId 지정(기본적으로 자신) 중심의 리더보드GetLeaderboardAroundPlayer()도 이 방법을 사용하는 경우 자신의 리더보드Entry를 포함해야 하기 때문에 전자의 조건만 있으면 된다
  • Unity 가상 코드


    아까처럼 처리한 곳에서 사랑을 베다
    void OnUpdatePlayerStatisticsSuccess(UpdatePlayerStatisticsResult result)
    {
        StartCoroutine("WaitAndGetLeaderboard", 2f);
    }
    
    void WaitAndGetLeaderboard(float waitSeconds)
    {
        yield return new WaitForSeconds(waitSeconds);
        GetLeaderboard();
    }
    
    void OnGetLeaderboardSuccess(GetLeaderboardResult result)
    {
        var entries = result.Leaderboard;
        var myEntry = entries.Find(_entry => _entry.PlayFabId == myPlayFabId);
        if (myEntry != null && myEntry.StatValue < myScore
            || myEntry == null && entries.Count < requestedEntriesCount
            || myEntry == null && entries[entries.Count - 1].StatValue < myScore)
        {
            StartCoroutine("WaitAndGetLeaderboard", 1f);
            return;
        }
    
        // entries を画面に表示する処理など
    }
    

    Cloud Script 프로세스를 사용하는 경우


    원래 고객의 부정행위를 방지하기 위해서는 UpdatePlayerStatistics()가 아니라 클라우드 스크립트로 Statiistics에 Update를 하는 것이 좋다Allow client to post player statisticUpdatePlayerStatistics()의 요청이 무효일 경우)
    그것대로라면 첫 번째 forum 검색 결과의
    Cloud Script를 사용하여 Statics에 대한 Update와 함께 Leaderboard의 Update를 진행하고 Cloud Script가 되돌아온 후에 Leaderboard의 클라이언트 조회를 받는 것을 권장합니다.
    "Statistics Update 후 Leaderboard Update 등"으로 교체하여 Cloud Script를 설치하는 것이 좋습니다.
    API 단위로는 정답이라고 생각했는데 답장할 때마다 2초 이상 기다려야 하는 것도 이상하고...고민이에요.
    더 좋은 방법이 있으면 알려주세요!

    어렵기 때문에.


    그런 고해상도 게임이 편입되어 있습니다. 유닛룸 씨, 구글 플레이스토어에서 안드로이드 버전을 공개합니다. 가능하면 하세요.
    유닛룸의 유닛 1주일 게임 잼 투고 이후 이번 수법으로 고득점 기능을 추가했다.

    https://unityroom.com/games/10to10
    https://play.google.com/store/apps/details?id=com.zurachu.TenToTen

    좋은 웹페이지 즐겨찾기