게임을 만들다 보면 플레이어의 점수, 아이템, 진행 상황 등을 저장해야 할 필요가 생깁니다. 이를 위해 로컬(기기 내)에 저장하는 방법도 있지만, 온라인 랭킹 시스템을 만들거나 여러 기기에서 데이터를 동기화하려면 서버에 데이터를 저장하는 과정이 필수적이죠.
오늘은 유니티에서 서버와 직접 통신해 데이터를 저장하는 가장 기본적인 방법을 소개하려 합니다. 복잡한 서버 개발 지식이 없더라도, 유니티의 기본 기능을 활용해 간단한 데이터 전송 시스템을 구축할 수 있습니다.
1. 전송할 데이터 구조 정의하기
서버로 데이터를 보내려면 먼저 어떤 정보를 보낼지 규칙을 정해야 합니다. 유니티에서는 C# 클래스를 이용해 이 규칙을 정의하고, 이를 JSON 형식으로 변환하여 서버에 전송하는 것이 일반적입니다. JSON은 웹에서 데이터를 주고받을 때 널리 사용되는 형식입니다.
예를 들어, 플레이어의 이름과 점수, 플레이 시간을 저장하고 싶다면 다음과 같이 클래스를 만들 수 있습니다.
C#
using System;
[Serializable]
public class UserData
{
public string playerName;
public int score;
public float playTime;
}
여기서 [Serializable]
속성은 클래스를 직렬화하여 JSON으로 쉽게 변환할 수 있게 해주는 중요한 부분입니다.
2. 서버 통신 스크립트 작성하기
이제 실제로 서버와 데이터를 주고받는 스크립트를 작성할 차례입니다. 유니티는 UnityWebRequest
라는 강력한 컴포넌트를 제공하여 HTTP 통신을 쉽게 처리할 수 있습니다. 이 스크립트는 **코루틴(Coroutine)**을 사용해 비동기적으로 통신을 처리합니다. 코루틴을 사용하면 게임이 멈추지 않고 서버의 응답을 기다릴 수 있어 게임의 사용자 경험을 해치지 않습니다.
아래 코드는 앞서 만든 UserData
클래스를 JSON으로 변환해 서버에 POST 요청으로 보내는 예시입니다.
C#
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using System.Text;
public class DataSender : MonoBehaviour
{
// 데이터를 받을 서버의 API 주소
public string apiURL = "https://your-server-api.com/save";
// 게임 데이터 저장 요청
public void SaveGameData(string name, int finalScore, float time)
{
// 1. 데이터를 UserData 클래스에 담기
UserData data = new UserData
{
playerName = name,
score = finalScore,
playTime = time
};
// 2. 클래스 객체를 JSON 문자열로 변환
string jsonData = JsonUtility.ToJson(data);
// 3. 코루틴을 시작해 서버로 데이터 전송
StartCoroutine(SendToServer(jsonData));
}
IEnumerator SendToServer(string jsonData)
{
// UnityWebRequest 객체 생성: URL과 POST 방식 지정
UnityWebRequest request = new UnityWebRequest(apiURL, "POST");
// JSON 데이터를 바이트 배열로 변환
byte[] jsonToSend = new UTF8Encoding().GetBytes(jsonData);
// request에 데이터 업로드 핸들러 추가
request.uploadHandler = new UploadHandlerRaw(jsonToSend);
// 서버의 응답을 받을 다운로드 핸들러 추가
request.downloadHandler = new DownloadHandlerBuffer();
// 헤더에 JSON 콘텐츠임을 명시
request.SetRequestHeader("Content-Type", "application/json");
// 서버에 요청 보내기
yield return request.SendWebRequest();
// 요청 결과에 따라 로그 출력
if (request.result == UnityWebRequest.Result.Success)
{
Debug.Log("데이터 저장 성공! 서버 응답: " + request.downloadHandler.text);
}
else
{
Debug.LogError("데이터 저장 실패: " + request.error);
}
}
}
3. 유니티에서 스크립트 연결 및 호출
- 스크립트 연결: 위 코드를
DataSender.cs
파일로 저장하고, 씬의 빈 게임 오브젝트에 컴포넌트로 추가해 줍니다. - API 주소 입력: Inspector 창에서
DataSender
컴포넌트의 API URL 필드에 여러분이 데이터를 보낼 실제 서버 주소를 입력합니다. - 함수 호출: 게임이 끝났을 때와 같이 데이터를 저장해야 하는 시점에
DataSender
의SaveGameData()
함수를 호출해 주면 됩니다. 예를 들어,GameManager
스크립트에서 게임 종료 이벤트를 감지해 다음과 같이 호출할 수 있습니다.
C#
// GameManager.cs
public class GameManager : MonoBehaviour
{
public DataSender dataSender; // Inspector에서 DataSender 오브젝트 연결 필요
private void GameOver()
{
// 게임 데이터 준비
string playerName = "Player01";
int finalScore = 1500;
float finalTime = 250.3f;
// DataSender를 통해 서버에 데이터 전송
dataSender.SaveGameData(playerName, finalScore, finalTime);
}
}
이렇게 하면 플레이어가 게임을 마쳤을 때, DataSender
스크립트가 유니티 게임 데이터를 JSON 형식으로 변환해 서버로 전송하는 일련의 과정이 자동으로 이루어집니다.
이 방법은 서버 API가 미리 준비되어 있어야 하지만, 클라이언트와 서버가 어떻게 소통하는지 이해하는 좋은 첫걸음이 될 것입니다. 이 기본적인 구조를 바탕으로 게임에 필요한 다양한 서버 기능을 구현해 보세요!