# Economy Game Overrides 与 Cloud Code

> Learn how to use Game Overrides with Cloud Code to personalize your in-game Economy for specific player groups.

通过 [Game Overrides](/game-overrides.md)，您可以对游戏内经济进行个性化设置。例如，在短时间内提供季节性促销活动，或者在购买时给予老玩家更多的所得内容。

## Game Overrides 和配置缓存如何与 Economy 结合使用##how-game-overrides-and-config-caching-work-with-economy

请阅读[配置缓存](./config-caching.md)，详细了解如何将配置分配哈希与 Cloud Code 和 Economy SDK 结合使用。

为了让 Economy 知道应该为玩家应用哪些覆盖，它必须知道客户端设备上有哪些覆盖。Economy 返回 `configAssignmentHash`，作为配置的一部分。将 `configAssignmentHash` 传递给 Economy 可确保 Economy 使用与设备上相同的配置，为玩家提供一致性的用户体验。

与 Economy API 交互时，Economy SDK 2.0.0 及更高版本会自动将 `configAssignmentHash` 传递到 Economy。要了解如何在 Economy SDK 中使用 Game Overrides，请参阅 Economy SDK 指南的 [Game Overrides](./sdk/game-overrides.md) 部分。

Cloud Code 中的 Economy SDK 1.0.0 和 Economy SDK 不会自动将 `configAssignmentHash` 传递给 Economy。如果 Economy 不接收 `configAssignmentHash` 作为参数，它就有办法确保与客户端设备配置保持一致，但在某些特殊情况下，该配置可能与客户端设备上的配置不一致。

## 将 Economy Game Overrides 与 Cloud Code 搭配使用##using-economy-game-overrides-with-cloud-code

使用 Cloud Code 将游戏逻辑移离客户端设备的另一种方法是使用 Cloud Code 与游戏经济进行交互。通过 Cloud Code 与 Economy 进行交互时，您需要将 `configAssignmentHash` 传递给 Cloud Code 脚本，然后再将其传递给 Economy。SDK 有一种在客户端设备上获取 `configAssignmentHash` 的方法。完整步骤如下：

### Cloud Code 设置##cloud-code-setup

1. [使用 `configAssignmentHash` 作为参数设置 Cloud Code 脚本](/cloud-code.md#use-cloud-code-with-modules-and-scripts)。


   **Frame:**
   ![Add a Script（添加脚本）对话框的屏幕截图，其中包含已添加的参数。](/api/media?file=/economy/media/images/config-assignment-hash.jpg)

2. 使用 [Economy SDK 2.2](https://cloud-code-sdk-documentation.cloud.unity3d.com/economy/v2.2) 或更高版本在 Cloud Code 中添加调用 Economy 的脚本。

   ```js title="JavaScript"
   /*
    *  -------- Example Cloud Code Script --------
    *
    *  Ensure consistency when using Game Overrides with Economy
    *
    * --------------------------------------------
    */
   const { CurrenciesApi } = require("@unity-services/economy-2.2");

   /*
    * CommonJS wrapper for the script. It receives a single argument, which can be destructured into:
    *  - params: Object containing the parameters provided to the script, accessible as object properties
    *  - context: Object containing the projectId, environmentId, environmentName, playerId and accessToken properties.
    *  - logger: Logging client for the script. Provides debug(), info(), warning() and error() log levels.
    */
   module.exports = async ({ params, context, logger }) => {
     // Log an info message with the parameters provided to the script and the invocation context
     logger.info("Script parameters: " + JSON.stringify(params));
     logger.info("Authenticated within the following context: " + JSON.stringify(context));

     const { projectId, playerId, accessToken } = context;
     const { currencyId, configAssignmentHash } = params;

     const currencies = new CurrenciesApi({ accessToken });
     const increment = await currencies.incrementPlayerCurrencyBalance({ projectId, playerId, currencyId, configAssignmentHash, currencyModifyBalanceRequest: { currencyId, amount: 10 } });

     logger.info("Increment data result: " + JSON.stringify(increment.data));

     // Return the JSON result to the client
     return {
       newBalance: increment.data.balance,
     };
   };
   ```

### 编辑器设置##editor-setup

1. 从 Economy SDK 2.0.0 或更高版本中[获取配置](./sdk/configuration.md)。

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

2. 调用：

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

   来自 Economy SDK。

3. 将步骤 2 中的 `configAssignmentHash` 传递到 [Cloud Code](/cloud-code/modules/how-to-guides/unity-services-integration.md)。

   ```cs title="C#"
   await CloudCode.CallEndpointAsync<NewBalance>("AddCurrency", new IncrementBalanceParam(currencyId, configAssignmentHash));
   ```

### 完整示例##full-example

```cs title="C#"
public async Task<int> IncrementCurrency()
{
   var goldCurrencyId = "GOLD";
   EconomyService.Instance.Configuration.GetCurrency(goldCurrencyId);
    var configAssignemntHash = EconomyService.Instance.Configuration.GetConfigAssignmentHash();
    var newBalance = await CallIncrementCurrencyEndpoint(goldCurrencyId, configAssignemntHash);
     return newBalance;
}

public async Task<int> CallIncrementCurrencyEndpoint(string currencyId, string configAssignmentHash)
{
   var newBalanceResult = await CloudCode.CallEndpointAsync<NewBalance>(
                    "AddCurrency", new IncrementBalanceParam(currencyId, configAssignmentHash));

   return newBalanceResult.newBalance;
}

public class NewBalance
{
   public int newBalance;
}

[Serializable]
public class IncrementBalanceParam
{
    public string currencyId;
   public string configAssignmentHash;

   public IncrementBalanceParam(string currencyId, string configAssignmentHash)
   {
       this.currencyId = currencyId;
       this.configAssignmentHash = configAssignmentHash;
   }

   public override string ToString()
   {
      return $"{{\"currencyId\": @currencyId, \"configAssignmentHash\": @configAssignmentHash }}";
   }
}
```

### 陷阱##pitfalls

请参阅[配置缓存陷阱](./config-caching.md#pitfalls)
