61.

UE5のSave Game To Slotがfalseになる原因と解決方法

編集

Unreal Engine 5(以下UE5)で「Save Game To Slot」ノードの戻り値(Return Value)がfalseになるのは、セーブデータの書き込みに失敗しているサインです。最も多い原因は、有効なセーブゲームオブジェクトが渡されていないこと(Create Save Game Objectをしていない、または変数がNullのまま)です。本記事では、まず最短で直すための手順を示し、続いて主な原因・確認方法・落とし穴・FAQを順に解説します。なお、ここで紹介する内容はUE5系の一般的な挙動に基づくため、お使いのエンジンバージョンや対象プラットフォームによって細部が異なる場合があります。最終的な仕様は公式ドキュメントでのご確認をおすすめします。

この記事の要点
  • 戻り値falseは「保存に失敗した」という意味。まず渡しているセーブゲームオブジェクトが有効か(Nullでないか)を疑う。
  • 正しい順序はCreate Save Game Object → 値を設定 → Save Game To Slot。この順を守るだけで多くのケースが解決する。
  • 渡す前にIs ValidでNullチェックを入れると、原因の切り分けが一気に進む。
  • スロット名は保存時とロード時で完全に一致させ、変数で固定するのが安全。
  • 保存したい変数はSaveGameクラスのメンバ変数として定義し、必要に応じてSaveGame指定子を付ける。
  • 容量不足・書き込み権限・モバイル/コンソールの制約も失敗要因になり得る。

最短の解決手順(まずこれを試す)

原因の多くは「セーブ処理の組み立て順」と「Null状態のオブジェクトを渡していること」に集約されます。次の手順どおりに組み直すと、多くのケースで戻り値がtrueに戻ります。

  1. Create Save Game Objectノードで、自作のSaveGameクラスを指定してセーブゲームオブジェクトを生成する。
  2. 生成したオブジェクトの各変数(メンバ)に保存したい値を代入する。
  3. そのオブジェクトをSave Game To SlotのSave Game Objectピンに渡す。
  4. スロット名(Slot Name)とUser Indexを指定する。User Indexは単一プレイヤー想定なら0でよい。
  5. 戻り値がtrueになることを確認する。falseの場合は、後述の「Is Validチェック」を追加して切り分ける。

ありがちな失敗は、毎フレームや別処理で使う「セーブゲームオブジェクト変数」を宣言だけして一度もCreate Save Game Objectで生成していないパターンです。この場合、変数はNull(未設定)のままSave Game To Slotに渡されるため、保存は成立せずfalseが返ります。「保存の直前に必ず有効なオブジェクトが存在する」状態を作ることが第一歩です。

戻り値がfalseになる主な原因

Save Game To Slotがfalseを返す代表的な原因を、影響が大きい順に整理します。

原因何が起きているか主な対処
セーブゲームオブジェクトがNullCreate Save Game Objectをしておらず、変数が空のまま渡されている保存直前にCreate Save Game Objectで生成。Is Validで確認
処理順が逆値設定や生成より先にSave Game To Slotを呼んでいる生成→値設定→保存の順に並べ直す
スロット名の不一致・不正空文字や特殊文字、保存とロードで名前が違うスロット名を変数で固定し、保存・ロードで共有
保存変数が定義されていないSaveGameクラス側に該当変数がなく値が乗らないSaveGameクラスにメンバ変数を定義(必要に応じSaveGame指定子)
書き込み権限・容量不足保存先ディレクトリに書けない、ストレージが満杯空き容量と保存先の権限を確認
プラットフォーム制約モバイル/コンソール特有のストレージ・認証要件各プラットフォームの保存方式に合わせる

1. セーブゲームオブジェクトがNullのまま渡されている

最頻出の原因です。Save Game To Slotは、有効なセーブゲームオブジェクトを受け取って初めて書き込みを行います。Create Save Game Objectを呼んでいない、あるいは別の場所で生成したつもりの変数が実際には空(Null)になっている場合、保存は成立せずfalseが返ります。Save Game Objectピンに渡しているオブジェクトが「確実に生成済みか」を最初に確認してください。

