# 配置缓存

> Understand how Economy caches configurations to ensure consistency across player devices.

Remote Config 和 [Game Overrides](/game-overrides/.md) 利用配置分配哈希来缓存玩家配置。Economy 服务将配置分配哈希缓存数小时，以避免不必要的网络调用。

## 配置分配哈希##config-assignment-hash

### 配置分配哈希代表什么？##what-does-the-config-assignment-hash-represent?

ConfigAssignmentHash 是 Remote Config、Game Overrides 和 Economy 项目配置中玩家数据快照的唯一标识符。

具体对于 Economy 来说，快照仅针对 Economy 项目配置（物品定义、货币定义等），而不针对玩家的余额或背包。

### 使用 Cloud Code 和 Economy SDK 配置缓存##config-caching-with-cloud-code-and-economy-sdk

请参阅[ Game Overrides - Cloud code](./game-overrides-cc.md) 和[ Game Overrides - Economy](./game-overrides-economy.md)，详细了解如何通过 Economy Cloud Code SDK 和 C# SDK 使用配置分配哈希缓存。

### 访问配置分配哈希##accessing-the-configuration-assignment-hash

在某些时候，您可能想要检索玩家当前的配置分配哈希，以便将其与其他 Unity 服务一起使用。您可以从配置命名空间获取该哈希值。

#### GetConfigAssignmentHash##getconfigassignmenthash

以字符串形式检索玩家的当前配置分配哈希。如果不存在则返回 `null`。

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

#### SyncConfigurationAsync##syncconfigurationasync

获取经过身份验证的玩家的最新配置，并在本地保存配置分配哈希以供以后进行 Economy API 调用。在进行其他 Economy 调用之前，最好先调用本方法，以确保使用正确的配置分配哈希。

```cs title="C#"

EconomyService.Instance.Configuration.SyncConfigurationAsync();
```

### 陷阱##pitfalls

#### 由于缓存配置分配哈希，Economy 的相关更改无法得到体现##economy-changes-not-being-reflected-due-to-a-cached-config-assignment-hash

当您对 Economy 项目配置或 Game Overrides 进行更改时，Cloud Code 执行和 Economy SDK 调用将继续使用其最近缓存的配置分配哈希。

您可以通过确保在进行任何 API 调用之前获取最新的配置分配哈希来规避此问题。

对于 Cloud Code，您可能需要将最新的配置分配哈希作为参数传递给脚本和脚本内的 API 调用。

您也可以在 Cloud Code 脚本开始时获取最新的配置分配哈希，并将其传递给脚本内的 API 调用。

```js title="Cloud Code JS 示例"
const { CurrenciesApi, ConfigurationApi } = require("@unity-services/economy-2.4");

module.exports = async ({ params, context, logger }) => {
  const currenciesApi = new CurrenciesApi({ accessToken: context.accessToken });
  const configApi = new ConfigurationApi({ accessToken: context.accessToken });
  const currencyId = "COIN";

  try {
    // Retrieve the player config to get the configAssignmentHash.
    // This is needed to ensure the currency is synced
    var config = await configApi.getPlayerConfiguration({
      playerId: context.playerId,
      projectId: context.projectId,
    });

    const result = await currenciesApi.incrementPlayerCurrencyBalance({
      currencyId,
      playerId: context.playerId,
      projectId: context.projectId,
      configAssignmentHash: config.data.metadata.configAssignmentHash,
      currencyModifyBalanceRequest: { amount: 10 },
    });

    return result.data;
  } catch (err) {
    logger.error("Failed to increment currency for player", { "error.message": err.message });
    return;
  }
};
```

### 异常##exceptions

您可能会遇到 `EconomyException`，提示您未找到配置分配哈希。

此异常的 `Reason` 为 `EconomyExceptionReason.ConfigAssignmentHashInvalid`。

要解决这个问题，请使用一种 `Configuration` 方法（例如 `GetCurrenciesAsync()`）再次获取 Economy 配置。这样，SDK 就会获得刷新后的配置分配哈希，这样您就可以正常调用了。
