Q.Loadボタンを押したときに、Q.Saveボタンを押してセーブしたシーンをロードする。

セーブは、今までの進行を保存する機能で、ゲーム制作で最も必要なものです。
本記事では、セーブ・ロード機能の第一歩として、クイックセーブとクイックロードの実装をします。
- ノベルゲームの作り方を知りたい。
- クイックセーブとクイックロードの使い方を知りたい。
クイックセーブ・クイックロード

クイックセーブとロードの機能は、ノベルゲームで力を発揮します。
ノベルゲームにおける「QuickSave」と「QuickRoad」は、プレイヤーがゲームをよりスムーズに進行させるための機能です。
通常のセーブやロードはセーブボタンで、用意された100個程度のセーブが保存できて、それぞれをロードボタンを押して、そのシーンまで戻ることができます。
一方で、クイックセーブとクイックロードは1つ、2つと数少ないですが、短時間で手軽にゲームの状態を保存・読み込みすることができます。クイックセーブとクイックロードは、プレイヤーに便利な機能であり、ゲームの進行を効率化することができます。
特にノベルゲームではストーリーの流れや選択肢の結果によって展開が変わるため、プレイヤーが自由にセーブ・ロードできることは重要な要素となります。
選択肢でも重要なシーンでもないけれど、セーブしたい。
そんなときに役立つのがクイックセーブとクイックロードの機能になります。
クイックセーブ
クイックセーブは、プレイヤーが現在のゲームの進行状況を瞬時に保存する機能です。
特定のポイントでゲームを一時停止し、その時点の状態を保存します。
例えば、表示されているテキストや選択肢の進行度などを保存します。
通常、ノベルゲームのクイックセーブはメニューやシステムボタンからアクセスできるようになっています。
クイックロード
クイックロードは、クイックセーブで保存されたゲームの状態を瞬時に読み込む機能です。
プレイヤーはクイックロードを選択することで、
最後に行ったクイックセーブの状態からゲームを再開できます。
クイックロードを使用すると、瞬時に前回のセーブポイントからゲームを再開することができます。
クイックセーブとクイックロードの実装
ここまで、クイックセーブとクイックロードの機能と実用性を理解したところで、ここからはノベルゲームに実装していきます。
通常のセーブ・ロードに比べて、クイックセーブとクイックロードは変数の値を互いに交換する操作のみで非常に簡単に実装できます。
交換をする変数「A」・「B」として具体的に考えます。
//クイックセーブ
A=B;
//クイックロード
B=A;本記事で紹介するソースコードでは、Aは「csvcontroler.i」、Bは「QPoint」となります。
ソースコード
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class QSave_Load : MonoBehaviour
{
int QPoint;
private void Start()
{
Debug.Log(csvcontroler.i);
}
public void QSave()
{
QPoint = csvcontroler.i; // csvcontroler クラスの静的変数 i の値を保存
Debug.Log("Saved QPoint: " + QPoint);
}
public void QLoad()
{
csvcontroler.i = QPoint; // 保存した QPoint の値を csvcontroler クラスの静的変数 i にロード
Debug.Log("Loaded QPoint: " + csvcontroler.i);
}
}
解説
今回のスクリプトでは、名前空間の変更がありません。
「QPoint」はint型の変数で、保存および読み込みされるゲームデータを保持します。
int QPoint;Startメソッドは、csvcontrolerクラスの静的変数iの値を出力しています。
別に必要ではありませんが、consoleウィンドウにて処理できているか確認するために入れています。
private void Start()
{
Debug.Log(csvcontroler.i);
}QSaveメソッドは、ゲームデータを保存するためのメソッドです。
QPointにcsvcontrolerクラスの静的変数iの値を代入し、デバッグログに保存された値を表示します。
public void QSave()
{
QPoint = csvcontroler.i; // csvcontroler クラスの静的変数 i の値を保存
Debug.Log("Saved QPoint: " + QPoint);
}QLoadメソッドは、ゲームデータを読み込むためのメソッドです。
csvcontrolerクラスの静的変数iに保存されたQPointの値を代入し、デバッグログにロードされた値を表示します。
public void QLoad()
{
csvcontroler.i = QPoint; // 保存した QPoint の値を csvcontroler クラスの静的変数 i にロード
Debug.Log("Loaded QPoint: " + csvcontroler.i);
}実演
今回のスクリプト「QSave_Load.cs」をHierarchyウィンドウにアタッチをしてください。
また、クイックセーブとクイックロードを処理するUIボタン「Q.Save」と「Q.Load」を選択して、onclickの項目でそれぞれQSaveメソッドとQLoadメソッドをアタッチしてください。

ここまで完了しましたら、再生ボタンを押してください。
冒頭のような処理が行われば、成功です。
ゲームを閉じてもクイックセーブを残す
本記事のスクリプトは、保存した行番号をQPointという変数に入れているだけです。そのため、ゲームを終了したときや、シーンを読み直してQSave_Loadが付いたオブジェクトが作り直されたときに消えてしまいます。
ゲームを閉じても残したい場合は、ファイルに書き出します。
セーブデータをファイルに書き出して、読み込む方法について解説しています。
ファイルに保存するようにしたら、次の2つも気をつけると、使いやすいクイックセーブになります。
- セーブが無いときはロードボタンを押せなくする:ボタンのinteractableをfalseにすると、灰色になり押せなくなります。
- データがあるかは「保存した日時」で判定する:セーブするときに日時も一緒に保存しておき、日時が空かどうかで判定します。
public Button qLoadButton; // Q.Loadボタン
string savedAt = ""; // クイックセーブした日時(空ならセーブなし)
void Start()
{
// セーブが無いときはロードボタンを押せなくする
qLoadButton.interactable = !string.IsNullOrEmpty(savedAt);
}
public void QSave()
{
QPoint = csvcontroler.i;
savedAt = System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
qLoadButton.interactable = true; // セーブしたのでロードできるようにする
}
自作のノベルゲームで、クイックセーブの有無を「保存したデータが空でないか」で判定していたところ、一度も保存していないのに「セーブあり」になることがありました。JsonUtilityで保存すると、空のデータが中身のあるデータとして読み込まれるためです。保存した日時で判定するように変えて直しました。
まとめ
ノベルゲームにおける「クイックセーブ」と「クイックロード」は、プレイヤーがゲームをスムーズに進行させるための便利な機能です。
通常のセーブやロードとは異なり、クイックセーブとクイックロードではセーブポイントを短時間で保存・読み込みすることができます。
クイックセーブは、プレイヤーが現在のゲームの進行状況を瞬時に保存する機能です。
特定のポイントでゲームを一時停止し、その時点の状態を保存します。
通常、ノベルゲームではメニューやシステムボタンからアクセスできるようになっています。
クイックロードは、クイックセーブで保存されたゲームの状態を瞬時に読み込む機能です。
プレイヤーはクイックロードを選択することで、最後に行ったクイックセーブの状態からゲームを再開できます。
クイックロードを使用すると、前回のセーブポイントからゲームを即座に再開することができます。
クイックセーブとクイックロードの実装は比較的簡単で、変数の値を互いに交換するだけです。
// クイックセーブ
QPoint = csvcontroler.i;
// クイックロード
csvcontroler.i = QPoint;クイックセーブでは、「csvcontroler.i」の値を「QPoint」に代入し、
クイックロードではその逆の操作を行います。
クイックセーブとクイックロードは、ノベルゲームにおいて重要な要素であり、
プレイヤーが自由にゲームの進行を管理できるようにするための機能です。
これにより、プレイヤーは選択肢やストーリーの展開によって影響を受ける前に、自由にセーブ・ロードすることができます。