2. 生成・値設定・保存の順序が崩れている

UE5のセーブは「Create Save Game Objectで器を作る → その器に値を入れる → Save Game To Slotで書き出す」という流れが基本です。値の代入より前に保存を呼んだり、生成より前に保存を呼んだりすると、空または不完全な状態が書き出されたり、失敗したりします。ノードの実行ピン(白い矢印)が意図した順序でつながっているかを見直しましょう。

3. スロット名が不正、または保存とロードで食い違っている

スロット名(Slot Name)が空文字だったり、ファイル名として扱いにくい特殊文字(スラッシュ「/」やコロン「:」など)を含んでいると、環境によっては保存に失敗することがあります。さらに見落としがちなのが、保存時とロード時でスロット名がわずかに違うケースです。保存自体は成功していても、ロードで別名を指定して「保存できていない」と誤認することがあります。スロット名は1か所の変数で定義し、保存・ロードの両方から参照するのが安全です。

4. 保存したい変数がSaveGameクラスに定義されていない

保存対象の値は、自作のSaveGameクラス(USaveGameを継承したクラス)のメンバ変数として用意し、その変数へ代入してから保存する必要があります。クラス側に受け皿となる変数がないと、値はどこにも乗らず、保存しても意味のあるデータになりません。C++でArIsSaveGameを有効にして書き出す構成では、対象プロパティにSaveGame指定子を付ける必要がある点にも注意してください(Blueprintのみで完結する一般的な構成では、クラスに変数を持たせて代入すれば保存対象になります)。

5. 書き込み権限・ストレージ容量の問題

保存先に書き込めない場合もfalseになります。ディスク/ストレージの空き容量が不足している、保存先ディレクトリへの書き込み権限がない、といったケースです。特にコンソールやモバイルでは保存先や権限の扱いがPCと異なるため、容量と権限の両面を確認してください。

6. 対象プラットフォーム固有の制約

モバイルやコンソールでは、ストレージの保存方式や認証・認可の要件がPCと異なります。「エディタ上では成功するが、実機ビルドでのみfalseになる」という事例も報告されています。実機で問題が出る場合は、対象プラットフォームのセーブ要件を個別に確認する必要があります。なお、大きなデータの保存や、プレイヤーが操作中の自動セーブでは、フレーム落ちや一部プラットフォームの認証回避の観点から、同期版のSave Game To SlotではなくAsync Save Game to Slot(非同期版)の使用が推奨されています。

原因を切り分けるためのチェック手順

falseが返るとき、どの段階で失敗しているかを切り分けると解決が早まります。

  • Is Validで渡す前に確認:Save Game To Slotに渡す直前で、セーブゲームオブジェクトをIs Validに通します。Not Validなら、Create Save Game Objectが実行されていない(=原因1)と特定できます。
  • 戻り値を分岐で受ける:Save Game To Slotの戻り値をBranchに接続し、falseのときにPrint Stringでメッセージを出すと、失敗の発生を可視化できます。
  • Output Log / Message Logを確認:エディタのログに警告やエラーが出ていないかを確認します。手がかりが残っていることが多いです。

// 切り分けの考え方(擬似フロー)

Create Save Game Object(クラス=自作SaveGame)

→ 変数に値を代入

→ Is Valid?(Not Validなら生成漏れ=原因1)

→ Save Game To Slot(Slot Name=変数で固定 / User Index=0)

→ Return Value を Branch で判定(false なら Print String で表示)

保存できているかを確認する方法

保存処理を直したら、本当に書き込めているかを確認します。次の2つが定番です。

  • Does Save Game Exist:指定したスロット名とUser Indexのセーブデータが存在するかを真偽値で返します。保存後にtrueになれば、書き込み自体は成立しています。
  • Load Game from Slot:保存に使ったのと同じスロット名・User Indexでロードし、戻り値を自作SaveGameクラスにキャストします。キャストが成功し、保存したはずの値が取り出せれば、保存とロードの往復が機能していると確認できます。

