跳到主要内容

In-game Currencies

1. 什么是游戏内货币

游戏内货币是游戏经济中的一般等价物。它是玩家用于购买游戏内物品和参与其他经济活动的媒介。您可以使用游戏内货币为物品设定价格、存储物品,并通过增加或减少玩家虚拟货币的活动来丰富游戏玩法。

每个游戏区服可以定义多种虚拟货币。常见的虚拟货币包括金币、钻石等。

##2. 属性参考 本节介绍游戏内货币的属性:

  • 货币类型(Currency Type):支持两种游戏货币类型,
  • 虚拟货币(Virtual Currency):一般来说,虚拟货币是指玩家无法直接使用现实货币购买的游戏货币。
  • 付费货币(Premium Currency)(目前仅限Midas全球币):相较于虚拟货币,付费货币是指玩家可以直接使用现实货币购买的游戏货币。付费货币不能独立存在,必须依赖支付方提供的付费货币,当游戏使用米达斯支付服务时,付费货币即为米达斯币。 PGOS允许游戏将付费货币视为虚拟货币使用,但付费货币的余额由支付方(如Midas)管理。PGOS会为用户屏蔽此差异,相关功能、接口、业务流程与虚拟货币保持一致。
  • 货币代码 (Currency Code): 游戏区服内货币的唯一标识,必须使用大写字母。RM、COIN为保留字段,不能使用。
  • 币种名称(Currency Name):该币种的显示名称。
  • 币种图标(Currency Icon):用于记录该币种的图标资源地址。
  • 初始余额(Initial Deposit) 仅限虚拟币种,玩家钱包中该币种的起始余额,默认值:0。
  • 最大余额(Max Deposit) 仅限虚拟币种,玩家最大余额 ,默认0表示无限制,最大数额为4,294,967,295(uint32最大值)。

3. 配置游戏内货币

3.1 创建和编辑

PGOS 不提供默认虚拟货币定义。您必须根据需要配置自定义虚拟货币。 转到经济 -> 货币页面。单击“添加货币”以创建新的虚拟货币。

image-20240808162938496

3.2 删除

您可以根据运营需求删除已创建的货币。在删除货币时,系统会检查该货币在经济系统中的使用情况。以下情况下货币无法删除:

  • 该货币被用于设置商店中物品的价格
  • 该货币作为礼包/容器的内容物

删除操作不可逆,请谨慎操作。

4. 使用游戏内货币

4.1 为物品或商店物品定价

配置物品的默认价格

您可以使用虚拟货币或付费货币为每个物品配置默认价格。前往开发者中心 -> 经济系统 -> 游戏内物品,选择目标物品进入编辑页面。在"默认价格"列表中点击添加价格为所选物品添加默认价格。在弹出的窗口中配置默认价格参数:

  • 货币:选择货币类型和代码。
  • 数量:价格,即购买该物品所需的货币数量。0是有效值。

image-20240808163438405

image-20240808163451294

配置商店虚拟货币价格

要了解更多关于配置商店物品虚拟货币价格的信息,点击此处.

4.2 作为礼包/容器内容使用

虚拟货币和高级货币都可以作为礼包/容器的内容。

  • 当作为礼包内容时,玩家获得礼包后货币将直接发放到玩家钱包中。
  • 当作为容器内容时,玩家打开容器后货币将直接发放到玩家钱包中。

如下图所示,选择内容时只需点击"货币"选项卡即可。

image-20240808165054163

4.3 使用PGOS SDK查询玩家余额

4.3.1 查询玩家余额

可以在游戏客户端和游戏服务器中查询玩家余额。以下是示例代码:

#include "PgosSDKCpp.h"

// Queyr player balance form game client
void SomeUObjectClass::SomeFunction()
{
auto Economy = IPgosSDKCpp::Get().GetClientEconomyAPI();
if (Economy)
{
Economy->GetBalances([](const FPgosResult& Ret, const FClientGetBalancesResult* Data) {
if (Ret.err_code == (int32)Pgos::PgosErrCode::kSuccess)
{
UE_LOG(LogTemp, Log, TEXT("GetBalances Success"));
}
else
{
UE_LOG(LogTemp, Log, TEXT("GetBalances Failed: err_code=%d, err_msg=%s"), Ret.err_code, *Ret.msg);
}
});
}
}

// Queyr player balance form game server
void SomeUObjectClass::SomeFunction()
{
auto Economy = IPgosSDKCpp::Get().GetServerEconomyAPI();
if (Economy)
{
FServerGetPlayerBalanceParams Params;
// fill Params
Economy->GetPlayerBalance(Params, [](const FPgosResult& Ret, const FServerGetPlayerBalanceResult* Data) {
if (Ret.err_code == (int32)Pgos::PgosErrCode::kSuccess)
{
UE_LOG(LogTemp, Log, TEXT("GetPlayerBalance Success"));
}
else
{
UE_LOG(LogTemp, Log, TEXT("GetPlayerBalance Failed: err_code=%d, err_msg=%s"), Ret.err_code, *Ret.msg);
}
});
}
}

4.3.2 增减玩家余额

PGOS仅允许在游戏服务器中增减玩家余额。以下接口支持虚拟货币(VC)和高级货币(PC)的操作。以增加余额操作为例:

#include "PgosSDKCpp.h"

void SomeUObjectClass::SomeFunction()
{
auto Economy = IPgosSDKCpp::Get().GetClientEconomyAPI();
if (Economy)
{
FServerGrantCurrencyToPlayerParams Params;
// Fill params
Economy->GrantCurrencyToPlayer(Params, [](const FPgosResult& Ret, const FServerGrantCurrencyResult* Data) {
if (Ret.err_code == (int32)Pgos::PgosErrCode::kSuccess)
{
UE_LOG(LogTemp, Log, TEXT("GrantCurrencyToPlayer Success"));
}
else
{
UE_LOG(LogTemp, Log, TEXT("GrantCurrencyToPlayer Failed: err_code=%d, err_msg=%s"), Ret.err_code, *Ret.msg);
}
});
}
}

4.3.3 批量扣减/发放余额

PGOS提供了批量发放/扣减玩家余额的接口,专门供游戏服务器使用。由于数据一致性的原因,批量接口不支持修改玩家PC余额,请注意这一点。以发放操作为例:

#include "PgosSDKCpp.h"

void SomeUObjectClass::SomeFunction()
{
auto Economy = IPgosSDKCpp::Get().GetClientEconomyAPI();
if (Economy)
{
FBatchGrantVirtualCurrenciesToPlayerParams Params;
// Fill params
Economy->BatchGrantVirtualCurrenciesToPlayer(Params, [](const FPgosResult& Ret, const FBatchGrantVirtualCurrenciesToPlayerResult* Data) {
if (Ret.err_code == (int32)Pgos::PgosErrCode::kSuccess)
{
UE_LOG(LogTemp, Log, TEXT("BatchGrantVirtualCurrenciesToPlayer Success"));
}
else
{
UE_LOG(LogTemp, Log, TEXT("BatchGrantVirtualCurrenciesToPlayer Failed: err_code=%d, err_msg=%s"), Ret.err_code, *Ret.msg);
}
});
}
}