Easy Multi Saveの翻訳文 【UE5/UE4】

本ページはプロモーションが含まれています。

目次

Easy Multi Saveの説明の翻訳文

FABでの販売ページ
https://www.fab.com/pl/listings/49f745a1-cbdd-4b18-8278-22ae1075d91d

チュートリアル
https://www.youtube.com/watch?v=e1u6s-w_nKU

仕様などを説明しているドキュメント
https://docs.google.com/document/d/1wzSXrekSKkNXzoi1WenpTB3TAi39YW2kojhYXGW3afk/edit?tab=t.0

ドキュメント内では、日本語への翻訳が出来ませんでした。
その為、皆のストレスが減るように翻訳文をのせておきます。
(Google 翻訳を使用。)

セーブ機能の作成が難しいので、多くの人が購入するであろうアセット。
購入後、サンプルプロジェクトから移行していくようです。

重要そうな所は色を変えておきます。

権利関係

Copyright © Michael Hegemann

このドキュメントは、最新のプラグインバージョンに合わせて定期的に更新されます。

バイナリプラグインバージョン [ランチャー]
1.73 (UE5.4 – UE5.6)
(以前のバージョンは、以前のUEバージョンと互換性があります)

ソースプラグインバージョン [Discord]
1.74 (UE5.4 – UE5.6)
1.49 (UE4.27)

サンプルプロジェクトバージョン
2.5 (UE5.5以降)
1.5 (UE4.27 – UE5.4)

一般的な概念

第1章 概要

1.1 一般的な概念

Easy Multi Save (EMS)は、プロジェクトの保存・読み込みプロセスを簡素化するために設計された包括的なソリューションです。柔軟な構造により、Unreal Engineの基本的な知識しかない方でも簡単に使用できます。EMSはあらゆるゲームタイプとプラットフォームに対応しており、複雑なデータの効率的かつ信頼性の高い管理に特化しています。

保存/読み込み:

無制限の数のセーブスロットにデータを保存できます。
コントローラー、ポーン、ステートを含むプレイヤー/クライアント。
レベルおよびサブレベルのブループリント。
ワールドパーティショニングを使用したオープンワールド。
レベルに配置されたアクタ、またはランタイムで生成されたアクタ。
すべてのActorのアクタコンポーネント。
再帰可能なブループリント構造体。
Actorの一部としてのUObject。
設定や進行状況などの追加データを保存するためのカスタムセーブオブジェクト。

このシステムは完全な初期化不要で、セーブオブジェクトを手動で作成する必要はありません。すべてが自動的に管理されるため、手間なく使用できます。EMSは明確で一貫性のある構造で設計されており、「より賢く、より効率的に」というUnreal Engineの基本理念を体現しています。

インストール

1.2 インストール

インストール方法は、他のUEプラグインと同様です。ダウンロード後、ライブラリ ➔ Vault で「Easy Multi Save」プラグインを探してください。次に、エンジンで「インストール」をクリックします。
これで準備完了です。

サンプルプロジェクト

1.3 サンプルプロジェクト

サンプルプロジェクトでは、このドキュメントに記載されているほとんどの例が実際に動作している様子をご覧いただけます。

ダウンロード

サンプルプロジェクトには最小限のコンテンツしか含まれていないため、独自のプロジェクトにコピー&ペーストして使用できます。EMS_HelperFunctionsライブラリには、便利なメソッドがいくつか用意されています。

1.4 概要

詳細を読み始める前に、基本的な機能が動作することを確認したい場合は、こちらをご覧ください。 ➤ PawnクラスにEMS Actor Save Interfaceを追加してください。

➤ ActorブループリントまたはレベルブループリントのいずれかにEMS Actor Save Interfaceを追加してください。

➤ 「ゲームアクタを保存」および「ゲームアクタを読み込み」ノードを、入力キーにバインドするだけで呼び出すことができます。
両方のノードで「レベルアクタ」と「プレイヤーアクタ」がチェックされていることを確認してください。

これは、アクタの保存と読み込みを行う最も簡単な方法です。これをもとに、クラスに変数などを追加するなど、拡張することも可能です。保存したいすべての変数に「保存対象」フラグが設定されていることを確認してください。

2.1. ファイルシステム

2.1. ファイルシステム

デフォルトでは、EMSは複数のファイルにデータを保存する方式を使用し、すべてのファイルを1つのフォルダに格納します。これにより、プレイヤー間でセーブデータを簡単に共有できるほか、Steam CloudやAmazon S3などのサービスに必要なファイルだけをアップロードすることも可能です。

ファイル構造

/SaveGames/SaveGameName/
このフォルダには、1つのセーブデータ/セーブスロットに関するすべてのデータが格納されます。

/SaveGameName/Slot.sav
このファイルには、レベル名、プレイヤーリスト、タイムスタンプなどのセーブスロット情報が格納されます。
セーブ機能が呼び出されると、スロット情報は常に自動的に保存されます。

/SaveGameName/Level.sav
このファイルには、保存インターフェースを持つ、配置されたすべてのレベルアクタとランタイムで生成されたアクタが格納されます。

/SaveGameName/Player.sav
このファイルには、プレイヤーコントローラーとポーンに関するすべての情報が格納されます。

/SaveGameName/thumb.png
これは、2Dレンダートゥターゲットから作成されたセーブデータのサムネイル画像です。

