# Cloud Code 向け Cloud Save のチュートリアル

> Use Cloud Code to access, modify, and manage Cloud Save data to achieve server-authoritative gameplay.

Cloud Code 向け Cloud Save SDK を使用すると、プレイヤーデータの読み取りと書き込み、ゲームデータの読み取りと書き込み、およびデータのクエリ (データをクエリ可能にするインデックスを設定している場合) を Cloud Code から実行できます。

使用可能なすべてのメソッドのリストについては、[Cloud Code 向け Cloud Save SDK のドキュメント](https://cloud-code-sdk-documentation.cloud.unity3d.com/cloud-save/) を参照してください。

## Cloud Code からの Cloud Save へのアクセス##authentication

以下は、Cloud Code スクリプトからプレイヤーデータに書き込む方法の例です。

*Javascript*

```js
const _ = require("lodash-4.17");
const {
  DataApi
} = require("@unity-services/cloud-save-1.4");

const NUMBER_OF_SIDES = 6;

module.exports = async ({ params, context, logger }) => {
  const {
	projectId,
	playerId
  } = context;

  const api = new DataApi(context);

  const roll = rollDice(NUMBER_OF_SIDES);

  if (roll > NUMBER_OF_SIDES) {
    // Log an error message with information about the exception
	logger.error("The roll is greater than the number of sides: " + roll);
    // Return an error back to the client
    throw Error("Unable to roll dice!");
  }

  // Return a JSON result to the client
  const result = {
	sides: NUMBER_OF_SIDES,
	roll: roll,
  };

  const setResult = await api.setItem(projectId, playerId, {
	key: "DIE_ROLL",
	value: result
  });
  logger.debug(JSON.stringify(setResult.data));

  return result;
};

// Function outside of the script wrapper
function rollDice(sides) {
  return _.random(1, sides);
}
```

## クロスプレイヤーデータ##using-cloud-save-with-cloud-code-modules

別のプレイヤーの ID を Cloud Save SDK に渡すことで、そのプレイヤーの Cloud Save データの読み取りと書き込みができるようになり、非同期のマルチプレイヤーインタラクションが可能になります。これは、ユーザーが自分のデータへのアクセスのみを許可されているクライアント内からは不可能です。

以下の例は、同じ [ロビー](/lobby.md) 内で他のプレイヤーにいいねを付ける方法を示しています。サンプルコードは、Cloud Save に保存された他のプレイヤーのデータにアクセスしてそのデータを変更する方法を示しています。`otherPlayerId` パラメーターにより、他のプレイヤーが識別されます。

*Javascript*

```js
const { DataApi } = require('@unity-services/cloud-save-1.4');

module.exports = async ({ params, context, logger }) => {
  const { projectId } = context;
  const { otherPlayerId } = params;

  // Initialize the cloud save API client
  const cloudSaveAPI = new DataApi(context);

  // Access the save data for the specified player
  const otherPlayerSave = await cloudSaveAPI.getItems(
    projectId,
    otherPlayerId, // or any other player ID
    "likes" // Cloud Code key
  );

  // Assume that player's likes is 0 if the key doesn't exist
  const otherPlayerLikes = otherPlayerSave.data.results[0]?.value || 0;

  // Update the data for the specified player
  cloudSaveAPI.setItem(
    projectId,
    otherPlayerId, { key: "likes", value: otherPlayerLikes + 1 }
  )
};
```

プレイヤーから発信されたリクエストは信頼できない入力と見なされるため、上記の例のように他のプレイヤーの ID をパラメーターとして受け入れる場合は注意してください。ゲームにプレイヤー同士のインタラクションのタイミングや方法に関する制限がある場合 (例えば、プレイヤーがマルチプレイヤーをオプトアウトできる場合) は、スクリプト内でそれらの前提条件を確認する必要があります。

## ユースケースと例##use-cloud-save-with-cloud-code-scripts

Cloud Code スクリプトによる Cloud Save SDK のその他のユースケースと例を見てみましょう。

\| トピック | 説明 | |-|-| | [クエストシステム](/cloud-code/modules/use-cases/quest-system.md) | サーバー主導型/チート対策クエストシステム。*Cloud Code モジュール (C#)* | | [引き換え可能なクーポン](/cloud-code/scripts/use-cases/redeemable-coupons.md) | プレイヤーにゲーム内報酬を提供します。*Cloud Code スクリプト (JavaScript)* | | [サーバー時刻のチート対策](/cloud-code/scripts/use-cases/server-time-anti-cheat.md) | チート対策システムを実装します。*Cloud Code スクリプト (JavaScript)*|
