适用于 Unreal 的 6labs SDK
本指南介绍如何将 6labs SDK 集成到您的 Unreal Engine 游戏中:安装插件、开始与控制游戏观察,以及发送游戏事件。
支持的平台
6labs Unreal SDK 目前支持以下平台:
- Windows 11(DirectX 12)
前提条件
在集成 6labs SDK 之前,请确保您的开发环境和项目满足以下要求:
- Unreal Engine 5.7 — 任意 5.7.x 版本。
- 如果您的项目使用其他引擎版本(例如 5.6.x 或 5.8.x),请联系 6labs 支持团队。
1. 下载并导入模块
6labs SDK 以 Unreal Engine 插件的形式提供。
将该模块添加到您的 Unreal 项目中:
- 下载 6labs Unreal SDK 最新版本
v2.3.5。 - 将插件解压到您项目的 Plugins 目录中
(
YourProject/Plugins/SixLabsSDK/). - 确认插件已启用:
- 在 Unreal Editor 中,前往 Edit > Plugins .
- 搜索“6labs SDK”,并确认其已启用。
- 添加模块依赖:
- 在您游戏模块的
Build.cs中添加:PublicDependencyModuleNames.Add("SixLabsSDK");
- 在您游戏模块的
2. 开始观察游戏
使用 StartSession() 方法开始观察游戏,如下所示:
// MyGameInstance.h
UFUNCTION()
void OnStartSessionComplete(ESixLabsSdkResponse Response, const FString& ErrorMessage);
// MyGameInstance.cpp
#include "SixLabsSubsystem.h"
if (USixLabsSubsystem* SixLabs = GetSubsystem<USixLabsSubsystem>())
{
FSixLabsLifecycleComplete OnComplete;
OnComplete.BindDynamic(this, &UMyGameInstance::OnStartSessionComplete);
SixLabs->StartSession(TEXT("<player_in_game_id>"), TEXT("<developer_payload>"), OnComplete);
}
void UMyGameInstance::OnStartSessionComplete(ESixLabsSdkResponse Response, const FString& ErrorMessage)
{
// Response == ESixLabsSdkResponse::SIXLABS_SUCCESS 表示 StartSession() 已成功完成
// 处理返回结果
// SixLabs->GetSdkState() 可获取 SDK 当前的状态
}
重要说明
- 如果未传递
InGameId,观察到的会话可能会被丢弃,并且不会用于 AI 分析。缺少该字段时,无法将会话归属到玩家,而这是生成后续洞察所必需的。 - 在开始观察游戏之前,请确保已获得用户同意。SDK不会自动请求权限,相关的授权流程需要在您的游戏逻辑中自行实现。
- 作为推荐的最佳实践,您可以在游戏的EULA(最终用户许可协议)或隐私政策中说明游戏观察相关内容。
- 要进行正确测试,您需要创建特定平台的构建并在真实设备上运行。在 Play-In-Editor 会话中,
StartSession()会改为使用SIXLABS_ERROR_NOT_SUPPORTED调用OnComplete。 - 请注意,所有 SDK 方法也可从蓝图调用。
方法说明StartSession()
void StartSession(
const FString& InGameId,
const FString& DeveloperPayload,
const FSixLabsLifecycleComplete& OnComplete);
参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
InGameId |
FString |
否 | 可选但推荐的用户标识符。如果省略,会话可能会被丢弃,且不会用于 AI 分析。 |
DeveloperPayload
|
FString |
否 | 与会话关联的可选开发者自定义元数据。该值会随会话请求原样转发,可用于附加自定义追踪信息或上下文信息。提供更丰富的 DeveloperPayload 可以显著提升 AI 驱动的分析能力和会话理解效果。如需详细用例和 JSON 示例,请参阅开发者载荷示例页面。
示例:
|
OnComplete |
FSixLabsLifecycleComplete |
是 | 调用完成后触发(无论成功或失败)。详见回调类型。在蓝图中,连接回调引脚是可选的。 |
回调响应
该回调是异步的,会通过 Response 和 ErrorMessage 提供结果。
| 响应值 | 说明 |
|---|---|
SIXLABS_SUCCESS |
会话已成功启动。 |
SIXLABS_ERROR_STATE_NOT_IDLE |
SDK 未处于 SDK_STATE_IDLE 状态 — 可能已有会话在运行、会话已暂停,或前一个会话仍在停止中。请改用 ResumeSession() 方法继续该暂停的会话。 |
SIXLABS_ERROR_NOT_SUPPORTED |
在不支持观察游戏的平台上调用了 StartSession(),例如 Play-In-Editor 会话。 |
SIXLABS_ERROR_SESSION_FAILED |
请求已被接受,但观察会话未能启动,SDK 已返回 SDK_STATE_IDLE。这可能是由于会话创建失败、设备性能限制、SDK 版本过旧、网络问题或其他初始化故障导致的。 |
3. 设置游戏内 ID
使用 SetInGameId() 方法将玩家的游戏内 ID 与现有的观察会话关联。当 SDK 在用户账户创建之前完成初始化时,通常需要调用此方法,以便将已登录的用户与当前正在进行的会话关联起来。
if (USixLabsSubsystem* SixLabs = GetSubsystem<USixLabsSubsystem>())
{
SixLabs->SetInGameId(TEXT("<player_in_game_id>"));
}
注意
- 如果在
StartSession()时已传入InGameId,调用SetInGameId()将覆盖当前会话中已设置的值。
方法说明SetInGameId()
void SetInGameId(const FString& InGameId);
参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
InGameId |
FString |
是 | 要与当前会话关联的玩家游戏内标识符。 |
4. 发送游戏事件
使用 SendGameEvent() 方法在活动的游戏观察会话期间记录自定义游戏事件。事件会被关联到该会话,并可用于在分析时对应到特定的游戏时刻。
const bool bAccepted = SixLabs->SendGameEvent(TEXT("<event_name>"), TEXT("<event_data_as_json>"));
if (!bAccepted)
{
// 事件未发送,原因见下文
}
方法说明SendGameEvent()
bool SendGameEvent(
const FString& EventName,
const FString& EventDataJson);
参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
EventName |
FString |
是 | 要记录的自定义事件的名称。 |
EventDataJson |
FString |
是 | 包含该事件附加数据的 JSON 编码字符串。 |
返回值
| 值 | 说明 |
|---|---|
true |
事件已被接受并加入上传队列。 |
false |
事件被拒绝,例如 EventName 为空时。 |
5. 高级控制
StartSession() 会为新会话开始观察游戏。之后,您可以根据需要使用
PauseSession()、
ResumeSession() 和
StopSession() 方法来控制该会话。
5.1 暂停 (PauseSession)
调用 PauseSession() 方法暂停游戏观察。
const ESixLabsSdkResponse Response = SixLabs->PauseSession();
if (Response != ESixLabsSdkResponse::SIXLABS_SUCCESS)
{
// SDK 并未在观察游戏,请参阅下方的响应说明
}
重要说明
- 该方法用于暂停游戏观察。
- 之后可以再次调用
ResumeSession()恢复游戏观察。
方法说明PauseSession()
ESixLabsSdkResponse PauseSession();
返回值
| 值 | 说明 |
|---|---|
SIXLABS_SUCCESS |
该调用已被接受并执行。 |
SIXLABS_ERROR_STATE_NOT_CAPTURING |
当 SDK 未处于 SDK_STATE_CAPTURING 状态时返回 — 例如当前没有正在进行的游戏观察、会话已处于暂停状态,或已有一个停止操作正在进行。有关状态和响应代码的完整列表,请参阅会话生命周期。 |
5.2 恢复 (ResumeSession)
使用 ResumeSession() 方法继续此前通过 PauseSession() 暂停的会话。
// MyGameInstance.h
UFUNCTION()
void OnResumeSessionComplete(ESixLabsSdkResponse Response, const FString& ErrorMessage);
// MyGameInstance.cpp
#include "SixLabsSubsystem.h"
if (USixLabsSubsystem* SixLabs = GetSubsystem<USixLabsSubsystem>())
{
FSixLabsLifecycleComplete OnComplete;
OnComplete.BindDynamic(this, &UMyGameInstance::OnResumeSessionComplete);
SixLabs->ResumeSession(OnComplete);
}
void UMyGameInstance::OnResumeSessionComplete(ESixLabsSdkResponse Response, const FString& ErrorMessage)
{
// Response == ESixLabsSdkResponse::SIXLABS_SUCCESS 表示 ResumeSession() 已成功完成
// 处理返回结果
// SixLabs->GetSdkState() 可获取 SDK 当前的状态
}
方法说明ResumeSession()
void ResumeSession(const FSixLabsLifecycleComplete& OnComplete);
参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
OnComplete |
FSixLabsLifecycleComplete |
是 | 调用完成后触发(无论成功或失败)。详见回调类型。在蓝图中,连接回调引脚是可选的。 |
回调响应
该回调是异步的,会通过 Response 和 ErrorMessage 提供结果。
| 响应值 | 说明 |
|---|---|
SIXLABS_SUCCESS |
会话已成功恢复。 |
SIXLABS_ERROR_STATE_NOT_PAUSED |
SDK 未处于 SDK_STATE_PAUSED 状态,因此没有可继续的暂停会话。 |
SIXLABS_ERROR_SESSION_FAILED |
请求已被接受,但暂停的会话未能恢复,SDK 已返回 SDK_STATE_IDLE。这可能是由于会话或运行时故障、网络问题,或其他导致会话无法恢复的故障。 |
5.3 停止 (StopSession)
使用 StopSession() 方法永久结束当前会话。与 PauseSession() 不同,已停止的会话无法通过 ResumeSession() 继续 — 如需开始新的会话,必须重新调用 StartSession()。
// MyGameInstance.h
UFUNCTION()
void OnStopSessionComplete(ESixLabsSdkResponse Response, const FString& ErrorMessage);
// MyGameInstance.cpp
#include "SixLabsSubsystem.h"
if (USixLabsSubsystem* SixLabs = GetSubsystem<USixLabsSubsystem>())
{
FSixLabsLifecycleComplete OnComplete;
OnComplete.BindDynamic(this, &UMyGameInstance::OnStopSessionComplete);
SixLabs->StopSession(OnComplete);
}
void UMyGameInstance::OnStopSessionComplete(ESixLabsSdkResponse Response, const FString& ErrorMessage)
{
// Response == ESixLabsSdkResponse::SIXLABS_SUCCESS 表示 StopSession() 已成功完成
// 处理返回结果
// SixLabs->GetSdkState() 可获取 SDK 当前的状态
}
方法说明StopSession()
void StopSession(const FSixLabsLifecycleComplete& OnComplete);
参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
OnComplete |
FSixLabsLifecycleComplete |
是 | 调用完成后触发(无论成功或失败)。详见回调类型。在蓝图中,连接回调引脚是可选的。 |
回调响应
该回调是异步的,会通过 Response 和 ErrorMessage 提供结果。
| 响应值 | 说明 |
|---|---|
SIXLABS_SUCCESS |
调用已被接受,会话已结束。 |
SIXLABS_ERROR_STATE_NOT_CAPTURING |
SDK 未处于 SDK_STATE_CAPTURING 或 SDK_STATE_PAUSED 状态,因此没有正在进行或已暂停的会话可以停止。 |
6. 会话生命周期
SDK 会在以下状态之间转换。您可以调用哪些方法以及方法返回什么,取决于当前状态:
- 您可以随时通过
GetSdkState()查看 SDK 当前的状态,该方法返回ESixLabsSdkState。 StartSession()、PauseSession()、ResumeSession()和StopSession()只能在 SDK 处于有效状态时调用。在无效状态下调用会返回错误。PauseSession()会直接返回一个ESixLabsSdkResponse。StartSession()、ResumeSession()和StopSession()则通过OnComplete回调返回结果。OnComplete回调在游戏线程上异步调用。
6.1 回调类型
FSixLabsLifecycleComplete 是一个动态委托,会接收以下两个参数:
| 参数 | 类型 | 说明 |
|---|---|---|
Response |
ESixLabsSdkResponse |
本次调用的结果,取值见响应代码。 |
ErrorMessage |
const FString& |
成功时为空;失败时说明具体原因。 |
6.2 状态
| 状态 | 值 | 说明 |
|---|---|---|
SDK_STATE_IDLE |
100 |
SDK 未在观察游戏。这是默认状态,也是会话停止或启动失败后所返回的状态。 |
SDK_STATE_CAPTURING |
101 |
SDK 正在主动观察游戏。这包括活动会话本身,以及缓冲和上传数据等后台处理工作。 |
SDK_STATE_STOPPING |
102 |
会话正在停止。SDK 会先完成剩余的处理工作,再返回 SDK_STATE_IDLE。 |
SDK_STATE_PAUSED |
103 |
会话已暂停。游戏观察暂时停止,但会话仍保持打开,此前已观察到的数据可以继续上传。 |
6.3 响应代码
| 响应值 | 值 | 触发方法 | 处理方式 |
|---|---|---|---|
SIXLABS_SUCCESS |
0 | 全部 | 无需处理 — 调用已被接受并成功完成。对于 StopSession(),表示会话已结束。 |
SIXLABS_ERROR_STATE_NOT_IDLE |
1 | StartSession() |
已有会话在运行、已暂停,或仍在停止中。请检查 GetSdkState();如果会话处于暂停状态,请调用 ResumeSession()。 |
SIXLABS_ERROR_STATE_NOT_CAPTURING |
2 | PauseSession(), StopSession() |
SDK 当前没有在进行观察。如果该调用来自可能在没有会话时触发的生命周期回调,可以安全忽略。StopSession() 也可以结束已暂停的会话。 |
SIXLABS_ERROR_NOT_SUPPORTED |
3 | StartSession() |
当前环境不支持游戏观察 — 目前为Play-In-Editor 会话。请提前返回,不要重试。 |
SIXLABS_ERROR_STATE_NOT_PAUSED |
4 | ResumeSession() |
SDK 当前未处于暂停状态。当状态为 SDK_STATE_IDLE 时,请改为调用 StartSession()。 |
SIXLABS_ERROR_SESSION_FAILED |
5 | StartSession(), ResumeSession() |
请求已被接受,但会话未能启动,SDK 已回到 SDK_STATE_IDLE。该错误通过 OnComplete 返回,而不是立即拒绝。请记录 ErrorMessage,并在下一个合适的时机重试;常见原因包括低端设备、SDK 版本过旧以及网络问题。 |
