執筆: HK
はじめに
前回、クリックで箱を吹き飛ばすように動かせる処理を実装してみました。
今回は、前回実装したものを応用してゲームを作っていきたいと思います。
これからつくるゲームは、箱を吹き飛ばしながら細い通路を通してゴールに導くゲームです。箱が通路から落ちたらリスタート、すべての箱がゴールに収まればゲームクリアというルールを想定して実装していきます。
簡単にするためにLevel Blueprintにしか実装しませんので、Blueprint初心者でも簡単に進められる内容になっていると思います。
実行環境
必要なActorを配置する
TextRenderを配置する
ゴールに入っていない残りのターゲット数を示すためにTextRenderを使用します。
Level Editorの左側にある「Place Actors」からTextRenderをViewportにドラッグ&ドロップして2つ配置します。
TextRenderの片方に「Target:」、もう片方に「10」とTextを設定します。
Textの設定はDetailsのTextから行うことができます。
役割をわかりやすくするために、WorldOutlinerから「Target:」と入力したほうのTextRenderは「TextRender_Target」、「10」と入力したほうには「TextRender_TargetNumber」に名前を変更します。
TriggerBoxを配置する
ゴールに入っていない残りのターゲット数を示すためにTriggerBoxを使用します。(Place Actor上での表記は「Box Trigger」です。)
Level Editorの左側にある「Place Actors」からBox TriggerをViewportにドラッグ&ドロップして1つ配置します。
TextRenderの近くに配置しておきましょう。
以上で、必要なActorの配置は完了です。
Level Blueprintに実装する
変数と配列を追加する
変数RemainingTargetを追加する
ここからはLevelBlueprintに実装をしていきます。
まずは、ターゲット残数として利用するRemainingTargetを追加します。
Remaining TargetはInteger型の変数として設定します。
配列TargetCubesを追加する
次に、TargetCubeのObjectReferenceの配列であるTargetCubesを追加します。
以上で、今回使用する変数と配列の追加は完了です。
関数 UpdateRemainingTarget を実装する
次に、設置したTextRenderのTextを書き換える関数を実装します。
Textを書き換える機会は「ゲーム開始時」「ゴールにTargetが入った時」「ゴールからTargetが出た時」といろいろな部分で生じますから、それぞれの場所で処理を実装するよりは、関数にして共通化してしまったほうが良いでしょう。
画像のように、TextRender_TargetNumberのTextにRemainingTarget(ターゲット残数)をSetする処理を書きます。
開始時処理を実装する
ゲーム開始時の処理を書きます。
Actor配置時にTextRender_TargetNumberのTextには「10」と書きましたが、Levelに配置しているTargetCubeの数が変わるたびに人力で書き直すのは手間でありますし確実性がありません。
GetAllActorsOfClassノードを使用して、Levelに存在するTargetCubeを取得して配列として持っておきます。また、配列の長さはTargetCubeの数でありますのでRemeiningTargetにSetしておきます。最後に、UpdateRemainingTargetでTextRenderを更新します。
TargetCubeがゴールに入った時の処理を実装する
TargetCubeがゴールに入った時の処理を実装します。
OnActorBeginOverlap(TriggerBox)イベントで、TargetCubeがBeginOverlapした際にRemainingTargetの数を1減らしてTextRenderを更新する処理です。
ここでTargetCubeに限らず処理をしてしまうと、例えばプレイヤーがゴールに入った時もターゲット残数が減ってしまうバグが生じるので気を付けましょう。
ゲームクリア時の処理として、TargetCubeを全部消してTextRenderに「COMPLETED!!」と表示する処理も書いておきます。
TargetCubeがゴールから出た時の処理を実装する
「TargetCubeがゴールに入った時の処理」のだけだと、ゴールにTargetCubeが入った後に再び出てしまった時にターゲット残数が実際とかけ離れてしまいます。
そのため、「TargetCubeがゴールから出た時の処理」を実装していきます。
OnActorBeginOverlap(TriggerBox)イベントで、TargetCubeがEndOverlapした際にRemainingTargetの数を1増やしてTextRenderを更新する処理です。
テストプレイ①
ゲームクリアまでの処理を実装したので、テストプレイをしてみましょう。
無事、ゲームクリアの処理が動けばOKです。
次に進みましょう。
ステージの難度を上げる
先ほどのテストプレイの段階では、ゲームの失敗がありませんでした。
そこで、画像のように途中でTargetCubeが落下しかねないステージをつくってみました。
これだけでも遊ぶことができますが、箱やプレイヤーが落下した際にクリアができないままで少々不親切ですので、落下した際にはリスタートする処理を追加していきます。
追加でActorを配置する
Level全体の底を覆うように新規のTriggerBoxを配置します。
Level Blueprintでリスタート処理をする
先ほど配置したTrigerBox(TriggerBox2)に何かが触れるとリスタートされる処理を書きます。
ついでに、Rキーの押下でもリスタートができるようにしておくと便利です。
テストプレイ②
リスタート処理が動作することを確認しつつ、ゲームクリアを目指しましょう!
まとめ
今回は、TriggerBoxとTextRenderを利用し、Level Blueprintへの少しの実装だけで簡単なゲームを作成してみました。
このようにUnreal Engine 4では高速にプロトタイピングができて楽しいですね。
テストプレイ中に思いつく様々なアイディアを実装していくと、どんどんUE4を使いこなせるようになっていくと思います!