유니티 게임 점수, PHP 서버로 보내기: 완벽 가이드
게임에서 플레이어의 점수를 단순히 기록하고 끝내는 것은 아쉽습니다. 온라인 랭킹 시스템을 구축하거나, 플레이어의 성장 데이터를 서버에 안정적으로 보관하려면 유니티 클라이언트와 외부 서버 간의 통신이 반드시 필요합니다. 이 가이드는 유니티에서 플레이어의 점수를 생성하고, 이를 PHP 서버로 전송하여 응답을 받는 과정을 상세히 다룹니다. 이 코드는 모든 온라인 기능의 기초가 될 것입니다.
1. PHP 서버 스크립트 작성 (데이터 수신 및 응답)
먼저, 유니티 클라이언트의 요청을 받아 점수 데이터를 처리할 PHP 스크립트를 작성해야 합니다. 이 스크립트는 POST
방식으로 전송된 username
과 score
데이터를 받아서 처리하고, 그 결과를 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 서버를 연동하는 가장 기본적인 구조를 제공합니다. 이 코드를 기반으로 회원가입, 로그인, 랭킹 시스템 등 다양한 온라인 기능을 구현해 보세요.