「リスポーン」の概要
STEP4-3では、トゲに触れると「やられた!」と画面に表示するところまで作りました。今回は、トゲに触れた時に操作キャラクターが倒れるゲームオーバーの機能と、ゲームオーバー後にキャラクターが復活するリスポーンの機能を作ります。
リスポーン(respawn)とは、ダメージを受ける、ステージ外へ落下するなどの理由で操作を失ったキャラクターを指定した位置に再配置すること。STEP4-3で制作したプロジェクトをもとに、設定の手順を解説します。
トゲがキャラクターにダメージを与える処理を作る
最初に、「トゲに触れたキャラクターが倒れて消える」というゲームオーバーの演出を作ります。前回作ったブループリント「DamageNeedle」と、操作キャラクターのブループリントである「BP_ThirdPersonCharacter」にノードを追加していきます。
トゲに触れると、キャラクターが「ダメージ」を受けるようにします。
「DamageNeedle」を開き、前回追加したPrintStringの続きに「ApplyDamage」を追加します。ApplyDamageは指定した相手にダメージを与えるノードです。
ApplyDamageの「DamagedActor」にダメージを与える相手を設定します。今回はプレイヤーが操作しているキャラクターにダメージを与える設定にしたいので、「GetPlayerPawn」を追加します。GetPlayerPawnをDamagedActorに繋ぐことで、プレイヤーが操作しているキャラクターにダメージを与えることができるようになります。
次に、ApplyDamageの「BaseDamage」欄で与えるダメージ量を設定します。BaseDamageは10.0に変更してください(初期値の0.0では、ノーダメージになってしまいます!)。
これで、トゲ側(DamageNeedle)のブループリントは完成です。
ダメージを受けたキャラクター側の処理を作る
次に、ダメージを受けたキャラクター側の処理を作っていきます。プレイヤーが操作していたキャラクターのブループリント「BP_ThirdPersonCharacter」を開きます。
ダメージを受けた時にイベントが実行される「EventAnyDamage」を追加します。
ダメージを受けたらキャラクターが倒れる処理を追加します。
まずは「SetAllBodiesSimulatePhysics」と「SetCollisionEnabled」を追加します。
SetAllBodiesSimulatePhysicsは、SimulatePhysicsを有効化するノードです。ブループリントから、STEP3-3で行ったボールのSimulatePhysics有効化と同じことしています。
SetCollisionEnabledは、当たり判定の設定を変更するノードです。
続いて、SetAllBodiesSimulatePhysicsのNewSimulateにチェックを入れます。さらに、SetCollisionEnabledのNewTypeをPhysicsOnly(NoQueryCollision)に変更します。
この設定にすることで、SimulatePhysicsが有効化されたキャラクターが荒ぶるのを防いでいます。
キャラクターが倒れた後にカメラを動かせてしまう問題
それでは、この段階で実際にプレイして確認してみましょう。
キャラクターは無事に倒れるようになりましたが、このままではトゲに触れて倒れたあともカメラを動かせてしまいます。カメラが動けないように「DisableInput」を追加します。
これでトゲに触れてダメージを受けて倒れるところまで完成です。
ここまででゲームオーバーの実装が完了しました。改めてプレイして確かめてください。トゲに触れた瞬間にダメージを食らい、その場に倒れる演出ができているはずです。
スタート地点へリスポーンする処理を作る
ゲームオーバー後、スタート地点からリスタートする「リスポーン機能」を作っていきます。
リスポーンとは、自身がプレイするキャラクターが倒されたのち、指定された位置で復活すること。先ほどの状態では、トゲに当たって消えたあとはゲームを終了するしかありませんでしたが、リスポーン地点を設定することで再びスタート地点に戻ることができるようになります。
さきほどの「BP_ThirdPersonCharacter」の続きから始めます。
ゲームオーバーになったあと3秒後にリスポーンする処理を追加します。「Delay」と「ExecuteConsoleCommand」を追加します。Delayは指定した秒数の間、処理を待機するノードです。
Unreal Engineには、コンソールコマンドと呼ばれるテキストでコマンドを打ち込みゲームの挙動を変化させる機能があります。ExecuteConsoleCommandは、このコンソールコマンドをブループリントから実行するためのノードです。
続いて、DelayのDurationを3.0に変更します。
さらに、ExecuteConsoleCommandのCommandを「RestartLevel」に変更します。
RestartLevelを実行すると、現在のレベルを再読み込みします。なお、この処理はキャラクターをスタート地点に戻すだけでなく、レベル上のギミックなども戻るので注意が必要です。
これでゲームオーバー後にスタート地点にリスポーンする処理が完成しました。
実際にプレイしてみましょう。何度ゲームオーバーになってもリスポーンできるようになっているはずです。
キャラクターのリスポーンには他にもいくつかの方法がありますが、今回はコンソールコマンドでレベルを再読み込みする方法で実装を行いました。
この後、もう1つだけキャラクターのリスポーンの方法を紹介しています。そちらの方法では好きな場所にリスポーンさせることができるので、気になる方は挑戦してみてください!
さらにチャレンジ!リスポーンの別の方法
上記で紹介した方法ではリスポーンと同時にレベルの状態も戻ってしまうため、途中まで攻略したギミックなどが攻略前に戻ってしまいます。これから紹介する方法はキャラクターを指定した位置でリスポーンするものです。
さきほどの続きで「BP_ThirdPersonCharacter」を開き、「Delay」と「ExecuteConsoleCommand」を削除します。
次に「Disable Input」の後に「Set Life Span」を繋げます。
Set Life Spanは数秒後にキャラクターを消すことができるノードです。
今回は自分自身を消したいので、TargetはselfのままでOKです。InLifespanは3.0に変更してください。これでダメージを受けると3秒後に消えるようになりました。
次に「BP_ThirdPersonGameMode」を開きます。
EventGraphの表示が出てこない場合は、上部の「OpenFullBlueprintEditor」をクリックすることで、今までと同じ画面を確認できます。
「BeginPlay」を追加します。これは、ゲームが開始されると実行されるイベントです。
「OnDestroyed」を追加します。選択肢が複数ありますが、Assignを選んでください。Assignを選ぶことでイベント「OnDestroyed_Event_0」も追加されます。
OnDestroyedは、Targetに設定したアクターが消えると、Eventに設定されたイベントが実行されるというものです。
Targetには「GetPlayerPawn」を設定します。
これで、「プレイヤーが操作しているキャラクターが消えるとOnDestroyed_Event_0が実行される」という処理になります。
キャラクターを指定箇所にスポーンさせる
「SpawnActorfromClass」を追加します。SpawnActorfromClassは、Classに設定したブループリントを、SpawnTransformに設定した位置にスポーンさせることができます。
スポーンさせるキャラクターを設定します。「ClassにBP_ThirdPersonCharacter」を設定します。
次に、スポーンさせる場所を設定します。スポーンさせる場所は、初期位置と同じ、ゲーム開始地点のPlayerStartにします。
レベルに配置されているPlayerStartを取得するため、「FindPlayerStart」を追加します。
しかし、このままではSpawnActorfromClassのSpawnTransformに繋がりません。
PlayerStartのTransform情報を取得するために「GetActorTransform」を追加します。
今までとノードの追加方法が違うことに注意してください。今回は、FindPlayerStartのReturnValueを引っ張り、何もないところで離します。これで、操作キャラクターが消えたあと、新しいキャラクターがPlayerStartの位置にスポーンするようになりました。
リスポーンしたキャラクターを操作できるように設定
ここからは、スポーンしたキャラクターとPlayerControllerの紐づけを行います。この設定を行わないと、キャラクターがスポーンしても操作することができません。
PlayerControllerを取得するために「GetPlayerController」を追加します。
次に「Possess」というノードを追加します。このノードが、プレイヤーコントローラーとキャラクターを紐づけてくれるノードです。GetPlayerControllerから引っ張って追加しましょう。
続いて、SpawnActorfromClassのReturnValueとPossessのInPawnを繋ぎます。これで、スポーンしたキャラクターとPlayerControllerの紐づけが完了しました。
プレイしてリスポーンすることを確認してみましょう。
一度目はリスポーンしますが、二度目はリスポーンしなかったはずです。
OnDestroyedのTargetに設定されたキャラクターは、リスポーンしたキャラクターで更新されません。このため、リスポーンしたキャラクターをもう一度OnDestroyedに設定する必要があります。
これで、何度ゲームオーバーになってもリスポーンするようになりました。ついにリスポーン機能の完成です!
後半ではキャラクターのみを再生成するという方法を紹介しました。「上手くできなかった」という方も、改めて記事内の画像を見ながら設定してみてください。