跳到主要内容

游戏区服Config Data

1. Overview

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

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

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

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

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

2. 自定义游戏区服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. 查询游戏区服数据

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

3.1 For 游戏客户端

API描述
GetTitleRegionConfigKVData查询游戏区服config data的指定key-value data
GetAllTitleRegionConfigKVData查询游戏区服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查询游戏区服config data的指定key-value data
GetAllTitleRegionConfigKVData查询游戏区服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 关键错误处理

Error Code相关 APIHandling Suggestion
kBackendServerValidateFailGetTitleRegionConfigKVData Client API
GetAllTitleRegionConfigKVData Client API
GetTitleRegionConfigKVData Server API
GetAllTitleRegionConfigKVData Server API
输入的参数无效,请检查错误消息以了解详细信息。
kBackendAllFailedGetTitleRegionConfigKVData Client API
GetAllTitleRegionConfigKVData Client API
GetTitleRegionConfigKVData Server API
GetAllTitleRegionConfigKVData Server API
所有查询数据失败,请检查‘失败’字段以了解失败原因。
kSdkNetworkErrorAll Network API网络错误,请检查错误消息了解详情。