유니티 게임 점수, PHP 서버로 보내기

유니티 게임 점수, PHP 서버로 보내기: 완벽 가이드

게임에서 플레이어의 점수를 단순히 기록하고 끝내는 것은 아쉽습니다. 온라인 랭킹 시스템을 구축하거나, 플레이어의 성장 데이터를 서버에 안정적으로 보관하려면 유니티 클라이언트와 외부 서버 간의 통신이 반드시 필요합니다. 이 가이드는 유니티에서 플레이어의 점수를 생성하고, 이를 PHP 서버로 전송하여 응답을 받는 과정을 상세히 다룹니다. 이 코드는 모든 온라인 기능의 기초가 될 것입니다.


1. PHP 서버 스크립트 작성 (데이터 수신 및 응답)

먼저, 유니티 클라이언트의 요청을 받아 점수 데이터를 처리할 PHP 스크립트를 작성해야 합니다. 이 스크립트는 POST 방식으로 전송된 usernamescore 데이터를 받아서 처리하고, 그 결과를 JSON 형식으로 유니티에 다시 보내줍니다.

submit_score.php

PHP

<?php
// 클라이언트에게 JSON 형식의 응답을 보낼 것임을 알립니다.
header('Content-Type: application/json');

// POST 요청으로 받은 데이터가 있는지 확인합니다.
if (isset($_POST['username']) && isset($_POST['score'])) {
    $username = $_POST['username'];
    $score = $_POST['score'];

    // 주의: 실제 서비스에서는 이 데이터를 데이터베이스에 안전하게 저장해야 합니다.
    // SQL 인젝션을 방지하기 위한 보안 처리도 필수입니다.
    // 여기서는 작동 확인을 위한 예시로 출력만 진행합니다.
    echo "서버에서 받은 데이터 - 아이디: " . $username . ", 점수: " . $score . "\n";
    
    // 유니티 클라이언트에게 보낼 JSON 응답 객체를 생성합니다.
    $response = [
        'status' => 'success',
        'message' => '점수가 성공적으로 서버에 기록되었습니다.'
    ];

} else {
    // 필수 데이터가 누락되었을 경우 실패 응답을 보냅니다.
    $response = [
        'status' => 'fail',
        'message' => '요청에 필요한 아이디 또는 점수 데이터가 없습니다.'
    ];
}

// PHP 배열을 JSON 문자열로 변환하여 출력합니다.
echo json_encode($response);
?>

이 PHP 스크립트의 핵심은 $_POST 슈퍼글로벌 변수를 이용해 클라이언트로부터 전송된 폼 데이터를 읽어오는 것입니다. header() 함수로 응답 형식을 JSON으로 지정하고, json_encode() 함수를 이용해 PHP 배열을 유니티가 쉽게 해석할 수 있는 JSON 문자열로 변환합니다.


2. 유니티 클라이언트 스크립트 작성 (데이터 전송 및 수신)

이제 유니티에서 PHP 서버로 데이터를 보내고 응답을 받는 C# 스크립트를 작성합니다. 이 스크립트는 **UnityWebRequest**를 이용해 HTTP 통신을 처리하며, WWWForm을 사용해 PHP 서버가 기대하는 형태로 데이터를 패키징합니다.

C#

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using TMPro;

public class ScoreSender : MonoBehaviour
{
    [Header("게임 점수 데이터")]
    public string username = "Player1";
    public int score = 100;
    
    [Header("서버 설정")]
    public string serverUrl = "http://your-server.com/submit_score.php";

    [Header("UI 연결")]
    public TextMeshProUGUI statusText;

    // 서버 응답을 파싱하기 위한 클래스 (PHP 스크립트의 응답 구조와 일치해야 함)
    [System.Serializable]
    public class PhpResponse
    {
        public string status;
        public string message;
    }

    // 게임 종료 시 호출하여 점수를 전송하는 함수
    public void SendScoreToServer()
    {
        Debug.Log("서버에 점수 전송을 시작합니다.");
        if (statusText != null) statusText.text = "점수 전송 중...";

        StartCoroutine(SubmitScoreCoroutine());
    }

    private IEnumerator SubmitScoreCoroutine()
    {
        // 서버에 보낼 데이터를 담을 WWWForm을 생성합니다.
        WWWForm form = new WWWForm();
        form.AddField("username", username);
        form.AddField("score", score.ToString()); // int를 string으로 변환해야 합니다.
        
        // UnityWebRequest를 이용해 POST 요청을 생성하고 폼 데이터를 추가합니다.
        UnityWebRequest request = UnityWebRequest.Post(serverUrl, form);

        // 요청을 전송하고 응답을 기다립니다. 코루틴의 핵심 부분입니다.
        yield return request.SendWebRequest();

        // 요청 결과 확인
        if (request.result != UnityWebRequest.Result.Success)
        {
            Debug.LogError("서버 연결 실패: " + request.error);
            if (statusText != null) statusText.text = "서버 연결 실패";
        }
        else
        {
            // 서버 응답을 JSON 문자열로 받음
            string responseText = request.downloadHandler.text;
            Debug.Log("서버 응답: " + responseText);

            // JSON 응답을 C# 클래스로 파싱합니다.
            PhpResponse response = JsonUtility.FromJson<PhpResponse>(responseText);
            
            // 응답 상태에 따라 UI 업데이트
            if (response.status == "success")
            {
                if (statusText != null) statusText.text = "점수 전송 성공! " + response.message;
            }
            else
            {
                if (statusText != null) statusText.text = "점수 전송 실패: " + response.message;
            }
        }
    }
}

3. 코드 해설 및 활용

  • WWWForm: PHP 서버는 일반적으로 POST 요청의 폼(form) 데이터를 받도록 설계되어 있습니다. WWWForm은 C# 객체를 JSON으로 변환하는 대신, 웹 폼 데이터와 같은 구조로 데이터를 패키징하여 서버로 전송합니다.
  • UnityWebRequest.Post: WWWForm과 함께 사용하면 복잡한 헤더 설정 없이도 간편하게 POST 요청을 보낼 수 있습니다.
  • 코루틴: SubmitScoreCoroutine()yield return을 활용하는 비동기 함수입니다. 서버 요청과 응답을 기다리는 동안 게임이 멈추지 않고 계속 실행될 수 있게 해줍니다.
  • JsonUtility: 이번에는 서버에서 받은 JSON 응답을 C# 클래스(PhpResponse)로 변환하여 상태와 메시지를 정확히 파싱하는 데 사용되었습니다.
  • 보안: 이 코드는 개념 증명을 위한 예시이므로, 실제 서비스에서는 HTTPS를 반드시 적용하여 통신을 암호화해야 합니다. 또한, 서버 측에서 데이터 유효성 검증과 보안 처리를 강화해야 합니다.

이 코드는 유니티와 PHP 서버를 연동하는 가장 기본적인 구조를 제공합니다. 이 코드를 기반으로 회원가입, 로그인, 랭킹 시스템 등 다양한 온라인 기능을 구현해 보세요.

댓글 남기기