오늘은 새로이 게임엔진을 통한 클라이언트에 대해 Nodejs SocketIO 기반 서버를 연동하는 프로젝트를 하는 것이 주된 일이었다.
언리얼 엔진으로 socketioclientforunreal 플러그인과 함께 ping test까지는 구현을 성공했다. 다만, 위치 동기화나 여러 가지에 대해서 언리얼 숙련도가 높은 편이 아니다보니, 생산성을 위해서 이번 프로젝트는 언리얼 엔진으로 완성하기엔 시간이 부족하다고 느껴 보류하게 되었다.
/* 중략 */
//=======================================================================
// :: 소켓 초기화
// FSocketIONative 객체 생성 및 서버 연결
Socket = ISocketIOClientModule::Get().NewValidNativePointer();
Socket->Connect("http://localhost:3010");
// "pong" 이벤트 수신 처리
Socket->OnEvent(TEXT("pong"), [this](const FString& Event, const TSharedPtr<FJsonValue>& Message)
{
if (Message.IsValid())
{
MYLOG(Warning, TEXT("[Pong] Received pong: %s"), *USIOJConvert::ToJsonString(Message));
}
});
// 이벤트 송신
// "ping" 이벤트 송신
TSharedPtr<FJsonObject> PingData = MakeShareable(new FJsonObject());
PingData->SetStringField(TEXT("message"), TEXT("ping test"));
Socket->Emit(TEXT("ping"), MakeShareable(new FJsonValueObject(PingData)));
MYLOG(Warning, TEXT("Ping sent to server"));
//=======================================================================
}
그래서 보다 나에겐 좀 더 편안하게 다룰 수 있는 환경은 유니티 엔진으로 개발 환경을 바꾸게 되었다.
확실히 다른 엔진, 다른 환경에서 다른 API를 호출해야 되다 보니 공식 문서 내지는 해당 라이브러리 깃허브를 읽느라 시간이 소모되는 부분이 컸다.
using System.Threading.Tasks;
using UnityEngine;
using SocketIOClient;
using static UnityEditor.Experimental.GraphView.GraphView;
using System.Collections.Generic;
using System;
using Newtonsoft.Json.Linq;
public class SocketManager : MonoBehaviour
{
public static SocketManager Instance { get; private set; }
private SocketIOClient.SocketIO socket;
private const string serverURL = "http://localhost:3010";
public GameObject playerPrefab;
/* 중략 */
void Start()
{
// SocketIO 인스턴스를 생성하고 서버와 연결
socket = new SocketIOClient.SocketIO(serverURL);
// 연결이 성공하면 호출되는 이벤트 핸들러
socket.OnConnected += async (sender, e) =>
{
Debug.Log("[SocketIOClient] Connected to Server");
await PingTest();
};
// 'pong' 이벤트 리스닝
socket.On("pong", response =>
{
Debug.Log("[Pong] pong received");
});
// 연결 시작
socket.ConnectAsync();
}
// 핑 테스트를 위한 함수
async private Task PingTest()
{
// 서버에 'ping' 이벤트를 보냄
await socket.EmitAsync("ping", "ping data");
Debug.Log("[Ping] Ping test");
}
void OnApplicationQuit()
{
// 애플리케이션 종료 시 서버 연결 종료
socket.DisconnectAsync();
}
/* 중략 */
}