2021년 11월 7일 일요일

뒤끝서버 데이터 파싱하기

 게임 개발을 하면서 게임 서버가 필요할때는 뒤끝서버를 애용하고 있습니다. 사용이 간편하고 제가 사용하는 유니티 엔진에 친화적이라서 사용하고 있습니다.

뒤끝 서비스 자체가 매우 많은 기능들을 제공하고 있지는 않지만 모바일 게임에서 서버가 해야하는 기능들은 거의 다 제공하고 있어서 아직까지 문제는 없었습니다.

뒤끝서버를 사용하면서 서버에서 전송하는 데이터를 한땀한땀 파싱하시는 분들이 혹시 계실까봐 제가 사용하는 코드 공유차원에서 글을 작성합니다. 


뒤끝서버는 데이터를 전송할때 json 형식으로 전송하며 게임정보(DB)의 경우 데이터 형식에 따라 맵의 키값이 다르게 옵니다.

N : 숫자(정수,실수)

S : 문자열

BOOL : bool값

자세한 데이터형식은 뒤끝SDK 문서에서 확인할 수 있습니다.

하지만 이런형식대로 데이터가 추가, 삭제될때마다 코드를 수정하면 너무 불편해서 파싱하는 함수를 만들어서 사용하고 있습니다.


코드는 다음과 같습니다.

차트 데이터의 경우는 모두 스트링형식으로 전송되기 때문에 플래그를 하나 넣어주었습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public T ParseBackendData<T>(JsonData json, bool isChart = false) where T : new()
    {
        T data = new T();
        var fields = typeof(T).GetFields();
        for (int i = 0; i < fields.Length; ++i)
        {
            if (fields[i].FieldType == typeof(int))
            {
                if (json.Keys.Contains(fields[i].Name))
                {
                    if (isChart)
                        fields[i].SetValue(data, int.Parse(json[fields[i].Name]["S"].ToString()));
                    else
                        fields[i].SetValue(data, int.Parse(json[fields[i].Name]["N"].ToString()));
                }
                else
                    fields[i].SetValue(data, 0);
            }
            else if (fields[i].FieldType == typeof(string))
            {
                if (json.Keys.Contains(fields[i].Name))
                    fields[i].SetValue(data, json[fields[i].Name]["S"].ToString());
                else
                    fields[i].SetValue(data, "");
            }
            else if (fields[i].FieldType == typeof(float))
            {
                if (json.Keys.Contains(fields[i].Name))
                {
                    if (isChart)
                        fields[i].SetValue(data, float.Parse(json[fields[i].Name]["S"].ToString()));
                    else
                        fields[i].SetValue(data, float.Parse(json[fields[i].Name]["N"].ToString()));
                }
                else
                    fields[i].SetValue(data, 0.0f);
            }
            else if (fields[i].FieldType == typeof(bool))
            {
                if (json.Keys.Contains(fields[i].Name))
                {
                    if (isChart)
                        fields[i].SetValue(data, bool.Parse(json[fields[i].Name]["S"].ToString()));
                    else
                        fields[i].SetValue(data, bool.Parse(json[fields[i].Name]["BOOL"].ToString()));
                }
                else
                    fields[i].SetValue(data, false);
            }
            else if (fields[i].FieldType == typeof(DateTime))
            {
                if (json.Keys.Contains(fields[i].Name))
                {
                    string time = json[fields[i].Name]["S"].ToString();
                    fields[i].SetValue(data, DateTime.Parse(time));
                }
                else
                    fields[i].SetValue(data, new DateTime(0));
            }
            else
                Debug.LogError("Wrong field type");
        }
        return data;
    }

cs

사용법은 간단합니다.

예를 들어 player 정보가 다음과 같을때


nickname : string

level : int

exp : float

stage : int


해당 정보를 저장할 클래스를 하나 만들어 줍니다.

1
2
3
4
5
6
7
public PlayerInfo
{
    public string nickname;
    public int level;
    public float exp;
    public int stage;
}
cs

주의하실점은 모두 public 으로 맴버변수를 만들어야하고, 뒤끝 서버에 저장되는 속성명과 동일한 변수명을 설정해야합니다.


이후에 뒤끝 데이터를 불러오는 부분은

1
2
3
4
5
6
7
8
9
SendQueue.Enqueue(Backend.GameData.GetMyData, TablePlayer, new Where(), bro =>
{
    if (bro.IsSuccess())
    {
        var json = bro.GetReturnValuetoJSON();
        var playerJson = json["rows"][0];
        PlayerInfo data = ParseBackendData<PlayerInfo>(playerJson);
    }
});
cs

위와같이 간편하게 사용할 수 있습니다.







댓글 없음:

댓글 쓰기

채근담 6일. 진미의 샘물