适用于 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 项目中:

  1. 下载 6labs Unreal SDK 最新版本 v2.3.5。
  2. 将插件解压到您项目的 Plugins 目录中 (YourProject/Plugins/SixLabsSDK/).
  3. 确认插件已启用:
    • 在 Unreal Editor 中,前往 Edit > Plugins .
    • 搜索“6labs SDK”,并确认其已启用。
  4. 添加模块依赖:
    • 在您游戏模块的 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()要求:SDK_STATE_IDLE
void StartSession(
    const FString& InGameId,
    const FString& DeveloperPayload,
    const FSixLabsLifecycleComplete& OnComplete);

参数说明

参数 类型 必填 说明
InGameId FString 否 可选但推荐的用户标识符。如果省略,会话可能会被丢弃,且不会用于 AI 分析。
DeveloperPayload FString 否 与会话关联的可选开发者自定义元数据。该值会随会话请求原样转发,可用于附加自定义追踪信息或上下文信息。提供更丰富的 DeveloperPayload 可以显著提升 AI 驱动的分析能力和会话理解效果。如需详细用例和 JSON 示例,请参阅开发者载荷示例页面。
示例:
  • 用户获取渠道
  • 活动 Campaign ID
  • 用户分群(例如:新用户 / 回访用户 / 付费用户)
  • A/B 测试变体(例如:variant_a、variant_b)— 将用户划分为不同的队列,并在 6labs 控制台中对比各队列的游戏数据。
  • 内部追踪标识
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()要求:SDK_STATE_CAPTURING
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()要求:SDK_STATE_PAUSED
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()要求:SDK_STATE_CAPTURING / SDK_STATE_PAUSED
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 版本过旧以及网络问题。
Text copied to clipboard
有疑问?请通过以下方式联系我们: dev-support@6labs.ai