🐊 Unity 프로젝트 구성

  1. Unity Hub에서 새 프로젝트를 생성합니다. 이름은 예시로 WebTest로 설정합니다.
  2. WebManager.cs 스크립트를 생성하고, 빈 GameObject를 만들어 이름을 WebManager로 지정 후 스크립트를 붙입니다.

🧱 기본 구조 만들기

using System.Collections;
using UnityEngine;

public class WebManager : MonoBehaviour
{
    string _baseUrl = "http://localhost:44360"; // WebAPI 주소

    void Start()
    {
        // 이후 구현 예정
    }

    IEnumerator CoSendWebRequest(string url, string method, object obj)
    {
        yield return null;
    }
}
  • baseUrl: WebAPI 주소. 포트 번호는 WebAPI의 launchSettings.json에서 확인 가능.
  • CoSendWebRequest: REST 메서드, URL, 객체를 전달받아 통신하는 코루틴.

🎮 GameResult 클래스 생성

public class GameResult
{
    public string UserName;
    public int Score;
}
  • WebAPI와 동일한 구조로 맞춰야 정상적으로 Serialize/Deserialize 가능.

🧪 Start에서 테스트 데이터 전송

void Start()
{
    GameResult res = new GameResult()
    {
        UserName = "Shung",
        Score = 555
    };

    StartCoroutine(CoSendWebRequest("ranking", "POST", res));
}

🧬 JSON 직렬화 및 요청 구성

IEnumerator CoSendWebRequest(string url, string method, object obj)
{
    string sendUrl = $"{_baseUrl}/{url}";

    byte[] jsonBytes = null;
    if (obj != null)
    {
        string json = JsonUtility.ToJson(obj);
        jsonBytes = System.Text.Encoding.UTF8.GetBytes(json);
    }

    var uwr = new UnityWebRequest(sendUrl, method);
    uwr.uploadHandler = new UploadHandlerRaw(jsonBytes);
    uwr.downloadHandler = new DownloadHandlerBuffer();
    uwr.SetRequestHeader("Content-Type", "application/json");

    yield return uwr.SendWebRequest();
}

✅ 설명

  • JsonUtility.ToJson: Unity 전용 JSON 직렬화 메서드.
  • UploadHandlerRaw: POST 시 데이터 전송에 사용.
  • DownloadHandlerBuffer: 응답 수신 처리.
  • SetRequestHeader: JSON 포맷임을 서버에 명시.

🚨 예외 처리 및 콜백

IEnumerator CoSendWebRequest(string url, string method, object obj, Action<UnityWebRequest> callback)
{
    // 위 직렬화, 전송 로직 동일

    yield return uwr.SendWebRequest();

    if (uwr.isNetworkError || uwr.isHttpError)
    {
        Debug.Log(uwr.error);
    }
    else
    {
        Debug.Log(uwr.downloadHandler.text);
        callback?.Invoke(uwr);
    }
}
  • uwr.error: 네트워크 혹은 HTTP 오류 메시지 출력.
  • callback.Invoke: 성공 후 응답 활용 가능.

🎯 요청 함수 분리

public void SendPostRequest(string url, object obj, Action<UnityWebRequest> callback)
{
    StartCoroutine(CoSendWebRequest(url, "POST", obj, callback));
}

public void SendGetAllRequest(string url, Action<UnityWebRequest> callback)
{
    StartCoroutine(CoSendWebRequest(url, "GET", null, callback));
}
  • POST, GET 요청을 메서드로 추출하여 재사용성 향상.

✨ 최종 Start 예시

void Start()
{
    GameResult res = new GameResult()
    {
        UserName = "Shung",
        Score = 555
    };

    SendPostRequest("ranking", res, (uwr) =>
    {
        Debug.Log("POST 완료 후 처리");
    });

    SendGetAllRequest("ranking", (uwr) =>
    {
        Debug.Log("모든 게임 결과 가져옴");
    });
}

📌 테스트 방법

  1. Visual Studio에서 WebApi 서버를 먼저 실행합니다.
  2. Unity Editor에서 Play 버튼 클릭 시 POST 요청 → 게임 결과 전송.
  3. 이어서 GET 요청으로 전체 랭킹을 조회.
  4. Unity 콘솔에 JSON 형태의 응답 데이터가 출력됩니다.

❓ REST를 꼭 지켜야 하나?

  • REST는 비공식적인 "표준 방식"일 뿐, 꼭 엄격히 따를 필요는 없습니다.
  • Unity에서는 상황에 따라 POST만 활용하거나, GET/POST를 유동적으로 처리하는 것도 실용적인 선택입니다.

profile
李家네_공부방

0개의 댓글