# 配置

> Retrieve your Economy configuration using the Configuration namespace.

通过 `Configuration` 命名空间中的方法，可以从全局经济配置中检索物品。

> **Note:**
>
> 参见[配置缓存](../config-caching)

`SyncConfigurationAsync()` 将缓存最新的 Economy 配置，之后您可以调用 `GetCurrencies()` 等方法从缓存中读取配置。如果发布了新配置，则必须再次调用 `SyncConfigurationAsync()` 以更新缓存。

### SyncConfigurationAsync##syncconfigurationasync

获取当前发布的 Economy 配置并缓存到 SDK 中。必须在调用其他配置方法（例如 `GetCurrencies()`）之前调用该方法，否则会出现异常。

```cs title="C#"
await EconomyService.Instance.Configuration.SyncConfigurationAsync();
```

## 货币##currencies

### GetCurrencies##getcurrencies

从缓存配置中检索所有货币。返回 `CurrencyDefinition` 对象列表。

```cs title="C#"
List<CurrencyDefinition> definitions = EconomyService.Instance.Configuration.GetCurrencies();
```

### GetCurrency##getcurrency

使用缓存配置中的货币 ID 获取指定的 `CurrencyDefinition`。如果货币不存在，则返回 `null`。

```cs title="C#"
string currencyID = "GOLD_BARS";
CurrencyDefinition goldCurrencyDefinition = EconomyService.Instance.Configuration.GetCurrency(currencyID);
```

### CurrencyDefinition##currencydefinition

`CurrencyDefinition` 对象代表一项货币配置，包含以下数据：

