2026年6月2日火曜日

【Unreal Engine_6】データセーブとセーブデータのロード、リセット、スクリーンショット機能の実装


これまで数回に分けて作ってきたUE5によるデザインレビューツールですが、いよいよ最終段階に到達しました。最も重要といっても過言ではない、セーブ機能を実装してこなかったので、プレイモードが終了すると何も残らない状態になっていました。

そこで今回は、終了ボタンを押したらデータをセーブ後にプレイモードが終了し、プレイモード再開時に保存したデータをセーブデータから自動で読み込む機能を考えてみました。

同時に、カメラ位置などを初期状態に戻すリセット機能、スクリーンショットを撮影する機能も同時に実装していきます。


・前回のブログ記事の終了時点からスタートします。

・前回のブログまでに作ってきたButton_Widgetを開いてUIを作っていきます。今回追加するボタンは右下に二つ、右上に一つです。右上がスクリーンショットを撮影するSHOTボタン、右下がカメラ位置を初期に戻すRESETボタンとセーブした後にプレイモードを終了させるQUITボタンという名前にします。

・ボタンを選択した状態でDetails欄のEvents項目にあるOn Clicked横のプラスボタンをそれぞれ押し、Graph画面に切り替えます。

・SHOTボタンはExecute Console Commandノードにつないでshotを設定します。

・RESETボタンとQUITボタンはEVENT DISPATCHERを設定し、Callで接続します。

・続いて、データをセーブするためのブループリントを新たに作ります。

・Content Browser内で右クリック→ブループリントを選び、CLASSは上の図のようにSaveGameを選択します。

・アイコンが新たに一つ加わりました。

・作成したSaveGameのブループリントを開き、セーブしたい変数を上の図のように設定します。今回作成する変数の名称、型は以下の通りです。

 <ビューの登録に使用しているカメラ情報>
 ①Save_Camera_Position : Vector型Array
 ②Save_Camera_Rotation : Rotator型Array
 ③Save_Camera_Target_Arm_Length : Float型Array
 ④Save_Camera_FOV : Float型Array

 <ビューの登録がされているかどうかを判別する変数>
 ⑤Save_Flag  : Boolean型Array

 <プレイモード実行が初回か2回目以降かを判別する変数>
 ⑥Save_Flag_First_Open : Boolean

 <プレイモード終了直前のカメラ情報>
 ⑦Save_Last_Camera_Position : Vector型
 ⑧Save_Last_Camera_Rotation : Rotator型
 ⑨Save_Last_Target_Arm_Length : Float型
 ⑩Save_Last_FOV : Float型

 <マテリアル、データ、環境の切り替えに使用する変数>
 ⑪Save_Level_Before : Integer型
 ⑫Save_Level_After : Integer型
 ⑬Save_Body_Color_Index : Integer型
 ⑭Save_Parts_Index : Integer型
 ⑮Save_Active_Level : String型

 ※名前が識別しやすいように、Persistentレベルのブループリントでセーブしたい変数と同じ名前の冒頭にSave_という文字を追加した変数名にしています。

 ※Array型の変数は要素の数だけ初期値が必要なので忘れずに設定します。これをしないとうまく動作しません。

・こちらのブループリントは変数を設定するだけで作業が終わりなので、コンパイル→上書き保存します。

・続いてPersistentレベルのブループリントを開きます。

・先ほど作成したセーブ用ブループリントのオブジェクト変数を作成しておきます。名前はSave_data、型はBP Save Dataです。

・同時に、プレイモード終了直前のカメラ情報を格納する変数を4つ、新たに作成します。
 ①Last_Camera_Position : Vector型
 ②Last_Camera_Rotation : Rotator型
 ③Last_Target_Arm_Length : Float型
 ④Last_FOV : Float型

・続いて、実際にセーブする機能のブループリントを組んでいきます。前回まで作成した、Add to Viewportの後ろにつないだSequenceの空きスロット及びReturn Valueからつないでいきます。

・ボタンクリックのイベント通知を受け取ったら、終了直前のカメラ情報にかんするパラメータを4つ、変数に保存します。

・その他の保存する変数については長くなるので関数化しました。その後ろにQuit Gameノードをつなぎ、プレイモードを終了します。

・関数化した中身は上の図のようにつないでいきます。

・セーブに必要な変数をすべて、冒頭にSave_が付いた変数に代入し、末尾でSave Game to Slotノードにつなぎます。Slot Nameは任意でokですが、この後の工程で設定する、Load Game from SlotノードのSlot Nameと同じにする必要があります。

・ここからは、プレイモード開始時のセーブデータをロードする処理を作っていきます。

・セーブ済みのデータはプレイモード開始後、まっさきにロードしておきたいので、Begin Playノードの後ろにSequenceノードを間にはさみ、0番ポートにつないでいきます。

・実際にロードする部分も関数化しました。

・関数の中身は上の図のように組んでみました。

・一番最初のBranchによる分岐は、既にセーブデータがあるかどうかで分かれています。

・Slot Nameで指定されたデータをロードし、ひたすらSave_の付いた変数の値を元の変数に代入する作業です。

・ここから、二回目のプレイモード開始時に、前回終了時点でのカメラ位置を再開するノードを組んでいきます。

・ボタンウィジェット生成後、一番最初に処理したい工程なのでAdd to Viewport後ろのSequenceノードの0番目からつないでいきます。

・プレイモード開始が初回か2回目かを判定するFlag_First_Open変数で分岐させています。初回はFalse側を通りFlag_First_Open変数をTrueに変更、2回目以降は必ずTrue側を取って前回終了時点のカメラ情報を読み込むようになっています。

・つづいて、RESETボタンの処理部分を作成します。

・カメラを初期状態に戻す場合、カメラ情報を事前に記憶させておく必要があるので、プレイモード開始時に初期のカメラ情報を格納するための変数を4つ作成します。
①Default_Position : Vector型
②Default_Rotator : Rotator型
③Default_Target_Arm_Length : Float型
④Default_FOV : Float型

・それらのデータを取得する関数を用意し、さきほどと同様、プレイモード開始直後に実行させたいのでBeginPlayノード直後のSequenceノード0番目に割り込ませます。

・関数の中身は上の図のように組んでいきます。

・RESETボタンを押した後の動作は、Add to Viewportノード後ろのSequenceノードから分岐させて作っていきます。ノードが長いため分割して

・最初はDefault_という名前の付いた変数を読み込み、カメラの位置、回転角、ターゲットアームレングス、FOV値を読み込んでセットし、FOV調整スライダーを初期値にセットしてテキストブロックにFOV値を表示させます。

・その後ろの工程は上の図のように組みます。

・ウサギのマテリアルを初期のものにアサインしなおしています。

・ラストは上の図のように組みます。

・切り替えデータ及び環境を初期のものに戻し、初期化が必要な変数を初期化します。

・最後に、プレイモード開始時、ビューが登録されたボタンの背景カラーをセットするノードを組みます。

ここまで来たら、すべての作業は完了です。

色々ややこしい作業が続きますが、必要に応じて取捨選択しながら実装してみてください。

0 件のコメント:

コメントを投稿

【Unreal Engine_6】データセーブとセーブデータのロード、リセット、スクリーンショット機能の実装

これまで数回に分けて作ってきたUE5によるデザインレビューツールですが、いよいよ最終段階に到達しました。最も重要といっても過言ではない、セーブ機能を実装してこなかったので、プレイモードが終了すると何も残らない状態になっていました。 そこで今回は、終了ボタンを押したらデータをセーブ...