/SaveGameName/*Custom.sav
任意の名前で作成されたカスタムセーブオブジェクトまたはカスタムプレイヤーファイルです。

ファイル保存場所

エディターまたは開発用パッケージ化されたゲームの場合、セーブファイルは以下の場所に保存されます。
/ProjectName/Saved/SaveGames

リリース版パッケージ化されたゲームの場合、セーブファイルは以下の場所に保存されます。
Users/…/AppData/Local/ProjectName/Saved/SaveGames

コンソール用ファイルシステム

プラグイン設定では、ファイルシステムをデスクトップ用からコンソール用に変更できます。この場合、EMSはセーブファイル用の個別のフォルダを作成せず、適切なファイル名にスロット名を付加します。例:/Saved/SaveGames/MySaveGame_Player.sav
この方式では、ハードウェアの制限によりファイル圧縮は使用されません。
2.2.ネイティブ関数概要

複雑さを軽減し、より強力な機能を実現。ここでは、各関数の概要と機能について説明します。サンプルプロジェクト内の「EMS_FunctionOverview」もぜひご確認ください。

UEの標準的な保存機能はEMSと互換性がないため、使用しないでください。

ゲームアクタの保存
プレイヤーアクタとレベルアクタを保存するための主要な関数です。
同じデータで複数の保存処理を同時に実行することはできません。

データ&セーブについて

▶ データ
保存するデータ(レベルデータ、プレイヤーデータ、または両方)を指定してください。

ゲームアクタの読み込み
プレイヤーアクタとレベルアクタを読み込むための主要な関数です。
同じデータで複数の読み込み処理を同時に実行することはできません。

▶ データ
読み込むデータ(レベルデータ、プレイヤーデータ、または両方)を指定してください。
プレイヤーアクタの場合、ノードは有効なPawnが生成されるまで待機します。
レベルアクタの場合、ノードは有効なゲームモードが生成されるまで待機します。
両方を読み込む場合は、有効なポーンが存在するまで開始しません。

⤷ 完全リロード
falseの場合、未ロードのアクターのみを読み込みます。
すべてのゲームデータ(アクターデータ)を再読み込みする場合はtrueに設定してください。
レベルを再読み込みせずにゲームデータを再読み込みするのに便利です。
保存されていないアクターについては、必要に応じてレベルの状態をリセットしてください。

すべてのセーブスロットを取得
利用可能なすべてのセーブスロットを返します。

⤶ 戻り値
利用可能なすべてのセーブスロットの配列(保存日時順にソート)。

現在のセーブスロットを設定
現在のセーブスロットの名前を設定します。すべてのセーブ/ロード機能はこのスロット名を使用するため、整合性が保たれます。現在のスロットを設定しない場合は、プラグイン設定の「デフォルトセーブスロット名」が使用されます。この機能で自動的に新しいスロットが作成されるわけではないことに注意してください。新しいスロットは、セーブ機能が呼び出されたときに作成されます。

⤷ セーブゲーム名
現在のスロットはこの名前に設定されます。

現在のセーブスロットを取得
現在のセーブスロットのデータを取得します。

⤶ セーブゲーム名
現在のセーブスロットの名前を返します。便利なショートカットです。

⤶ 戻り値
スロット情報オブジェクト。
このオブジェクトからスロット情報構造体にアクセスして、レベル名やタイムスタンプなどを取得できます。

指定したセーブスロットを取得
特定のセーブスロットのデータを取得します。

⤷ セーブゲーム名
情報を取得するスロット名。

⤶ 戻り値
スロット情報オブジェクト。

セーブスロットを削除
この機能は、セーブデータとそのすべての関連ファイルを削除します。

⤷ セーブゲーム名
削除するスロット/フォルダ名。

セーブスロットの存在確認
指定したセーブスロットが存在するかどうかを確認します。

⤷ セーブゲーム名
確認するスロット名。

⤷ 完全一致
スロットファイルだけでなく、レベル、プレイヤー、スロット名も確認します。

⤶ 戻り値
セーブスロットが見つかった場合はtrue。

現在のセーブユーザーを設定
現在のセーブユーザーを設定します。マルチユーザーゲームの場合に便利です。すべてのセーブデータは、/SaveGames/ ではなく /UserSaveGames/UserName に保存されます。
ユーザー名が指定されていない場合は、/SaveGames/ フォルダが使用されます。

⤷ ユーザー名
現在のセーブユーザーの名前。セーブユーザーの削除
この関数は、指定されたセーブゲームユーザーのフォルダとその中のすべてのファイルを削除します。

→ ユーザー名
削除するセーブユーザーの名前。

現在のセーブユーザーの取得
現在のセーブユーザー名を取得します。

← 戻り値
現在のセーブユーザー名。

すべてのセーブユーザーの取得
利用可能なすべてのセーブゲームユーザーを返します。

← 戻り値
利用可能なすべてのセーブゲームユーザーの配列(名前順にソート済み)。

カスタムセーブオブジェクトの取得
EmsCustomSaveGameを継承したカスタムセーブオブジェクトを返します。
これは、すべてのブループリントで任意のデータを扱うために使用できます。
カスタムセーブオブジェクトについてはこちらをご覧ください。

→ セーブゲームクラス
EmsCustomSaveGameを基にしたカスタムクラス。

→ セーブスロット
オプション。特定のスロットからカスタムセーブオブジェクトにアクセスします。
空の場合、現在のセーブスロットが使用されます。

→ ファイル名
オプション。ブループリントのデフォルトのファイル名を上書きします。
同じクラスで複数のカスタムセーブオブジェクトを保持できます。

← 戻り値
返されたカスタムセーブオブジェクト(入力クラスに自動的にキャストされます)。

カスタムオブジェクトの保存
変更されたすべてのカスタムセーブオブジェクトを自動的に保存します。
オプションで、特定のカスタムセーブオブジェクトのみを保存することもできます。

→ セーブゲーム
すべての変更されたカスタムセーブオブジェクトを自動的に保存する代わりに、特定のカスタムセーブオブジェクトのみを保存する場合に指定します。

← 戻り値
保存が成功したかどうか。

カスタムセーブオブジェクトの削除
「カスタムセーブオブジェクトの取得」で取得したセーブオブジェクトを削除します。

→ セーブゲーム
削除するカスタムセーブオブジェクト。

カスタムセーブファイルの存在確認
指定されたカスタムセーブファイルが存在するかどうかを確認します。

→ セーブゲーム
確認するカスタムセーブ。

セーブ/ロード処理中の確認
セーブゲームアクタまたはロードゲームアクタが現在アクティブかどうかを確認します。

← 戻り値
セーブ/ロード処理が現在アクティブかどうか。

レベルストリーミング処理中の確認
EMSの観点から、レベルストリーミングがまだアクティブとしてマークされているかどうかを確認します。
これは、ストリーミング中にセーブ/ロード処理を遅延または停止するために使用できます。
ログにこの警告が表示された場合に使用してください。

← 戻り値
レベルストリーミング処理が現在アクティブかどうか。

ワールドパーティションセーブの確認
現在の永続レベルが、EMSの観点からワールドパーティション化されているかどうかを確認します。戻り値
現在の永続レベルがEMSを使用したワールドパーティションを使用している場合。

ワールドパーティション保存データのクリア
キャッシュされたすべてのワールドパーティション保存データをクリアします。例えば、プレイヤーをテレポートさせる場合、このデータをクリアしてから、移動後のレベルアクタを明示的にロードする必要があります。

マルチレベル保存データのクリア
マルチレベル保存を使用している場合、現在ロードされていないレベルのすべての保存データを削除します。これは、例えばスロットやユーザーを切り替える際に使用できます。

保存/ロード完了待ち
このノードは、保存/ロード処理が完了するまで明示的に待機します。実行ごとに1回しか呼び出せません。このノードの後に​​BeginPlayイベントでロードされた変数を使用したい場合に便利です。

アクタの保存プロパティ設定
EMSプロパティタグを追加または削除します。BeginPlayイベントで呼び出す必要があります。

保存をスキップ
このアクタの保存をスキップします。

アクターについて

→ 持続性
アクターをレベル間で保持します。トランスフォームは自動的にスキップされます。

→ トランスフォームをスキップ
アクターのトランスフォームを保存しないようにします。

→ ロード状態
アクターがロード中またはアンロード中である場合、この設定を上書きします。

生のオブジェクトデータを保存
有効なUObjectをアクターの一部として保存します。生のオブジェクトの保存方法についてはこちらをご覧ください。

→ データ
保存するUObjectと一意のIDを含む構造体です。

生のオブジェクトデータをロード
有効なUObjectをアクターの一部としてロードします。

→ データ
ロードするUObjectと一意のIDを含む構造体です。

セーブファイルの整合性を確認
利用可能なファイルの整合性を確認します。バージョン管理についてはこちらをご覧ください。

→ 確認タイプ
確認するファイルのタイプです。

→ カスタムセーブ名
カスタムセーブまたはカスタムプレイヤーを確認する場合、これは現在のスロット内にあるファイル名、またはスロットとは関係のないファイル名です。

→ 詳細な確認
データを一時的にロードして処理可能かどうかを確認することで、より詳細な確認を行います。通常は必要ありません。

セーブサムネイルをエクスポート
レンダートゥターゲットからセーブゲームのサムネイル画像をエクスポートします。
この機能は処理負荷が高く、動作が一時的に重くなる可能性があります。

→ テクスチャレンダートゥターゲット
サムネイルを生成するレンダートゥターゲットです。

→ セーブゲーム名
サムネイルをエクスポートするセーブゲームスロットの名前です。通常は現在のスロットですが、他のスロットにエクスポートしたい場合もあります。

セーブサムネイルをインポート
以前にエクスポートしたサムネイル画像をインポートします。

→ セーブゲーム名
画像をインポートするセーブゲームスロットの名前です。

→ 戻り値
インポートされたTexture2D形式のサムネイル画像です。

カスタムプレイヤーを保存
コントローラー、ポーン、PlayerStateを専用のセーブファイルに保存します。
これは、サーバー上の個々のプレイヤーを保存するために使用できます。マルチプレイヤーについてはこちらをご覧ください。

→ コントローラー
ポーンとPlayerStateに関連付けられたコントローラーです。

→ ファイル名
実際のファイル名です。これは一意のプレイヤーIDである必要があります。

→ 戻り値
カスタムプレイヤーが正常に保存されたかどうかを示します。

カスタムプレイヤーをロード
専用のセーブファイルからコントローラー、ポーン、PlayerStateをロードします。

→ コントローラー
ポーンとPlayerStateに関連付けられたコントローラーです。 → ファイル名
実際のファイル名です。これは、プレイヤー固有のIDであるべきです。

← 戻り値
カスタムプレイヤーが正常に読み込まれたかどうかを示す値です。

カスタムプレイヤーの削除
カスタムプレイヤーファイルを削除します。

→ ファイル名
削除する実際のファイル名です。

← 戻り値
カスタムプレイヤーが正常に削除されたかどうかを示す値です。

2.3 保存と読み込み

変数
詳細パネルで「保存対象」プロパティをチェックすると、保存インターフェースを実装しているアクタのすべての変数が自動的に保存されます。

変換
アクタの変換は自動的に保存/読み込みされます。
ルートコンポーネントは移動可能に設定する必要があります。
物理アクタの場合、シミュレートされたコンポーネントがルートである必要があります。
コンポーネントの場合、相対変換が使用されます。
ポーンは位置と回転を自動的に保存/読み込みします。
コントローラーはビューの回転を自動的に保存/読み込みします。

削除されたアクタ
デフォルトでは、EMSは保存インターフェースを持つすべてのAクタの削除を自動的に処理します。
プラグイン設定でこの機能を無効にすることで、手動で処理することも可能です。

ブループリント構造体
デフォルトでは、「保存対象」がチェックされている構造体のすべての要素が自動的に保存されます。
この動作は設定で変更でき、構造体の特定の変数のみを保存対象にすることも可能です。

AIコントローラー
レベルに配置されたAI(自動的に所有されるもの)のAIコントローラーの保存は、そのまま使用できます。
ランタイムで生成されたAIの場合は、少し工夫が必要です。サンプルプロジェクトには、AIコントローラーと生成されたAIポーンを保存する方法を示すAIサンプルレベルが含まれています。

アクタ依存オブジェクト
イベントディスパッチャー、アニメーションブループリント、ブラックボードなどのアクタ依存オブジェクトを直接保存することはサポートされていません。これは、他のプラグインやUEの標準機能との互換性を損なう可能性があります。変数自体をアクタ内に直接保存するか、カスタム保存オブジェクトを使用してください。

アタッチされたアクタ
レベルに配置されたアクタが他のアクタにアタッチされている場合、読み込み時にその変換は適用されず、アタッチ元の位置が維持されます。ランタイムで生成されたアクタの場合は、アクタ読み込みイベントでアタッチ状態を処理する必要があります。

UObject
UIウィジェットやその他のUObjectベースのクラスの場合は、Raw Object Saving(生オブジェクト保存)を使用できます。

インスタンスのセーブについて

ゲームインスタンス
ゲームインスタンスの保存は現在サポートされていません。通常、ゲームインスタンスはレベル間の変数共有に使用され、保存データには使用されません。カスタム保存オブジェクトを使用すると、保存処理がより簡単かつ柔軟になります。

レベルインスタンス
配置されたレベルインスタンス内のアクターの保存と読み込みは、完全に対応しています。
これはワールドパーティションレベルにも適用されます。プラグイン設定で「動的ストリーミングレベルを許可」を有効にしてください。

ログ出力
出力ログには、EMSが現在どのような処理を行っているかが詳細に表示されます。
ログフィルターに「LogEasy」と入力すると、EMSからのメッセージのみを簡単に確認できます。

ゲーム一時停止中
現在、ゲームが一時停止中の状態では、保存機能は利用できません。

一時停止中。
ゲームの一時停止を解除し、保存処理を実行してから再度一時停止することで、この問題を簡単に回避できます。ほとんどの場合、この方法で問題は解決します。

スタンドアロンテスト
エディターからスタンドアロンテストを実行すると、予期しない動作が発生する可能性があります。本格的なスタンドアロンテストを行う場合は、ゲームを開発版またはリリース版としてパッケージ化することをお勧めします。

オブジェクト参照
ランダムなレベルアクタへの参照など、単純なケースでは、直接的なオブジェクト参照を保存できます。しかし、一般的には推奨されません。なぜなら、ロード時に参照が有効である必要があるからです。Unreal Engineは、解決されたオブジェクトのプロパティタイプのみを返すためです。代わりに、ロード後にいつでも安全に解決できるソフトオブジェクト参照を使用することをお勧めします。

ソフトオブジェクト参照
ソフトオブジェクト参照は完全にサポートされています。これは、EMSによって再生成されたランタイムアクタや、レベルに配置されたアクタにも適用されます。保存とロードを行うには、ソフトオブジェクトを解決して、他の変数と同様に使用するだけです。例えば、キャラクターがいて、レベルに武器をドロップしたとします。武器にEMSインターフェースを追加して、ロード時に再生成されるようにします。次に、キャラクターにドロップされた武器へのソフトオブジェクト参照を追加してアクセスできます。参照を使用する前に、武器が既に再生成されていることを確認する必要があります。これは、アクタロードイベントで「保存完了待ち」または「ロード完了待ち」ノードを使用することで実現できます。

アセット参照
メッシュ、マテリアル、アニマシオンインスタンスを参照する変数は、アセットへの直接参照が含まれている限り保存できます。例えば、アクタがあり、そのスタティックメッシュコンポーネントを新しいメッシュに設定したい場合などです。これはデータアセットにも適用されます。

プラグイン設定

2.4 プラグイン設定

まず、プラグインを使用するために設定を変更する必要はないことを覚えておいてください。
ただし、各設定の意味を理解しておくことは重要です。設定を変更するには、以下の手順に従ってください。

プロジェクト設定 ➔ プラグイン ➔ Easy Multi Save

一般設定

デフォルトの保存スロット名
現在の保存スロット名が指定されていない場合、またはスロットなしで単一のセーブデータを使用する場合、これがセーブデータの名前になります。

スロット情報クラス
保存スロットにカスタムデータを使用する場合は、カスタムブループリントクラスをここで指定します。通常は、デフォルトの保存スロットクラスで問題ありません。カスタムスロットの詳細はこちらをご覧ください。

ファイルシステム
使用するファイルシステムを選択してください(デスクトップまたはコンソール)。コンソールゲームを開発する場合は、コンソールファイルシステムを使用する必要があります。その他のプラットフォームでは、どちらのファイルシステムでも使用できます。ファイルシステムの詳細はこちらをご覧ください。

以前のデータの自動バックアップ
以前のセーブデータを自動的にバックアップします。自動バックアップの詳細はこちらをご覧ください。

アクター

構造体の自動保存
構造体は、他の変数と同様に、すべてのActorに対して自動的に保存されます。
ただし、構造体アセット内で「セーブゲーム」にチェックマークが付いている変数のみが保存されます。

アクターの自動削除
削除されたアクターを自動的に保存およびロードし、ロード時に再度削除します。手動処理に比べて柔軟性は劣りますが、ワールドパーティションレベルでは便利です。Actor Save Interfaceを実装しているアクターに適用されます。

アクター – 詳細設定

詳細なスプワイニングチェック
有効にすると、EMSはアクターの重複を検出するために、より厳密なチェックを実行します。ほとんどの場合、これは必要ありません。ただし、BeginPlayイベントで保存されたアクターをスプワイニングする場合は役立ちます。削除されたアクターの未使用のメモリ参照はチェックされません。「ガベージコレクション」は手動で実行する必要があります。

保存とロード

マルチスレッド保存
有効にすると、レベルアクターの保存処理がゲームスレッドとは別のスレッドで行われます。レベルに複雑なデータを持つ多くのアクターが含まれている場合は、フレームドロップを防ぐのに役立ちます。ただし、「Net Dormancy」を使用するマルチプレイヤーゲームでは、このオプションは推奨されません。非アクティブなアクターの複製された変数を更新することはスレッドセーフではないためです。

レベルロード方法
レベルアクターをロードする際に使用するメソッド。ロード方法の詳細はこちらをご覧ください。

保存とロード – 詳細設定

ロードバッチサイズ
遅延ロードまたはマルチスレッドロード時に、1回のバッチでロードするアクターの数。

非同期待機時間
非同期ノードが特定の状態で維持される最大時間。例えば、Load Game Actorsを呼び出す場合、ノードは有効なゲームモードまたはポーンが見つかるまで待機します。0に設定すると、ノードは無限に待機します。

ゲームスレッドでの事前保存
マルチスレッド保存を使用する場合、Actor Pre-Saveイベントは強制的にゲームスレッドで呼び出されます。イベントからタイマーやレンダリング関連のプロパティなどのゲームオブジェクトに直接アクセスする場合は、このオプションを有効にしてください。

永続化

マルチレベル保存
レベル間でデータを保持する方法。マルチレベル保存の詳細はこちらをご覧ください。永続化設定 – 詳細設定

動的ストリーミングレベルを許可
ランタイムレベルインスタンスと、同じタイプの複数のストリーミングレベルをサポートします。レベルインスタンスを生成した後、ゲームアクタの読み込みを開始する前に一定の時間を待機してください。
この設定では、アクタに一意のIDを割り当てるため、以前のバージョンとの互換性はありません。また、パフォーマンス面では、若干負荷が大きくなります。

ワールドパーティションについて

ワールドパーティション

ワールドパーティションの保存

ワールドパーティションレベルの自動保存およびロード方法を変更します。
データをメモリにのみ保存するか、ディスクに直接保存するかを選択できます。

ワールドパーティション初期化モード
レベルアクタを最初に自動的にロードするか、このプロセスをスキップして手動で処理するかを選択できます。ワールドパーティションに関する説明を参照してください。

ワールドパーティション – 詳細設定

ワールドパーティション初期化遅延
ワールドパーティションレベルの初期自動ロードが開始されるまでの準備時間です。この間、プレイヤーを配置するには、手動で行うか、プレイヤーアクタをロードする必要があります。プレイヤーのカメラはストリーミングの起点となるため、EMSによってストリーミングされる初期領域とアクタが決定されます。

ワールドパーティション初期化閾値
初期ワールドパーティションロードが開始されるまで、レベルストリーミングが完了状態である必要のある最小時間です。非同期レベルストリーミングのため、Unreal Engineは複数のフレームにわたってストリーミングが完了していると認識する場合がありますが、実際には完了していないことがあります。EMSは、早期にロードされないように、実際に完了するまで待機します。

圧縮

サムネイル画像形式
保存されたサムネイルの画像形式。

バージョン管理

セーブゲームバージョン
現在のスロットのファイルと比較できる、事前定義されたゲームバージョン。

移行済みセーブパッケージバージョン
マルチレベルセーブアクタの移行
バージョン管理に関する説明を参照してください。

リダイレクター

ランタイムアクタのリダイレクト
アクタの名前変更に関する説明を参照してください。

基本的な使い方

3.1. ゲームアクタのロード

ゲームアクタをロードするタイミングは非常に重要です。
シングルプレイヤーゲームの場合、キャラクターの所有イベント、ゲームモードのBeginPlayイベントまたはOnRestartPlayerイベントが適切な開始点です。レベルブループリントのBeginPlayも使用できます。サンプルプロジェクトには、より高度な設定が用意されています。ぜひご確認ください。

同じデータでLoad Game Actorsを一度に複数回呼び出すことはできません。
1フレームあたり、レベルデータとプレイヤーデータの2回呼び出すことはできますが、レベルデータのみで2回呼び出すことはできません。

また、Open Level直後にLoad Game Actorsを呼び出すのは避けてください。実行されないためです。

3.2. セーブスロット

1つのセーブデータのみを使用する場合は、セーブスロットシステムは必要ありません。
EMSは、単一スロット、固定スロット、および無制限の動的スロットをサポートしています。 Set Current Save Slot関数を呼び出すと、EMSのすべての機能で使用されるグローバルなセーブスロット名が設定されます。

EMSにおけるセーブスロットは、単なる文字列です。設定は自動的に行われます。
セーブスロット名が設定されていない場合は、プラグイン設定で指定されたデフォルトのセーブスロット名が使用されます。

新しいゲームを開始するには、一時的なセーブスロットを設定するか、ロードゲームの呼び出しを無効にしてください。セーブスロットに関する詳細な情報は、「カスタムスロット情報」と「追加データ」のセクションをご覧ください。

セーブスロットには、永続レベル名などの情報も保存されます。これらは次のようにアクセスできます。

3.3. セーブインターフェース

セーブ対象とするすべてのActorには、EMS Actor Save Interfaceを実装する必要があります。
このインターフェースは、いくつかの便利な関数とイベントを提供します。

ActorPreSave
Actorのセーブ処理開始前に呼び出されます。ここでは、あらゆる変数を安全に設定し、セーブ時に必要な値が確実に設定されるようにできます。

ActorSaved
Actorとそのコンポーネントのセーブ処理が完了した後に呼び出されます。

ActorPreLoad
Actorとそのすべてのコンポーネントがロードされる直前に呼び出されます。ロード前に物理演算を無効にしたり、デフォルト値を保持するなど、特殊な場合に役立ちます。しかし、ほとんどの場合、このイベントは必要ありません。

ActorLoaded
Actorとそのコンポーネントのロード処理が完了した後に呼び出されます。
このイベント以降は、ロードされたActorのすべての変数に安全にアクセスできます。
これは最も一般的に使用されるイベントです。

ComponentsToSave
セーブ対象とするコンポーネントの配列を指定します。
この関数は、レベルブループリントには影響しません(レベルブループリントにはコンポーネントがないため)。
Actorコンポーネントを参照してください。

3.4. レベルActor

レベルActor、ゲームモード、ゲームステートは、レベルファイルに保存されます。
配置されたActorとランタイムで生成されたActorを区別なく保存できます。同じクラスのActorでも問題ありません。レベルブループリントとサブレベルブループリントは、他のすべてのActorと同様に動作します。

フルリロード
「ゲームActorをロード」ノードには「フルリロード」チェックボックスがあります。これを有効にすると、レベルを再起動することなく、既にロード済みのActorを再ロードできます。Actorを保存する際に、それらは既にロード済みとしてマークされます(同じ状態であるため)。

チェックをオフにすると、以前にロードされていないActorのみが対象となります。ストリーミングレベルでは、使用されていないアクタが動的に読み込まれるため、このような処理が一般的です。

アクタの削除と再読み込み
生成したアクタを削除して、レベルを再起動せずに再度読み込む場合、古い参照を削除する必要があります。ゲームアクタを読み込む前に、ガベージコレクションを実行してください。永続レベルを再開する場合は、この手順は不要です。

永続レベルのアクタ
すべてのアクタは、保存データと共にレベル間で移動できます。
「アクタの保存設定」を設定し、チェックボックスをオンにしてください。

コリジョンボックス。
永続アクターは、生成時に常に座標(0,0,0)に配置されます。

プロシージャルレベル
プロシージャル生成されたレベルの場合、レベルを生成する代わりに、アクターを直接保存して、保存されたファイルからレベルを読み込むことができます。レベルストリーミングやサブレベルの保存/読み込みと組み合わせることも可能です。レベルに何千ものアクターがある場合は、高度な読み込み方法のいずれかを使用することをお勧めします。

3.5. プレイヤーアクター
プレイヤーコントローラー、ポーン、プレイヤーステートは、プレイヤーファイルに保存されます。
これにより、P2Pマルチプレイヤーゲームでローカルクライアントを保存および読み込むこともできます。
詳細については、マルチプレイヤー機能の説明をご覧ください。

プレイヤーのアクターを読み込む際は、有効なポーンが生成されるまで待機します。
レベルとプレイヤーを同時に読み込む場合、プレイヤーアクターは最初に読み込まれます。

インベントリ
複雑なインベントリを保存するには、データをポーンまたはコンポーネント内に保存することをお勧めします。すべてのインベントリ変数を格納するために構造体を使用し、保存されたデータから読み込む際にインベントリを作成/生成します。

永続プレイヤー
レベルとは独立してプレイヤーデータを保存するには、マルチレベル保存機能を使用します。

3.6. アクターコンポーネント
コンポーネントインターフェース
EMSコンポーネント保存インターフェースは、任意のカスタムコンポーネントに追加でき、EMSアクター保存インターフェースを持つアクターの一部として保存されます。これは、モジュール式ゲーム機能のコンポーネントとも互換性があります。コンポーネントは、アクターと同様に独自のイベントを持つことができます。すべてのカスタムコンポーネントとそのデータは保存されます。

コンポーネント配列
コンポーネントは、EMSアクター保存インターフェースの一部として配列に追加することもできます。この場合、コンポーネントは独自のイベントを受け取らず、インターフェースは必要ありません。

配列は、ランタイムで生成されたコンポーネントも処理できます。
追加されたコンポーネントへの有効な参照を入力してください。
次のように、別のアクターからのコンポーネントを保存することもできます。

子アクターコンポーネント
子アクターの場合、コンポーネント保存インターフェースではなく、配列を使用する必要があります。
子アクターのアクタークラスにアクター保存インターフェースがある場合、コンポーネントとして保存されず、警告ログが表示されます。

3.7. マルチレベル保存

マルチレベル保存機能は、レベル間で保存データを保持するために使用されます。例:レベルAでセーブし、レベルBに進み、レベルBでセーブした後、レベルAに戻ると、レベルAのデータはそのまま残っています。

設定では、マルチレベルセーブの処理方法をいくつか選択できます。いずれの方法でも、ゲームモードとゲーム状態は常に保持され、レベルごとに保存されることはありません。また、プレイヤーの座標位置もレベルごとに自動的に保存され、すべてのデータが保持されます。手動操作は不要です。

異なるマルチレベルセーブモード間のセーブデータの互換性は限定されています。BasicモードはFullモードと互換性があり、DisabledモードはStreamingモードと互換性があります。
異なるモードを使用する場合は、新しいセーブスロットを使用することをお勧めします。

Disabled(無効)
マルチレベルセーブが無効になります。

Basic(基本)
この方法は、ストリーミングを使用しない独立した複数のレベルを持つプロジェクトに適しています。
複数のレベル間でデータを保持します。
用途例:メタボリューム型ゲーム

Streaming(ストリーミング)
この方法は、ストリーミングまたはワールドパーティションサブレベルを持つ1つのメインレベルに適しています。
用途例:オープンワールドRPG

Full(完全)
このモードは、ストリーミングサブレベルまたはワールドパーティションを持つ複数のメインレベルをサポートします。制限はありません。複数のメインレベル間でデータを保持できるため、StreamingモードよりもFullモードを使用することをお勧めします。
3.8. カスタムセーブオブジェクト

UEのデフォルトのセーブ機能と同様に、カスタムデータを保存できる柔軟なシステムです。アクタのセーブとは独立しており、より効率的に使用できます。EmsCustomSaveGameを継承したカスタムブループリントを作成し、必要な変数を追加します。これは、ウィジェットや設定などのUI関連データを保存するのに役立ちます。プレイヤーのステータスやゲームの進行状況を保存するのにも便利です。

基本的な使い方
カスタムセーブは非常に簡単です。必要なノードはたった2つです。「カスタムセーブオブジェクトを取得」と「カスタムセーブオブジェクトを保存」です。保存ノードは、変更されたすべてのカスタムセーブオブジェクトを自動的にディスクに書き込みます。

オプションとして、特定のオブジェクトのみを保存することもできます。

カスタムセーブは手動でロードする必要はありません。次のようにしてデータにアクセスできます。

「取得」関数には自動キャスト機能があり、入力クラスを返します。
通常、これはEmsCustomSaveGameを継承した独自のブループリントクラスです。
すべてのブループリントから制限なく変数に直接アクセスできます。クラス設定
カスタム保存ファイルの名前は、EmsCustomSaveGameブループリントのクラス設定で定義できます。また、スロットシステムとの連携オプションも用意されています。デフォルトでは、カスタム保存データはどの保存スロットにも適用され、スロットごとに固有の設定はできません。
なお、カスタム保存オブジェクトクラスには、特別な設定をしない限り、一意の名前を付ける必要があります。

高度な機能
オプションとして、特定の保存スロットからカスタム保存オブジェクトにアクセスすることも可能です。
この機能を使用するには、クラス設定で「保存スロットを使用」を有効にする必要があります。この設定が有効になっていない場合は、現在の保存スロットが使用されます。

その他、以下のような機能もカスタムファイル名を定義します。これにより、ブループリントで設定されたファイル名が上書きされ、1つのカスタム保存オブジェクトクラスで複数のファイルを扱うことができます。

その他の注意点
カスタム保存オブジェクトは常に有効であり、通常は検証チェックは不要です。
「カスタム保存ファイルが存在するかどうか」ノードを使用して、ファイルが実際に存在するかどうかを確認できます。

カスタム保存オブジェクトを使用する場合は、ゲームアクタの保存処理と同じフレームで実行しないことをお勧めします。両者が競合する可能性があるためです。アクタの保存処理が完了する前または後に実行してください。

3.9. サムネイル

Easy Multi Saveは、セーブスロット用のサムネイル画像の保存もサポートしています。これは、2Dレンダートラゲットソースのキャプチャ画像を保存することで実現されます。これは、セーブUIに非常に役立ちます。サンプルプロジェクトでは、その方法が示されています。EMS_HelperFunctionsライブラリには、「サムネイル画像を保存」というブループリント関数があり、レンダートラゲットのキャプチャ設定方法が説明されています。

キャプチャ元は、RGBのFinal Color LDRでレンダリングされる必要があります。

レンダートラゲットテクスチャのフォーマットがRGBA8 SRGBであることを確認してください。サムネイルが暗すぎる場合は、シーンキャプチャコンポーネントのポストプロセッシングのコントラストを調整してみてください。

プラグイン設定で画像形式(JPEGまたはPNG)を選択できます。
高画質PNG形式で問題が発生する場合は、JPEGに切り替えてみてください。

第4章. 高度な機能

4.1. レベルストリーミング

EMSは、ストリーミングサブレベルのアクタの保存と読み込みを完全にサポートしています。

サブレベルからデータを保存するには、そのレベルが読み込まれて表示されている必要があります。
サブレベルからデータを読み込むには、サブレベルが読み込まれて表示された後に、「ゲームアクタを読み込む」関数を再度呼び出す必要があります。

ランタイムで生成されたアクタは、常にパーシステントレベルの一部です。

「完全リロード」を無効にしてください。有効にすると、サブレベルの新しいアクタだけでなく、すべての既存のアクタが再度読み込まれてしまいます。

ストリーミングレベル間でデータを保持する場合は、マルチレベル保存機能を使用してください。

レベルインスタンス
サブレベル内のレベルインスタンスでアクタを保存または読み込む場合、エンジンの制限により、ストリーミングの完了が予測できない場合があります。遅延処理や有効性チェックを使用することをお勧めします。これは、レベルインスタンスのストリーミングがより安定しているパーシステントレベルやワールドパーティションレベルには影響しません。

4.2.ワールドパーティション

ワールドパーティション領域に配置されたアクタは、マルチレベル保存設定が「ストリーミング」または「フル」に設定されている限り、自動的に保存およびロードされます。ワールドパーティションデータの管理方法をさらにカスタマイズするには、プラグイン設定を調整できます。

デフォルトの初期ロード
デフォルトでは、配置されたアクタとランタイムレベルアクタは、レベル開始時に初期ロードされます。システムは、すべてのグリッドセルがストリーミングされ、表示されるまで処理を待機します。レベル開始時に手動でレベルアクタをロードしないようにし、「ゲームアクタをロード」設定で「プレイヤー」のみを有効にしてください。ワールドパーティションを使用しない永続レベルがある場合は、「Is World Partition Save」ノードを使用することもできます。

初期ロードをスキップする
プラグイン設定の「ワールドパーティション初期化モード」を変更することで、レベル開始時の初期ロードをスキップできます。この場合、レベル開始時に通常通り、手動でレベルアクタをロードする必要があります。
一度でも手動でロードすると、システムはセルを自動的に保存/ロードし始めます。これにより、より細かく制御できますが、ほとんどの場合、自動初期ロードをお勧めします。

プレイヤーキャラクター
ワールドパーティションシステムが必要な領域を十分に早くストリーミングできない場合、プレイヤーがマップ外に落下してしまう可能性があります。確実な解決策は、衝突判定のある床が見つかるまで、プレイヤーキャラクターの位置を固定し、物理演算と入力を無効にすることです。移動コンポーネントの「床を検出」機能を使用できます。
この例は、サンプルプロジェクトでも示されています。

メモリのみ保存
パフォーマンスと信頼性をさらに向上させるには、プラグイン設定の「ワールドパーティション保存オプション」を「メモリのみ」に変更してください。これにより、すべてのグリッドセルのランタイム状態が保持されますが、実際のデータをディスクに書き込むには、手動で保存する必要があります。このオプションはデフォルトでは無効になっていますが、特に大規模なワールドでは推奨されます。

パフォーマンス

パフォーマンス
セルあたり200個未満のアクタであれば、パフォーマンスへの影響は少ないため、デフォルトのロード方法を使用できます。それ以外の場合は、マルチスレッドまたは遅延ロードを使用できます。ロード方法については、ドキュメントを参照してください。設定でマルチスレッド保存も有効にしてください。

再ロード
ワールドパーティションレベルを再ロードする場合は、レベルを再開する前に、「Clear World Partition Save」を呼び出すことをお勧めします。

削除されたアクタ
最も簡単な方法は、プラグイン設定でデフォルトで有効になっている自動アクタ削除機能を使用することです。これにより、各セルで削除されたアクタが自動的に処理されます。物理演算対象オブジェクト
配置された物理演算対象オブジェクトを保存/読み込む際には、物理​​演算のオン/オフを切り替えるための回避策が必要です。これにより、これらのオブジェクトが世界空間に落下してしまうのを防ぐことができます。

永続レベルに配置されたアクターは、その位置が実際に表示される領域にあるのか、衝突判定が有効なのかが不明な場合があります。回避策として、アクターを固定位置に配置することも可能ですが、これは必ずしも望ましい方法とは限りません。

4.3. ロード方法

レベルに大量のアクターが存在する場合、ロードに時間がかかる可能性があります。
このような場合、EMSはレベル内のアクターをロードするための様々な方法をサポートしています。プレイヤーは常にデフォルトの方法を使用します。ロード方法の設定はプラグイン設定で変更できます。

デフォルト
ゲームスレッドで一度にすべてのAクターをロードします。少数のアクターの場合に便利で、ほとんどのプロジェクトではこれで十分でしょう。

遅延ロード
遅延ロードは、複数のフレームにわたってロード処理を分散します。システムは少数のアクターをバッチ処理し、一度にロードして、すべてのAクターがロードされるまでこの処理を繰り返します。ランタイムで生成される大量のアクターや、非常に複雑なデータを持つアクターに適しています。

マルチスレッド
この方法では、主要な処理を別のスレッドで行います。
レベルに配置された大量のアクターに適しています。

4.4. カスタムスロット情報

カスタム保存スロット情報を使用するのは簡単です。EMSInfoSaveGameを継承したブループリントを作成し、GetCurrentSaveSlotからキャストするだけです。

スロット情報は常に自動的に保存されるため、Save Game Actorsを呼び出す前に、必ず必要な変数を設定してください。

4.5. 拡張データ

保存スロットに、追加データを保存したい場合があります。
例えば、ゲーム内のパノラマ写真モードで取得したレンダーターゲットなどです。
必要なのは、正しいパスを設定することだけです。

この例では、レンダーターゲットが現在の保存スロットにエクスポートされ、適切なフォルダに保存されます。

4.6. アクターの名前変更

EMSは内部的なアクター名を使用して識別子を生成します。この識別子はあらゆる状況で一意であることが保証されており、手動設定は不要です。

アクターの名前を変更しても問題ありません。Unrealは内部名を保持します。ブループリントの親クラスを変更することも可能です。しかし、あるアクターを別の全く異なるアクターで完全に置き換えると、保存データが破損する可能性があります。

場合によっては、EMSによってランタイムで生成されるブループリントクラスを移動または名前変更する必要があるかもしれません。Unrealは生成時に正しいクラスを必要とし、保存ファイルには古いパスしか含まれません。リダイレクト機能を使用すると、保存パスを任意の新しいクラス(右側)に設定できます。新しいクラスはコンテンツブラウザから簡単に選択できます。

古いクラス(左側)の入力値は、次のような生成されたクラスパス名にする必要があります。/Game/EasyMultiSave/Blueprints/BP_OldActor.BP_OldActor_C

4.7. アクターの除外

場合によっては、特定のActorを保存対象から除外したいことがあります。
「Actorの保存設定」関数を使用し、チェックボックスにチェックを入れるだけで設定できます。

4.8. マルチプレイヤー

マルチプレイヤーゲームでの保存は非常に複雑な問題で、考慮すべき点や注意すべき事項が数多くあります。レベルアクターは常にサーバーで管理されるため、シングルプレイヤーゲームでの保存方法と変わりません。

ピアツーピア(P2P)
基本的なP2Pマルチプレイヤー環境では、クライアント上でプレイヤーアクターを保存する必要があります。
以下のような実装方法が考えられます。

クライアントレプリケーション
クライアントは、所有するアクター(コントローラー、ポーン、プレイヤー状態)のレプリケートされたデータを保存できます。保存するすべての変数(位置情報を含む)は、レプリケートされた関数呼び出しでサーバーに送信する必要があります。位置情報の自動保存/読み込みは、クライアントには影響しません。

クライアントでのデータ読み込みは、他のクライアント操作と同様に扱います。ゲーム関連データをサーバーに通知し、それに応じてレプリケートする必要があります。
実際には、以下のような実装方法が考えられます。

リスンサーバー
リスンサーバーは、自身のプレイヤーデータとレベルデータを保存/読み込みできます。

専用サーバー
レベルアクターはサーバー側で保存されます。プレイヤーデータについては、サーバーに保存することも、プレイヤーがローカルに保存することも可能です。

シームレストラベル
シームレストラベルは、特別な設定なしでサポートされています。

サーバーのみのプレイヤーデータ保存
サーバーにのみプレイヤーデータを保存することも可能です。
Steam IDやプレイヤー名などの、プレイヤーを識別できる一意のIDが必要になります。これにより、サーバー上に各プレイヤーごとに個別の保存ファイルが作成されます。

プレイヤーデータをいつ保存するかは、プロジェクトによって異なります。理論上、サーバーはすべてのプレイヤーデータを一度に保存することも、プレイヤーが退出しようとした時に保存することも可能です。
クライアントは、レプリケートされた関数を使用してサーバーに保存要求を送信することはできません。

データは常に現在の保存スロットに保存されます。これは非常に軽量な機能で、現時点ではPlayer Actorでの構造体データの自動保存はサポートしていません。構造体アセット内の各変数に対して、保存設定を個別に指定するだけです。それ以外は何も必要ありません。

カスタムプレイヤーデータも同様の方法で削除できます。

4.9. 汎用オブジェクトの保存

UObjectは、任意のActorの一部として保存できます。
これにより、プラグインの他のシステムともシームレスに連携できます。

保存可能なオブジェクトは、ランタイムで生成されたUObject、サブシステム、その他のActorなど、あらゆる種類のものになります。

これは高度な機能です。通常は、UObjectを保存する必要はありません。

オブジェクト内の変数も、保存対象として扱うには「Save Game」が有効になっている必要があります。

この機能を使用するには、保存対象のActorブループリント内に2つのノードを追加するだけです。入力データ構造体には、Actorの保存データに追加するオブジェクトと、一意のIDを指定します。IDには、GUID、ゲームプレイタグ、または単純な数字など、何でも使用できます。

データはActorと共に保存されます。Actorのロード時に、EMSはこれらのオブジェクトを自動的に再作成するのではなく、必要に応じてデータを取得します。保存ノードを呼び出す最適なタイミングは、Pre-Saveイベントです。

これは、プレイヤー所有のActor(例えば、ゲーム開始時にキャラクターが生成・装備する武器など)のデータを保存する場合にも使用できます。

4.10. ロード用デリゲート

このプラグインには、Actorのロードが完了した際に通知される複数のデリゲートが用意されています。これらを使用しない場合は、「Load Game Actors」ノードの「On Completed」出力を使用します。これらのデリゲートにアクセスするには、Easy Multi Saveサブシステムを参照してください。ブループリントアクションリストで「EMSObject」を検索してください。

現在、3つのデリゲートが用意されています。

これらのデリゲートは、通常どおりにバインドまたはアンバインドできます。レベルイベントとパーティションイベントには、ロードされたすべてのActor(ランタイムで生成されたActorを含む)へのソフト参照のリストが付属しています。このリストはイベント実行中のフレームのみ有効ですが、必要に応じてコピーできます。

フレームワーク

5.1. プロジェクトベースのプラグイン

場合によっては、Easy Multi Saveをプロジェクトと一緒にパッケージ化する必要があります。

プラグインのソースコードを修正する場合は、必ずこの方法でパッケージ化してください。また、特定のモバイルデバイスやコンソール向けにビルドする場合にも必要です。

プロジェクトディレクトリ内に「Plugins」フォルダを作成します。 …\MyProject\Plugins

UEがインストールされているフォルダに移動し、プロジェクトで使用しているバージョンを選択します。
…\Epic Games\UNREAL_VERSION\Engine\Plugins\Marketplace

EasyMultiSaveフォルダを、プロジェクトディレクトリ内の新しいPluginsフォルダにコピーします。

Epic Games Launcherを開き、Easy Multi Saveプラグインをアンインストールしてください。これで、プロジェクト固有のプラグインのみが使用されます。他のプロジェクトで使用する場合は、LauncherからEMSを再度インストールする必要があります。プラグインをコンパイルおよびパッケージ化するには、プロジェクトに少なくとも1つのC++クラスが必要です。そうでない場合、ランチャー版のプラグインが常に使用されます。

トラブルシューティング

エディター起動時
EMSの初期化に問題が発生した場合は、EasyMultiSave.upluginファイル内のロードフェーズを変更してください。

「LoadingPhase”: “Default”」を「LoadingPhase”: “PreDefault”」に変更してください。

パッケージ化されたゲーム
パッケージ化されたゲームに問題が発生した場合、通常はDefaultEngine.iniが古いバージョンで、無効なスロット情報が含まれていることが原因です。対処方法は非常に簡単です。
プラグイン設定で「スロット情報クラス」を「なし」に設定し、再度「EMSInfoSaveGame」または独自のクラスに設定してください。

DefaultEngine.iniの内容が以下のようになっていることを確認してください。

[/Script/EasyMultiSave.EMSPluginSettings]
SlotInfoSaveGameClass=/Script/EasyMultiSave.EMSInfoSaveGame

マルチスレッド保存
マルチスレッド保存が有効になっている場合、EMSがレンダースレッドまたはゲームスレッドをクラッシュさせる場合があります。これは、保存イベントから直接オブジェクトにアクセスしようとした場合に発生します。これを解決するには、プラグイン設定で「ゲームスレッドで保存」を有効にしてください。

パッケージ化されたセーブデータの互換性
エディターで保存されたセーブデータは、開発/リリース/デバッグビルドで読み込むことができます。
ただし、逆は通常できません。

アクタが読み込まれない
まれに、レベルを開いた直後に、EMSが一部のアクタを処理できない場合があります。これを解決するには、Load Game Actorsを呼び出す前に、少し待機時間を設けてください。

保存して読み込んでも何も起こらない
レベルを再開せずに、Save Game ActorsとLoad Game Actorsを連続して呼び出す場合は、「完全リロード」を有効にしてください。そうすることで、データが新しいものとして読み込まれます。

位置情報が0になる
アクタの移動方法が「移動可能」に設定されていることを確認してください。物理的なアクタの場合は、ルートコンポーネントがシミュレーション対象になっていることを確認してください。

ゲームインスタンスの初期化
ゲームインスタンスブループリントの初期化イベントからEMS関数を呼び出す場合は、呼び出す前に少し待機時間を設けてください。EMSサブシステムは同じフレームで初期化されるため、そうしないと予期しないエラーが発生する可能性があります。

アクタのタグ
保存されたアクタのタグをすべて削除しないでください。EMSは、特定の状態を識別するためにこれらのタグを使用します。アクターにタグを追加する場合は、タグの削除は必ず手動で行ってください。

ファイルアクセスロックについて
開発中に、プロジェクトがクラウドサービスと同期され、ファイルがリアルタイムでアップロードされる場合があります。DropboxやGoogle Driveなどのアプリケーションは、クラウドサービスとの同期中にファイルをロックします。これにより、通常は書き込み保護状態となり、EMSはアップロード中に保存ファイルを上書きすることができなくなります。この状態は数秒間続くことがあり、ログに警告メッセージが表示されます。対処法としては、保存時にプロジェクトを同期しない、またはクラウドサービスアプリでSaveGamesフォルダを無視している可能性があります。

オブジェクトエラー警告
開発ビルドでは、まれに「Object.None.Noneが見つかりません」という警告が表示される場合があります。これは無視して構いません。機能に影響はなく、リリース版では表示されません。これは、EMSで処理されるコンポーネントまたはアクタに関連している可能性があります。ブループリントクラスを複製したり、アセットを再作成したりすると解決する場合があります。また、ゲームアクタの読み込み前に短時間待機させるのも有効です。

新規ゲーム
「新規ゲーム」機能の実装時には、メモリ内のデータをクリアすることが重要です。これにより、不要なデータや意図しないデータが読み込まれるのを防ぎ、ゲームをクリーンな状態から開始できます。また、実際に保存されない一時的なセーブスロット名を使用することをお勧めします。

セーブスロットが削除されない
サムネイルが削除できない場合に発生する可能性があります。
解決策は、シーンキャプチャコンポーネントで「レンダリング状態を常に保持」を無効にすることです。そうしないと、サムネイルファイルがロックされる可能性があります。

スロットでカスタムセーブが削除されない
この問題は、コンソールファイルシステムでのみ発生します。カスタムセーブオブジェクトにアクセスしていない場合、キャッシュに存在しないためです。そのため、Delete Custom Save Objectノードを使用して手動で削除する必要があります。

乗っ取り時の重複アクタ
別のPawn(車両など)に乗っ取って乗っ取り状態を保存する場合、初期のデフォルトPawnと乗っ取られたPawnの両方がレベルに配置されている必要があります。プレイヤー開始位置から初期生成した場合、重複したPawnが生成される可能性があります。ランタイムで生成された乗っ取られたPawnの保存は、今後のバージョンで対応予定です。

「IsLevelStreamingActive」が常にtrueを返す
この場合、Unreal Engineは一部のワールドパーティションセルの実際のストリーミング状態を判別できない可能性があります。代わりにWorldPartitionSubsystem > IsStreamingCompletedを使用し、プラグインからの警告は無視してください。

5.3. コンソール

ビルド
まず、設定でファイルシステムをコンソールに変更する必要があります。コンソール版のプラグインは、プロジェクトフォルダからビルドする必要があります。プロジェクトベースのプラグインを参照してください。

また、EasyMultiSave.upluginファイルに適切なコンソールを追加する必要があります。例:

「PlatformAllowList」:
[
“Win64”,
“PS5”,
“XB1”,
“XSX”
]

ファイルアクセス

「すべてのセーブスロットを取得」ノードは、一部のプラットフォームではファイルアクセス制限により利用できない場合があります。回避策としては、固定数のセーブスロットを使用し、「指定されたセーブスロットを取得」で取得したタイムスタンプでソートする方法があります。

サムネイル
PS5では、現在サムネイルの保存機能が動作しません。
この問題を解決するには、Epic Gamesによるエンジン側の修正が必要です。

ユーザーデータの保存
これはコンソールログインシステムによって管理されます。EMSのユーザーデータ保存機能は、コンソールでは動作しません。

5.4. Android

Androidで権限に関する問題が発生した場合は、以下のリソースを参照してください。
https://defconnet.work/en/how-android-save-games-work-ue4-27/
https://forums.unrealengine.com/t/android-13-save-game-permissions-not-working/
https://chatgpt.com/share/68714489-66a0-800f-be2c-317aa2e8e5ed

重要なのは、権限を付与することです。権限が付与されると、通常どおりEMSの関数を呼び出すことができます。GameInstanceから呼び出す必要はありません。

セーブデータを削除するには、追加の権限が必要です。
プロジェクト設定の「Android高度なAPKパッケージング」セクションで、「追加の権限」に「android.permission.WRITE_EXTERNAL_STORAGE」を追加してください。

5.5. バージョン管理

EMSで使用されるすべてのファイルは、Unreal EngineのデフォルトのGVASタグと、エンジンおよびファイルパッケージのバージョン情報を使用してバージョン管理されます。通常は特別な設定は必要ありません。ただし、古いバージョンのエンジンで作成されたセーブデータを移行する場合は例外です。設定画面で、古いセーブデータが作成されたエンジンのバージョンを選択してください。デフォルトではUE5が選択されています。

ログには、ファイルバージョンが空であることを示す警告が表示されます。問題なく正常に読み込まれた場合は、ゲームを再度保存すると、ファイルにバージョン情報が書き込まれます。マルチレベルセーブ機能
マルチレベルセーブ機能を使用し、旧バージョンのエンジンからセーブデータを移行する場合は、新しいエンジンのビルドで「マルチレベルセーブアクタの移行」機能を有効にする必要があります。

ファイル整合性チェック
セーブファイルの整合性チェック機能は、セーブファイルが正常に読み込めるかどうかを確認します。ファイルが破損する確率は非常に低いですが、念のため整合性チェックを行うことをお勧めします。デフォルトでは、スロット、プレイヤー、レベルのデータがチェックされますが、カスタムセーブオブジェクトのみ、またはスロットのみをチェックすることも可能です。また、詳細なチェックを実行する場合は、バージョン情報がログに記録されます。この機能はデスクトッププラットフォームのみに対応しており、他のプラットフォームではネイティブの整合性チェック機能が使用されるため、この機能は実行されません。

5.6 自動バックアップ

プラグインは、有効なセーブデータを自動的にバックアップできます。
設定画面で「以前のデータを自動バックアップ」を有効にしてください。

この機能を有効にすると、既存のセーブデータを上書きする前に、自動的にバックアップが作成されます。保存データを作成します。バックアップにアクセスするには、現在のスロット名に「_bak0」を連結した名前を使用してください。例えば、データは「MySaveGame_bak0」というスロットに保存されます。

サムネイルは自動的にバックアップされません。

5.7 アセットとの互換性

多くのFABアセットは、UEの標準機能に基づいた独自の保存システムを備えています。ほとんどの場合、EMSはアセットを解析することなく、既存のシステムと連携させることができます。

最も簡単な方法は、カスタム保存オブジェクトを使用し、既存の保存用ブループリントをEMS用カスタム保存オブジェクトにリペアレントすることです。次に、保存ノードと参照を「Save Custom Object」と「Get Custom Object」に置き換えます。これによって簡単に実装できます。その後、アクターの保存機能も追加できます。

Easy Multi Saveは、Moonville EntertainmentのMenu System Proと互換性があります。
付録

サポート

Easy Multi Saveに関するご質問、ご意見、バグレポート、機能リクエスト、またはEMSを使用したプロジェクトのご紹介などがありましたら、お気軽にお問い合わせください。

FABでEasy Multi Saveを評価していただけると大変嬉しいです。ありがとうございます!

Discordサポート
Easy Multi Save Discordサーバーに参加する

メールサポート
HegiDev@gmail.com

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次