랭킹 출력에 관하여

고객님의 문의에 답변하는 직원은 고객 여러분의 가족 중 한 사람일 수 있습니다.
고객의 언어폭력(비하, 조롱, 욕설, 협박, 성희롱 등)으로부터 직원을 보호하기 위해
관련 법에 따라 수사기관에 필요한 조치를 요구할 수 있으며, 형법에 의해 처벌 대상이 될 수 있습니다.

커뮤니티 이용 정책에 위배되는 게시물을 작성할 경우, 별도 안내 없이 게시물 삭제 또는 커뮤니티 이용이 제한될 수 있습니다.

문의 응대 : 평일 오전 10시 ~ 오후 6시
문의를 남기실 경우 다음 항목을 작성해 주세요.
정보가 부족하거나 응대시간 외 문의하는 경우 확인 및 답변이 지연될 수 있습니다.

  • 뒤끝 SDK 버전 : 5.11.3
  • 프로젝트명 : jump_up
  • 스테이터스 코드 :
  • 에러 코드 :
  • 에러 메시지 :

랭킹 페이지에 1~50등까지의 랭킹을 출력하고, 50등 안에 들지 못한 유저는 그 아래에 자신의 등수를 볼 수 있게 하려 합니다.


50등까지의 랭킹을 불러오는 함수는 아래와 같이(Constants.GLOBAL_MAX_RANK_LIST = 50) 작성하였고,

private void GetGlobalRankList()
    {
        var bro = Backend.URank.User.GetRankList(Constants.GLOBAL_RANK_UUID, Constants.GLOBAL_MAX_RANK_LIST); 이하 생략 }

내 랭킹을 불러오는 함수는 아래와 같습니다.

 private void GetMyGlobalRank()
    {
        // 내 랭킹 정보 불러오기
        var bro = Backend.URank.User.GetMyRank(Constants.GLOBAL_RANK_UUID);
        {
            // 닉네임이 없으면 ID, 있으면 nickname
            string nickname = userNick == null ? userID : userNick;

            if (bro.IsSuccess())
            {
                // Json 데이터 파싱 성공
                try
                {
                    JsonData globalRankDataJson = bro.FlattenRows();

                    // 받아온 데이터의 개수가 0이면 데이터가 없는 것
                    if (globalRankDataJson.Count <= 0)
                    {
                        // [순위에 없음 닉네임 0]과 같이 출력 
                        SetRankData(myGlobalRankData, 1000000000, nickname, 0, 0);
                        Debug.LogWarning("데이터가 존재하지 않습니다.");
                    }
                    else
                    {
                        myGlobalRankData.Rank = int.Parse(globalRankDataJson[0]["rank"].ToString());
                        myGlobalRankData.BestRecord = int.Parse(globalRankDataJson[0]["score"].ToString());
                        // 닉네임을 설정하지 않은 유저는 닉네임 대신 ID를 출력
                        myGlobalRankData.Nickname = globalRankDataJson[0].ContainsKey("nickname") == true ?
                                                 globalRankDataJson[0]["nickname"]?.ToString() : userID;
                        gameoverSceneDirector.myGlobalRank = myGlobalRankData.Rank;
                        myGlobalRankData.Trophy = int.Parse(globalRankDataJson[0]["trophy"].ToString());

                    }
                }
                // 자신의 랭킹 정보 JSON 데이터 파싱에 실패했을 때 
                catch
                {
                    // [순위에 없음 닉네임 0]과 같이 출력
                    SetRankData(myGlobalRankData, 1000000000, nickname, 0, 0);

                    // try-catch 에러 출력
                    Debug.LogError(enabled);
                }
            }
            else
            {
                // 자신의 랭킹 정보 데이터가 존재하지 않을 때
                if (bro.GetMessage().Contains("userRank"))
                {
                    // [순위에 없음 닉네임 0] 과 같이 출력
                    SetRankData(myGlobalRankData, 1000000000, nickname, 0, 0);
                }
            }
        }
    }

50등 안에 들었을 경우
gameoverSceneDirector.myGlobalRank = myGlobalRankData.Rank;
이 값이 제대로 들어갑니다만 50등 밖에 있을 경우에는 '0’으로 출력됩니다.
콘솔에서 보면 순위권 밖의 유저도 랭킹 데이터가 존재하는데 불러오지 못하는 이유가 무엇인지 궁금합니다.
순위권 밖의 랭크를 조회하려면 어디를 고쳐야 할까요?

안녕하세요 개발자님!
현재 보여지는 코드상에서는 특별한 문제가 발견되지 않았습니다.
랭크 삽입 부분에서 별도의 예외 처리나 문제가 없는지 확인 부탁드립니다.

확인해 주셨음에도 문제가 지속된다면 아래의 정보를 제공해주시면 감사하겠습니다.

  1. 랭크 삽입 코드
  2. SetRankData 함수 내부

감사합니다.

private void SetRankData(GlobalRankData globalRankData, int rank, string nickname, int bestRecord, int trophy)
{
    globalRankData.Rank = rank;
    globalRankData.Nickname = nickname;
    globalRankData.BestRecord = bestRecord;
    globalRankData.Trophy = trophy;
}

