이전에 작성한 구글 스프레드시트 데이터를 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로 전달하는 전체 흐름을 구현했습니다.
핵심 포인트는 다음과 같습니다.
- Unity ↔ 서버 간 실시간 통신을 위해 Socket.IO 클라이언트를 Unity에 설치
- SocketManager에서 소켓 연결 → 데이터 요청 → 응답 수신 구조 구현
- 받은 데이터를 DataManager에서 JsonUtility를 이용해 Unity 객체로 변환
- 서버에서는 Prisma ORM을 활용해 DB 데이터를 불러온 뒤 JSON.stringify로 직렬화하여 Unity로 전송
이 과정을 통해 Unity가 실시간으로 서버 DB 데이터를 받아서 사용하는 구조를 완성할 수 있었습니다.
'이노베이션캠프 > TIL' 카테고리의 다른 글
유니티 인풋 시스템 복습 (0) | 2025.08.21 |
---|---|
자바스크립트 데이터 외부 DB로 보내기 (0) | 2025.08.20 |
구글 스프레드 시트 데이터 자바스크립트로 가져오기 (3) | 2025.08.19 |
네트워크 기본 개념 정리 (3) | 2025.08.18 |
트러블슈팅 - AWS EC2에 서버 배포 (2) | 2025.07.31 |