2. 뒤끝 서버 아이템 데이터 삽입

2023. 10. 31. 22:26언어/유니티

728x90

https://parkhyeonjae.github.io/2020/11/28/%EB%92%A4%EB%81%9D%EC%A0%95%EB%A6%AC3.html

https://game-chanda.tistory.com/101

참고자료 읽고 시작

 

 


아이템을 받고 

아이템 차트를 먼저 만들기 보다는

유저에게 어떤 데이터를 넣을지를 생각해야된다.

반대로 생각해서 시행착오 겪음;;

 

 

 

다음 변수들은 다음과 같은 식으로 파싱이 가능합니다.
userGameitemData.itemname = gameDataJson[0][“itemname”].ToString();
userGameitemData.itemAct = bool.Parse(gameDataJson[0][“itemAct”].ToString());

어느 참고 자료의 데이터 형태인지는 현재 파악이 어렵지만, static을 통해 Instance를 만드는 이유는 해당 데이터의 활용도가 높아 어느 스크립트에서든 접근을 하기 위해서인 것으로 추측됩니다.

만약 static Instance를 선언하지 않을 경우, BackendGameitem 에 접근하는 모든 스크립트 마다 다음과 같이 수동으로 참조해야하는 로직이 추가되어야하기 때문입니다.

[SerializeField] private UserGameItemEvent;

위 GameData를 파싱하는 것으로 보아 데이터를 넣는 형식은 올바르다고 판단되며,
동기와 비동기의 경우, 함수를 호출하고 기다리는 동안 유니티가 다음 동작을 실행하지 않을 것인지, 외부 쓰레드를 통해 호출에 대한 응답을 기다리고 유니티는 계속 활동하게 할 것인지에 대한 선택입니다.

게임에서는 동기로 호출할 경우, 게임이 멈춘것처럼 보이기 때문에 대부분의 경우에는 사용하지 않지만 순차적으로 호출되기 때문에 코드의 이해가 쉽습니다. 비동기의 경우, 게임이 멈추지 않고 자연스럽게 흘러가지만 순차적으로 구현하기에는 서버를 처음 구현하시는 분에게는 어렵게 느껴질 수 있습니다.

 

뒤끝에서 이런 답변을 받았다. 나에게는 엄청 좋은 솔루션이 였다. 

 

 

먼저 UserGameitem 에 아이템 정보를 입력

초기화 시켜줄 itemReset() 추가 . 

public class UserGameitem
{


    public int State; // 아이템 강화상태
    public string itemname; // 아이템 이름
    public bool itemAct; // 아이템 활성화 비활성화
    public int itemCount; // 아이템 갯수 

      
    public void itemReset()
    {
        State = 0;
        itemname = ""; 
        itemAct = false;
        itemCount = 0;
    }


}

 

이후

유저 정보를 불러오거나 업데이트할 

GameDataInsert -뒤끝 콘솔 테이블에 새로운 유저 정보 추가

GameDataLoad - 뒤끝 콘솔 테이블에서 유저 정보를 불러올 때 호출

GameDataUpdate- 뒤끝 콘솔에 데이터를 업데이트 

 

이 내용은 흐름이라 꼭 기억해야됨 

 


이제 아이템들을 서버에 데이터로 만들어 주기위해서 

BackendGameitem 스크립트 하나 만들어주고 

 

먼저 앞에 적은 아이템을 불러오기 위해서 작업 해주고 

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

public class BackendGameitem : MonoBehaviour
{
    [Serializable]
    public class UserGameitemEvent : UnityEngine.Events.UnityEvent { }
    public UserGameitemEvent onGameItemDataLoadEvent = new UserGameitemEvent();

    private static BackendGameitem instance = null;
    public static BackendGameitem Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new BackendGameitem();
            }

            return instance;
        }
    }

    private UserGameitem userGameitemData = new UserGameitem();

    public UserGameitem UserGameitemData => userGameitemData;



    public string gameDataRowInDate = string.Empty;


}

 

 


 

뒤끝 콘솔 테이블에 새로운 유저 정보 추가 하기위해서 아이템들을 적용 

 

" 듸끝 콘솔 테이블에  USER_ITEM 라는 값 만들어주세요~" 

 public void GameitemDataInsert()
    {
        // 유저 정보를 초기값으로 설정
        userGameitemData.itemReset();

        // 테이블에 추가할 데이터로 가공
        Param param = new Param()
        {
            { "State",      userGameitemData.State },
            { "itemname",   userGameitemData.itemname },
            { "itemAct",    userGameitemData.itemAct },
            { "itemCount",  userGameitemData.itemCount },
        };

        // 첫 번째 매개변수는 뒤끝 콘솔의 "게임 정보 관리" 탭에 생성한 테이블 이름
        Backend.GameData.Insert("USER_ITEM", param, callback =>
        {
            // 게임 정보 추가에 성공했을 때
            if (callback.IsSuccess())
            {
                // 게임 정보의 고유값
                gameDataRowInDate = callback.GetInDate();

                Debug.Log($"게임 정보 데이터 삽입에 성공했습니다. : {callback}");
            }
            // 실패했을 때
            else
            {
                Debug.LogError($"게임 정보 데이터 삽입에 실패했습니다. : {callback}");
            }
        });
    }

 

 


