本文へスキップ
開発設計

ゲーム開発のセーブデータ設計入門【初心者向け】

ゲーム開発初心者向けに、セーブデータ設計の基本を解説。どの情報を保存するか、最初に考えるべきことを整理します。

公開日: 2026-05-28#Unity#セーブデータ#ゲーム開発#初心者
+
*
+
ココ先生・喜ぶ
ココ先生
ゲーム開発の案内役
この記事では セーブと復帰導線 を、読んで終わりにせず、SaveRecoveryDemo の小さな実装イメージまでつなげて案内します。
+
*
+
はじめちゃん・笑う
はじめちゃん
ゲームエンジン学習中
ゲーム開発のセーブデータ設計入門【初心者向け】 を読む前に、まずUnity のどこを見ればよいかを確認したいです。
ココ先生
今日は「セーブと復帰導線」を、まず何が変わるのか、次に画面で何を見せるのか、最後にどの値を確認するのか、という順番で読んでいきます。
はじめちゃん
大きなテーマに見えますが、今日は「SaveRecoveryDemo」という小さな練習用の場面だけを作るのですね。何から始めればよいか分かりました。
ココ先生
保存地点を記録を表示、Retry Buttonで進める、リトライを選ぶを確認の流れを追えば、記事の内容を自分のプロジェクトへ移しやすくなります。
ゲーム開発のセーブデータ設計入門を表したヒーロー画像
完成イメージ

セーブと復帰導線の状態を分ける

保存地点を記録、リトライを選ぶ、復旧警告を出す を別々の状態として扱い、今どの段階かを画面で確認できるようにします。

どこから戻るかをUIで伝える

Console だけではプレイヤーには見えません。TextMeshPro や Slider に saveSlotIndex / checkpointDistance / retryCount を出して、判断材料を画面へ移します。

最小実装から広げる

まず SaveRecoveryDemo を動かし、その後に本物の入力、通信、戦闘、保存処理などへ置き換えると、原因を見失いにくくなります。

導入

ゲーム開発のセーブデータ設計入門【初心者向け】では、セーブと復帰導線を小さな確認用シーンで作ります。セーブと復帰導線 は、しおりを挟んだ本に戻る感覚です。大事なのは、内部処理を全部見せることではなく、プレイヤーが「今は リトライを選ぶ で、次に 復旧警告を出す へ進む」と分かる目印を置くことです。

これから作るもの

  • Project ウィンドウで右クリックし、Create > C# Script を選びます。名前を SaveRecoveryTutorial にして新規作成します。
  • Hierarchy で右クリックし、Create Empty を選びます。名前を SaveRecoveryDemo に変え、作った SaveRecoveryTutorial スクリプトをこの GameObject へドラッグして付けます。
  • Canvas がなければ Hierarchy で右クリックし、UI > Canvas を選びます。Canvas を右クリックして UI > Text - TextMeshPro を新規作成し、どこから戻るか を表示する文字にします。
  • Canvas を右クリックして UI > Button を新規作成し、名前を Retry Button に変えます。これは状態を1つ進めるために押す Button GameObject です。
  • SaveRecoveryDemo を選び、Inspector の SaveRecoveryTutorial コンポーネントにある saveSlotIndex、checkpointDistance、retryCount を確認します。ここで数字を変えると、ゲームを再生した時の最初の値を変えられます。

ステップ1: 値を作る

保存地点を記録、リトライを選ぶ、復旧警告を出す を別々の状態として扱い、今どの段階かを画面で確認できるようにします。

[SerializeField] private TextMeshProUGUI statusText;    // 状態や結果を画面に表示するTextへの参照
    [SerializeField] private float saveSlotIndex = 1f;    // saveSlotIndex は Inspector で調整するゲーム内の値
    [SerializeField] private float checkpointDistance = 2f;    // checkpointDistance は Inspector で調整するゲーム内の値
    [SerializeField] private float retryCount = 3f;    // retryCount は Inspector で調整するゲーム内の値

ステップ2: 状態を進める

ボタンを押した時だけ、次の状態へ進めます。待ち時間を作らず、Play中にすぐ確かめられるようにします。

private int step;
        step = (step + 1) % 3;
        var label = step == 0 ? "保存地点を記録" : step == 1 ? "リトライを選ぶ" : "復旧警告を出す";

ステップ3: 今の状態に名前を付ける

Console だけではプレイヤーには見えません。TextMeshPro や Slider に saveSlotIndex / checkpointDistance / retryCount を出して、判断材料を画面へ移します。

var label = step == 0 ? "保存地点を記録" : step == 1 ? "リトライを選ぶ" : "復旧警告を出す";

ステップ4: 画面に出す

状態と値を画面へ出します。数値だけでなく、今何が起きているかを一緒に表示します。

if (statusText != null)
        {
            statusText.text = $"{label}\nsaveSlotIndex={saveSlotIndex:0.##}\ncheckpointDistance={checkpointDistance:0.##}\nretryCount={retryCount:0.##}";
        }
        Debug.Log($"セーブと復帰導線: {label}");

