跳到主要内容

游戏 Region Config Data

1. Overview

游戏region config data是一组与游戏region相关的数据。它通常用于存储适用于整个游戏region的config data,例如关卡经验坡道、伤害规则等。目前,开发者可以通过在门户上自定义一组键值对数据来构建游戏regionconfig data。游戏region config data可以通过 CLI 工具 或在门户上手动修改。但是,它对于游戏客户端/服务器是只读的。

完成本教程后,您将学习以下内容:

  • 如何在门户上自定义游戏region config data。

  • 如何在代码中查询游戏region config data。

游戏region config data 的用法与 游戏 config data 几乎相同,主要区别在于 游戏region config data 的范围仅限于游戏region,而 游戏config data 适用于整个游戏。

2. 自定义游戏region config data

登录到门户网站,进入控制台,打开 Title Region > Config Data:

image-20240318143116781

2.1 添加新的数据项

点击 Add 按钮添加新的数据项:

image-20211125172308655

字段说明:

  • Key:道具名称,由字母、数字、下划线、空格组成,必须以字母开头,长度不能超过128个字符。

  • Is Json:道具值是否需要遵守JSON约束,如果开发者希望在代码中以JsonValue的形式访问该道具值,建议设置为true,在编辑值时会进行JSON约束检查。

  • Server Only:道具是否只能由服务端访问。

    • True:游戏服务器可读,游戏客户端不可见。

    • False:游戏服务器和游戏客户端均可读。

  • Description:道具描述信息,仅用于道具管理,PgosSDK不可见。

  • Value:道具值,最大字符长度为1048576(1*1024*1024)。

    • 通过PgosSDK查询得到的字符串值为:
      • 如果Is Json为false:与Portal编辑框中的字符串相同。
      • 如果Is Json为true:删除Portal编辑框中的空白字符后的字符串。

Item 值将以 FKVDataValue 结构体的形式呈现,开发者可以使用 AsStrAsInt32AsInt64AsFloatAsDoubleAsJson 函数获取所需的数据格式。可创建的标题区域config data项数量上限为 1000 个。

2.2 编辑数据字段

如果开发者想要修改数据字段,点击操作栏中的编辑链接:

image-20211125171609232

弹出编辑面板:

image-20211119203107947

Is Json 设置为 true 时,Value 编辑框将检查 JSON 约束。

2.3 移除现有数据项

如果不再需要某些数据项,可以选中它们并点击移除按钮。已移除的条目无法通过PgosSDK查询。

image-20211119194856512

2.4 上传 JSON

标题区域config data可以通过本地的 JSON 文件导入,JSON 文件的内容是一个 JsonObject,与标题区域config data中的 key-value 一一对应,也就是说 JsonObject 中第一级的 key-value 将作为标题区域config data的 key-value,例如:

{
"AndroidPushSenderId": "594923569376",
"CharacterLevelRamp": {
"1": 0,
"2": 2725,
"3": 5440,
"4": 8155,
"5": 10875,
"6": 13595,
"7": 16310,
"8": 19035,
"9": 21750,
"10": 24465
},
"CommunityWebsite": "http://mygame.community.gl",
"MinimumInterstitialWait": "10.0",
"NPC Bios": [
{
"NPC ID": "Dave",
"Birthday": "6/15/74",
"Loyalty Reward": "5pc Discount"
},
{
"NPC ID": "Joan",
"Birthday": "9/24/83",
"Loyalty Reward": "Extra Slot"
}
],
"StandardStores": [
"Gem Store"
],
"StartingCharacterSlots": "3"
}

点击 Upload JSON 按钮:

image-20211119201448924

上传完成后,您可以看到导入的数据项如下:

image-20211125193703007

导入的 JSON 以补充+覆盖的方式合并到 Title Region Config Data 中,即:

  • 如果 key 不存在,则在末尾添加一个新项,并将 Server Only 设置为 true。
  • 如果 key 已经存在,则覆盖其值,并保留其 Server Only 权限、描述和位置。

如果导入的项目值满足 JSON 约束,则 Is Json 将自动设置为 true。

2.5 下载 JSON

开发者可以选择一些项目并将其导出到本地 JSON 文件(如果未选择任何项目,则将导出所有项目)。

image-20211119201926270

导出的 JSON 文件的格式与导入的格式相同:

  • 如果 Is Json 为 true:则值将作为 JsonValue 写入文件。

  • 如果 Is Json 为 false:则值将作为普通字符串值写入文件。

3. 查询游戏region数据

查询游戏region config data的指定key-value data,查询游戏regionconfig data的所有key-value data。

3.1 For 游戏客户端

API描述
GetTitleRegionConfigKVData查询游戏region config data的指定key-value data
GetAllTitleRegionConfigKVData查询游戏region config data的所有key-value data

GetTitleRegionConfigKVData Client API

接口原型:

/**
* Query the specified key-value data of the title region config data.
*
* @param QueryKeys Keys to query
*/
void GetTitleRegionConfigKVData(
const TArray<FString>& QueryKeys,
TFunction<void(const FPgosResult& Ret, const FTitleRegionConfigKVDataQueryResult* Data)> Callback) const;

示例代码:

#include "PgosSDKCpp.h"

