目次
はじめに
前回の続きです。
以前同じような内容の記事を書いているのでこちらと似たような実装になります。
ただしAp●x風になるよう多少変更を加えています。
▼この記事でできること
解説
①アイコンを押されたイベントの検出
某ゲームではアイテムアイコンを右クリックすることですべて捨てることができます。
その機能を実装するためアイテムアイコンが押されたら検出できるようにします。
WBP_Itemを開きます。
グラフから関数のオーバーライド→OnMouseButtonDownを選択します。
押されたキーが何かを検出するためIsMouseButtonDownで(右クリック)を指定します。
実行してアイコンを右クリックするとログが出ることを確認しましょう。
②アイテム情報の更新
プレイヤーが持つItemDataの情報を更新する関数を作成しておきます。
BP_FirstPersonCharacterを開きましょう。
選択したアイテムを配列から初期化する関数RemoveItemを作ります。
インプットにIndexの番号を持たせ、対象を初期化します。
配列から削除すると長さが変わって管理が大変になるので初期化するようにしました。
それぞれのWBP_Itemで発生したクリックイベントがBP_FirstPersonCharacterのイベントを呼び出すのは、クラス設計者に喧嘩を売るような実装なのでやめます。
そこでイベントディスパッチャーを使用します。WBP_InventoryがWBP_Itemの入力を監視して入力があれば自身のイベントを呼ぶようにすることで、直接的な参照を減らします。
WBP_Itemを開きます。
まず自分が何番目のスロットなのかを記録する変数SlotNumberを作ります。
次にイベントディスパッチャーRemoveItemを作成します。
詳細からインプットSlotNumを追加します。
関数に追記します。ディスパッチャーを呼び出し、ウィジェットから外します。
WBP_Inventoryを開きます。
WBP_Itemを生成した後にIndex番号をSlotNumberにセットします。
カスタムイベントRemoveItemEventを作成し、イベントのバインドを行います。この時引数にInt型のモノがないと接続できないのSlotNumを作成しておきましょう。
プレイヤーキャラの参照を変数化しておきます。
BP_FirstPersonCharacterのRemoveItemイベントを接続すれば完成です。
右クリックしてアイテムアイコンが消えるを確認しましょう。
③自動で詰めるようにしよう
現状拾った順番に追加され、捨てても詰めないのでこれを改善します。
BP_FirstPersonCharacterの持つItemDataからアイコンを表示しているので、この配列内で整頓できればいいことが分かります。
BP_FirstPersonCharacterに関数SortItemDataを作ります。
関数を開いたら関数の中でだけ使用できるローカル変数、CashItemDataとAddIndexCountを作成します。
まずCashItemDataの配列を空っぽにします。
ItemDataに情報が含まれている場合はCashItemDataに追加します。
配列の長さが変わらないようインベントリのスロット数の長さを比較してセットします。
足りない分はデフォルト値を追加します。
最後にItemDataにセットして終了です。
WBP_Inventoryを開きます。
配列から生成するイベントGenerateItemDataを作ります。
少し裏技的ですが配列から直接RemovefromParantでUIを排除します。
イベントのインプット(ST_ItemInfoの配列)から存在するアイテムだけ追加していきます。
BP_FirstPersonCharacterに戻りインベントリ情報を更新するイベンUpdateInventoryUIを作成します。
ブループリントの配列とループ系はネイティブ化しない限り遅いので1フレーム分の遅延ノードを挟みます。
インベントリのアクションと、
WBP_InventoryのRemoveItemEventに追記しました。
実行してみましょう。
途中のアイコンも消すと左にズレれば成功です!
④アイテムをドロップする
このままだと落とすではなく消費するなので、プレイヤーからアイテムを生成する仕組みを作ります。
ST_ItemInfoにクラスをして記録できるようにしてみましょう。
ST_ItemInfoを開きます。
変数の追加からActor型のクラス参照でItemClassを作成します。
スケールも保持したいため
itemScaleも用意しました。
デフォルト値を1,1,1にします。
BP_ItemBaseのインスタンスを開きます。
例:BP_ItemAmmo
BeginPlayから現在のスケールとクラスをセットします。
最後にBP_FirstPersonCharacterに関数DropItemを実装します。
見ている距離300の場所にアイテムを生成します。
WBP_Inventoryを開いて
RemoveItemEventからDropItemEventに変更してあげましょう。
⑤アイテム用のコリジョン設定
プレイヤーのカプセルコリジョンと干渉してしまうのでコリジョンプリセットを作ります。
プロジェクト設定からコリジョンを開きます。
新規オブジェクトチャンネルからItemをBlockで作成します。
PawnのプリセットからItemをオーバーラップにします。
ItemBaseのTypeをitemにして完成です。
実行してみましょう!
最後に
UE4やUE5向けの記事を書いています。
皆様の応援が投稿のモチベーションになりますので
コメントやTwitterのフォローなどしていただけるとありがたいです。
それではよきゲーム開発を。