콘텐츠로 이동

이벤트 수신을 위한 콜백 함수 등록

리모트 플레이로부터 수신하는 이벤트의 종류 및 수신 과정을 설명하고, 이벤트 수신을 위해 SDK에 콜백 함수를 등록하는 방법을 알아봅니다.

이벤트 수신 과정

SDK에 콜백 함수를 등록하면 호스트 PC 게임에서는 리모트 플레이로부터 상태 이벤트와 채팅 이벤트를 수신할 수 있습니다.

상태 이벤트 수신

리모트 플레이가 시작되거나 종료될 때 발생하는 상태 이벤트를 호스트 PC 게임에서 수신하여 다르게 동작하도록 구현할 수 있습니다. 특히 '결제'나 '로그아웃'과 같은 리모트 플레이 실행 중에 사용이 불가능한 기능의 경우, 리모트 플레이 시작 이벤트를 수신하면 유저에게 사용이 불가능한 기능을 공지하는 팝업을 띄우도록 처리할 수 있습니다.

호스트 PC 게임에서 리모트 플레이의 상태 이벤트를 수신하여 동작 처리를 구현하는 예시는 아래와 같습니다.

  • 리모트 플레이가 시작되면 호스트 PC 게임의 마우스 커서를 숨기고 리모트 플레이가 종료되면 다시 마우스 커서를 보이게 처리할 수 있습니다.
  • 리모트 플레이가 시작되면 캐시 상점 사용 불가 팝업을 띄울 수 있습니다.

채팅 이벤트 수신

유저가 리모트 플레이 실행 중 입력한 채팅 문자열을 호스트 PC 게임에서 수신하여 게임 채팅 창에 전송함으로써, 리모트 플레이 채팅 기능을 구현할 수 있습니다.
채팅 이벤트를 수신하여 리모트 플레이 채팅 기능을 구현하는 과정은 아래와 같습니다.

1) 아래와 같이 유저가 리모트 플레이 전용 웹 내 텍스트 박스에 문자열을 입력하고 엔터 키를 누르면 문자열이 호스트 PC 게임으로 전송됩니다. * 리모트 플레이에서 최대 입력 가능한 문자 길이는 150자이며, 읽는 방향은 LTR(Left to Right) 및 RTL(Right to Left), 두 가지입니다.

2) 호스트 PC 게임에서는 미리 등록한 콜백 함수를 통해 채팅 문자열을 수신합니다.

3) 호스트 PC 게임에서 해당 문자열을 게임 채팅창에 전달합니다.

콜백 함수 등록하기

리모트 플레이로부터 이벤트를 수신하려면, SDK에 리모트 플레이 플러그인 임포트 후 콜백 함수를 등록해야 합니다.

콜백 함수를 등록하면 리모트 플레이 실행 중 이벤트를 수신할 준비가 완료된 것으로, 호스트 PC 게임에서는 수신한 각 이벤트를 분석해서 각 게임 환경에 맞추어 적용할 수 있습니다.

SDK에 콜백 함수를 등록하는 예제 코드는 아래와 같습니다. HiveRemotePlayManager.RegisterCallback에 콜백 함수를 등록합니다.

using AOT; // MonoPInvokeCallback 때문에 필요

public class {YourCustomClass} : MonoBehaviour { // YourCustomClass: 유저 Game에서 사용하는 클래스
#if !UNITY_EDITOR && UNITY_STANDALONE_WIN
    [MonoPInvokeCallback (typeof(HiveRemotePlayManager.RemotePlayCallbackType))]
    public static void RegisterRemoteCallbackFunction(int type, string remotePlayJsonData)
    {
        Debug.Log("REMOTE Callback DATA :" + remotePlayJsonData); // RemoteSDK 에서 보내주는 json data 수신.
    }
#endif

    void Start() {
#if !UNITY_EDITOR && UNITY_STANDALONE_WIN
        HiveRemotePlayManager.RegisterCallback(RegisterRemoteCallbackFunction);
#endif
    }
}

[Your_Project_Root]/Source/[Your_Project_Name]/[Your_Project_Name].build.cs에 내용을 추가하세요. [Your_Project_Name]은 실제 여러분의 프로젝트 이름으로 대체하세요.

public class <Your_Project_Name> : ModuleRules
{
    public <Your_Project_Name>(ReadOnlyTargetRules Target) : base(Target)
    {
        ...
        PublicDependencyModuleNames.AddRange(new string[] { "HiveRemotePlay" });
        ...
    }
}

프로젝트 구현 시 사용하는 코드 예제는 다음과 같습니다.

#include "RemotePluginInterface.h"  //  required on Project's build.cs : PublicDependencyModuleNames.AddRange(new string[] { "HiveRemotePlay" });

// Example API 1. Temporal API Name
void SendRemotePlayKeyCallback(int _type, const char* _pData) {
    UE_LOG(LogTemp, VeryVerbose, TEXT("==================SendRemotePlayKeyCallback================\n"));
    char typeBuffer[35];
    char* typeStr;
    typeStr = _itoa(_type, typeBuffer, 10);
    UE_LOG(LogTemp, VeryVerbose, TEXT("type : %s \n"), *FString(typeStr));
    UE_LOG(LogTemp, VeryVerbose, TEXT("type : %s \n"), *FString(_pData));   //  example : {"version":"1.0.250300","eventType":"Message","eventValue":{"value":"MTFIZWxsbyBrZXkgaW5wdXQgMQ==","action":"LTR"},"etc":{}} 
}

// Example API 2. Call this API After signgin, EX) inner signin Callback
void RegisterHiveRemoteCallback {
    RegisterCallback(SendRemotePlayKeyCallback);
}

이벤트 프로토콜

게임에서 콜백 함수를 통해 수신한 상태 이벤트와 채팅 이벤트의 프로토콜을 설명합니다.

JSON 프로토콜

이벤트 데이터는 아래와 같은 JSON 형식의 Key - Value 로 구성됩니다.

Key Value Type Description ETC
version version number Json 버전 정보 예제 참고
eventType eventType string 이벤트 타입 - Event와 Message 항목이 존재 예제 참고
eventValue eventValue object 이벤트 값 오브젝트 예제 참고
eventValue - value eventValue - value string 이벤트 값 예제 참고
eventValue - action eventValue - action string 이벤트 동작 예제 참고
etc etc object 확장 용도 예제 참고

상태 이벤트 데이터 예시

상태 이벤트 데이터 예시는 아래와 같습니다.

{
    "version"        : "1.0.2411.0",
    "eventType"       : "Event" ,
    "eventValue"     : {
                            "value"  : "REMOTE_PLAY_CONNECTED"
                       },
    "etc"            : { }
}
// value    : REMOTE_PLAY_CONNECTED, REMOTE_PLAY_DISCONNECTED

채팅 이벤트 데이터 예시

수신한 채팅 문자열은 UTF-8로 인코딩하여 Base64로 변환된 값입니다. 또한, 읽는 방향 정보를 포함하고 있어 다국어 지원이 가능합니다.

채팅 이벤트 데이터 예시는 아래와 같습니다.

{
    "version"        : "1.0.2411.0",
    "eventType"       : "Message" ,
    "eventValue"     : {
                            "value"  : "Something Message",
                            "action" : "LTR | RTL"
                       },
    "etc"            : { }
}
// value    : Base64  (UTF-8 문장) 인코딩
// action   : LTR (아랍어를 제외한 문자) | RTL (아랍어)