랭킹 불러오기

문의를 남기실 경우 다음 항목을 작성해 주시면 빠른 답변 처리에 도움이 됩니다.

  • 프로젝트명 : 화랑키우기
  • 뒤끝SDK 버전 : 5.4.3
  • 에러 코드 : null

실시간 랭킹이 총 3가지인데 그중 한가지는 정상적으로 작동하는데
남은 두가지는 GetReturnValuetoJSON 함수를 사용하면 Null로 나오게 됩니다
콘솔에서 확인할때는 데이터가 다 들어가있는데 왜그런거죠>

안녕하세요 개발자님,
GetReturnValuetoJSON 함수 사용 시 Null로 나온다고 말씀해 주셨는데요.
당시에 확인되는 에러 정보 확인을 부탁드리겠습니다.

추가적으로 랭킹을 생성할 때 선택한 컬럼의 값 (점수로 사용할 값)의 범위는 아래와 같아야 합니다.
해당 범위를 벗어나는 값은 반올림, 반내림 되는 등 정상적으로 저장되지 않을 수 있고, SDK에서 랭킹을 조회할 때 에러가 발생할 수 있습니다.

정수 : -9007199254740992 ~ 9007199254740992 (-2^53 ~ 2^53)
실수 : -3.40282347E+38F ~3.40282347E+38F (float.MinValue ~ float.MaxValue)

숫자 범위가 랭킹이 지원하는 숫자 범위인지도 확인을 부탁드리겠습니다.

NullReferenceException: Object reference not set to an instance of an object
BackEndGameInfo+d__33.MoveNext () (at Assets/Scripts/BackEndScripts/BackEndGameInfo.cs:893)
UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/Coroutines.cs:17)
UnityEngine.MonoBehaviour:StartCoroutine(String)
BackEndGameInfo:startshowboss2ranking() (at Assets/Scripts/BackEndScripts/BackEndGameInfo.cs:837)
EnterPanel:enterrankingsubpanel(Int32) (at Assets/Scripts/EnterPanel.cs:634)
UnityEngine.EventSystems.EventSystem:Update() (at /Users/pyoungzoo/Desktop/Unity/2019.4.16f1/Unity.app/Contents/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/EventSystem.cs:377)

이런 오류가 발생합니다. 범위는 랭킹에 선택한 칼럼이 float 이고 그 범위를 넘지않습니다. 어떠한 이유인가요?

안녕하세요 개발자님.

로그상으로는 BackEndGameInfo.cs의 893번째 줄 부분에서 사용되는 오브젝트가 다른 오브젝트와 연결되어있지 않거나 메모리 할당되어있지 않아서 Null이 발생하는 오류로 확인되는데요.
해당 부분에서 사용되는 객체나 변수가 할당이 되어있고 정상적으로 작동되는지 확인해주시면 감사하겠습니다.

만약 해당 부분이 GetReturnValueToJSON부분이라면 랭킹 불러오기 함수의 리턴값으로 반환되는 BackendReturnObject를 Debug.Log()를 통해 returnValue가 정상적으로 리턴되는지도 확인해주시면 감사하겠습니다.

그 부분이
BackendReturnObject callback = Backend.URank.User.GetRankList(“aa5bb420-9377-11eb-9102-1be1ad89393c”, 50);
int rankcount = callback.GetReturnValuetoJSON()[“rows”].Count;
이렇게 되있는 부분인데 콜백으로 함수는 성공적으로 불러와지는데 콜백의 리턴값이 제이슨일경우는 null 이고
GetReturnValue() 이함수로 불러올경우는 데이터가 들어가있습니다. 제이슨으로 값을 가져오는게 전부 null로 나옵니다.

개발자님,
정확한 확인 위해 성공 시와 실패 시 모두 어떤 함수들을 요청하고 있는지와 함께
GetReturnValue 함수를 통해 리턴되는 모든 값의 확인을 부탁드립니다. (성공 실패 시 모두)
추가적으로 실패 시 확인되는 statusCode, errorCode, message 값을 확인 부탁드립니다.

