［UE5］特定の回数乗ったら消える床を作る

# 概要
この記事では、Unreal Engine 5 で、下の動画のような、1回乗るごとにマテリアルが変わり、特定の回数乗ったら消える床を作成します。
ゲームである、残りの乗れる回数とかが表示されていて、乗れる回数が0になったら消える床のようなものです。

<iframe width="640" height="360" src="https://www.youtube.com/embed/gsQv7qBftTU" title="limited use floor 1" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>


# この記事の主な対象者
- Blueprint（BP）の作り方の基礎を習得されている、初心者の方



# 特定の回数乗ったら床が消える床を作る

最初に、下図のようなコンポーネント構成のBPを作成します。

![limitedusefloor_components.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/f9b46888-38df-e795-7f74-d2396c8bd0bd.jpeg)


|コンポーネント名|コンポーネントの種類|備考|
|:-:|:-:|:--|
| DefaultSceneRoot | Scene | このコンポーネントを一番上の親にします。 |
| Box | Box Collision | プレイヤーが床に乗って、床から降りたことを検知することに使用します。 |
| Floor | Static Mesh | 床のメッシュです。上図では「Cube」メッシュをセットし、拡大率を調整して、床のようにしています。 |

上図のコンポーネントを作り終えたら「Box」コンポーネントのサイズと、位置を調整します。プレイヤーが床の上に乗ったときのみ「Box」コンポーネントとプレイヤーが重なるように、下図のように「Box」コンポーネントを配置します。

![boxcollision.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/79b53a06-a5db-21f4-88a0-a93566ba41ce.jpeg)<br><br>


次に、プレイヤーが床から降りたらマテリアルが変わり、特定の回数乗ったら消える床が消える処理を実装していきます。

最初に、処理を実装するにあたって必要とする変数を作成していきます。

上で作成した床のBPのイベントグラフを開き、「float」型の変数「RidingNum」を作成します。プレイヤーが床に乗った回数を記憶しておくことに使用します。

![ridingnum.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/0b1bf800-eecd-a289-f129-140a8760fb02.jpeg)

次に「Material」型の配列の変数「RidingNumToMaterialArray」を作成します。床のマテリアルを、乗った回数に合わせたマテリアルに変更することに使用します。

![ridingnumtomaterialarray.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/8d995b93-8ab1-ae62-e120-269aa6530825.jpeg)

「RidingNumToMaterialArray」のデフォルト値に、床にセットしていきたいマテリアルを設定します。
下図のように設定すれば、プレイヤーが床に1回も乗っていないときは黄緑色のマテリアル、床に1回乗って降りたら黄色のマテリアル、床に2回乗って降りたら赤色のマテリアルになるようになります。
**この配列にセットしたマテリアルの数が、床に乗ることができる回数となるので、注意します。**

![ridingnumtomaterialarray_defaultvalue.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/c77317ff-ef9f-c219-dea1-c92a70ab85ac.jpeg)<br><br>


処理を実装するために必要とする変数の作成が終わったら、処理を実装するために必要となるノードを、イベントグラフ追加します

上で作成した床のBPのコンポーネント一覧から「Box」コンポーネントを選択し、詳細パネルを開きます。

詳細パネルの「イベント」＞「On Component End Overlap」の横にある＋ボタン（下図の赤丸）をクリックします。

![oncomponentendoverlap_add.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/ee0f8f9d-c603-88a5-5982-308d2d1d1208.jpeg)

イベントグラフに、下図のノードが追加されていることを確認します。下図のノードは「Box」コンポーネントにOverlapしていたアクタが、「Box」コンポーネントにOverlapしていない状態になった際に呼び出されます。

![oncomponentendoverlap_node.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/25992e73-0f98-23fa-c01a-581a4986ad02.jpeg)<br><br>


次に、処理の実装で使用する関数を作成します。インプットで受け取ったインデックス番号に対応した「RidingNumToMaterialArray」のマテリアルを取得するための関数です。（今回の記事では、関数の名前を「GetFloorMaterial」にします。）

![getfloormaterial.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/dff73a40-27a2-bd66-9d33-996524506518.jpeg)

「GetFloorMaterial」関数のインプットとアウトプットは、下図のようにします。

![getfloormaterial_inputoutput.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/b9b7d055-f90b-3efc-a6c6-f3faef58c106.jpeg)<br><br>


上図の関数を作成し終わったら、今までに準備した変数やノード、関数を利用して、プレイヤーが床から降りたらマテリアルが変わり、特定の回数乗ったら消える床が消える処理を実装していきます。

下図のノードを組みます。
床がスポーンされた際に、プレイヤーが床に乗った回数を0に設定し直しておくようにするとともに、プレイヤーが1回も床に乗っていないときの床のマテリアルを、床に設定します。

![beginplay_graph.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/b7accc82-e53b-681d-63fd-bcf1ca79269e.jpeg)<br><br>


次に、下図のノードを組みます。
床からプレイヤーが下りたときに、プレイヤーが床に乗った回数を1回増やすとともに、乗った回数に対応したマテリアルに床のマテリアルを更新します。プレイヤーが床にたくさん乗り、床に設定すべきマテリアルがなくなったら、床を消すようにします。

![oncomponentendoverlap_graph.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628167/d2c3eb5d-fbf1-ff69-ea66-dede5f18f662.jpeg)<br><br>


これで完成です。
下の動画のように、プレイヤーが床に乗るごとにマテリアルが変わり、プレイヤーが特定の回数床に乗ったら、床が消えるか確認します。

<iframe width="640" height="360" src="https://www.youtube.com/embed/gsQv7qBftTU" title="limited use floor 1" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<br><br><br>



以上で今回の記事の内容は終了です。
最後まで読んでいただき、ありがとうございました。