ブループリントで「ゲームオーバーからリスポーンまでの流れ」を作ってみよう

2022.01.01
ゲームづくりの知識
この記事をシェア!
Twitter Facebook LINE B!
Twitter Facebook LINE B!
目次

「リスポーン」の概要

STEP4-3では、トゲに触れると「やられた!」と画面に表示するところまで作りました。今回は、トゲに触れた時に操作キャラクターが倒れるゲームオーバーの機能と、ゲームオーバー後にキャラクターが復活するリスポーンの機能を作ります。

リスポーン(respawn)とは、ダメージを受ける、ステージ外へ落下するなどの理由で操作を失ったキャラクターを指定した位置に再配置すること。STEP4-3で制作したプロジェクトをもとに、設定の手順を解説します。

トゲがキャラクターにダメージを与える処理を作る

最初に、「トゲに触れたキャラクターが倒れて消える」というゲームオーバーの演出を作ります。前回作ったブループリント「DamageNeedle」と、操作キャラクターのブループリントである「BP_ThirdPersonCharacter」にノードを追加していきます。

前回作ったトゲのブループリント「DamageNeedle」を開く

トゲに触れると、キャラクターが「ダメージ」を受けるようにします。

「DamageNeedle」を開き、前回追加したPrintStringの続きに「ApplyDamage」を追加します。ApplyDamageは指定した相手にダメージを与えるノードです。

EventGraphの何もないところで右クリックし、ノード検索窓を呼び出す。指定した相手にダメージを与えるノード「ApplyDamage」を追加する

PrintStringの次にApplyDamageを繋ぐ

ApplyDamageの「DamagedActor」にダメージを与える相手を設定します。今回はプレイヤーが操作しているキャラクターにダメージを与える設定にしたいので、「GetPlayerPawn」を追加します。GetPlayerPawnをDamagedActorに繋ぐことで、プレイヤーが操作しているキャラクターにダメージを与えることができるようになります。

プレイヤーが操作しているキャラクターを取得するため「GetPlayerPawn」を追加

次に、ApplyDamageの「BaseDamage」欄で与えるダメージ量を設定します。BaseDamageは10.0に変更してください(初期値の0.0では、ノーダメージになってしまいます!)。

BaseDamageが0.0のままだと、ダメージを与えた判定にならない。想定した結果が得られなかったときは、ダメージ量を設定しているか再度確認してみよう

これで、トゲ側(DamageNeedle)のブループリントは完成です。

DamageNeedleの完成図

ダメージを受けたキャラクター側の処理を作る

次に、ダメージを受けたキャラクター側の処理を作っていきます。プレイヤーが操作していたキャラクターのブループリント「BP_ThirdPersonCharacter」を開きます

プレイヤーが操作しているキャラクターのブループリント「BP_ThirdPersonCharacter」を開く

ダメージを受けた時にイベントが実行される「EventAnyDamage」を追加します。

ダメージを受けた時に実行されるイベント「EventAnyDamage」を追加

トゲからダメージを受けるとこのイベントが呼ばれる。ApplyDamageとAnyDamageはセットで使うノードなので覚えておこう

ダメージを受けたらキャラクターが倒れる処理を追加します。

まずは「SetAllBodiesSimulatePhysics」と「SetCollisionEnabled」を追加します。

SetAllBodiesSimulatePhysicsは、SimulatePhysicsを有効化するノードです。ブループリントから、STEP3-3で行ったボールのSimulatePhysics有効化と同じことしています。

SetCollisionEnabledは、当たり判定の設定を変更するノードです。

SetAllBodiesSimulatePhysicsは、STEP3-3で行ったボールのSimulatePhysics有効化と同じことをブループリントから行うためのノード

SetCollisionEnabledを追加することで、倒れるキャラクターの挙動が荒ぶってしまうのを防いでいる

続いて、SetAllBodiesSimulatePhysicsのNewSimulateにチェックを入れます。さらに、SetCollisionEnabledのNewTypeをPhysicsOnly(NoQueryCollision)に変更します。

この設定にすることで、SimulatePhysicsが有効化されたキャラクターが荒ぶるのを防いでいます。

チェックの付け忘れや、NewTypeが変更されていないと想定した挙動にならないのでしっかり確認しよう

キャラクターが倒れた後にカメラを動かせてしまう問題

それでは、この段階で実際にプレイして確認してみましょう。

キャラクターは無事に倒れるようになりましたが、このままではトゲに触れて倒れたあともカメラを動かせてしまいます。カメラが動けないように「DisableInput」を追加します

カメラを動けなくするために「DisableInput」を追加。マウスやキーボードなどの入力を無効にするノード

プレイヤーが操作するキャラクターへの入力を受け付けるPlayer Controllerを繋げることで、入力を受け付けなくする