BackendReturnObject callback = Backend.URank.User.GetRankList(“aa5bb420-9377-11eb-9102-1be1ad89393c”, 50);
if (callback.IsSuccess())
{
Transform[] childList = DataController.Instance.rankingpanelposition.transform.GetComponentsInChildren(true);
if (childList != null)
{
for (int i = 1; i < childList.Length; i++)
{
if (childList[i] != transform)
Destroy(childList[i].gameObject);
}
}

        print(callback.GetMessage());
        print(callback.GetStatusCode());
        print(callback.GetErrorCode());
        int rankcount = callback.GetReturnValuetoJSON()["rows"].Count;
        int totalcount = callback.GetReturnValuetoJSON()["rows"].Count;
        while (rankcount > 0)
        {
            DataController.Instance.rankloadingpanel.SetActive(true);
            var rankingpanel = Instantiate(DataController.Instance.rankingpanelpref, DataController.Instance.rankingpanelpref.transform.position,
                DataController.Instance.rankingpanelpref.transform.rotation);
            rankingpanel.transform.SetParent(DataController.Instance.rankingpanelposition.transform);
            rankingpanel.transform.localScale = new Vector3(1,1,1);
            rankingpanel.GetComponent<BackEndRanking>().mygradebox.SetActive(false);
            rankingpanel.GetComponent<BackEndRanking>().myrank.text = callback.GetReturnValuetoJSON()["rows"][totalcount-rankcount]["rank"]["N"].ToString();
            rankingpanel.GetComponent<BackEndRanking>().mynickcname.text = callback.GetReturnValuetoJSON()["rows"][totalcount-rankcount]["nickname"]["S"].ToString();
            rankingpanel.GetComponent<BackEndRanking>().mysocre.text = DataController.Instance.changefloat(float.Parse(callback.GetReturnValuetoJSON()["rows"][totalcount-rankcount]["score"]["N"].ToString()));
            rankcount--;
            yield return new WaitForSeconds(3*Time.deltaTime);
        }
        DataController.Instance.rankloadingpanel.SetActive(false);
    }

우선 이부분이 해당 함수 부분이며
message 값은 success
errorcode 값은 null
statuscode 값은 200 으로 표기됩니다.

int rankcount = callback.GetReturnValuetoJSON()[“rows”].Count 이부분에서 위에 보내드렸던 오류가 발생합니다.

안녕하세요 개발자님

aa5bb420-9377-11eb-9102-1be1ad89393c 랭킹에 저장된 점수를 확인해보았는데요,

2.9149564e+19
2.8120913699999998e+19
1.8858497e+17

와 같은 소수점 자리수가 긴 점수가 저장되어 있어 json 파싱을 할 때 실패하는 것 같습니다.

랭킹을 새로 만드시거나 혹은 뒤끝 콘솔에서 소수점 자리수가 길게 저장된 점수를 지닌 랭커를 삭제하신 후

랭킹 조회를 하시면 정상적으로 이용이 가능하실 것 입니다.

아니면

뒤끝에서 제공하는 LitJson이 아닌, 다른 서드파티 json 라이브러리를 이용하여

callback.GetReturnValue() 의 값을 json으로 파싱하여 사용하시면 이용이 가능하실 것 입니다.

참고부탁드리겠습니다.

감사합니다.

네 답변감사합니다 !

아직 오류가 발생합니다.
우선 기록되는 칼럼 값을 mathf.round 로 소숫점은 제거 하여 등록하였는데
100경 까지는 기록이되나 이 보다 큰 숫자들이 등록될경우 에러가 발생하는듯합니다.
float 인 칼럼을 사용중인데 랭킹에는 100경 정도까지만 가능한가요?

최초 안내드린 바와 같이 랭킹의 컬럼값의 범위는 아래와 같아야 합니다.
해당 범위를 벗어나는 값은 반올림, 반내림 되는 등 정상적으로 저장되지 않을 수 있고, SDK에서 랭킹을 조회할 때 에러가 발생할 수 있습니다.

정수 : -9007199254740992 ~ 9007199254740992 (-2^53 ~ 2^53)
실수 : -3.40282347E+38F ~3.40282347E+38F (float.MinValue ~ float.MaxValue)

1000경은 실수 범위안에 포함되는거 아닌가요?

실수 범위 내에서는 서버에 저장이 되는게 맞고
float.MaxValue를 저장해보시면 확인하실 수 있듯 정상적으로 이용이 가능합니다.

해당 범위 내 값을 사용하실 때 GetReturnValuetoJSON 함수에서 Null 혹은 empty가 리턴되는 경우에는
서버에서 지원하는 것과 별개로 LitJson에서 파싱이 실패하는 것이기 때문에
앞서 말씀드린 것처럼 별도의 서드파티 json 라이브러리(Unity JSON Utility, newtonsoft.json 등)를 이용하여 GetReturnValue의 값을 파싱해 주시면 이용 가능합니다.

그럼 지금 null로 나오는 이유는 정확하게 모르나요?
단지 숫자 단위가 커져서 안들어가는건가요? float 범위 안에 있는 단위긴한데

1+E19 를 넣어도 마찬가지로 오류가 발생합니다.
소숫점문제가아니라 그냥 숫자가 저정도 크기부터는 파싱자체가안되는것같네요
float 단위 안에있는 숫자인데… 해결방안없나요 뒤끝에서

LitJson에서 해당 범위의 숫자를 지원하지 않아 파싱오류가 발생해 Null 이 리턴되는 것입니다.

기획적으로 게임에서 너무 큰 숫자를 사용하시는 것으로 예상됩니다.
가능하다면 숫자를 줄여 이용해주심이 좋을 것으로 보여지며, 불가피하다면 앞서 말씀드린 것처럼 별도의 서드파티 json 라이브러리(Unity JSON Utility, newtonsoft.json 등)의 이용을 추천드리겠습니다.