アイテムとインベントリの基本的な考え方

ゲーム内でアイテムを拾って、インベントリで管理する時の基本的な考え方。

今回は三人称テンプレートを使用しました。バリアントは不要です。

  • プレイヤーキャラクターBPにインベントリ用のアクタコンポーネントを追加し、そのアクタコンポーネントに変数(配列)を作り、それがアイテム箱になります。
  • アイテムは2つの構造体と1つのデータテーブルで構成します。
    S_Item、S_Slot、DT_Item
  • Cast to *****は負荷が大きくなるので使用しない。ブループリントインターフェースを使用します。

アイテム管理は複雑であり、5つくらいのプロジェクトでアイテム管理システムを導入すれば、ようやく理解できてきます。

今回、UIに関しては必要最低限の説明しかしていません。UIの装飾は自由にやってください。

構造体 S_Item

この構造体では、名前、サムネイル、メッシュ、価格など、アイテムに必要な要素を設定します。

コンテンツブラウザで右クリックして ブループリント > 構造体
名前はS_Itemにします。

S_Itemを開き、+変数を追加をクリックして構造体を追加します。
今回はシンプルにNameとMeshを設定しました。

  • Name – Text
  • Mesh – スタティックメッシュ

例えば回復アイテムを作る場合は、Heal – Floatを追加します。

データテーブル

さきほど作成した構造体を用いて「やくそう」「どくけしそう」「キメラのつばさ」などのアイテムを設定するのがデータテーブルです。

コンテンツブラウザで右クリックして その他 > データテーブル
「構造体を選択」というウィンドウが開きますからS_Itemを指定。
名前はDT_Itemにします。

DT_Itemを開いて+追加をクリックするとアイテムの設定ができます。
入力が必要なのは「行の名前」と「Name」と「Mesh」です。

  • MedicinalHerb – やくそう
  • AntidotalHerb – どくけしそう
  • ChimaeraWing – キメラのつばさ

「Mesh」は適当に選択してください。
アイテムをレベルに配置した時に表示されるスタティックメッシュになります。

構造体 S_Slot

構造体をもう1つ作成します。
名前はS_Slot。

こちらの構造体では、ItemID、数量、装備中か?などを設定します。

  • ItemID – Data Table Row Handle
  • Quantity – Integer
  • Equiped – Boolean

ItemIDはデータテーブルの「行の名前」を引っ張るためのものです。
数量、装備中か?などはゲームプレイ中に変化がある要素です。
先に作成したS_Itemで設定したものは基本的にゲームプレイ中に変化がない要素です。

ブループリントインターフェース

アイテムとプレイヤーキャラクターの連携にはブループリントインターフェースを使用します。

やってはいけないのが、Cast to *****での連携です。注意書きにも「負荷が大きくなることがあります」と書いてあるように、レベルに多数配置する可能性のあるアイテムアクタでCast to *****を使用すると、かなり負荷が大きくなります。

コンテンツブラウザで右クリックして ブループリント > ブループリントインターフェース
名前はBPI_Playerにしました。プレイヤーキャラクターに持たせるインターフェースです。

関数の追加

名前: GetItem
インプット: Item – S_Slot
インプット: Ref – アクタ

アクタ BP_Item

アイテムのアクタを設定します。
このアクターをレベルに配置して、プレイヤーが接触するとアイテムを獲得できるようにします。

コンテンツブラウザで右クリックして ブループリント クラス > アクタ
名前はBP_Itemにします。

変数の作成

SlotS_Slot
・型は作成したS_Slotです。
・詳細の「インスタンス編集可能」と「スポーン時に公開」にチェックを入れる。「インスタンス編集可能」にチェックを入れていると、レベルに配置してからこのアクタが何のアイテムであるかを設定できます。
・詳細の「デフォルト値」のデータテーブルをDT_Itemにします。Quantityは1の方が良いでしょう。

このアクタをレベルに配置すると、詳細のItem > ItemID > 行の名前で「MedicinalHerb」「AntidotalHerb」「ChimaeraWing」らの指定ができます。

コンポーネント

コンポーネントに+追加 > スタティックメッシュコンポーネント
スタティックメッシュコンポーネントの詳細の コリジョン > コリジョンプリセット はNoCollisionにしておきます。
コリジョンがあっても良いのですが、今回はMeshをテキトーに設定したため、Meshがデカすぎて当たり判定となるSphere Collisionよりもデカくなっている可能性があるからです。

スタティックメッシュコンポーネントの下に+追加> Sphere Collision

ノードの作成:指定したアイテムのメッシュを表示

Construction Scriptを編集します。

・変数ItemをGetして配置。そのピンで右クリックして「構造体ピンを分割」します。
・さらにItem Item IDのピンで右クリックして「構造体ピンを分割」します。
Get データ Table Row(データテーブル行を取得)外側の列から線を伸ばしてS_Item を分解を選択。
S_Item を分解もしくはS_Slot を分解は、ノードが出にくい時があります。「状況に合わせた表示」のチェックを外して、「S Item を分解」と検索すればでます。「_」を入れちゃうと検索しても出ません。

