본문 바로가기

c#(유데미)

뒤끝 GameData 게임정보 CRUD 하는법 튜토리얼

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using BackEnd;

/// <summary>
/// 게임 정보를 이용하기 위한 간단한 튜토리얼 입니다.
/// 뒤끝 SDK를 사용하는 방법은 뒤끝 SDK 개발자 문서를 참고해주세요.
/// 회원가입/로그인 : https://developer.thebackend.io/unity3d/guide/bmember/signup_login/
/// 게임 정보 생성  : https://developer.thebackend.io/unity3d/guide/gameDataV3/insert
/// 게임 정보 조회  : https://developer.thebackend.io/unity3d/guide/gameDataV3/get/where
/// 게임 정보 수정  : https://developer.thebackend.io/unity3d/guide/gameDataV3/update/inDate
/// 게임 정보 연산  : https://developer.thebackend.io/unity3d/guide/gameDataV3/updatewithCalc/inDateCalc
/// 게임 정보 삭제  : https://developer.thebackend.io/unity3d/guide/gameDataV3/delete/inDate
/// </summary>

public class BackendMgr : MonoBehaviour
{
    public InputField idField = null;
    public InputField pwField = null;

    public string tableName = string.Empty;

    private string rowIndate = string.Empty;
    private string firstKey = string.Empty;

    void Awake()
    {
        // 뒤끝 초기화
        var bro = Backend.Initialize(true);

        if (bro.IsSuccess() == false)
        {
            Debug.LogError("뒤끝 초기화 실패\n" + bro);
            return;
        }

        Debug.Log("뒤끝 초기화 성공");
    }

    void Update()
    {
        // 비동기 콜백 함수 풀링
        if (Backend.IsInitialized)
        {
            Backend.AsyncPoll();
        }
    }

    // 커스텀 로그인
    public void CustomLogin()
    {
        if (idField == null || pwField == null)
        {
            throw new System.Exception("idField 혹은 pwField가 null 입니다.");
        }
        Backend.BMember.CustomLogin(idField.text, pwField.text, callback =>
        {
            if (callback.IsSuccess() == false)
            {
                Debug.LogError("로그인 실패: " + callback);
                return;
            }

            Debug.Log("로그인 성공");
            Debug.Log(string.Format("유저 inDate: {0} / 유저 닉네임: {1}", Backend.UserInDate, Backend.UserNickName));
        });
    }

    // 커스텀 회원가입
    public void CustomSignUp()
    {
        if (idField == null || pwField == null)
        {
            throw new System.Exception("idField 혹은 pwField가 null 입니다.");
        }

        Backend.BMember.CustomSignUp(idField.text, pwField.text, callback =>
        {
            if (callback.IsSuccess() == false)
            {
                Debug.LogError("회원가입 실패: " + callback);
                return;
            }

            Debug.Log("회원가입 성공");
            Debug.Log(string.Format("유저 inDate: {0} / 유저 닉네임: {1}", Backend.UserInDate, Backend.UserNickName));
        });
    }

    // 테이블 명, rowIndate 가 string.empty 인지 확인
    // 각각 string.empty 인 경우 exception을 throw
    void NullChecker(bool isCheckRowIndate = false)
    {
        // 테이블 명이 존재하는지 확인
        if (string.IsNullOrEmpty(tableName))
        {
            throw new System.Exception("tableName is empty");
        }

        // 해당 튜토리얼에서 
        // update와 delete는 rowIndate가 필요하고,
        // insert와 get은 rowIndate가 필요하지 않습니다.
        if (isCheckRowIndate)
        {
            // rowIndate 가 존재하는지 확인
            if (string.IsNullOrEmpty(rowIndate))
            {
                throw new System.Exception("rowIndate is empty");
            }
        }
    }

    // 게임 정보 삽입
    // 아무런 컬럼을 추가하지 않고 row를 삽입합니다.
    public void InsertData()
    {
        NullChecker();

        // 게임 정보를 삽입합니다.
        Backend.GameData.Insert(tableName, callback =>
        {
            if (callback.IsSuccess() == false)
            {
                Debug.LogError("테이블 삽입 실패: " + callback);
                return;
            }

            Debug.Log("테이블 삽입 성공: " + callback);

            // 현재 삽입한 데이터의 rowIndate를 저장합니다.
            rowIndate = callback.GetInDate();
            Debug.Log("rowIndate: " + rowIndate);
        });
    }

