AG04.ステージのギミック(触れると落下するステージ)を実装する
😸では今回は最初のステージ「LEVEL1」のステージのギミック、触れると落ちるステージを実装していきます。
プレイヤーが触れた瞬間に、落ち始めるステージを実装していきます。
①触れると落ちるステージを実装する
まずはBlueprintsフォルダでブループリントクラス > Actorを作成してBP_FloatingStageという名前にします。
https://scrapbox.io/files/65d33b7be99324002582f521.png
BP_FloatingStageを開いてビューポートを開いておきます。
https://scrapbox.io/files/65d33bd1e57c7500267aa04b.jpg
StaticMeshコンポーネントを追加して、SM_FloatingIsland_Sを選択します。
https://scrapbox.io/files/65d33bf3b66cf900265c2339.jpg
なおSM_FloatingIsland_Sは二つ表示されますが、どちらでも構いません。下の方を選択しました。
https://scrapbox.io/files/65d33c139a4ecb0025a3e692.png
StaticMeshを選択した状態でトランスフォームの拡大縮小を0.19にします。
https://scrapbox.io/files/65d33c39753dc3002453043c.jpg
そのままイベントグラフを開きます。
https://scrapbox.io/files/65d33c54a37d3300269d8463.jpg
まずはStaticMeshコンポーネントで右クリック > イベントを追加 > OnComponetHitノードを追加します。
https://scrapbox.io/files/65d33c728adcdf0025ee4bcd.jpg
OnComponetHitノードが追加されました。
https://scrapbox.io/files/65d33c902a4e9f00249a8ee2.jpg
OnComponetHitノードとは?
OnComponetHitノードとはこのスタティックメッシュに他のアクタと衝突した時に起動するノードです。
次にCastToBP_Playerノードを作成しておきます。
https://scrapbox.io/files/65d33cbb3678a100252430e8.jpg
CastToBP_Playerノードとは?
CastTo~ノードは対象のブループリントクラスかチェックして、参照を行うノードです。これで他のアクタと衝突した時に、そのアクタがBP_Playerかどうかを判別する事ができます。
その後にDelayノードとSetSimulatePhysics(StaticMesh)ノードを作成します。Delayには1.0と入力します。Simulateにはチェックを入れます。
https://scrapbox.io/files/65d33d5d397d8b002577b08b.jpg
SetSimulatePhysicsノードとは?
SetSimulatePhysicsノードとはSimulatePhysics(物理挙動)を有効にするノードです。物理挙動を有効にすると、重力や外部からの力がこのスタティックメッシュにかかるようになります↓
https://scrapbox.io/files/65d33d934266470024fa455e.gif
コンポーネントをセットする場合のやり方
またSetSimulatePhysicsノードには左のコンポーネントから対象となるスタティックメッシュをドラッグしてセットする事も可能です。
https://scrapbox.io/files/65d33dc21c9451002330d61a.gif
SetSimulatePhysics(StaticMesh)ノードであれば既存でスタティックメッシュのコンポーネントもセットで作成されます。
現在こんな感じのノードです↓
https://scrapbox.io/files/65d33e0427f388002530125f.jpg
ノード解説
プレイヤーが触れたかどうかを検知して、0.2秒後に物理挙動をオンにして落下を開始させます。あまりに早く落下し始めるとゲームとして難しすぎるのでDelayで0.2秒後に落下させるようにしています。
🐱なお下の方でblueprintUEのリンク貼ってあるので詳細に確認したい場合はそちらをご参考ください。
コンパイルします。
一旦これでBP_FloatingStageを適当に数個配置して上手く機能するか確認してみましょう。
https://scrapbox.io/files/65d33ef92adbff00251c9c60.png
前回のページでスタートをデフォルトのカメラ位置にしたので、そのままになっている方はデフォルトのプレイヤースタートに戻しておきましょう。
https://scrapbox.io/files/65d33f298adcdf0025ee5979.jpg
プレイするとこんな感じに落下するようになりました。↓
https://scrapbox.io/files/65d33f40b5ebea00254db516.gif
キャラクターが落下した後の処理については後から実装するのでEscキーでゲームを終了しましょう。また落下しない場合が稀にありますが、この問題については一旦無視します。
🐱次に落下したステージは物理挙動の処理がいつまでたっても行われているので一定の地点まで落ちたら削除する機能を作っていきます。基本的に動かないメッシュであれば問題無いですが、動くメッシュはできるだけ少ない方がパフォーマンス的に良いです。
BP_FloatingStageを再度開きます。
https://scrapbox.io/files/65d33f7d000cc8002556d272.jpg
イベントTickノードを作成してその後にGetWorldLocation(StaticMesh)を作成してRetrunValueを構造体ピンを分割します。Z軸から「<=」と検索してLessThanノードで-5000と入力します。-5000以下になったらDestroyActorで削除します。
https://scrapbox.io/files/65d33fa21c9451002330e151.jpg
GetWorldLocation(StaticMesh)とは?
https://scrapbox.io/files/65d33fdb9a4ecb0025a402c8.png
GetActorLocationのようにアクタの位置を取得できるノードですが、このGetWorldLocationはターゲットのコンポーネント、つまり上の状態だとStaticMeshの位置をVector型で取得できるノードです。要するにコンポーネントのメッシュの位置を取得できるノードになります。
なぜGetActorLocationノードではなく、GetWorldLocation(StaticMesh)なの?
なぜGetActorLocationを使用しなかったかというと、SetSimulatePhysicsノードで重力がかかるのはメッシュの方でメッシュのみが移動する形になります。つまりアクタの位置はそのままでメッシュのみが落下するので、メッシュの位置を取得するGetWorldLocation(StaticMesh)を使用した訳です。
🐱これで落下するステージのメッシュのZ軸が5000以下になった時に削除される機能が追加されました。
一旦プレイしてみて、落下ステージが実際に削除されるか試してみましょう。
https://scrapbox.io/files/65d340554266470024fa6497.gif
配置したBP_FlotingStageが落下し、一定の時間が経過したら削除されてるのが確認できます。
https://scrapbox.io/files/65d3408c93fc700024850100.png
😺これで落下するステージが完成したので、次にステージを配置する作業に移っていきます。
②作ったステージを配置する
では、作ったステージをこんな感じに配置していきます↓
https://scrapbox.io/files/65d340d6c09dc000261f0b89.png
では、BP_FloatingStageをドラッグで配置します。一個配置したら後はAlt+ドラッグで複製していって合計11個ぐらい用意します。
https://scrapbox.io/files/65d341962d1b950024933d69.jpg
位置や回転,拡大縮小などを個別に調整します。最終的にこんな感じになるように配置していきます↓トランスフォームは下に記載しています。
https://scrapbox.io/files/65d341e00ef294002c65a6b0.png
位置や回転、拡大縮小のトランスフォームはご自身で調整してもらって構いません。
プレイしてみます。触れると落ちるステージのギミックが完成しました。
https://scrapbox.io/files/65d342107ff8ba002da4c437.gif
③配置したブループリントクラスに草を生やす
ではBP_FloatingStageにこんな感じ↓に草を生やしていくのですが、
https://scrapbox.io/files/65d3426e4de5ef0025e8dc50.jpg
スタート地点やゴール地点のステージに使用したフォリッジの機能は使用しません。
フォリッジを使用しない理由
フォリッジを使用しない理由は、フォリッジのペイントで草を生やせるのは可動性をスタティックに設定したメッシュのみです(このBP_FloatingStageのメッシュはデフォルトでムーバブルになっており、物理挙動で移動させるためにもムーバブルに設定しておく必要があります)。またフォリッジの塗りつぶしモードというものを使用すれば可動性がムーバブルのアクタでもクリックする事で草を生やす事ができますが、BP_FloatingStageが落下した際に草はついてきません。つまりフォリッジの機能ではムーバブルに設定したアクタには草を生やす事はできません。なのでBP_FloatingStageにもフォリッジの機能で草をペイントして生やす事ができません。
🐱整理するとフォリッジは可動性が「スタティック」のアクタ、つまり地面などの動かないアクタにしか基本的に塗れません。可動性というのは簡単に言うとゲーム中にそのアクタが移動するかしないかの設定で、移動するアクタにはムーバブルを、移動しないアクタにはスタティックを選択するというものでした。なので今回のBP_FloatingStageはゲーム中に動くので「ムーバブル」になっており(デフォルト設定)、ムーバブルのアクタに対してはフォリッジは基本的に適用できないという事になります。ではどうするのかというと、手動で配置すれば良いだけです。
まずはBP_FloatingStageを開きます。
https://scrapbox.io/files/65d34383afa7b600240f1e2a.png
追加からStaticMeshを追加します。
https://scrapbox.io/files/65d343998dc56a00257bf9a4.png
StaticMesh1を選択した状態で、StaticMeshをSM_Grass_Lt_02を選択します。他の草のメッシュでも構いません。
https://scrapbox.io/files/65d343c6b76ea9002418d679.png
影は必要ないのでCastShadowのチェックを外しておきます。
https://scrapbox.io/files/65d343e07b9b760024674799.png
トランスフォームを以下の値にしておきます。
(X=272.432324,Y=10.066980,Z=0.000001)
(Pitch=0.000000,Yaw=-146.471174,Roll=0.000000)
(X=5.263158,Y=5.263158,Z=5.263158)
https://scrapbox.io/files/65d343fe8a920300258b2c9e.png
確認してみましょう。こんな感じになりました↓
https://scrapbox.io/files/65d344160a7d2e002b6255e3.png
BP_FloatingStageが落下しても草はちゃんとステージのメッシュに付随して落下していくのが確認できます。
https://scrapbox.io/files/65d344310a7d2e002b62573a.gif
では最後に、フォルダにBP_FlotingStageをまとめておきましょう。Shift+クリックでBP_FlotingStageを全て選択して、右クリック > 移動先 > 新規フォルダを作成します。
https://scrapbox.io/files/65d3444cfc51620025c1062d.png
名前をBP_FlotingStagesにします。
https://scrapbox.io/files/65d34464b5ebea00254de27a.png
今の所、こんな感じのアウトライナ―になっています↓
https://scrapbox.io/files/65d3447bc09dc000261f2eb8.png
このページはこれで以上になります。
触れると落ちるステージギミック完成!
プレイしてみて問題ないか試してみましょう。
https://youtu.be/Jag_Bjvt850