void SomeUObjectClass::SomeFunction()
{
auto TitleRegionConfigData = IPgosSDKCpp::Get().GetClientTitleRegionConfigDataAPI();
if (TitleRegionConfigData)
{
TArray<FString> QueryKeys = {TEXT("level_exp_ramp"), TEXT("use_cdn")};
TitleRegionConfigData->GetTitleRegionConfigKVData(QueryKeys, [](const FPgosResult& Ret, const FTitleRegionConfigKVDataQueryResult* Data) {
if (Ret.err_code == (int32)Pgos::PgosErrCode::kSuccess)
{
UE_LOG(LogTemp, Log, TEXT("GetTitleRegionConfigKVData Success"));
}
else
{
UE_LOG(LogTemp, Log, TEXT("GetTitleRegionConfigKVData Failed: err_code=%d, err_msg=%s"), Ret.err_code, *Ret.msg);
}
});
}
}

GetAllTitleRegionConfigKVData Client API

接口原型:

/**
* Query all key-value data of the title region config data.
*/
void GetAllTitleRegionConfigKVData(TFunction<void(const FPgosResult& Ret, const FTitleRegionConfigKVDataQueryResult* Data)> Callback) const;

示例代码:

#include "PgosSDKCpp.h"

void SomeUObjectClass::SomeFunction()
{
auto TitleRegionConfigData = IPgosSDKCpp::Get().GetClientTitleRegionConfigDataAPI();
if (TitleRegionConfigData)
{

TitleRegionConfigData->GetAllTitleRegionConfigKVData([](const FPgosResult& Ret, const FTitleRegionConfigKVDataQueryResult* Data) {
if (Ret.err_code == (int32)Pgos::PgosErrCode::kSuccess)
{
UE_LOG(LogTemp, Log, TEXT("GetAllTitleRegionConfigKVData Success"));
}
else
{
UE_LOG(LogTemp, Log, TEXT("GetAllTitleRegionConfigKVData Failed: err_code=%d, err_msg=%s"), Ret.err_code, *Ret.msg);
}
});
}
}

3.2 For 游戏服务器

API描述
GetTitleRegionConfigKVData查询游戏region config data的指定key-value data
GetAllTitleRegionConfigKVData查询游戏region config data的所有key-value data

GetTitleRegionConfigKVData Server API

接口原型:

/**
* Query the specified key-value data of the title region config data.
*
* @param QueryKeys Keys to query
*/
void GetTitleRegionConfigKVData(
const TArray<FString>& QueryKeys,
TFunction<void(const FPgosResult& Ret, const FTitleRegionConfigKVDataQueryResult* Data)> Callback) const;

示例代码:

#include "PgosSDKCpp.h"

void SomeUObjectClass::SomeFunction()
{
auto TitleRegionConfigData = IPgosSDKCpp::Get().GetServerTitleRegionConfigDataAPI();
if (TitleRegionConfigData)
{
TArray<FString> QueryKeys = {TEXT("level_exp_ramp"), TEXT("use_cdn")};
TitleRegionConfigData->GetTitleRegionConfigKVData(QueryKeys, [](const FPgosResult& Ret, const FTitleRegionConfigKVDataQueryResult* Data) {
if (Ret.err_code == (int32)Pgos::PgosErrCode::kSuccess)
{
UE_LOG(LogTemp, Log, TEXT("GetTitleRegionConfigKVData Success"));
}
else
{
UE_LOG(LogTemp, Log, TEXT("GetTitleRegionConfigKVData Failed: err_code=%d, err_msg=%s"), Ret.err_code, *Ret.msg);
}
});
}
}

GetAllTitleRegionConfigKVData Server API

接口原型:

/**
* Query all key-value data of the title region config data.
*/
void GetAllTitleRegionConfigKVData(TFunction<void(const FPgosResult& Ret, const FTitleRegionConfigKVDataQueryResult* Data)> Callback) const;

示例代码:

#include "PgosSDKCpp.h"

void SomeUObjectClass::SomeFunction()
{
auto TitleRegionConfigData = IPgosSDKCpp::Get().GetServerTitleRegionConfigDataAPI();
if (TitleRegionConfigData)
{

TitleRegionConfigData->GetAllTitleRegionConfigKVData([](const FPgosResult& Ret, const FTitleRegionConfigKVDataQueryResult* Data) {
if (Ret.err_code == (int32)Pgos::PgosErrCode::kSuccess)
{
UE_LOG(LogTemp, Log, TEXT("GetAllTitleRegionConfigKVData Success"));
}
else
{
UE_LOG(LogTemp, Log, TEXT("GetAllTitleRegionConfigKVData Failed: err_code=%d, err_msg=%s"), Ret.err_code, *Ret.msg);
}
});
}
}

3.3 关键错误处理

错误码相关 APIHandling Suggestion
kBackendServerValidateFail (51)GetTitleRegionConfigKVData Client API
GetAllTitleRegionConfigKVData Client API
GetTitleRegionConfigKVData Server API
GetAllTitleRegionConfigKVData Server API
输入的参数无效,请检查错误消息以了解详细信息。
kBackendAllFailed (14)GetTitleRegionConfigKVData Client API
GetAllTitleRegionConfigKVData Client API
GetTitleRegionConfigKVData Server API
GetAllTitleRegionConfigKVData Server API
所有查询数据失败,请检查‘失败’字段以了解失败原因。
kSdkNetworkError (200008)All Network API网络错误,请检查错误消息了解详情。