    // 게임 정보를 조회합니다.
    // 이전에 조회한 데이터에서 firstKey가 존재하는 경우 연속해서 계속 조회합니다.
    public void GetData()
    {
        NullChecker();

        int limit = 10;

        if (string.IsNullOrEmpty(firstKey) == false)
        {
            Debug.Log("firstKey가 존재합니다. 해당 row 다음부터 조회합니다: " + firstKey);
        }

        // limit 10개로 게임 정보를 조회합니다.
        // 이전에 게임 정보를 조회했을 때 firstKey가 존재했다면 조회한 데이터 다음부터 이어서 조회합니다.
        // 검색 쿼리는 조건없음 입니다.
        // 쿼리에 아무런 조건을 넣지 않으면 테이블 내 모든 데이터를 조회할 수 있습니다.
        Backend.GameData.Get(tableName, new Where(), limit, firstKey, callback =>
        {
            if (callback.IsSuccess() == false)
            {
                Debug.LogError("테이블 조회 실패: " + callback);
                firstKey = string.Empty;
                return;
            }

            Debug.Log("테이블 조회 성공: " + callback);

            // rows 내에 존재하는 데이터를 전체 출력
            // row 1개당 Debug.Log를 1회 호출하기 때문에
            // limit가 크면 여기서 병목이 발생할 수 있습니다.
            var data = callback.FlattenRows();
            for (int i = 0; i < data.Count; ++i)
            {
                string returnValue = string.Empty;
                foreach (var key in data[i].Keys)
                {
                    returnValue += string.Format("{0} : {1} / ", key, data[i][key].ToString());
                }

                Debug.Log(returnValue);
            }

            // 조회 결과 데이터가 1개 이상 존재하면 0번째 데이터의 inDate를 저장
            if (data.Count > 0)
            {
                rowIndate = data[0]["inDate"].ToString();
            }

            // firstKey가 존재하면 firstKey를 저장
            if (callback.HasFirstKey())
            {
                firstKey = callback.FirstKeystring();
            }
            else
            {
                firstKey = string.Empty;
            }
        });
    }

    // 게임정보 업데이트
    public void UpdateData()
    {
        NullChecker(true);

        System.Random rnd = new System.Random();

        // score 컬럼에 1 ~ 100 사이 랜덤한 숫자를 갱신합니다.
        Param param = new Param();
        param.Add("score", rnd.Next(1, 100));

        // 게임 정보 업데이트
        // tableName 테이블의 rowIndate row의 score 컬럼을 위 랜덤한 값으로 수정합니다.
        Backend.GameData.Update(tableName, rowIndate, param, callback =>
        {
            if (callback.IsSuccess() == false)
            {
                Debug.LogError("테이블 갱신 실패: " + callback);
                return;
            }

            Debug.Log("테이블 갱신 성공: " + callback);
        });
    }

    // 게임정보 연산
    public void UpdateCalcData()
    {
        NullChecker(true);

        System.Random rnd = new System.Random();

        // score 컬럼에 10을 더합니다.
        Param param = new Param();
        param.AddCalculation("score", GameInfoOperator.addition, 10);

        // 게임 정보 업데이트
        // tableName 테이블의 rowIndate row의 score 컬럼에 10을 더합니다.
        Backend.GameData.UpdateWithCalculation(tableName, rowIndate, param, callback =>
        {
            if (callback.IsSuccess() == false)
            {
                Debug.LogError("테이블 갱신 실패: " + callback);
                return;
            }

            Debug.Log("테이블 갱신 성공: " + callback);
        });
    }

    // 테이블 삭제
    public void DeleteData()
    {
        NullChecker(true);

        // 게임 정보 삭제
        // tableName 테이블의 rowIndate row를 삭제합니다.
        Backend.GameData.Delete(tableName, rowIndate, callback =>
        {
            if (callback.IsSuccess() == false)
            {
                Debug.LogError("테이블 삭제 실패: " + callback);
                return;
            }

            Debug.Log("테이블 삭제 성공: " + callback);
        });
    }
}