* `Id`：货币 ID。
* `Name`：人类可读的货币名称。
* `Type`：在 Economy 后台中定义的物品类型（对于所有 `CurrencyDefinition` 对象，类型都是 `CURRENCY`）。
* `Initial`：玩家初始获得的货币数量。
* `Max`：（可选项，0 表示无上限）玩家可拥有的最大货币量。
* `CustomData`：与此货币定义关联的任何自定义数据，形式为 `Dictionary<string, object>`（参阅[使用 CustomDataDeserializable](#using-customdata)）。
* `Created`：该货币的创建日期。它是一个 [EconomyDate](./common-objects.md#economydate) 对象。
* `Modified`：该货币的修改日期。它是一个 [EconomyDate](./common-objects.md#economydate) 对象。

此外，还可以采用以下便捷方法：

#### GetPlayerBalance##c

此方法获取当前登录玩家的 `CurrencyDefinition` 指定货币余额。它返回[玩家余额](./player-balances.md)中指定的 `PlayerBalance`。

```cs title="C#"
string currencyID = "GOLD_BARS";
CurrencyDefinition goldCurrencyDefinition = EconomyService.Instance.Configuration.GetCurrency(currencyID);
PlayerBalance playersGoldBarBalance = await goldCurrencyDefinition.GetPlayerBalanceAsync();
```

## 背包##inventories

### GetInventoryItems##getinventoryitems

从缓存的配置中检索所有背包物品。返回 `InventoryItemDefinition` 对象列表。

```cs title="C#"
List<InventoryItemDefinition> definitions = EconomyService.Instance.Configuration.GetInventoryItems();
```

### GetInventoryItem##getinventoryitem

使用缓存配置中的物品 ID 检索指定的 `InventoryItemDefinition`。如果该物品不存在，则返回 `null`。

```cs title="C#"
string itemID = "SWORD";
InventoryItemDefinition definition = EconomyService.Instance.Configuration.GetInventoryItem(itemID);
```

### InventoryItemDefinition##inventoryitemdefinition

`InventoryItemDefinition` 对象代表一项背包物品配置，并包含以下数据：

* `Id`：背包物品 ID。
* `Name`：人类可读的名称。
* `Type`：在 Economy 后台中定义的物品类型（对于所有 `InventoryItemDefinition` 对象，类型都是 `INVENTORY_ITEM`）。
* `CustomData`：与此物品定义关联的任何自定义数据，形式为 `Dictionary<string, object>`（参阅[](#using-customdata)[使用 CustomDataDeserializable](#using-customdata)）。
* `Created`：该物品的创建日期。它是一个 [EconomyDate](./common-objects.md#economydate) 对象。
* `Modified`：该物品的修改日期。它是一个 [EconomyDate](./common-objects.md#economydate) 对象。

此外，还可以使用以下辅助器方法：

### GetAllPlayersInventoryItems##getallplayersinventoryitems

获取当前登录玩家的所有背包物品。返回[玩家背包](./player-inventory.md)中定义的 `GetInventoryResult`。

```cs title="C#"
string itemID = "SWORD";
InventoryItemDefinition definition = EconomyService.Instance.Configuration.GetInventoryItem(itemID);
GetInventoryResult allThePlayersSwords = await definition.GetAllPlayersInventoryItemsAsync();
```

## 购买##purchases

### 虚拟购买##virtual-purchases

#### GetVirtualPurchases##c

从缓存的配置中检索所有虚拟购买。返回 `VirtualPurchaseDefinition` 对象列表。

```cs title="C#"
List<VirtualPurchaseDefinition> definitions = EconomyService.Instance.Configuration.GetVirtualPurchases();
```

#### GetVirtualPurchase##c

从缓存的配置中检索一项虚拟购买。返回一个 `VirtualPurchaseDefinition` 对象。

```cs title="C#"
string purchaseId = "VIRTUAL_PURCHASE_ID"
VirtualPurchaseDefinition definition = EconomyService.Instance.Configuration.GetVirtualPurchase(purchaseId);
```

#### VirtualPurchaseDefinition##getplayerbalance

`VirtualPurchaseDefinition` 对象代表您配置中虚拟购买的定义。它由许多组件对象组成，如下所列。

`VirtualPurchaseDefinition` 具有以下字段：

* `Id`：购买定义的 ID。
* `Name`：人类可读的名称。
* `Type`：在 Economy 后台中定义的物品类型（对于所有 `VirtualPurchaseDefinition` 对象，类型都是 `VIRTUAL_PURCHASE`）。
* `CustomData`：与此购买定义关联的任何自定义数据，形式为 `Dictionary<string, object>`（参阅[](#using-customdata)[使用 CustomDataDeserializable](#using-customdata)）。
* `CustomDataDeserializable`：与此购买定义关联的任何自定义数据，形式为 `IDeserializable`（参阅[使用 CustomDataDeserializable](#using-customdata)）。
* `Created`：此购买定义的创建日期。它是一个 [EconomyDate](./common-objects.md#economydate) 对象。
* `Modified`：此购买定义的修改日期。它是一个 [EconomyDate](./common-objects.md#economydate) 对象。
* `Costs`：与此购买相关的成本列表，形式为 [`PurchaseItemQuantity`](#purchaseitemquantity)。
* `Rewards`：与此购买相关的所得内容列表，形式为 [`PurchaseItemQuantity`](#purchaseitemquantity)。

### 真实货币购买##real-money-purchases

> **Warning:**
>
> Economy SDK 3.0.0 存在一个问题,导致 `GetRealMoneyPurchase())`/`GetRealMoneyPurchases()` 方法不返回 `StoreIdentifiers`。建议最佳做法：开发者恢复到 SDK 版本 2.0.4 以避免此问题，直到问题得到解决。

#### GetRealMoneyPurchases##c

从缓存的配置中检索所有真实货币购买。返回 `RealMoneyPurchaseDefinition` 对象列表。

```cs title="C#"
List<RealMoneyPurchaseDefinition> definitions = EconomyService.Instance.Configuration.GetRealMoneyPurchases();
```

#### GetRealMoneyPurchase##c

从缓存的配置中检索一项真实货币购买。返回一个 `RealMoneyPurchaseDefinition` 对象。

```cs title="C#"
string purchaseId = "REAL_MONEY_PURCHASE_ID"
RealMoneyPurchaseDefinition definition = EconomyService.Instance.Configuration.GetRealMoneyPurchase(purchaseId);
```

#### RealMoneyPurchaseDefinition##c

`RealMoneyPurchaseDefinition` 对象代表您配置中真实货币购买的定义。它由许多组件对象组成，如下所列。

`RealMoneyPurchaseDefinition` 具有以下字段：

* `Id`：购买定义的 ID。
* `Name`：人类可读的名称。
* `Type`：在 Economy 后台中定义的物品类型（对于所有 `RealMoneyPurchaseDefinition` 对象，类型都是 `MONEY_PURCHASE`）。
* `CustomData`：与此购买定义关联的任何自定义数据，形式为 `Dictionary<string, object>`（参阅[](#using-customdata)[使用 CustomDataDeserializable](#using-customdata)）。
* `Created`：此购买定义的创建日期。它是一个 [EconomyDate](./common-objects.md#economydate) 对象。
* `Modified`：此购买定义的修改日期。它是一个 [EconomyDate](./common-objects.md#economydate) 对象。
* `StoreIdentifiers`：此次购买的商店标识符。它是一个 [StoreIdentifiers](#getvirtualpurchases) 对象。
* `Rewards`：与此购买相关的所得内容列表，形式为 [`PurchaseItemQuantity`](#purchaseitemquantity)。

#### StoreIdentifiers##getvirtualpurchases

`StoreIdentifers` 对象包含 Google 和 Apple 商店标识符。在 [Unity Dashboard（Unity 后台）](https://dashboard.unity3d.com/)的“商店关联”步骤中创建购买时会设置这些对象。可以在 Unity Dashboard（Unity 后台）中单击您的购买并向下滚动到“商店关联”，以此编辑这些对象。

## PurchaseItemQuantity##purchaseitemquantity

`PurchaseItemQuantity` 表示与购买相关的货币/背包物品的数量。每个数量都与一种货币/背包物品类型相关（例如，4 把剑、10 个金币等）。它包含以下字段：

* `Item`：指向此数量所表示的物品定义的 `EconomyReference`。
* `Amount`：所表示的物品的数量（整数）。

### EconomyReference##economyreference

`EconomyReference` 是对购买中另一个定义的引用。它采用一种方法：

* `GetReferencedConfigurationItem()`，用于获取关联物品。

以这种方式获取引用物品是同步发生的，因为它不需要额外的网络请求，并且获取的引用物品与检索购买信息时相同（在获取购买信息和访问引用之间的时间，对定义实施的任何更改都不会反映在引用物品中）。

## 使用 CustomDataDeserializable##using-customdata

自定义数据需在 [Unity Dashboard（Unity 后台）](https://dashboard.unity3d.com/)中设置。选择一项货币、背包物品或购买，导航到**自定义数据**，然后添加 JSON 格式的数据。

自定义数据存储在所获取配置物品的 `CustomDataDeserializable` 中。其类型为 `IDeserializable`。这样，即可将物品的自定义数据反序列化到您自己的自定义类中。

例如，如果游戏具有颜色稀有度系统，则在后台中物品可能具有以下 JSON 代码：

```js title="JSON"
{
    "rarity": "purple"
}
```

您可以通过以下方式反序列化实例数据：

```cs title="C#"
class MyCustomData{
    public string Rarity
}
MyCustomData fetchedCustomData = fetchedConfigItem.CustomDataDeserializable.GetAs<MyCustomData>();
string rarity = fetchedCustomData.Rarity;
```