例えばレベルに配置した時に詳細のItem > ItemID > 行の名前で「MedicinalHerb」を指定すれば、データテーブルで設定してあるMeshがこのアクタに適用されるわけです。
ノードの作成:プレイヤーとの接触

イベントグラフを編集します。
コンポーネントのSphereを選択し、詳細のOn Component Begin Overlapをクリック。

・こういう時にCast to *****を使ってはいけません。レベルにアイテムアクタを複数配置すると負荷が大きくなり過ぎます。

ウィジェットブループリント W_InventorySlot

アイテムリストの中に格納される個別のスロットです。

コンテンツブラウザで右クリックして ユーザーインターフェース > ウィジェットブループリント
親クラスはユーザーウィジェット
名前はW_InventorySlotにします。

デザイナーの編集

右上の「Fill Screen」を「Desired on Screen」に変更します。

これもUIの装飾は自由にやってください。

必要なのはサイズボックスとボタンとテキスト2種です。

サイズボックスは、
Width Override: 300
Height Override: 40

サイズボックスの中にオーバーレイを入れました。
Horizontal Alignment: 一番右(横全体に広げる)
Vertical Alignment: 一番右(縦全体に広げる)

オーバーレイの中にボタンとHorizontal Boxを入れました。
階層ではボタンが上部、Horizontal Boxを下部に配置します。
Horizontal Boxにテキストを入れるため、下部に配置しないとボタンにテキストが隠れてしまいます。

Horizontal Boxの中にテキストを2つ配置します。
1つはText_Nameにして、Is Variableにチェックを入れて変数化します。
もう1つはText_Quantityにして、Is Variableにチェックを入れて変数化します。
位置やサイズ調整は適当に設定してください。今回はアイテム管理のやり方がメインですから、UIは必要な変数さえあれば良いです。

グラフ:変数の作成

ItemSlotS_Slot
・詳細の「インスタンス編集可能」と「スポーン時に公開」にチェックを入れる。

InventoryIndexInteger
・今回は使用しない変数ですが、W_Inventoryに格納された時、このW_InventorySlotが何番目にあるか知っておくための変数です。

グラフ:ノードの編集

ボタンのイベント On Clickedにアイテムを使用した時の処理を書くわけです。

ウィジェットブループリント W_Inventory

アイテム用のUIであり、アイテムリストです。

コンテンツブラウザで右クリックして ユーザーインターフェース > ウィジェットブループリント
親クラスはユーザーウィジェット
名前はW_Inventoryにします。

デザイナーの編集

UIの装飾は自由にやってください。

必要なのはWrap Boxのみです。
Wrap Boxの名前はWrapBox_ItemList。
Is Variableにチェックを入れて変数化します。
サイズX: 300 / サイズY: 600
Orientation: Vertical ※縦並びにするためのものです

このWrap Boxの中にW_InventorySlotが格納されます。

グラフ:ノードの編集


カスタムイベント UpdateItemsのインプットは、SlotsS_Slot※配列です。このイベントは、アイテムを入手したタイミングで起動させることになります。

アクタコンポーネント BPC_Inventory

キャラクターブループリントにアクタコンポーネントをセットしてインベントリの管理をします。
キャラクターブループリントのみで管理しても良いのですが、アクタコンポーネントを使用した方が汎用性があり、複数のプレイアブルキャラクターのアイテム管理ができたりします。

変数の作成

ItemsS_Slot ※配列
・この変数がアイテムを入れる箱です。複数のアイテムを入れる箱ですから、型を配列にする必要があります。

NewItem?Boolean
・取得したアイテムが未入手アイテムであるか、入手済アイテムであるかを分別するための変数です。

ノードの編集:イベント Begin Play


・W_Inventor ウィジェットを作成し、変数化します。

ノードの編集:関数 Add Item


関数 Add Itemのインプットは、
Slot – S_Slot

関数 Add Itemは、アイテムを入手した時に起動します。
アイテム箱(Items)のアイテムと入手アイテムの名前を比較して、同じ名前であれば数量を足す。
同じ名前のアイテムがなければ、新規入手アイテムですからアイテム箱(Items)の配列に加える。

キャラクター BP_ThirdPersonCharacter

ブループリントインターフェースの設定

クラス設定 > インターフェース > 実装インターフェース にBPI_Playerを指定。

そうするとマイブループリントの欄に インターフェース > GetItemが追加されます。
そのGetItemをダブルクリックしてノードを配置。

ノードの編集:インターフェース イベント GetItem


・アイテム入手がTrueだったら、アイテムアクタをDestroyします。

ノードの編集:インベントリUIの表示

動作テストとして、簡易的にIキーでインベントリUIを表示させます。

テストプレイ

BP_Itemをレベルに6つ配置します。
配置したBP_Itemの詳細の デフォルト > Slot > ItemID > 行の名前を設定します。
MedicinalHerbを3つ、AntidotalHerbを2つ、ChimaeraWingを1つ。

テストプレイしてアイテムを回収すると、インベントリにやくそうx3、どくけしそうx2、キメラのつばさが入ります。

コメント

タイトルとURLをコピーしました