これまで数回に分けて作ってきたUE5によるデザインレビューツールですが、いよいよ最終段階に到達しました。最も重要といっても過言ではない、セーブ機能を実装してこなかったので、プレイモードが終了すると何も残らない状態になっていました。
そこで今回は、終了ボタンを押したらデータをセーブ後にプレイモードが終了し、プレイモード再開時に保存したデータをセーブデータから自動で読み込む機能を考えてみました。
同時に、カメラ位置などを初期状態に戻すリセット機能、スクリーンショットを撮影する機能も同時に実装していきます。
・ボタンを選択した状態で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型の変数は要素の数だけ初期値が必要なので忘れずに設定します。これをしないとうまく動作しません。
・こちらのブループリントは変数を設定するだけで作業が終わりなので、コンパイル→上書き保存します。
・先ほど作成したセーブ用ブループリントのオブジェクト変数を作成しておきます。名前はSave_data、型はBP Save Dataです。
・同時に、プレイモード終了直前のカメラ情報を格納する変数を4つ、新たに作成します。
①Last_Camera_Position : Vector型
②Last_Camera_Rotation : Rotator型
③Last_Target_Arm_Length : Float型
④Last_FOV : Float型
・ボタンクリックのイベント通知を受け取ったら、終了直前のカメラ情報にかんするパラメータを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側を取って前回終了時点のカメラ情報を読み込むようになっています。
・カメラを初期状態に戻す場合、カメラ情報を事前に記憶させておく必要があるので、プレイモード開始時に初期のカメラ情報を格納するための変数を4つ作成します。
①Default_Position : Vector型
②Default_Rotator : Rotator型
③Default_Target_Arm_Length : Float型
④Default_FOV : Float型
・それらのデータを取得する関数を用意し、さきほどと同様、プレイモード開始直後に実行させたいのでBeginPlayノード直後のSequenceノード0番目に割り込ませます。
・最初はDefault_という名前の付いた変数を読み込み、カメラの位置、回転角、ターゲットアームレングス、FOV値を読み込んでセットし、FOV調整スライダーを初期値にセットしてテキストブロックにFOV値を表示させます。
・ウサギのマテリアルを初期のものにアサインしなおしています。
・切り替えデータ及び環境を初期のものに戻し、初期化が必要な変数を初期化します。
ここまで来たら、すべての作業は完了です。
色々ややこしい作業が続きますが、必要に応じて取捨選択しながら実装してみてください。



















0 件のコメント:
コメントを投稿