註冊接收事件的回呼函數
本節說明從遠端遊玩接收的事件類型、接收這些事件的過程,以及如何在SDK中註冊回調函數來處理這些事件。
事件接收流程¶
透過在 SDK 中註冊回調函數,主機 PC 遊戲可以接收來自遠端遊玩的狀態事件和聊天事件。
接收狀態事件¶
狀態事件在遠端遊玩開始或結束時發生,允許主機電腦遊戲根據需要實現不同的行為。例如,如果在遠端遊玩期間無法使用某些功能,例如「付款」或「登出」,則可以在接收到遠端遊玩開始事件時顯示彈出窗口,通知用戶這些功能不可用。
主機 PC 遊戲中處理遠端遊玩狀態事件的範例包括:
- 在遠端遊玩開始時隱藏滑鼠游標,並在遠端遊玩結束時再次顯示。
- 在遠端遊玩開始時顯示彈出窗口以通知用戶現金商店不可用。
接收聊天事件¶
當用戶在遠端遊玩會話中輸入聊天消息時,主機電腦遊戲會接收聊天字符串並將其發送到遊戲內聊天窗口,啟用遠端遊玩聊天功能。
實現遠端遊玩聊天功能的過程如下:
1) 當用戶在遠端播放網頁介面的文本框中輸入字符串並按下 Enter 鍵時,該字符串將發送到主機 PC 遊戲,如下所示。
* 遠端播放的最大輸入長度為 150 個字符,閱讀方向為 LTR(從左到右)和 RTL(從右到左)。
在主機電腦遊戲中,字串是通過預先註冊的回調函數接收的。
3) 在主機電腦遊戲中,相應的字串會傳遞到遊戲聊天視窗。
註冊回調函數¶
要接收來自遠端遊玩的事件,您必須將遠端遊玩插件導入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 協議¶
| 鍵 | 值類型 | 描述 | 其他 | |
|---|---|---|---|---|
| 版本 | 版本 | 數字 | Json 版本信息 | 參考示例 |
| 事件類型 | 事件類型 | 字符串 | 事件類型 - 包括 "事件" 和 "消息" 值 | 參考示例 |
| 事件值 | 事件值 | 對象 | 事件值對象 | 參考示例 |
| 事件值 - 值 | 事件值 - 值 | 字符串 | 事件值 | 參考示例 |
| 事件值 - 操作 | 事件值 - 操作 | 字符串 | 事件操作 | 參考示例 |
| 其他 | 其他 | 對象 | 擴展用途 | 參考示例 |
狀態事件數據範例¶
以下是狀態事件數據的示例。
{
"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 (아랍어)