AG11.レベル遷移を実装する
今回実装する機能
今回はLEVEL1からLEVEL2へのレベル遷移を実装していきます。
https://scrapbox.io/files/65d478086b036c002558925b.gif
今回実装する機能は以下の二つです。
①クリアした時のテキスト表示をレベルに合わせて変更する機能
②LEVEL1からLEVEL2へのステージに遷移する機能
🐱では、この二つの機能を実装して「LEVEL1」「LEVEL2」のステージを繋げてゲームプレイできるようにしていきましょう!
①クリアした時のテキスト表示をレベルに合わせて変更する
現在ゴールすると「LEVEL1 COMPLETED!」と表示されているのでLEVEL1の部分を「LEVEL2」のように現在のレベルに合わせてテキストを変化させる処理をまずは作っていきます。
https://scrapbox.io/files/65d47844bd59a70025c8eeeb.gif
まずはWBP_Goalを開きます。
https://scrapbox.io/files/65d4785b392aba002dcaf306.png
LEVEL1 COMPLETED!のTextウィジェットの名前をブループリントで使用するので、「COMPLETED_TextBlock」にウィジェットの名前を変更しておきます。
https://scrapbox.io/files/65d4788ba0396c0025759db3.jpg
COMPLETED_TextBlockにIsVariableにチェックを入れて変数化しておきます。
https://scrapbox.io/files/65d478bbdc6c94002e78d3c1.png
そのままWBP_Goalのグラフを開きます。
https://scrapbox.io/files/65d478cb4185450024aba458.png
WBP_Goalのグラフを開いて以下のノードを作成します。イベントConstructノードから、GetCurrentLevelNameを作成します。その後Appendノードを作成します。一度「ピンを追加」をクリックしてAにGetCurrentLevelNameノード,BにShift+Enterで改行,Cに「COMPLETED!」と入力します。最後にCOMPLETED_TextBlockのテキストをセットします。'
https://scrapbox.io/files/65d478f54185450024aba7f4.jpg
COMPLETED_TextBlockは変数から追加します。
https://scrapbox.io/files/65d4795d5a41300025c37584.png
ノード解説
イベントConstructはイベントBeginPlayと同じでゲーム開始時または、ウィジェットブループリントが生成されたタイミングで起動します。つまり、ゴールした瞬間にこのノードは起動します。GetCurrentLevelNameで現在のレベル名を取得します。その「レベル名」+「(改行)」+「COMPLETED!」でテキストを結合して「LEVEL2(改行)COMPLETED!」にしています。
😺これでLEVEL2のレベルの場合は「LEVEL2 COMPLETED!」と表示され、LEVEL1の場合は「LEVEL1 COMPLETED!」と表示されるようになりました。
プレイしてみましょう↓「LEVEL2 COMPLETED!」と表示されるようになりました。
https://scrapbox.io/files/65d479b0db985a0025289a29.gif
これでLEVEL3やLEVEL4というステージを作成した時も自動でテキストが変更されます。
通しでLEVEL2プレイした感じです↓
https://youtu.be/YbQQ-OlMsH0
なお、動画の途中で行っていますがアクタを右クリック > ここからプレイでステージの中盤からプレイする事もできるので活用していきましょう。
😺次にLEVEL1からLEVEL2へのステージ遷移の機能を実装していきます。
②レベル(ステージ)の遷移を実装する
ではLEVEL1のステージをクリアしてNextボタンをクリックするとLEVEL2のステージが開始されるように実装していきます。
LEVEL1のステージを開いておきます。
https://scrapbox.io/files/65d47a536eab9e002584e2cc.png
WBP_Goalを開きます。
https://scrapbox.io/files/65d47a6f2c1af90024e959e4.png
NEXTと書かれた部分のButtonウィジェットの名前を「NEXT_Button」としておきます。
https://scrapbox.io/files/65d47a7d63f2e300262c9b95.png
NEXT_Buttonを選択した状態でOnClickedボタンのプラスボタンを押します。
https://scrapbox.io/files/65d47accbd59a70025c90cba.jpg
OnClickedノードが作成されました。
https://scrapbox.io/files/65d47ae9392aba002dcb1796.png
OnClickedノードはこのボタンを押した時(正確には押して離した瞬間)に後続のノードが起動するノードです。
ボタンイベントの種類を復習しておこう!
https://scrapbox.io/files/65d47b2176c42100253b2003.jpg
他のイベントを復習しておくと以下になります↓
OnPressedはボタンが押された瞬間のイベント
OnReleasedはボタンが離された瞬間のイベント
OnHoverdはボタンにカーソルがあてられた瞬間のイベント
On Unhoverdはボタンからカーソルが離れた瞬間のイベントです。
今回作るノードについて
なお今回はレベルは「LEVEL1」と「LEVEL2」の二つしかステージを作っていないので、こんなシンプルなノードにしても良いのですが↓
https://scrapbox.io/files/65d47b56db1c0a0024192a3d.png
本来であれば「LEVEL1」「LEVEL2」「LEVEL3」「LEVEL4」のように複数のレベル(ステージ)を作成します。なので現在のレベルがLEVEL1なら次はLEVEL2、現在のレベルがLEVEL3ならLEVEL4を開くといった感じに現在のステージの一個上のレベルが開けるように実装していこうと思います。
GetCurrentLevelNameノードからRightChopノードを作成して「5」と入力します。そこから++のIncrementIntノードを繋ぎます。
https://scrapbox.io/files/65d47b94854ce10026c121b6.png
RightChopノードとは?
https://scrapbox.io/files/65d47bd9dc6c94002e78fb6b.png
RightChopノードは文字列データの左端から指定した文字数を除いた文字列を出力します。例えば上のようにSourceStringに「AAABBB」、Countに3と入力した場合左端から3文字目までを取り除いた右端の文字を取り出します。下のようにBBBと表示されます↓
https://scrapbox.io/files/65d47c20c26ea00024f00437.png
なので今回組んだノードの場合は現在のレベル名「LEVEL1」となるので左から5文字を除いた数字の部分「1」だけ文字列として取り出す事ができます。
😺このようにstring(文字列)の中から指定の文字を取得したり編集したりするノードはいくつかあるので、「ue4 文字列 操作」などで検索すると一覧記事などが見つかります。
IncrementIntノードから、Appendノードで「LEVEL」の文字と結合します。その後OpenLevelでレベルを開きます。
https://scrapbox.io/files/65d47c5b99dd57002515eae7.png
ノード解説
https://scrapbox.io/files/65d47cb60c7af400284455d0.png
最初にレベル名「LEVEL1」を取得して、RightChopノードで左端から5文字を除いた文字「1」を取得します。その取得した「1」に+1して「2」という数字と「LEVEL」という文字を結合して「LEVEL2」という文字を作って、その文字列を元にレベルを開いています。
LEVEL1をプレイしてみて、NEXTボタンを押すと次のレベル「LEVEL2」に遷移するようになりました。
https://scrapbox.io/files/65d47ce599dd57002515ef1c.gif
ただし、LEVEL2になったらキャラクターが操作不能になっています。
レベル遷移後にキャラクターが操作できない理由は?
レベル遷移後にキャラクターが操作できない理由は、ゴール時の処理として作成したBP_GoalPoint(ゴールを検知するために作ったブループリントクラス)でSetInputModeUIOnlyノードを使用しているためです↓
https://scrapbox.io/files/65d47d410c6cbd0024ca15be.png
SetInputModeUIOnlyノードはゲーム内のキャラなどの操作を不可能にして、UIの操作ができるようにするためのノードです。レベルを変更しても適用され続けるノードらしく、これを解除するには下記で紹介するSetInputGameModeOnlyノードを使用して問題解決する必要があります。
🐱という訳でLEVEL2になったらちゃんとキャラが操作できるように問題解決していきます。
BP_JumperGameModeを開きます。
https://scrapbox.io/files/65d47d9c854ce10026c13586.png
ここまでのBP_JumperGameModeのイベントグラフはこんな感じになっています↓
https://scrapbox.io/files/65d47dad414647002616a2d9.png
BeginPlayとCollapseGraph_Timerの間にSetInputModeGameOnlyノードとGetPlayerControllerを作成します。
https://scrapbox.io/files/65d47dcea6f63200245ed39a.png
SetInputModeGameOnlyノードとは?
SetInputModeGameOnlyは、ゲーム内の操作のみ可能にするためのノードです。これでプレイヤーの操作が可能になります。
プレイしてみてレベル遷移後に操作してみましょう。LEVEL2になってもプレイヤーの操作が可能になっています。
https://scrapbox.io/files/65d478086b036c002558925b.gif
完成!
LEVEL1とLEVEL2通しでプレイした様子です↓
https://youtu.be/0dnjBWXZPtY
🐱という事でLEVEL1とLEVEL2の二つのステージが完成して、レベル遷移もできるようになりました。これでステージ自体はほぼ完成したので、後はセーブ機能やらタイトル画面やら作っていきます。今回は以上です。お疲れ様でした!