客户端账号接入
从本文开始,跟着指引一步步接入 PlayerNetwork SDK吧!
若需人工服务,可以到企业微信咨询 Player Network助手 。
游戏注册&配置
注册和配置游戏,需要登录Player Network Console,详情可参考Player Network Console使用文档。
客户端接入
步骤一:在游戏工程中,导入PlayerNetwork SDK
- Unreal Engine
1、Player Network SDK 接入
引擎版本支持情况
| SDK 版本号 | 支持的 UE 版本 |
|---|---|
| SDK 1.26 及以后的版本 | UE4.21 ~ UE4.27 & UE5 ~ UE5.5 |
| SDK 1.26 之前版本 | UE4.21 ~ UE4.27 & UE5 ~ UE5.4 |
2、 拷贝文件到工程中
将 LevelInfinite 和 INTLSDK 目录拷贝至游戏工程的 Plugins 目录中。如果项目没有 Plugins 目录,可以手动创建一个。

| 文件夹 | 说明 |
|---|---|
| LevelInfinite | Player Network 引擎层代码&相关依赖库 |
| INTLSDK | Player Network SDK 引擎层代码&相关依赖库 |
| Symbols | PlayerNetwork SDK的符号表文件,用于还原堆栈 |
LevelInfiniteAssetVersion.lua 的文件拓展名为 LUA 而并非 LUAC,是因为里面包含了 LI PASS 的版本号,方便业务同学了解我们的 LI PASS 版本,便于定位问题。
Symbols目录下的文件,需妥善保存,游戏上线后,排查线上问题,有可能需要用到符号表。
3、在游戏工程中添加PlayerNetwork SDK依赖
打开游戏项目的构建文件,即 {项目名}.Build.cs 文件,并按照示例将 LevelInfinite 插件添加为模块的私有依赖:
public INTLSample(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay" });
// Add the following code
PrivateDependencyModuleNames.AddRange(new string[] {
"INTLCore",
"INTLFoundation",
"INTLConfig",
"LevelInfinite"
});
}
4、 将 PNT Lua 资源打进首包
将 PNT Lua 资源打进首包,在 Packaging/Additional Non-Asset 选项中添加:
../Plugins/LevelInfinite/Content

业务需要根据实际存放 LevelInfinite 文件夹的路径进行填写,例如实际存放路径是 ../Plugins/Template/LevelInfinite,则在此需要添加的是 ../Plugins/Template/LevelInfinite/Content。
5、 将 PNT uasset 资源打进首包
将 PNT uasset 资源打进首包,在 Packaging/Additional Asset 选项中添加:
/LevelInfinite

步骤二:配置 INTLConfig.ini 文件
- INTLConfig.ini 文件包含 PNT 服务的配置项,是游戏使用PNT服务必需的配置文件。
- 在下载 SDK 的时候,INTLConfig.ini 会生成默认的配置,游戏可使用这些配置体验 PNT 相关功能。
- 若有修改INTLConfig.ini配置项的需求,可选择使用游戏引擎的可视化配置编辑工具来修改,或直接修改 INTLConfig.ini 文件。
特别的,需要配置可见的品牌名称:
BRAND_NAME: xxxxxx
- Unreal Engine
通过编辑器工具栏 LITools > Config Editor 打开可视化配置编辑工具。

有关各配置项的详情,可在编辑器选中选项来自动展示选项的简述,或参见 SDK 的所有配置 查看完整的配置项列表。
[可选] 第三方渠道登录时获取玩家邮箱
此项设置属于 Player Network 控制台的 第三方渠道配置,Web 端运营角色将无权限访问,请联系业务完成配置。
要使用 Web 绑定模块的快速绑定功能,需先设置在第三方渠道登录时获取玩家邮箱的权限。
- 基于合规考虑,可针对特定来源对返回的
email做 mask 处理,如有需求请联系 Player Network 助手打开。 - 可在后台流水日志中上报 hash 后的
base64(sha256(email)),如有需求请联系 Player Network 助手打开。 - 可用于验证玩家信息或绑定列表是否包含
email信息,如有需求请联系 Player Network 助手打开。 - 可用于 iOS Firebase 的 Private Set Membership(PSM)功能,详见 Firebase iOS 工程配置。
以下为支持返回玩家邮箱的第三方渠道:
Apple
Apple 获取玩家邮箱需要玩家授权,如果玩家拒绝授权将无法获取到玩家邮箱,详见 Login 接口传入 email 和 fullName。
-
使用编辑工具,将
email权限添加到 [Dynamic] 下的APPLE_LOGIN_PERMISSION。 -
在 Player Network 控制台 开启 email 返回功能,将 return_email 设置为 YES,详细步骤请参见 第三方渠道配置。
在 Player Network 控制台 开启 email 返回功能,将 return_email 设置为 YES,详细步骤请参见 第三方渠道配置。
-
使用编辑工具,将
email权限添加到 [Dynamic] 下的FACEBOOK_LOGIN_PERMISSION。如果INTLConfig.ini没有配置FACEBOOK_LOGIN_PERMISSION,则会自动带上email权限。 -
在 Meta for Developers 配置 email 权限。email 权限需要有 高级访问级别,才能让所有应用都能获取到玩家的 email。