これでトゲに触れてダメージを受けて倒れるところまで完成です。

ここまでのBP_ThirdPersonCharacterの図

ここまででゲームオーバーの実装が完了しました。改めてプレイして確かめてください。トゲに触れた瞬間にダメージを食らい、その場に倒れる演出ができているはずです。

スタート地点へリスポーンする処理を作る

ゲームオーバー後、スタート地点からリスタートする「リスポーン機能」を作っていきます。

リスポーンとは、自身がプレイするキャラクターが倒されたのち、指定された位置で復活すること。先ほどの状態では、トゲに当たって消えたあとはゲームを終了するしかありませんでしたが、リスポーン地点を設定することで再びスタート地点に戻ることができるようになります。

さきほどの「BP_ThirdPersonCharacter」の続きから始めます。

ゲームオーバーになったあと3秒後にリスポーンする処理を追加します。「Delay」と「ExecuteConsoleCommand」を追加します。Delayは指定した秒数の間、処理を待機するノードです。

Unreal Engineには、コンソールコマンドと呼ばれるテキストでコマンドを打ち込みゲームの挙動を変化させる機能があります。ExecuteConsoleCommandは、このコンソールコマンドをブループリントから実行するためのノードです。

「Delay」を追加することで、そのあとに続くノードの実行を遅らせることができる

コンソールコマンドをブループリントから実行するために「ExecuteConsoleCommand」を追加

続いて、DelayのDurationを3.0に変更します。

さらに、ExecuteConsoleCommandのCommandを「RestartLevel」に変更します。

RestartLevelを実行すると、現在のレベルを再読み込みします。なお、この処理はキャラクターをスタート地点に戻すだけでなく、レベル上のギミックなども戻るので注意が必要です。

Commandの入力ミスに注意しよう

これでゲームオーバー後にスタート地点にリスポーンする処理が完成しました。

BP_ThirdPersonCharacterの完成図

実際にプレイしてみましょう。何度ゲームオーバーになってもリスポーンできるようになっているはずです。

キャラクターのリスポーンには他にもいくつかの方法がありますが、今回はコンソールコマンドでレベルを再読み込みする方法で実装を行いました。

この後、もう1つだけキャラクターのリスポーンの方法を紹介しています。そちらの方法では好きな場所にリスポーンさせることができるので、気になる方は挑戦してみてください!

さらにチャレンジ!リスポーンの別の方法

上記で紹介した方法ではリスポーンと同時にレベルの状態も戻ってしまうため、途中まで攻略したギミックなどが攻略前に戻ってしまいます。これから紹介する方法はキャラクターを指定した位置でリスポーンするものです。

さきほどの続きで「BP_ThirdPersonCharacter」を開き、「Delay」と「ExecuteConsoleCommand」を削除します。

「Delay」と「ExecuteConsoleCommand」を削除する

次に「Disable Input」の後に「Set Life Span」を繋げます。

Set Life Spanは数秒後にキャラクターを消すことができるノードです。

数秒後にキャラクターが消えるように「SetLifeSpan」を追加

今回は自分自身を消したいので、TargetはselfのままでOKです。InLifespanは3.0に変更してください。これでダメージを受けると3秒後に消えるようになりました。

InLifespanを3.0に設定。これで、キャラクターはダメージを受けると3秒後に消えるようになった

次に「BP_ThirdPersonGameMode」を開きます。

「BP_ThirdPersonGameMode」を開く

EventGraphの表示が出てこない場合は、上部の「OpenFullBlueprintEditor」をクリックすることで、今までと同じ画面を確認できます。

OpenFullBlueprintEditorをクリックして、画面の表示を変更する

「BeginPlay」を追加します。これは、ゲームが開始されると実行されるイベントです。

ゲームが開始したときに実行されるように「BeginPlay」を追加

「OnDestroyed」を追加します。選択肢が複数ありますが、Assignを選んでください。Assignを選ぶことでイベント「OnDestroyed_Event_0」も追加されます。

OnDestroyedは、Targetに設定したアクターが消えると、Eventに設定されたイベントが実行されるというものです。

OnDestroyedを追加。AssignOnDestroyedを選択することで、CustomEventの作成を省くことができる

AssignOnDestroyedを追加したのでCustomEvent「OnDestroyed_Event_0」が追加されている

Targetには「GetPlayerPawn」を設定します。

これで、「プレイヤーが操作しているキャラクターが消えるとOnDestroyed_Event_0が実行される」という処理になります

プレイヤーが操作しているキャラクターを取得するため「GetPlayerPawn」を追加

BindEvent to OnDestroyedのTargetにGetPlayerPawnを繋ぐ

キャラクターを指定箇所にスポーンさせる

