# プレイヤーのインベントリ

> Use the SDK to manage player inventory items including adding, updating, and deleting items.

`PlayerInventory` 名前空間のメソッドを使用して、プレイヤーのインベントリインスタンスの取得と更新を行うことができます。

これらのメソッドは、Authentication SDK から、現在サインインしているプレイヤーのインベントリデータを返します。

> **Note:**
>
> この名前空間のすべてのメソッドは、[EconomyException](./exceptions.md#economyexception) をスローする可能性があります。

## GetInventoryAsync##getinventory

現在サインインしているプレイヤーに関連付けられている現在のインベントリアイテムインスタンスを取得します。

このメソッドには `GetInventoryOptions` オブジェクトを任意で指定できます。これを使用して、フェッチごとのアイテム数やフィルタリングでのアイテム数を設定できます。

設定アイテム ID または `PlayersInventoryItem` ID (あるいは両方) のリストを使用して、インベントリアイテムをフィルター処理できます。これらのフィルターオプションを使用すると、指定した設定アイテム ID と `PlayersInventoryItem` ID のプレイヤーアイテムのみが返されます。

以下のサンプルコードは、現在のユーザーの最初の 5 個のアイテムを取得してから、次の 5 個を取得します。

```cs title="C#"
// Optional, defaults to 20
GetInventoryOptions options = new GetInventoryOptions
{
    ItemsPerFetch = 5
};

GetInventoryResult inventoryResult = await EconomyService.Instance.PlayerInventory.GetInventoryAsync(options);
List<PlayersInventoryItem> firstFiveItems = inventoryResult.PlayersInventoryItems;
// do something with your items

if (inventoryResult.HasNext) {
    inventoryResult = await inventoryResult.GetNextAsync(5);
    List<PlayersInventoryItem> nextFiveItems = inventoryResult.PlayersInventoryItems;
    // do something with your items
}
```

次に示すこのサンプルコードは、プレイヤーの `SWORD` アイテムのみを取得します。

```cs title="C#"
GetInventoryOptions options = new GetInventoryOptions
{
    InventoryItemIds = new List<string>() { "SWORD" }
};

GetInventoryResult inventoryResult = await EconomyService.Instance.PlayerInventory.GetInventoryAsync(options);

List<PlayersInventoryItem> listOfItems = inventoryResult.PlayersInventoryItems;

// ... etc
```

これらのメソッドは `GetInventoryResult` を返します。

### GetInventoryOptions##getinventoryoptions

`GetInventoryAsync` 呼び出しの任意のオブジェクト。これには以下のフィールドがあります。

* `PlayersInventoryItemIds`: 文字列のリスト。デフォルトは `null` です。取得しようとするプレイヤーのインベントリにあるアイテムの `PlayersInventoryItem` ID。
* `InventoryItemIds`: 文字列のリスト。デフォルトは `null` です。取得しようとするアイテムの設定 ID。
* `ItemsPerFetch`: 整数。デフォルトは 20 です。これを使用して、呼び出しごとにフェッチするアイテムの最大件数を 1 から 100 の間で設定します。

### GetInventoryResult##getinventoryresult

`GetInventoryResult` を使用すると、取得したプレイヤーのインベントリアイテムのリストをページで区切ってアクセスできるようになります。これには以下のフィールドがあります。

* `PlayersInventoryItems`: 現在フェッチされたアイテムが含まれる `List<PlayersInventoryItem>`。

これには以下のメソッドがあります。

* `GetNextAsync(int itemsToFetch = 20)`: このメソッドは、より多くの結果を非同期でフェッチします。これには 1 つの任意のパラメーターがあり、フェッチされる結果の数を制限できます (1 から 100 を設定でき、デフォルトは 20 です)。これによって新しい結果が返され、元のアイテムと新しくフェッチされたアイテムの両方が `PlayersInventoryItems` リストに含められます。それ以上フェッチする結果がなくなると、結果は `null` になります。

## AddInventoryItemAsync##addinventoryitemasync

プレイヤーのインベントリにアイテムを追加します。

このメソッドには `AddInventoryItemOptions` オブジェクトを任意で指定できます。これを使用してカスタムの `PlayersInventoryItemId` を設定できます。`null` の場合、自動生成されます。インスタンスデータのディクショナリを設定するためにも使用できます。

プレイヤーのインベントリに追加されたインベントリアイテムを表す `PlayersInventoryItem` を返します。

```cs title="C#"
Dictionary<string, object> instanceData = new Dictionary<string, object>
{
    { "rarity", "purple" }
};

AddInventoryItemOptions options = new AddInventoryItemOptions
{
    PlayersInventoryItemId = "customID",
    InstanceData = instanceData 
};

PlayersInventoryItem createdInventoryItem = await EconomyService.Instance.PlayerInventory.AddInventoryItemAsync("SWORD", options);
```

### AddInventoryItemOptions##addinventoryitemoptions

`AddInventoryItemAsync` 呼び出しの任意のオブジェクト。これには以下のフィールドがあります。

* `PlayersInventoryItemId`: 文字列。デフォルトは `null` です。作成される `PlayersInventoryItem` の ID を設定します。指定されない場合は生成されます。
* `InstanceData`: `Dictionary<string, object>`。[インスタンスデータ](#using-instancedata) のディクショナリを設定するために使用されます。

## DeletePlayersInventoryItemAsync##deleteplayersinventoryitemasync

プレイヤーのインベントリからアイテムを削除します。

このメソッドには、書き込みロックの設定に使用される `DeletePlayersInventoryItemOptions` オブジェクトを任意で指定できます。書き込みロックが指定されても、アイテムが削除されるのは Economy サービスが書き込みロックを受け入れた場合のみです。書き込みロックが指定されない場合、操作は強制的に行われます。

```cs title="C#"
DeletePlayersInventoryItemOptions options = new DeletePlayersInventoryItemOptions
{
    WriteLock = "writeLock"
};
EconomyService.Instance.PlayerInventory.DeletePlayersInventoryItemAsync("playersInventoryItemID", options);
```

### DeletePlayersInventoryItemOptions##deleteplayersinventoryitemoptions

`DeletePlayersInventoryItemAsync` 呼び出しの任意のオブジェクト。これには以下のフィールドがあります。

* `WriteLock`: 文字列。デフォルトは `null` です。これを使用して、楽観的コンカレンシーのための書き込みロックを設定します。[書き込みロック](./common-objects.md#using-the-writelock) を参照してください。

## UpdatePlayersInventoryItemAsync##updateplayersinventoryitemasync

アイテムを新しいインスタンスデータで更新します。

更新されたプレイヤーインベントリアイテムを返します。

このメソッドには、書き込みロックの設定に使用される `UpdatePlayersInventoryItemOptions` オブジェクトを任意で指定できます。書き込みロックが指定されても、アイテムが更新されるのは Economy サービスが書き込みロックを受け入れた場合のみです。書き込みロックが指定されない場合、操作は強制的に行われます。

```cs title="C#"
Dictionary<string, object> instanceData = new Dictionary<string, object>
{
    { "rarity", "purple" }
};

UpdatePlayersInventoryItemOptions options = new UpdatePlayersInventoryItemOptions
{
    WriteLock = writeLock 
};

PlayersInventoryItem playersInventoryItem = await EconomyService.Instance.PlayerInventory.UpdatePlayersInventoryItemAsync("playersInventoryItemID", instanceData, options);
```

### UpdatePlayersInventoryItemOptions##updateplayersinventoryitemoptions

`UpdatePlayersInventoryItemAsync` 呼び出しの任意のオブジェクト。これには以下のフィールドがあります。

* `WriteLock`: 文字列。デフォルトは `null` です。これを使用して、楽観的コンカレンシーのための書き込みロックを設定します。[書き込みロック](./common-objects.md#using-the-writelock) を参照してください。

## PlayersInventoryItem##playersinventoryitem

`PlayersInventoryItem` は、プレイヤーのインベントリ内の 1 つの一意のアイテムを表します。以下のフィールドが含まれます。

* `PlayersInventoryItemId`: プレイヤーのインベントリ内のこの一意インベントリアイテムの ID。
* `InstanceItemId`: このインベントリアイテムの設定 ID。
* `InstanceData`: このプレイヤーインベントリアイテムに関連付けられているインスタンスデータ。
* `InstanceDataDeserializable`: このプレイヤーインベントリアイテムに `IDeserializable` として関連付けられているインスタンスデータ。[InstanceDataDeserializable の使用](#using-instancedata) を参照してください。
* `WriteLock`: このプレイヤーのインベントリアイテムの現在の `writelock` 文字列。
* `Created`: このプレイヤーのインベントリアイテムが作成された日付。これは [EconomyDate](./common-objects.md#economydate) オブジェクトです。
* `Modified`: このプレイヤーのインベントリアイテムが変更された日付。これは [EconomyDate](./common-objects.md#economydate) オブジェクトです。

また、以下のヘルパーメソッドがあります。

### GetItemDefinitionAsync##getitemdefinitionasync

このメソッドは、このプレイヤーのインベントリアイテムの設定 (タイプ `InventoryItemDefinition`) をフェッチします。

```cs title="C#"
PlayersInventoryItem playersInventoryItem = // ... fetch the players inventory item
InventoryItemDefinition itemDefinition = playersInventoryItem.GetItemDefinitionAsync();
```

## PlayersInventoryItemUpdated##playersinventoryitemupdated

このイベントをサブスクライブすると、SDK がプレイヤーのインベントリの特定のアイテムを更新したときに通知を受け取ることができます。サブスクライバーには、更新されたアイテムの `playersInventoryItem` ID が渡されます。

> **Note:**
>
> このイベントは、SDK が開始したアクション (例えば、プレイヤーのインベントリの更新や購入) についてのみ呼び出されます。他のデバイス/サービス側の変更による更新については呼び出されません。

```cs title="C#"
EconomyService.Instance.PlayerInventory.PlayersInventoryItemUpdated += playersInventoryItemID => {
    Debug.Log($"The players inventory item that was updated was {playersInventoryItemID}");
};
```

### InstanceDataDeserializable の使用##using-instancedata

`InstanceDataDeserializable` を使用して、プレイヤーのインベントリの特定のアイテムにカスタムデータを追加します。これは、タイプ `object` として渡され、タイプ `IDeserializable` としてフェッチされます。これを使用して、独自のカスタムクラスをインスタンスデータとして渡すことができます。

例えば、プレイヤーの盾に耐久性レーティングを設定できます。これは `InstanceDataDeserializable` を使用して設定および更新できます。

```cs title="C#"
class MyInstanceData
    {
        public int Durability;
        public string Rarity;
    }

MyInstanceData myInstanceData = new MyInstanceData() { Durability = 100, Rarity = "purple"};
PlayersInventoryItem updatedItem = await EconomyService.Instance.PlayerInventory.UpdatePlayersInventoryItemAsync("playersInventoryItemId", myInstanceData);
```

以下を実行してインスタンスデータをデシリアライズできます。

```cs title="C#"
MyInstanceData fetchedInstanceData = updatedItem.InstanceData.GetAs<MyInstanceData>();
int durability = fetchedInstanceData.Durability;
string rarity = fetchedInstanceData.Rarity;
```