ここで重要なのは、確認に使うスロット名・User Indexを保存時とそろえることです。名前やインデックスがずれていると、保存は成功していてもDoes Save Game Existがfalseを返し、原因を見誤ります。

よくある落とし穴
  • オブジェクト未生成:Create Save Game Objectを通さず、空(Null)の変数をそのまま渡している。Is Validで最初に弾く。
  • スロット名の不一致:保存とロード(や存在確認)でスロット名・User Indexが違う。1か所の変数で共有して防ぐ。
  • 処理順の取り違え:値の設定より先に保存を呼び、空のまま書き出している。実行ピンの流れを確認する。
  • 容量・権限:ストレージ満杯や保存先への書き込み不可。実機では特に確認が必要。
  • モバイル/コンソール固有の制約:エディタでは通るが実機でのみfalse。対象プラットフォームの保存要件を個別に確認する。
  • C++でのSaveGame指定子漏れ:ArIsSaveGame運用時にプロパティへSaveGame指定子が付いておらず、値が保存対象から外れる。

よくある質問(FAQ)

Q1. Create Save Game Objectは毎回呼ぶ必要がありますか?

新規にセーブデータを作る場面では、Create Save Game Objectで有効なオブジェクトを用意してから保存します。すでに有効なセーブゲームオブジェクトを保持していて、その値を更新して保存し直すだけなら毎回生成する必要はありません。ポイントは「Save Game To Slotに渡すオブジェクトが、その時点でNullでないこと」です。不安なときは渡す前にIs Validを挟むと確実です。

Q2. User Indexには何を指定すればよいですか?

単一プレイヤー向けの一般的な構成では0で問題ありません。重要なのは、保存・ロード・存在確認のすべてで同じUser Indexを使うことです。値がずれると、保存したデータを正しく参照できず「保存できていない」ように見えることがあります。

Q3. エディタでは保存できるのに、実機(モバイル等)だけfalseになります。

プラットフォーム固有のストレージ・権限・認証要件が原因のことがあります。実機で問題が出る場合は、対象プラットフォームのセーブ要件を確認し、必要に応じて非同期版のAsync Save Game to Slotの利用も検討してください。具体的な要件はバージョンやプラットフォームで異なるため、最終的には公式ドキュメントでの確認をおすすめします。

まとめ