=================================

    public void GlobalRankInsert(int bestRecord, int trophy)
{
    string rankUUID = Constants.GLOBAL_RANK_UUID;

    string tableName = "USER_DATA";

    string rowInDate = string.Empty;

    // 랭킹을 삽입하기 위해서는 게임 데이터에서 사용하는 데이터의 inDate값이 필요합니다.
    // 따라서 데이터를 불러온 후, 해당 데이터의 inDate값을 추출하는 작업을 해야합니다.
    Debug.Log("데이터 조회를 시도합니다.");
    var bro = Backend.GameData.GetMyData(tableName, new Where());

    if (bro.IsSuccess() == false)
    {
        Debug.LogError("데이터 조회 중 문제가 발생했습니다 : " + bro);
        return;
    }

    Debug.Log("데이터 조회에 성공했습니다 : " + bro);

    if (bro.FlattenRows().Count > 0)
    {
        rowInDate = bro.FlattenRows()[0]["inDate"].ToString();
    }
    else
    {
        Debug.Log("데이터가 존재하지 않습니다. 데이터 삽입을 시도합니다.");
        var bro2 = Backend.GameData.Insert(tableName);

        if (bro2.IsSuccess() == false)
        {
            Debug.LogError("데이터 삽입 중 문제가 발생했습니다 : " + bro2);
            return;
        }

        Debug.Log("데이터 삽입에 성공했습니다 : " + bro2);

        rowInDate = bro2.GetInDate();
    }

    Debug.Log("내 게임 정보의 rowInDate : " + rowInDate); // 추출된 rowIndate의 값은 다음과 같습니다.

    Param param = new Param();
    param.Add("bestRecord", bestRecord);
    param.Add("trophy", trophy);

    // 추출된 rowIndate를 가진 데이터에 param값으로 수정을 진행하고 랭킹에 데이터를 업데이트합니다.
    Debug.Log("랭킹 삽입을 시도합니다.");
    var rankBro = Backend.URank.User.UpdateUserScore(rankUUID, tableName, rowInDate, param);

    if (rankBro.IsSuccess() == false)
    {
        Debug.LogError("랭킹 등록 중 오류가 발생했습니다. : " + rankBro);
        return;
    }
    Debug.Log("랭킹 삽입에 성공했습니다. : " + rankBro);
}

==================================================

private void UpdateMyGlobalRankData(int bestRecord, int trophy)
{
    string rowInDate = string.Empty;

    Backend.GameData.GetMyData(Constants.USER_DATA_TABLE, new Where(), bro =>
    {
        Debug.Log("go get my data");

        if (!bro.IsSuccess())
        {
            Debug.LogError($"데이터 조회 중 문제가 발생했습니다.: {bro}");
            return;
        }

        Debug.Log($"데이터 조회에 성공했습니다.: {bro}");

        if (bro.FlattenRows().Count > 0)
        {
            rowInDate = bro.FlattenRows()[0]["inDate"].ToString();
        }
        else
        {
            Debug.LogError("데이터가 존재하지 않습니다.");
            return;
        }

        Param param = new Param()
        {
            {"bestRecord", bestRecord },
            {"trophy", trophy }
        };

        Backend.URank.User.UpdateUserScore(Constants.GLOBAL_RANK_UUID, Constants.USER_DATA_TABLE, rowInDate, param, callback =>
        {
            if (callback.IsSuccess())
            {
                Debug.Log($"글로벌 랭킹 등록에 성공했습니다. : {callback}");
            }
            else
            {
                Debug.LogError($"랭킹 등록에 실패했습니다.: {callback}");
            }
        });
    });
}

GetMyGlobalRank() 에서 gameoverSceneDirector.myGlobalRank에 순위를 파싱파고 Debug.Log로 출력해보면, 마찬가지로 순위권(50위) 내에 있을 때는 정상 출력, 순위권 밖에 있을 때는 0으로 출력됩니다.

안녕하세요 개발자님!

보내주신 코드를 모두 확인 및 테스트 해보았음에도 큰 문제는 발견되지 않았습니다.
정확한 해결을 위해 GetMyGlobalRank()함수의 bro값을 알려주시면 감사하겠습니다.

Debug.Log(bro);

추가적으로 테스트 중 SetRankData() 함수가 의도와 다르게 동작할 수 있음을 확인했습니다.
SetRankData() 함수가 자신의 지역변수를 참조하고 있기 때문에 값이 변경되지 않을 수 있습니다.

SetRankData(ref myGlobalRankData, 1000000000, nickname, 0, 0);
SetRankData(ref GlobalRankData globalRankData, int rank, string nickname, int bestRecord, int trophy)

myGlobalRankData의 값을 수정하고자 한다면 위 코드의 방식으로 사용해주시면 감사하겠습니다.
감사합니다.

GetMyGlobalRank() 에서

gameoverSceneDirector.myGlobalRank = int.Parse(globalRankDataJson[0][“rank”].ToString());

바로 파싱하니 해결되었습니다.

bro 값은 정상적으로(스테이터스 코드 200) 출력되는 것도 확인하였습니다.

감사합니다.

좋아요 2