「SpawnActorfromClass」を追加します。SpawnActorfromClassは、Classに設定したブループリントを、SpawnTransformに設定した位置スポーンさせることができます。

新しいキャラクターをスポーンさせるために「SpawnActorfromClass」を追加

OnDestroyed_Event_0に繋ぐ。BindEventtoOnDestroyedではないので注意しよう

スポーンさせるキャラクターを設定します。「ClassにBP_ThirdPersonCharacter」を設定します。

ClassにキャラクターのブループリントであるBP_ThirdPersonCharacterを設定

次に、スポーンさせる場所を設定します。スポーンさせる場所は、初期位置と同じ、ゲーム開始地点のPlayerStartにします。

ゲームの開始地点。PlayerStartの位置を変更すれば、好きなところからゲームを始められる

レベルに配置されているPlayerStartを取得するため、「FindPlayerStart」を追加します。

レベルに配置されているPlayerStartを取得するため「FindPlayerStart」を追加

しかし、このままではSpawnActorfromClassのSpawnTransformに繋がりません。

FindPlayerStartとSpawnTransformが繋がらない

PlayerStartのTransform情報を取得するために「GetActorTransform」を追加します。

今までとノードの追加方法が違うことに注意してください。今回は、FindPlayerStartのReturnValueを引っ張り、何もないところで離します。これで、操作キャラクターが消えたあと、新しいキャラクターがPlayerStartの位置にスポーンするようになりました。

取得したPlayerStartのTransformを取得するために「GetActorTransform」を追加。今までとノードの追加方法が違うので注意しよう

SpawnTransformにGetActorTransformを繋ぐ

リスポーンしたキャラクターを操作できるように設定

ここからは、スポーンしたキャラクターとPlayerControllerの紐づけを行います。この設定を行わないと、キャラクターがスポーンしても操作することができません。

PlayerControllerを取得するために「GetPlayerController」を追加します

PlayerController取得のために「GetPlayerController」を追加

次に「Possess」というノードを追加します。このノードが、プレイヤーコントローラーとキャラクターを紐づけてくれるノードです。GetPlayerControllerから引っ張って追加しましょう。

紐づけのために「Possess」を追加。ノードの追加方法が違うので注意しよう

続いて、SpawnActorfromClassのReturnValueとPossessのInPawnを繋ぎます。これで、スポーンしたキャラクターとPlayerControllerの紐づけが完了しました。

Possessに紐づけるキャラクターとPlayerControllerを繋ぐ

プレイしてリスポーンすることを確認してみましょう。

一度目はリスポーンしますが、二度目はリスポーンしなかったはずです。

OnDestroyedのTargetに設定されたキャラクターは、リスポーンしたキャラクターで更新されません。このため、リスポーンしたキャラクターをもう一度OnDestroyedに設定する必要があります。

BindEventtoOnDestroyedをコピー&ペーストして、リスポーンしたキャラクターを設定。コピー&ペーストは、Ctrl+C(コピー)・Ctrl+V(ペースト)で可能

これで、何度ゲームオーバーになってもリスポーンするようになりました。ついにリスポーン機能の完成です!

後半ではキャラクターのみを再生成するという方法を紹介しました。「上手くできなかった」という方も、改めて記事内の画像を見ながら設定してみてください。

関連記事

Unity 6のグラフィックスに関する学習リソースまとめ、Unity Technologiesが公開
2024.11.19
『Mayaリギング 3rd edition』、2024年11月下旬にボーンデジタルから発売
2024.11.19
Blender入門書を卒業したユーザー向けの書籍『プロフェッショナルBlneder』、ボーンデジタルが2024年11月下旬に発売予定
2024.11.18
アークライト 野澤 邦仁のボードゲームを作るには Vol.04「ルール調整編」
2024.11.01
【西川善司が語る“ゲームの仕組み” Vol.5】ポリゴンでモデリングされた3Dキャラクターを動かすための技術
2024.10.29
『鉄拳8』全キャラクターの髪型から衣装、靴まで自由にカスタマイズ!量産のカギは“体格に合わせた変形”をランタイム側で行う独自の多重リグシステム【CEDEC2024】
2024.10.24

注目記事ランキング

2024.11.14 - 2024.11.21
VIEW MORE

連載・特集ピックアップ

イベントカレンダー

VIEW MORE

今日の用語

フォワードシェーディング(Forward Shading)
フォワードシェーディング オブジェクト毎にライティングの計算を行い、その計算結果を描画するレンダリング手法。フォワードレンダリングともいう。ディファードシェーディング(Deferred Shading)に比べてポストプロセスの自由度は低いが、(何も物を配置しなかった際にかかる)最低限の描画コストが低く、アンチエイリアス処理などにおいてフォワードシェーディングの方が有効な分野も存在する。
VIEW MORE

Xで最新情報をチェック!