Save Game To Slotの戻り値がfalseになるのは「保存に失敗した」というサインで、最も多い原因は有効なセーブゲームオブジェクトを渡せていないことです。まずは「Create Save Game Object → 値設定 → Save Game To Slot」の順に組み直し、渡す直前にIs Validを挟んでNullを切り分けるのが近道です。あわせてスロット名・User Indexを変数で固定して保存・ロードで共有し、必要に応じて容量・権限・プラットフォーム制約を確認すれば、多くのケースで保存が成立するようになります。それでも解決しない場合は、Output LogやMessage Logの内容と合わせて、お使いのバージョンの公式ドキュメントを確認してください。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 床の上に乗ったらイベントを発生させる方法
  2. OverlapAllDynamicとOverlapAllの違い
  3. タイトル画面を作る方法
  4. サードパーソンテンプレートでのキャラクター表示の仕組みと非表示にする方法
  5. ボタンに文字を記載する方法
  6. Event ActorBeginOverlapとOn Component Begin Overlapの違い
  7. キャラクターに特定のオブジェクトとの当たり判定を付ける
  8. 特定のオブジェクトに触れたとき、キャラクターが倒れるようにする
  9. 動いているオブジェクトに静止しているキャラクターが当たり判定を持たない原因と解決方法
  10. 「On Component Hit」に「Cast To ~」で複数のクラスを指定する方法
  11. Blenderファイルをインポートする方法
  12. 鏡を作成する方法
  13. レベルブループリントでキャラクターの出現を設定する方法
  14. サードパーソンテンプレートにおけるキャラクター出現の定義
  15. アイテムに近づいたらボタンを押してイベントを発火させる方法
  16. 画面の中央にメッセージを表示する方法
  17. どこからでも呼び出せるカスタムイベントを作成する方法
  18. カスタムイベントに引数を追加する方法
  19. 「Get Overlapping Actors」から特定のクラスの場合のみ処理を実行する方法
  20. オブジェクトに近づいている間だけメッセージを表示する方法
  21. PCの画面を操作するUIを作る方法
  22. コンテンツブラウザに画像を追加する方法
  23. SetInputMode_UIOnlyを取り消す方法
  24. 特定の画像の上にマウスカーソルを置いたら手マークにする方法
  25. オブジェクトがアウトライナーで選択できない原因と解決策
  26. PlayerStartを作成する方法
  27. メニュー画面を作成して開く方法
  28. 「Esc」キーを押してメニュー画面を開く方法
  29. イベントの「On Clicked」と「On Pressed」の違い
  30. 「Set Input Mode」の種類と使い方
  31. 「Set Game Paused」の使い方と詳細解説
  32. Motion Matchingとは?
  33. 「GameMode」と「GameModeBase」の違い
  34. マップに配置したTargetPointを取得する方法
  35. TargetPointにタグをつけて取得する方法
  36. Spawnしたインスタンスがイベントを実行する方法
  37. 特定の時間ごとに処理を実行する方法
  38. 数値をランダムで出力する方法
  39. ThirdPersonテンプレートでキャラクターの移動を歩くように変更する方法
  40. MaxWalkSpeedを変更する方法
  41. しゃがむ動作を導入する方法
  42. キャラクターのアニメーションを設定する方法
  43. 導入済みのプラグインを確認する方法
  44. Motion Matchingの導入と必要なプラグイン
  45. プレイヤーを非表示にする方法
  46. カメラを傾ける角度を制限させる方法
  47. 配列からランダムに重ならない要素を特定の数取得する方法
  48. カメラの映す画面に文字やエフェクトを付ける方法
  49. キャラクターやメッシュを非表示にした際にカメラが移動しなくなる問題の解決方法
  50. プライマリーデータアセットを活用する方法
  51. プレイヤーのHPといった変数を定義する最適な場所
  52. カメラに映った画面をスクリーンショットとして保存する方法
  53. ゲーム内のカメラ映像を保存して再表示する方法
  54. HighResShot を使って高解像度の画像を保存する方法(UE5)
  55. HighResShotで保存した画像のファイル名を取得する方法
  56. SceneCapture2DとFrameGrabberの画像保存方法の比較
  57. SceneCapture2Dを使用して画像を保存・取得する方法
  58. HighResShotとTake High Res Screenshotの違い
  59. ゲーム終了ボタンを作成する方法
  60. 「Save Game To Slot」の戻り値がfalseになる問題の解決方法
  61. 画面上にメッセージを指定された時間表示させる方法
  62. シェーダコンパイル時間を短縮する方法
  63. 「Take High Res Screenshot」実行時に「シェーダをコンパイル」に長時間待たされる問題とその解決策
  64. データベースを活用する方法
  65. UE5.5がインストールされた環境にUE5.4を追加で導入する方法
  66. World PartitionとWorld Compositionの違い
  67. オープンワールドテンプレートとは?
  68. ポーンをスポーンさせても視点を切り替えない方法
  69. キャラクター同士がすり抜けてしまう問題の解決方法
  70. キャラクターの外見を動的に変更
  71. World Partitionでインスタンスが「アンロード済み」になる問題
  72. データ アセットとデータ テーブルの違い
  73. コンポーネントイベントグラフ内で親クラスの変数にアクセスする方
  74. エディターのソースコードの自動保存の頻度を高める方法
  75. SpawnActorでSpawn Transform Rotationが反映されない理由
  76. ミニマップを表示しポーンの位置を反映する方法
  77. RInterp ToとVInterp Toの違い
  78. 毎秒実行するイベントの定義方法
  79. Niagara のエフェクトにコリジョンを持たせる方法
  80. 「Overlap」と「Hit」の違い
  81. OverlapはあるがHitがない原因
  82. Overlapした位置の座標を取得する方法
  83. ブループリントでレベル間のパラメータを受け渡す方法

最近更新/作成されたページ