跳转至

注册用于接收事件的回调函数

本节解释了从远程游戏接收的事件类型、接收这些事件的过程,以及如何在SDK中注册回调函数以处理这些事件。

事件接收过程

通过在SDK中注册回调函数,主机PC游戏可以接收来自远程游戏的状态事件和聊天事件。

接收状态事件

状态事件在远程播放开始或结束时发生,允许主机 PC 游戏相应地实现不同的行为。例如,如果在远程播放期间无法使用某些功能,例如“支付”或“注销”,您可以在接收到远程播放开始事件时显示弹出窗口,通知用户这些功能不可用。

主机PC游戏中处理远程播放状态事件的示例包括:

  • 在远程游戏开始时隐藏鼠标光标,并在远程游戏结束时再次显示。
  • 在远程游戏开始时显示弹出窗口,通知用户现金商店不可用。

接收聊天事件

当用户在远程游戏会话中输入聊天消息时,主机PC游戏接收聊天字符串并将其发送到游戏内聊天窗口,从而启用远程游戏聊天功能。
通过接收聊天事件实现远程游戏聊天功能的过程如下:

1) 当用户在远程播放网页界面的文本框中输入字符串并按下回车键时,该字符串将发送到主机PC游戏,如下所示。 * 远程播放的最大输入长度为150个字符,阅读方向为LTR(从左到右)和RTL(从右到左)。

在主机PC游戏中,字符串通过预注册的回调函数接收。

在主机PC游戏中,相应的字符串会传递到游戏聊天窗口。

注册回调函数

要接收来自远程游戏的事件,您必须将远程游戏插件导入SDK并注册回调函数。

一旦回调函数注册完成,主机PC游戏就准备好在远程游戏期间接收事件。然后,游戏可以分析每个接收到的事件,并根据其环境进行应用。

以下是如何在SDK中注册回调函数的示例。使用HiveRemotePlayManager.RegisterCallback注册您的回调函数。

using System.Runtime.InteropServices;
using UnityEngine;
using AOT;

public class {YourCustomClass} : MonoBehaviour
{
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    private delegate void RemotePlayCallbackType(int type, IntPtr data);

    [DllImport("plugins/RemotePlayDll", CallingConvention = CallingConvention.Cdecl)]
    private static extern void RegisterCallback(RemotePlayCallbackType callback);

    private static RemotePlayCallbackType _callbackDelegate;

    [MonoPInvokeCallback(typeof(RemotePlayCallbackType))]
    private static void RegisterRemoteCallbackFunction(int type, IntPtr data)
    {
        string jsonData = Marshal.PtrToStringAnsi(data);
        Debug.Log("REMOTE Callback DATA : " + jsonData);
    }

    void Start()
    {
        _callbackDelegate = RegisterRemoteCallbackFunction;
        RegisterCallback(_callbackDelegate);
    }
}

{YourCustomClass}.h

#pragma once

#include "HAL/PlatformProcess.h"
#include "Misc/Paths.h"

class {YourCustomClass}
{
public:
    static void Initialize();

private:
    static void StaticCallback(int Type, const char* Data);
};

{YourCustomClass}.cpp

#include "{YourCustomClass}.h"

typedef void(*FP_RegisterCallback)(void(*)(int, const char*));

void {YourCustomClass}::Initialize()
{
    FString DllPath =
        FPaths::Combine(
            FPaths::GetPath(FPlatformProcess::ExecutablePath()),
            TEXT("Plugins/RemotePlayDll.dll"));

    void* DllHandle = FPlatformProcess::GetDllHandle(*DllPath);

    if (!DllHandle)
    {
        UE_LOG(LogTemp, Error, TEXT("RemotePlay DLL Load Failed"));
        return;
    }

    FP_RegisterCallback RegisterCallback =
        (FP_RegisterCallback)FPlatformProcess::GetDllExport(
            DllHandle,
            TEXT("RegisterCallback"));

    if (RegisterCallback)
    {
        RegisterCallback(&StaticCallback);
    }
}

void {YourCustomClass}::StaticCallback(int Type, const char* Data)
{
    UE_LOG(LogTemp, Log, TEXT("REMOTE Callback DATA : %s"), *FString(Data));
}

事件协议

本节描述了通过游戏中的回调函数接收的状态事件和聊天事件的协议。

JSON协议

值类型 描述 其他
version 版本 数字 Json 版本信息 参见示例
eventType 事件类型 字符串 事件类型 - 包括 "事件" 和 "消息" 值 参见示例
eventValue 事件值 对象 事件值对象 参见示例
eventValue - value 事件值 - 值 字符串 事件值 参见示例
eventValue - action 事件值 - 动作 字符串 事件动作 参见示例
etc 其他 对象 用于扩展目的 参见示例

状态事件数据示例

以下是状态事件数据的示例。

{
    "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 (아랍어)