56.アイテムを拾う機能を実装する
今回実装する機能↓
では今回はコリジョンのイベントを使用して、プレイヤーがアイテムを拾うというシンプルな機能を実装していきます。
https://youtu.be/vv2l4JpYFJ8
①拾うアイテムを作成する|実践
まずは拾うアイテムをブループリントクラスで作成しまていきます。
サードパーソンのプロジェクトで行っていきます。
コンテンツブラウザでBlueprintsフォルダを用意して右クリック > ブループリントクラス > Actorで作成します。名前をBP_Itemにします。
https://scrapbox.io/files/65c86cde549c5e0025daaf03.jpg
BP_Itemを開きます。そしたらコンテンツドロワーから「SM_Statue」と検索してドラッグでビューポートに追加しましょう。(SM_Statueはスターターコンテンツです)
https://scrapbox.io/files/65c86d11c17f4f0027ca57a4.gif
SM_Statueという名前のコンポーネントが追加されました。
https://scrapbox.io/files/65c86d39e223760024489f99.jpg
このコンポーネントは何?
このコンポーネントはStaticMeshコンポーネントです。コンテンツブラウザからからスタティックメッシュをドラッグで追加しましたが、この場合StaticMesh(スタティックメッシュ)コンポーネントとして追加されます。名前もそのアセット名に変換されます。
なので以下の操作(追加からStaticMeshコンポーネントを追加して、スタティックメッシュをSM_Statueにする)という操作と全く同じ意味になります。
https://scrapbox.io/files/65c86d6c9f4de00025f2ad6f.jpg
🐱スタティックメッシュのコンポーネント追加方法はどちらでも構いませんが、コンテンツブラウザからの方が若干楽かなと思います。
次にこのメッシュは透明な部分があって見えづらいので、見やすくするためにSM_Statueを選択した状態でマテリアル > エレメント0に「M_Metal_Gold」というマテリアルを割り当てておきましょう。
https://scrapbox.io/files/65c86db655d3820025c37c94.jpg
ではコリジョンを付けていきます。追加からSphere Collisionコンポーネントを追加します。
https://scrapbox.io/files/65c86f203b4d4200247c75d4.jpg
SphereCollisionコンポーネントの大きさを大体で良いのでメッシュを覆うぐらいの大きさに変更します。さらに位置も調整しましょう。Rキーで拡大縮小、Wキーで移動です。
https://scrapbox.io/files/65c86f162c9c6a002494e918.gif
Scaleを使用せずに、Sphere Radiusの値を大きくしてもかまいません。
https://scrapbox.io/files/65c86f45cd7c110024b3393b.jpg
コリジョンはメッシュの形と正確でなくても良い?
基本的にはアイテムなどのアクタはそのメッシュの形ではなく、手順で行ったようにSphereCollisionやBoxCollisionなどシンプルな形のコリジョンを使用するケースが多いです。理由はパフォーマンス的にも良いですし、実際のアイテムの形に合わせるより球体の方がアイテムの中心点から均等に範囲が広がって拾いやすかったりするためです。
例えばフォートナイトで落ちているドロップアイテムなどにもSphereCollisionが付いているはずです↓
https://scrapbox.io/files/65c86ffb2c9c6a002494ed94.jpg
という事で基本的にアイテムなどの拾うためのコリジョンはSphereCollisionなどで充分です。といっても必要な場合はスタティックメッシュエディタで正確なコリジョンを付けてもらっても構いません。
🐱ブループリントクラスで作成するアクタのほとんどの場合は手順の様にSphereCollisionコンポーネントやBoxCollisionなどシンプルなコリジョンを追加すると一旦覚えておきましょう。
SphereCollisionコンポーネントを選択した状態でコリジョンプリセットをOverlapAllにします。
https://scrapbox.io/files/65c871c8dbcec000231095f2.jpg
🐱今回はイベントActorBeginOverlapノードを使用するのでコリジョンはオーバーラップの設定となるOverlapAllに選択しておきました。
さらにGenerate Overlap Eventsにチェックが入っている事を確認します。
https://scrapbox.io/files/65c871e891f63d00245a30ec.jpg
これで完成です。レベルに何個かBP_Itemを配置しておきます。
https://scrapbox.io/files/65c8722c70a45e0025dfe2ff.jpg
🐱では続いてBP_Itemを拾えるように実装していきます。
②アイテムを拾う機能を実装する|実践
では作ったアイテムをプレイヤーが拾えるように実装していきます。
BP_ThirdPersonCharacterを開きます。
https://scrapbox.io/files/65c872583b4d4200247c8610.jpg
イベントグラフを開きます。既存のノードは無視で良いです。
イベントActorBeginOverlapノードを作成します。
https://scrapbox.io/files/65c872789f4de00025f2cdfd.gif
イベントActorBeginOverlapとは?
https://scrapbox.io/files/65c872da3d51b9002434f814.jpg
イベントActorBeginOverlapノードを記載したアクタと、他のアクタと重なり始めた瞬間に後続のノードを実行するノードです。OtherActorの出力ピンからは重なった他アクタを出力します。
そのあとに「CastToBP_Item」ノードを追加します。
https://scrapbox.io/files/65c87340f15b63002647391e.jpg
CastTo~ノードとは?
CastToBP_Itemノードは、Objectピンに接続されたアクタが「BP_Item」だった場合に後続のノードを実行させるノードです。CastTo~ノードについて気になる方は以前のページ「CastToノードとは?」をチェックしてみてください。
🐱今回の場合、簡単に言うとCastToノードは重なったアクタが「BP_Item」だったかどうかを判別するために使用しました。
そのあとにDestroyActorノードとPrintStringノードを追加します。PrintStringノードには「アイテムを拾った!」と入力します。
https://scrapbox.io/files/65c874466ad0eb00247849c5.jpg
ノード解説
では作ったノードを解説していきます。シンプルに言うと、他アクタと重なった時にBP_Itemだった場合にBP_Itemを削除するというノードになります。
https://scrapbox.io/files/65c87478d38a770026121149.jpg
①イベントActorBeginOverlapノードで他のアクタと重なり始めた瞬間に処理を実行します。OtherActorピンから重なったオブジェクトを出力します。
②CastToBP_Itemノードで受け取ったアクタがBP_Itemかどうかチェックします。BP_Itemであれば後続のノードを実行します。BP_Itemでなければ後続のノードは実行されません。
③DestroyActorノードでターゲットに入力されたアクタ(BP_Item)を削除します。
④テキスト表示します。
ではプレイしてみましょう。アイテムを拾う機能が実装できました。
https://youtu.be/vv2l4JpYFJ8
これでアイテムを拾う機能実装は以上です。
アイテムを拾うという機能について
「アイテムを拾う」といったノードは無いので、アイテムを拾う場合のノードはこのようにDestroyノードなどを使用して"拾った"ように見せかけます。
例えば拾ったアイテムを所持したい場合などには
①触れたアイテムを名を出力してString型のデータとして保持する
②触れたアイテムをアイテムを削除
といった処理などでアイテムの所持の実装を行います。
《実践演習》
拾ったアイテムの数をセーブする機能を追加しましょう。
①SaveGameクラスを使用します。BP_SaveGameItemという名前です。
②変数名は『SaveGame_ItemAmount』とします。
③BP_ThirdPerosnGameModeに処理を追加していきます。
④SlotName用に、SaveSlotというString型の変数を作成し、デフォルト値をItemSaveDataとします。
⑤DeleteキーでSaveDataを削除できるようにしましょう
⑥BP_ThirdPersonChaeacterに、SaveGame_ItemAmountの値をプラスする処理を追加し、加算出来たらセーブする処理を加えます。
答えBP_ThirdPersonChaeacter
https://blueprintue.com/blueprint/m9-scy4r/
答えBP_ThirdPersonGameMode
https://blueprintue.com/blueprint/kxhqidqq/