薬草を拾うと9個まで増え、10個目は持てない。カバン全体が満杯になっても、薬草を使えば、そのぶん別のアイテムを入れられる。今回は、そんな持ち物の仕組みを作ります。
インベントリ は、「何を、いくつ持っているか」を管理する仕組みです。アイテムの説明、個数の増減、画面表示を一度に作ろうとすると、どこを直せばよいか見えにくくなります。まずは、薬草の性質と、自分が持つ薬草の数を分けるところから始めましょう。
この記事でわかること
- アイテムの定義と、プレイヤーごとの所持数を分ける
- 種類ごとの上限と、カバン全体の容量を守って増減する
- 薬草を1個使い、CharacterのHPを回復する
- 所持数が変わったときだけ、簡単な持ち物表示を更新する
Blueprintの変数・関数・Branchを使える人向けの実践です。Data Asset、Map、Actor Componentを組み合わせます。Third Personテンプレートの1人プレイで、キー入力を「拾う」操作の代わりに使います。
薬草の性質と、持っている数を分ける
薬草を3個持つ人も、9個持つ人も、1個使ったときの回復量は同じです。この「薬草とは何か」という共通の情報を 定義 と呼び、Data Assetへ置きます。
一方、「自分はいま3個持っている」は、そのプレイヤーだけの 所持状態 です。こちらはカバン側で管理します。
| 分けるもの | 薬草の例 | 置き場所 |
|---|---|---|
| 定義 | 表示名は薬草、回復量20、上限9個 | DA_Herb |
| 所持状態 | DA_Herbを3個持っている | Inventory ComponentのItems |

分けておくと、回復量を20から25へ調整するときは、定義を1か所直せます。所持品ごとに回復量のコピーを持たせていると、そちらも更新する必要があります。今回の所持データには、どの定義を使うかという参照と、個数 を入れます。
今回は、1種類につき1つの個数を持つ
Map は、「調べるためのキー」と「対応する値」を組にして持つ入れ物です。今回は、アイテム定義をキー、所持数を値にします。DA_Herbを渡せば、薬草の個数を取り出せます。

| 欲しいカバン | 扱いやすい形 |
|---|---|
| 薬草9個、鍵1個のように、種類ごとの合計だけ分かればよい | 今回のMap |
| 薬草を「9個の枠」と「1個の枠」に分けたい | スロットの配列 |
| 同じ剣でも耐久値72と13を区別したい | 個体の情報を持つ構造体の配列など |
スタック は、同じ種類をまとめて持つことです。今回はMapなので、薬草は合計9個で上限とし、10個目を別枠へ回しません。また、容量15は「15種類」「15枠」ではなく、全種類を合わせて15個 です。このルールを先に決めてから作ります。
準備:4種類の定義とカバンを作る
1. アイテム定義を作る
Third PersonのBlueprintプロジェクトを使います。Variantを選べる版ではNoneを選び、標準のBP_ThirdPersonCharacterで進めます。
コンテンツブラウザで右クリックし、「Blueprint Class → All Classes」からPrimary Data Assetを親にして、BPDA_ItemDefinition を作ります。次の変数を追加し、すべてInstance Editableを有効、Privateを無効にして、コンパイル・保存します。
| 変数名 | 型 | 初期値 |
|---|---|---|
| DisplayName | Text | 空欄 |
| MaxStack | Integer | 1 |
| HealAmount | Float | 0.0 |
続いて「Miscellaneous → Data Asset」でBPDA_ItemDefinitionを選び、4枚作ります。Blueprintのクラスを複製する操作ではなく、値を入れるデータを作る操作です。
| アセット名 | DisplayName | MaxStack | HealAmount |
|---|---|---|---|
| DA_Herb | 薬草 | 9 | 20.0 |
| DA_Potion | ポーション | 5 | 50.0 |
| DA_Key | 鍵 | 1 | 0.0 |
| DA_Bomb | 爆弾 | 3 | 0.0 |

今回は名前と個数を表示する ので、アイコン画像の準備は不要です。データの型と実データの違いは、Data Assetの記事でも説明しています。
2. 所持数を管理するComponentを作る
Actor Componentを親に BP_InventoryComponent を作ります。ComponentはActorへ付け足せる機能の部品です。カバン自体の位置は必要ないので、Scene ComponentではなくActor Componentを使います。
| 用意するもの | 名前 | 設定 |
|---|---|---|
| 変数 | Items | キーがBPDA_ItemDefinitionのObject Reference、値がIntegerのMap。初期値は空。Privateを有効 |
| 変数 | MaxCapacity | Integer、初期値15。Instance Editableを有効 |
| Event Dispatcher | OnInventoryChanged | 入力なし |
Itemsの型をBPDA_ItemDefinitionの Object Reference にし、コンテナをMapへ切り替え、右側の値の型をIntegerにします。Class Referenceを選ばないようにしてください。

Event Dispatcher は、登録した相手へ「変わりました」と知らせる仕組みです。「My Blueprint」のEvent DispatchersからOnInventoryChangedを追加します。通知を受け取る表示側は後で作ります。
Itemsは外から直接書き換えず、これから作るAddItemとRemoveItemを通して変更します。上限の確認や通知を、この2つの入口へまとめるためです。