ステップ5: Play中に確認する

Play を押し、作った Button をクリックして 保存地点を記録を表示 → Retry Buttonで進める → リトライを選ぶを確認 → 復旧警告を出すで結果を見る の順に変わるか見ます。画面の表示とConsoleのログが同じ内容なら、最小実装は完成です。

// Button コンポーネントの On Click() から NextStep() を選びます。
// Play中にButtonを押すたび、この関数が1回呼ばれます。
    public void NextStep()
    {
        step = (step + 1) % 3;
        var label = step == 0 ? "保存地点を記録" : step == 1 ? "リトライを選ぶ" : "復旧警告を出す";
        if (statusText != null)
        {
            statusText.text = $"{label}\nsaveSlotIndex={saveSlotIndex:0.##}\ncheckpointDistance={checkpointDistance:0.##}\nretryCount={retryCount:0.##}";
        }
        Debug.Log($"セーブと復帰導線: {label}");
    }

完成版

ここまでをまとめた SaveRecoveryDemo の完成版です。

using UnityEngine;
using TMPro;

public class SaveRecoveryTutorial : MonoBehaviour
{
    [SerializeField] private TextMeshProUGUI statusText;
    [SerializeField] private float saveSlotIndex = 1f;
    [SerializeField] private float checkpointDistance = 2f;
    [SerializeField] private float retryCount = 3f;

    private int step;

    public void NextStep()
    {
        step = (step + 1) % 3;
        var label = step == 0 ? "保存地点を記録" : step == 1 ? "リトライを選ぶ" : "復旧警告を出す";
        if (statusText != null)
        {
            statusText.text = $"{label}\nsaveSlotIndex={saveSlotIndex:0.##}\ncheckpointDistance={checkpointDistance:0.##}\nretryCount={retryCount:0.##}";
        }
        Debug.Log($"セーブと復帰導線: {label}");
    }
}

Inspectorでつなぐ

  1. Hierarchy で SaveRecoveryDemo を選び、Inspector に SaveRecoveryTutorial コンポーネントが付いていることを確認します。
  2. Canvas の Text (TMP) を SaveRecoveryDemo の Inspector にある Status Text 欄へドラッグします。これでスクリプトが文字を変更できます。
  3. Retry Buttonで進める用に作った Button GameObject を選びます。Inspector の Button コンポーネントにある On Click() で + を押し、SaveRecoveryDemo を空欄へドラッグします。
  4. On Click() のメニューから SaveRecoveryTutorial > NextStep() を選びます。これで Button を押した時に NextStep が動きます。
  5. SaveRecoveryDemo の Inspector で値を少し変え、Play を押します。Button を押して、文字と数字が変われば設定完了です。

次に足すとよいもの

  • ログだけで終わる: セーブと復帰導線はプレイヤーが見る機能なので、Debug.Log だけでは不足です。必ず画面表示も同時に確認します。
  • 状態名が曖昧: 保存地点を記録、リトライを選ぶ、復旧警告を出す の名前が似すぎると、どこで失敗したか分かりません。短く別の言葉にします。
  • 一度に本番化する: 最初から大きなシステムへつなぐと原因が追いにくくなります。SaveRecoveryDemo で表示と値だけを固めてから広げます。

まとめ

完成形は SaveRecoveryDemo です。Retry Button を押すと状態が 保存地点を記録 → リトライを選ぶ → 復旧警告を出す と進み、saveSlotIndex、checkpointDistance、retryCount が TextMeshPro の表示と Console ログに出ます。 まずは SaveRecoveryDemo をPlay中に動かし、画面で変化が読めるところまで作ってください。

はじめちゃん
最後に整理すると、セーブと復帰導線でいちばん見失いやすい所はどこですか?
ココ先生
内部処理だけを追って、画面で伝える言葉を後回しにする所です。SaveRecoveryDemoでは、まずプレイヤーに見える変化を先に決めます。
はじめちゃん
流れは「保存地点を記録を表示」から始めて、「Retry Buttonで進める」で操作を入れる、と覚えればよいですか?
ココ先生
その通りです。その後に「リトライを選ぶを確認」で途中状態を見て、「復旧警告を出すで結果を見る」で結果を確認します。順番を固定すると、失敗した場所も見つけやすくなります。
はじめちゃん
つまり、いきなり完成システムにせず、状態名、表示、値の変化を小さくそろえるのですね。
ココ先生
はい。最後は「セーブと復帰導線をわかりやすく考える」の考え方で、難しい処理をプレイヤーに伝わる短い合図へ置き換えられるか確認しましょう。
この記事のまとめを案内するガイドキャラクター

この記事のまとめ

ゲーム開発初心者向けに、セーブデータ設計の基本を解説。どの情報を保存するか、最初に考えるべきことを整理します。

大きな違いを生むのは、派手な性能よりも 毎日触れる環境を無理なく整えること です。見やすい画面と使いやすい道具がそろうと、学習や次の一歩を決めやすくなります。