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

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(ペースト)で可能

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

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

関連記事

チュートリアルでプレイヤーが迷わない理由は「ユーザー文化の理解」と「ステレオタイプの利用」にあった。直感で理解できるゲームをどう作るか【cluster革命前夜 Unity賞受賞者インタビュー】
2024.07.23
ヒット作品を作るための再現可能なテクニックを徹底解説!コヤ所長による『科学的企画開発手法』でプレイヤーの“未充足ニーズ”を手に入れよう【Classmethod Odyssey】
2024.07.18 [PR]
『呪術廻戦 ファンパレ』シナリオパート制作に迫る開発者インタビュー。Live2Dキャラクターの実在感を高める3Dライティングと作品愛あふれるワークフロー【CAGC2024】
2024.07.03
『呪術廻戦 ファントムパレード』の「夢幻廻楼」背景演出について、サムザップが技術ブログで解説。無限に続く塔、天候の変化を表現する方法とは
2024.06.26
雲が流れる速度や色彩変化を低コストで調整。UnityのSRPとVolumeを活用した事例をQualiArtsが紹介
2024.06.21
スクワッドスターズ株式会社 岡田 和也氏による「猫でも分かる ゲームエンジンのサンプルを面白くする方法」の講演動画・スライドを公開!【ゲームメーカーズ スクランブル2024】
2024.06.18

注目記事ランキング

2024.07.20 - 2024.07.27
VIEW MORE

連載・特集ピックアップ

イベントカレンダー

VIEW MORE

今日の用語

フォグ(Fog)
フォグ 「霧」を意味する英単語。3DCGにおいて、現実の霧による見た目をシミュレーションする画面効果やエフェクトを指す。代表的なものとして、カメラから遠くにあるオブジェクトの色調を変化させることで遠近感を出す手法がある。
VIEW MORE

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