게임 데이터를 불러오기 위해서 

코드를 만들어줍니다.

 

여기서 궁금한점은 string 과 bool 형은 어떤식으로 데이를 삽입 해야되는지 잘모르겠음  // 뒤끝 질문함 

  public void GameitemDataLoad()
    {
        Backend.GameData.GetMyData("USER_ITEM", new Where(), callback =>
        {
            // 게임 정보 불러오기에 성공했을 때
            if (callback.IsSuccess())
            {
                Debug.Log($"게임 정보 데이터 불러오기에 성공했습니다. : {callback}");

                // JSON 데이터 파싱 성공
                try
                {
                    LitJson.JsonData gameDataJson = callback.FlattenRows();

                    // 받아온 데이터의 개수가 0이면 데이터가 없는 것
                    if (gameDataJson.Count <= 0)
                    {
                        Debug.LogWarning("데이터가 존재하지 않습니다.");
                    }
                    else
                    {
                        // 불러온 게임 정보의 고유값
                        gameDataRowInDate = gameDataJson[0]["inDate"].ToString();
                        // 불러온 게임 정보를 userData 변수에 저장
                        userGameitemData.State = int.Parse(gameDataJson[0]["State"].ToString());
                        userGameitemData.itemname = gameDataJson[0]["itemname"].ToString();
                        userGameitemData.itemAct = bool.Parse(gameDataJson[0]["itemAct"].ToString());
                        userGameitemData.itemCount = int.Parse(gameDataJson[0]["itemCount"].ToString());
                        onGameItemDataLoadEvent?.Invoke();
                    }
                }
                // JSON 데이터 파싱 실패
                catch (System.Exception e)
                {
                    // 유저 정보를 초기값으로 설정
                    userGameitemData.itemReset();
                    // try-catch 에러 출력
                    Debug.LogError(e);
                }
            }
            // 실패했을 때
            else
            {
                Debug.LogError($"게임 정보 데이터 불러오기에 실패했습니다. : {callback}");
            }
        });
    } // 아이템 데이터 불러오기

 


 

 

아이템을 업데이트를 위한 코드 

 

  public void GameDataUpdate(UnityAction action = null)
    {
        if (userGameitemData == null)
        {
            Debug.LogError("서버에서 다운받거나 새로 삽입한 데이터가 존재하지 않습니다." +
                           "Insert 혹은 Load를 통해 데이터를 생성해주세요.");
            return;
        }

        Param param = new Param()
        {
            { "State",        userGameitemData.State },
            { "itemname",     userGameitemData.itemname },
            { "itemAct",      userGameitemData.itemAct },
            { "itemCount",    userGameitemData.itemCount },
        };

        // 게임 정보의 고유값(gameDataRowInDate)이 없으면 에러 메시지 출력
        if (string.IsNullOrEmpty(gameDataRowInDate))
        {
            Debug.LogError($"유저의 inDate 정보가 없어 게임 정보 데이터 수정에 실패했습니다.");
        }
        // 게임 정보의 고유값이 있으면 테이블에 저장되어 있는 값 중 inDate 컬럼의 값과
        // 소유하는 유저의 owner_inDate가 일치하는 row를 검색하여 수정하는 UpdateV2() 호출
        else
        {
            Debug.Log($"{gameDataRowInDate}의 게임 정보 데이터 수정을 요청합니다.");

            Backend.GameData.UpdateV2("USER_ITEM", gameDataRowInDate, Backend.UserInDate, param, callback =>
            {
                if (callback.IsSuccess())
                {
                    Debug.Log($"게임 정보 데이터 수정에 성공했습니다. : {callback}");

                    action?.Invoke();
                }
                else
                {
                    Debug.LogError($"게임 정보 데이터 수정에 실패했습니다. : {callback}");
                }
            });
        }
    }

 


데이터 만들기

 

여기까지 완료했다면 

 

이제 계정 생성될때 내가 저장한 데이터를 Insert() 해주기 위해서 

 

 

RegisterAccount 스크립트에 

                        BackendGameitem.Instance.GameitemDataInsert();  // 계정 생성 성공시 게임 아이템 데이터 저장

 

한줄 추가 

 

이제 실행을해서 계정생성 해서 로그인을하면 아까 저장해둔 데이터들로 만들어짐 

이제 이걸 게임에 이용이되게 만들어야되는데 그럴려면 

아이템GameDataLoad , GameDataUpdate 이두개를 이용해서 유아이와 연결 시켜야된다. 

 

 

728x90