見出し画像

Unreal Engine でリスポーン処理を実装しました!

UE5にて、リスポーン処理を実装した際のメモになります。
参考になる人はなかなかいないかもしれませんが、何かの参考になるかもしれないので、処理内容を公開しておきます。

『おわりに』には参考にさせていただいたWebページを乗せています。

※内容は変更する可能性があります。
※Unreal Engineの5.0.3で実装しました。

動作イメージは以下。

使い方は、位置を保存するためのオブジェクトをMapに配備し、死亡時によびだされるRespawn画面をクリックすると、オブジェクト位置に復帰する。

セーブしたいデータを定義するBluePrintを作成

  • 親にSaveGameを指定し、BluePrintを作成

  • 名前をBP_MySaveGame(名前は任意)に設定

  • VARIABLESに保存したいデータを設定

    • 今回は、キャラクターの位置を保存したいので、Transform型の変数を作成

復帰位置を保存するためのセーブ用のオブジェクト

  • 親にAcotorを指定して、BluePrintを作成

  • 名前をBP_CheckPointに変更(名前は任意)

  • Componentsにボックスコライダー、スタティックメッシュ、パーティクルシステムを追加

 BoxCollider:キャラクターが接触したことを検知し、データの保存処理を行う
 StataicMesh:セーブ用のオブジェクトのメッシュを設定する
 ParticleSystem:パーティクルシステムを設定する

BoxColliderの各種設定を行う

  • Transform:スタティックメッシュを覆うように設定する

  • Collision:キャラクターが接触したことを検知するためにGenerateOverlap Eventsにチェックを付ける

  • Events:On Component Begin Overlapをクリックして、キャラクターが接触した際の処理を記載(後ほど記載)

StaticMeshの設定を行う

Collision:オブジェクトをキャラクターが通り抜けてもよい場合はCollision PresetsをNoCollisionに設定しておく

ParticleSysteの設定を行う

特に必要な設定はないので好きなように設定する

On Conmponent Begine Overlap (BOX)の設定を行う

処理1

  • SaveGameオブジェクト(BP_MySaveGame)を作成する

  • 作成したオブジェクトの変数に値をセット

  • スロットにSaveGameオブジェクトを保存する

処理2

(なくても問題ない)

  • VARIABLESにSoundCue形式の変数を作成

  • コンパイルして、Default Valueに好きな音のSoundCueを設定する

  • (変数の目のマークをクリックしておくと、配備したCheckPoint毎に音をMap上で変更できる)

  • PlaySound atLocationを使用して、音を鳴らす

GameModeにリスポーンを実現するための処理を記載する

  • ゲームのGameModeを開く

  • Add Custom EventからEventを作成し、Respawnと名前を付ける

※GameModeを作成済みプロジェクトでは、World SettingsのGame Mode欄もしくは、Project SettingsのProject>Maps&ModesのDefault GameMode設定を確認しましょう

処理1

  • Load Game from slotでセーブ用オブジェクトでセーブしたTransformの情報を取得する

処理2

  • キャラクターを削除する

  • キャラクターをセーブ位置からリスタートさせる

死亡時に画面をクリックするとリスポーンするように設定する

死亡時に画面に表示するWidgetを作成する

  • Widget Blueprintを作成(Contentで右クリック>WidgetBlueprint>User Interface>User Widget)

  • 名前を好きなように変更(今回WB_DeathScreenとします

  • ①CanvasPanelを追加

  • ①の配下にImageを追加し、画面いっぱいに広げる(BackImage)

  • ①の配下にTextを追加し、リスポーン方法を記載する

  • ①の配下にButtonを追加(RespawnButton/必須)

リスポーン用のボタンの設定を行う

  • ボタンを画面いっぱいに広げる

  • ボタンを透明にする(Appearance>Style配下にあるすべての場合のTintのAlphaを0に設定する)

  • EventsのOn Pressedをクリックして、画面をクリックした際の処理を記載する

On Preeedの設定を行う

  • GameModeに作成したRespawnイベントを呼び出し、リスポーン処理を行う

死亡時に呼び出すWidgetを作成する

  • FUNCTIONSに死亡時にWidgetを呼び出すための関数(Death_f)を追加する

  • 右クリックからCreate Widgetを選択

  • classに作成したWidgetを設定(WB_DeathScreen)

  • Add Viewportを設定しつなげる

  • 必要に応じて、画面操作の設定処理を追加する

Widgetを呼び出す処理を死亡時に呼び出す

この部分はゲームの作りでかなり違う形になる。
死亡処理があれば、そこから呼び出すのが早い。
それが難しい場合は、死亡アニメーションの終了時に呼び出す。

※死亡アニメーション終了時の呼び出す方法の手順

  • 死亡アニメーションのMontageを開く

  • アニメーションの最後にNotifiesを追加

  • Montageを設定しているAnimBPを開く

  • 右クリックからFinishCharacterDeathのEVENTの呼び出しを配置

注意事項

Advanced_AI_SpawnSystemのアセットを利用した場合にエラーが発生

標題のアセットを利用した場合、リスポーン処理やワープ移動処理を行うとアセットでエラーが発生する。(プレイヤーが突然消えることにより、プレイヤーとの距離を測る処理でエラーが出てそう)

対処方法としては、リスポーン画面からはRestart処理を実施、Open Level BlueprintのEvent BeginPlayへリスタート処理(移動だけでも良いはず)を実施するようにすればエラーは無視できる。
※この方法だと、ゲームを始めた際に必ずセーブポイントから始まるので、フラグでPlayerStartから始めたり、アセットの処理を修正する方法を考えた方がよいかも

おわりに

参考にしたサイトを載せておきます。
(情報を公開してくださっているいる皆様ありがとうございます!)

以上

この記事が気に入ったらサポートをしてみませんか?