유니티 로그인 페이지: PHP 서버와 연동하기

유니티 게임에 로그인 기능을 구현할 때, Firebase 같은 서비스를 이용할 수도 있지만 직접 PHP 서버를 만들어 데이터를 처리하는 방법도 있습니다. 이 방식은 백엔드 로직을 직접 제어할 수 있다는 장점이 있습니다.

아래에서는 유니티에서 입력받은 아이디와 비밀번호를 PHP 서버로 보내고, 서버의 응답에 따라 로그인 성공/실패를 처리하는 방법을 단계별로 설명합니다.


1. PHP 서버 스크립트 작성

먼저, 유니티 클라이언트의 요청을 받아 로그인 유효성을 검증하고 응답을 보낼 PHP 스크립트를 작성해야 합니다. 이 스크립트는 서버에 업로드되어야 합니다.

login.php 파일

PHP

<?php
header('Content-Type: application/json');

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

    // 실제로는 데이터베이스에서 사용자 정보를 조회하는 로직이 들어갑니다.
    // 여기서는 간단한 테스트를 위해 하드코딩된 정보를 사용합니다.
    $valid_username = 'testuser';
    $valid_password = 'password123';

    // 아이디와 비밀번호 일치 여부 확인
    if ($username === $valid_username && $password === $valid_password) {
        $response = [
            'status' => 'success',
            'message' => '로그인 성공!'
        ];
    } else {
        $response = [
            'status' => 'fail',
            'message' => '아이디 또는 비밀번호가 올바르지 않습니다.'
        ];
    }
} else {
    $response = [
        'status' => 'fail',
        'message' => '잘못된 요청입니다.'
    ];
}

echo json_encode($response);
?>

이 스크립트는 usernamepassword를 받아 하드코딩된 값과 비교합니다. 결과에 따라 statusmessage를 담은 JSON 형식의 응답을 반환합니다.


2. 유니티 클라이언트 스크립트 작성

이제 유니티에서 PHP 서버로 데이터를 보내고 응답을 받는 C# 스크립트를 작성할 차례입니다.

C#

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

public class LoginManager : MonoBehaviour
{
    public TMP_InputField usernameInput;
    public TMP_InputField passwordInput;
    public Button loginButton;
    public TextMeshProUGUI statusText;

    // PHP 서버 URL. 반드시 실제 서버 주소로 변경해야 합니다.
    public string serverUrl = "http://your-server.com/login.php";

    void Start()
    {
        // 로그인 버튼에 클릭 이벤트 리스너 추가
        loginButton.onClick.AddListener(OnLoginButtonClicked);
    }

    void OnLoginButtonClicked()
    {
        string username = usernameInput.text;
        string password = passwordInput.text;
        
        statusText.text = "로그인 요청 중...";
        
        // 코루틴으로 로그인 요청 시작
        StartCoroutine(ProcessLogin(username, password));
    }

    IEnumerator ProcessLogin(string username, string password)
    {
        // 서버에 보낼 데이터를 담을 WWWForm 생성
        WWWForm form = new WWWForm();
        form.AddField("username", username);
        form.AddField("password", password);
        
        // UnityWebRequest를 이용해 POST 요청 생성
        UnityWebRequest request = UnityWebRequest.Post(serverUrl, form);

        // 요청 전송
        yield return request.SendWebRequest();

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

            // JSON 응답 파싱
            LoginResponse response = JsonUtility.FromJson<LoginResponse>(responseText);

            if (response.status == "success")
            {
                statusText.text = "로그인 성공!";
                // 다음 씬으로 이동하거나 게임 로직 실행
                // SceneManager.LoadScene("MainGameScene");
            }
            else
            {
                statusText.text = response.message;
            }
        }
    }
    
    // 서버 응답 JSON을 파싱하기 위한 클래스
    [System.Serializable]
    public class LoginResponse
    {
        public string status;
        public string message;
    }
}

이 스크립트는 **WWWForm**을 이용해 아이디와 비밀번호 데이터를 POST 방식으로 서버에 전송합니다. 서버로부터 JSON 응답을 받으면 JsonUtility를 사용해 C# 클래스로 변환한 뒤, status 값에 따라 로그인 성공/실패 여부를 판단합니다.


3. 유니티에서 스크립트와 UI 연결

  1. 오브젝트 생성 및 스크립트 부착: 씬에 빈 오브젝트를 만들고 LoginManager.cs 스크립트를 부착합니다.
  2. UI 요소 연결: LoginManager 오브젝트의 Inspector 창에서 Username Input, Password Input, Login Button, Status Text 필드에 해당 UI 오브젝트들을 드래그하여 연결합니다.
  3. 서버 URL 설정: Inspector 창의 Server Url 필드에 PHP 파일이 위치한 실제 서버 주소를 정확하게 입력합니다.

이 방법을 통해 PHP 서버와 통신하는 기본적인 로그인 시스템을 구축할 수 있습니다. 중요한 보안 이슈로, 실제 서비스에서는 HTTPS를 사용하여 모든 통신을 암호화해야 합니다.

댓글 남기기