게임에서 플레이어의 점수를 단순히 기록하고 끝내는 것은 아쉽습니다. 다른 플레이어와 순위를 경쟁하고, 점수를 서버에 안전하게 저장하려면 유니티 클라이언트와 외부 서버 간의 통신이 필수적입니다. 오늘은 게임 내 점수를 생성하고, 그 데이터를 REST API를 통해 외부 서버로 전송하는 방법을 단계별로 알아보겠습니다.
1. 점수 데이터 구조 클래스 작성
먼저, 서버로 보낼 점수 데이터를 담을 C# 클래스를 만듭니다. 서버의 데이터 구조와 일치해야 하며, 유니티의 **JsonUtility
**를 이용해 JSON 형식으로 쉽게 변환될 수 있도록 [System.Serializable]
속성을 추가해야 합니다.
C#
using System;
[Serializable]
public class ScoreData
{
public string username;
public int score;
}
2. 점수 관리 및 서버 통신 스크립트 작성
이제 게임 점수를 관리하고 서버에 전송하는 핵심 스크립트를 작성합니다. 이 스크립트는 **UnityWebRequest
**를 사용해 게임의 흐름을 방해하지 않고 비동기적으로 HTTP 요청을 보냅니다.
C#
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using TMPro; // UI 표시를 위해 TextMeshProUGUI를 사용합니다.
public class ScoreManager : MonoBehaviour
{
[Header("게임 점수 설정")]
public string username = "Player1";
public int score = 0;
[Header("서버 설정")]
public string serverUrl = "http://your-server.com/api/submit_score";
[Header("UI 연결 (선택 사항)")]
public TextMeshProUGUI scoreText;
void Start()
{
if (scoreText != null)
{
scoreText.text = "점수: " + score;
}
}
// 점수를 획득하는 예시 함수입니다.
public void AddScore(int points)
{
score += points;
Debug.Log("현재 점수: " + score);
if (scoreText != null)
{
scoreText.text = "점수: " + score;
}
}
// 게임 종료 시 호출하여 서버에 점수를 전송하는 함수
public void SubmitScoreToServer()
{
Debug.Log("서버로 점수 전송을 시작합니다.");
StartCoroutine(SendScoreCoroutine());
}
private IEnumerator SendScoreCoroutine()
{
// 서버로 보낼 데이터를 C# 객체에 담습니다.
ScoreData data = new ScoreData
{
username = this.username,
score = this.score
};
// JsonUtility.ToJson()을 사용해 C# 객체를 JSON 문자열로 변환합니다.
string jsonData = JsonUtility.ToJson(data);
// UnityWebRequest 객체 생성: 서버 URL과 POST 방식을 지정
UnityWebRequest request = new UnityWebRequest(serverUrl, "POST");
// JSON 데이터를 바이트 배열로 변환하여 요청 본문에 첨부합니다.
byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(jsonData);
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
request.downloadHandler = new DownloadHandlerBuffer();
// 헤더 설정: 서버가 JSON 형식의 데이터를 받도록 Content-Type을 지정합니다.
request.SetRequestHeader("Content-Type", "application/json");
// 요청을 보낸 후 서버의 응답을 기다립니다.
yield return request.SendWebRequest();
// 요청 결과 확인
if (request.result != UnityWebRequest.Result.Success)
{
Debug.LogError("서버 요청 실패: " + request.error);
}
else
{
Debug.Log("서버 응답: " + request.downloadHandler.text);
// 서버에서 보낸 응답 메시지를 여기서 처리할 수 있습니다.
}
}
}
3. 코드 해설 및 사용법
UnityWebRequest
: 유니티에서 HTTP 통신을 담당하는 핵심 클래스입니다.POST
방식을 지정하여 서버에 데이터를 보내는 요청을 만들 수 있습니다.JsonUtility
: C# 객체와 JSON 문자열을 서로 변환해주는 유니티 내장 기능입니다.ToJson()
을 사용해 C# 객체를 서버가 이해할 수 있는 JSON 형태로 바꿔줍니다.- 코루틴:
SendScoreCoroutine()
은IEnumerator
와yield return
을 활용하는 비동기 함수입니다. 서버에 요청을 보낸 후 응답이 올 때까지 게임의 다른 동작을 멈추지 않고 기다릴 수 있습니다. - Inspector 설정: 스크립트를 빈 게임 오브젝트에 부착한 뒤,
Inspector
창에서Username
과Server Url
을 실제 값으로 변경해야 합니다. 특히,serverUrl
에는 점수를 받을 서버의 REST API 주소를 정확히 입력해야 합니다.
이제 게임이 끝나는 시점이나 점수가 최종 확정되는 시점에 ScoreManager
오브젝트의 SubmitScoreToServer()
함수를 호출하기만 하면 됩니다. 이 기본 구조를 바탕으로 랭킹 시스템, 플레이어 데이터 저장 등 다양한 온라인 기능을 자유롭게 확장해 보세요.