본문 바로가기

이노베이션캠프/TIL

DB 데이터 유니티로 내보내기

이전에 작성한  구글 스프레드시트 데이터를 JSON으로 변환해 DB에 저장하는 과정을 구현했는데, 이번에는 DB에 있는 데이터를 Unity로 내보내는 작업을 진행했습니다.

 

1. Unity에서 Socket.IO 설치

Unity와 서버 간 실시간 통신을 위해 Socket.IO 라이브러리를 설치했습니다. 아래 GitHub 저장소에서 설치 방법을 확인할 수 있습니다.

 

https://github.com/NetEase/UnitySocketIO

 

GitHub - NetEase/UnitySocketIO: socket.io client for unity3d.

socket.io client for unity3d. Contribute to NetEase/UnitySocketIO development by creating an account on GitHub.

github.com

 

 

2. SocketManager.cs 작성

게임 실행 시 서버와 연결이 이루어지도록 SocketManager를 만들고, Awake 메서드에서 소켓 연결을 초기화했습니다.

public class SocketManager : Singleton<SocketManager>
{
    private SocketIOUnity socket;
    public string jsonData;

    private string serverUrl = "http://localhost:xxxx"; // 연결할 서버 포트 주소

    protected override void Awake()
    {
        socket = new SocketIOUnity(serverUrl);

        // 소켓 연결 시 이벤트 등록
        socket.OnConnected += (sender, e) =>
        {
            Debug.Log("Socket.IO Connected");
            LoadData(); // 연결되면 데이터 로드
        };

        socket.Connect(); // 소켓 연결
    }

    // 서버에서 데이터 가져오기
    public void LoadData()
    {
        socket.Emit("loadData"); // 서버에 요청

        socket.On("sendData", response =>
        {
            jsonData = response.GetValue<string>();
            Debug.Log("Data loading from server is complete: " + jsonData);

            DataManager.Instance.SetGameData(jsonData); // DataManager로 전달
        });
    }
}

 

3. DataManager.cs에서 JSON 파싱

서버로부터 전달받은 데이터를 DataManager에서 Unity 객체로 변환합니다. 이를 위해 미리 [System.Serializable] 클래스를 정의해 두어야 합니다.

 

public class DataManager : Singleton<DataManager>
{
    public GameAsset gameAsset;

    public void SetGameData(string jsonData)
    {
        // Socket으로 받아온 데이터를 유니티에서 사용할 데이터로 변환
        gameAsset = JsonUtility.FromJson<GameAsset>(jsonData);
        Debug.Log("DataManager has parsed the data.");
    }

}

4. 서버에서 데이터 전달 로직

Node.js 서버에서는 Prisma ORM을 이용해 DB 데이터를 읽어온 후, JSON 형태로 Unity에 전달하도록 작성했습니다.

 

// 유니티에 데이터 로드
export const loadDBData = async () => {

  const getCharacterInfo = prisma.characterInfo.findMany();
  const getMonsterInfo = prisma.monsterInfo.findMany();
  const getItem = prisma.item.findMany();
  const getStage = prisma.stage.findMany();
  const getLevelInfo = prisma.levelInfo.findMany();
  const getMonster = prisma.monster.findMany();
  const getMonsterOnStage = prisma.monsterOnStage.findMany();

  const [characterInfo, monsterInfo, item, stage, levelInfo, monster, monsterOnStage] =
    await Promise.all([
      getCharacterInfo,
      getMonsterInfo,
      getItem,
      getStage,
      getLevelInfo,
      getMonster,
      getMonsterOnStage,
    ]);


  const allData = { characterInfo, monsterInfo, item, stage, levelInfo, monster, monsterOnStage };
  
  return JSON.stringify(allData, null, 2);

};

 

결론

오늘은 DB 데이터를 Unity로 전달하는 전체 흐름을 구현했습니다.

핵심 포인트는 다음과 같습니다.

  1. Unity ↔ 서버 간 실시간 통신을 위해 Socket.IO 클라이언트를 Unity에 설치
  2. SocketManager에서 소켓 연결 → 데이터 요청 → 응답 수신 구조 구현
  3. 받은 데이터를 DataManager에서 JsonUtility를 이용해 Unity 객체로 변환
  4. 서버에서는 Prisma ORM을 활용해 DB 데이터를 불러온 뒤 JSON.stringify로 직렬화하여 Unity로 전송

이 과정을 통해 Unity가 실시간으로 서버 DB 데이터를 받아서 사용하는 구조를 완성할 수 있었습니다.