유니티 게임 점수 이제 서버로 보내자! (REST API 연동 가이드)

게임에서 플레이어의 점수를 단순히 기록하고 끝내는 것은 아쉽습니다. 다른 플레이어와 순위를 경쟁하고, 점수를 서버에 안전하게 저장하려면 유니티 클라이언트와 외부 서버 간의 통신이 필수적입니다. 오늘은 게임 내 점수를 생성하고, 그 데이터를 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()IEnumeratoryield return을 활용하는 비동기 함수입니다. 서버에 요청을 보낸 후 응답이 올 때까지 게임의 다른 동작을 멈추지 않고 기다릴 수 있습니다.
  • Inspector 설정: 스크립트를 빈 게임 오브젝트에 부착한 뒤, Inspector 창에서 UsernameServer Url을 실제 값으로 변경해야 합니다. 특히, serverUrl에는 점수를 받을 서버의 REST API 주소를 정확히 입력해야 합니다.

이제 게임이 끝나는 시점이나 점수가 최종 확정되는 시점에 ScoreManager 오브젝트의 SubmitScoreToServer() 함수를 호출하기만 하면 됩니다. 이 기본 구조를 바탕으로 랭킹 시스템, 플레이어 데이터 저장 등 다양한 온라인 기능을 자유롭게 확장해 보세요.

댓글 남기기