# Cloud Code를 사용한 Economy Game Overrides

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

[Game Overrides](/game-overrides.md)를 사용하면 게임에서 Economy를 맞춤화할 수 있습니다. 예를 들어 단기간만 시즌 세일을 제공하거나 베테랑 플레이어가 구매할 때 보상을 더 지급할 수 있습니다.

## Economy에서 Game Overrides와 Config Caching이 작동하는 방식##how-game-overrides-and-config-caching-work-with-economy

Cloud Code와 Economy SDK에서 구성 할당 해시를 사용하는 방법에 관한 자세한 내용은 [Config Caching](./config-caching.md)을 참고하시기 바랍니다.

Economy에서 플레이어에게 적용할 오버라이드를 알려면 클라이언트 디바이스에 어떤 오버라이드가 있는지 알아야 합니다. Economy는 구성의 일부로 `configAssignmentHash`를 반환합니다. `configAssignmentHash`를 Economy에 전달하면 Economy는 디바이스의 구성과 동일한 구성을 사용하여 플레이어에게 일관된 사용자 경험을 제공할 수 있습니다.

Economy SDK 2.0.0 이상은 Economy API와 상호 작용할 때 `configAssignmentHash`를 Economy에 자동으로 전달합니다. Economy SDK에서 Game Overrides를 사용하는 방법은 Economy SDK 가이드의 [Game Overrides](./sdk/game-overrides.md)를 참고하십시오.

Economy SDK 1.0.0과 Cloud Code의 Economy SDK는 `configAssignmentHash`를 Economy에 자동으로 전달하지 않습니다. Economy에 `configAssignmentHash`가 파라미터로 전달되지 않을 경우 클라이언트 디바이스 구성과 일관성을 유지할 수 있는 방법이 있긴 하지만, 클라이언트 디바이스의 구성과 일치하지 않는 경우도 드물게 있습니다.

## Cloud Code로 Economy Game Overrides 사용##using-economy-game-overrides-with-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##pitfalls

[Config Caching](./config-caching.md#pitfalls) 참고
