AG07.ゲームのリスタートを実装する
😸では今回はプレイヤーの落下時にゲームのリスタートを行う機能を追加していきます!
今回実装する機能
今回はプレイヤーが落下したらゲームをリスタートする機能を実装していきます。
https://youtu.be/9Y3ICYhxo0M
🐱今回は前回と違って結構シンプルな手順になります。
①ゲームのリスタート機能を実装する
ではまず現時点のデフォルトでは何も設定していないのにも関わらず落下するとキャラクターは何故か消えてしまいます。
https://scrapbox.io/files/65d3db787fcd8000275375a9.gif
プレイヤーが落下すると消える理由
これはサードーパーソンのテンプレートプロジェクトでは「killZ」が設定されているためです。killZとは、プレイヤーが落下した時に位置のZ軸を元に消える設定です。では設定を変えていきましょう。
設定 > ワールドセッティングを開きます。ワールド > キルZがデフォルトだたと-1000になっています。キルZが-1000になっている事でプレイヤーのZ軸が-1000になった時点でプレイヤーが消える設定になっています。今回はキルZは使わないので-999999とかにしておきます。
https://scrapbox.io/files/65d3dc34cb588d0024bc00bb.jpg
これでプレイヤーが落ちてもしばらくは消えなくなりました。
😸では落下した時のリスポーン機能ですが、今回の実装方法としては見えないブロックを設置して、そのブロックに触れたらOpenLevelノードで再度同じレベルを開くという形にしていきます。
BlueprintsフォルダにActorのブループリントクラスを作成、BP_RespawnBlockという名前にします。
https://scrapbox.io/files/65d3dc52a2c1ce0024494ecd.jpg
BP_RespawnBlockを開いてBoxCollisionを追加します。サイズ等はそのままで良いです。
https://scrapbox.io/files/65d3dc60b66cf900265ff3ed.png
Boxを右クリック > イベントを追加OnComponetBeginOverlapを選択します。
https://scrapbox.io/files/65d3dcfe397d8b00257b869d.jpg
OnComponetBeginOverlapノードの発動条件とは?
https://scrapbox.io/files/65d3dd1d802397002630130b.png
OnComponetBeginOverlapノードの発動条件は衝突する二つのアクタの内、一つがOverlap(衝突はしないが重なりを検知する)の設定になっている時です。つまりどちらかのアクタがOverlapの設定になっていれば起動します。
Boxコリジョンがプレイヤーに対してOverlapになっているか確認しよう
つまりBoxコリジョンがOverlapであればOnComponetBeginOverlapノードが起動するのでせっかくなので確かめてみましょう。Boxコリジョンを選択して、コリジョン > コリジョンプリセットがOverlapAllDynamicになっている事がまず確認できます↓
https://scrapbox.io/files/65d3dd4dd8659500246bb256.jpg
このOverlapAllDynamicのコリジョンプリセットの設定はプロジェクト設定 > Collision > Presetから確認する事ができます↓
https://scrapbox.io/files/65d3dd938f06780025d9f2f1.jpg
OverlapAllDynamicの項目を開くとPawnに対しては真ん中の列オーバーラップの項目になっています。(テキストがバグで見えないですが真ん中の列はオーバーラップです)。キャラクターのコリジョンとなるCapsuleComponentのコリジョンプリセットを見るとPawnになっています↓
https://scrapbox.io/files/65d3ddcfa1e8660025921916.jpg
RespawnBlockがPlayerとの衝突判定はオーバラップ、つまり「衝突しないが重なりを検知する」という設定になっているのでOnComponetBeginOverlapのノードが起動します。例えば二つのアクタが相互にブロック、つまり「衝突させる」設定にしてあるとOnComponetBeginOverlapは起動しないので注意が必要です。このあたりはコリジョンの章で詳しく解説しています。
😺要するにOnComponetBeginOverlapを発動するには衝突するオブジェクトのどちらがオーバラップの設定になっている必要があるという事です。このノードが上手く起動しないというケースがよくあるので、その場合はコリジョンプリセットなどの設定を確認する事をおすすめします。
ではRespawnBlockのノードから以下の様に作成します。CastToBP_PlayerノードからGetCurrentLevelName,OpenLevelノードを繋げます。
https://scrapbox.io/files/65d3de252a4e9f00249ea670.png
ノード解説
これでBP_PlayerがRespawnBlockに触れた時に、OpenLevelでレベルを開きなおします。OpenLevelノードは開くレベルの名前が必要なので、GetCurrentLevelNameノードで現在のレベルの名前を取得しています。
そしたらこのRespawnBlockをステージの下あたりに配置します。
https://scrapbox.io/files/65d3dec493fc70002489650f.png
サイズをステージ全体を覆うように大きくします。
https://scrapbox.io/files/65d3df14f4d1a90025eea993.jpg
トランスフォームはこんな感じになりました↓がざっくりで構いません。
位置 (X=4982.256972,Y= - 3169.525810,Z= - 1175.490009)
回転 (Pitch=0.000000,Yaw=0.000000,Roll=0.000000)
拡大縮小 (X=226.752640,Y=134.614441,Z=1.000000)
https://scrapbox.io/files/65d3df2414b7d400256889e0.png
リスタート機能完成!
プレイしてみましょう。落ちてRespawnBlockに触れたらレベルがリセットされて開きます。
https://youtu.be/9Y3ICYhxo0M
今回はこれで以上になります。また現状コインは拾った分はリセットされてしまうのでその点については後からコイン枚数を引き継ぐようにしていきたいと思います。
😸今回はゲームを簡単にリスタートする機能を実装しました。リスタート機能の実装方法としては他にもレベルリセットせずにキャラの位置をスタート地点に移動させるなどそういった方法もあります。その際はタイマーなども既存のデータもリセットされるようにノードを組む必要がありますが簡単な方法としてはこんな感じにレベルリセットが楽かなと思います。という事で今回は以上です。お疲れさまでした!