-
在 Player Network 控制台开启 email 返回功能,将 return_email 设置为 YES,详细步骤请参见 第三方渠道配置。
-
在 Twitter Developer Platform 的 User authentication settings 下,勾选 Request email from users。
-
在 Player Network 控制台 开启 email 返回功能,将 return_email 设置为 YES,详细步骤请参见 第三方渠道配置。
步骤三:初始化 PNT
- Unreal Engine
游戏启动的时候,应调用PNTSDK提供的初始化接口 INTLAPI.InitSDK 和 LevelInfinite.InitLIP 。
- 初始化过程会检查当前资源版本是否有可用的热更资源;
- 若有资源更新,将会自动下载新版资源,然后加载新版资源;
- 资源加载完成后,会触发 PNT 事件回调(
LIEventObserver)中的GN_READY事件,此时 PNT 初始化完成。
#include "INTLSDKAPI.h" // Include the INTL header file
UINTLSDKAPI::Init();
FString Version = FApp::GetBuildVersion();
ULevelInfiniteAPI::InitLIP(GetGameInstance<UGameInstance>(), Version, TEXT("en"));
步骤四:设置 PNT 界面和邮件的语言
- 设置 PNT 界面使用的语言, 调用
SetLanguage接口。 - 建议此处设置的语言与游戏语言保持一致;
- 设置好的语言类型也会作用于电子邮件中,比如
验证码邮件等。
注意在切换游戏语言的时候,需要再次设置 SetLanguage 接口
- Unreal Engine
接口详情:SetLanguage。
ULevelInfiniteAPI::SetLanguage(TEXT("en"));
步骤五:设置UI根节点
在使用其他 PNT 功能之前,需调用 SetUIRoot 设置所有 PNT 界面的根节点,保证 UI 显示正确。
设置 UI 根节点后,请不要销毁该节点,否则 PNT UI 界面无法挂载,会产生预期外的行为。
PNT 界面的释放请通过界面按钮操作,不要强制销毁。在切换场景时若由 Unity 控制 GC(垃圾回收)可能会造成空指针错误出现。
- Unreal Engine
- 主机端的后续接入步骤,请参考 Console 账号方案步骤六。
- PC Standalone 登录方案的后续接入步骤,请参考 PC Standalone 账号方案步骤六。
- PC Store 登录方案的后续接入步骤,请参考 PC Store 账号方案步骤六。
- 移动端的后续接入步骤,请参考 移动端账号方案步骤六。
可能遇到的问题
- Unreal Engine
1. Cook 时的路径报错:LongPackageNameToFilename failed to convert ...
在 Cook 的时候如果报错 LongPackageNameToFilename failed to convert '/LevelInfinite'. Path does not map to any roots,需要修改 Cook 的路径 /LevelInfinite -> /LevelInfinite/,一般常出现在低于 UE4.27 版本。
如果接入过程中遇到问题,请参见 常见问题
步骤六:添加回调处理
- Unreal Engine
-
需添加 AuthResultObserver 和 LIEventObserver 回调来处理登录组件事件;
-
回调数据结构为 INTLAuthResult,其中包含登录信息和账号信息,例如 OpenID、账号绑定信息和账号注销状态。
// Add callbacks
AuthResultObserver = UINTLSDKAPI::GetAuthResultObserver().AddUObject(this, &ULevelInfiniteWindow::OnAuthResult_Callback);
// Handle AuthResultObserver callback result
void ULevelInfiniteWindow::OnAuthResult_Callback(FINTLAuthResult AuthResult)
{
if(AuthResult.MethodId == (int32)LIEnterGameMethodId::kLILoginEnterGame)
{
}
else if (AuthResult.MethodId == (int32)LIEnterGameMethodId::kLIAutoLoginEnterGame)
{
}
}
// Add callbacks
FDelegateHandle LIEventObserver;
LIEventObserver = ULevelInfiniteAPI::GetEventDelegate().AddUObject(this, &ULevelInfiniteWindow::OnLIEvent_Callback);
// Handle LIEventObserver callback result
void ULevelInfiniteWindow::OnLIEvent_Callback(FLIBaseEvent Event)
{
FString logStr;
switch(Event.EventType){
case ELIEventType::GN_READY:
{
break;
}
}
}
步骤七:完成 PNT 登录流程
- Unreal Engine
- 调用
LoginChannelWithLIPass接口并指定登录渠道,进行三方授权登录;
ULevelInfiniteAPI::LoginChannelWithLIPass(EINTLLoginChannel::kChannelSteam);
- 第三方渠道授权后,如果当前账号尚未关联 PNT 账号,且玩家是第一次进入游戏,将显示关联 PNT 账号的用户界面;
- 登录完成后,若当前玩家的合规流程没有走完,会自动进入LI PASS的合规流程。
步骤八:配置第三方渠道信息
以 steam 为例
- Steam渠道的游戏申请教程
- 配置Player Network Console的Steam渠道参数
- steam_appid.txt 的配置,参考 Steam登录和配置
更多Steam 渠道接入信息,可浏览 Steam 渠道接入。
更多Epic 渠道接入信息,可浏览Epic 渠道接入。
步骤九:其他的配置
配置跳过关联
- 若游戏不希望首次登录的时候强制关联 PNT 账号,可以在Player Network Console上可以配置可跳过关联 PNT 账号;
- 若开启跳过关联 PNT 账号配置,PNT的登录面板会出现
Skip按钮,玩家点击该按钮可以跳过关联。
商店渠道号配置
计划在Steam或Epic商店上架的游戏,需要在INTLConfig.ini中添加商店渠道号:
- Steam
- Epic
[INTL Tools]
WINDOWS_STORE_CHANNEL = 101
[INTL Tools]
WINDOWS_STORE_CHANNEL = 102