Q.Loadボタンを押したときに、Q.Saveボタンを押してセーブしたシーンをロードする。
Unityで作るノベルゲーム第7回は、Unityでクイックセーブ、クイックロードを実装します。
- 第0回:「画面サイズ変更、ボタンとテキスト作成、UIの操作 」
- 第1回:「Excel(表計算ソフト)でCSVを作成して読み込む」
- 第2回:「画面クリックした回数だけCSVのテキストを表示する」
- 第3回:「CSVのテキストをスクリプトでUITextを操作、画面に表示する」
- 第4回:「ボタンクリックで画面クリック判定しない方法」
- 第5回:「CSVでテキスト、画像、音をパスで認識して呼び起こす方法」
- 第6回:「Auto機能の実装」
- 第7回: 【本記事】
- 第8回:「改造されないセーブ・ロード実装」
前回までのノベルゲーム制作は、セリフの管理や素材、テキストの表示を導入してきました。
今回は、ゲームにおいて最も大切なセーブとロードに関する機能を作成していきます。
Unityには、セーブやロードを作る方法がたくさんあります。
例えば、Unity標準のセーブ・ロード機能「PlayerPrefs」やオブジェクトをJSON(JavaScript Object Notation)に変換する「JsonUtility」を使ったセーブ・ロード機能、アセット「Easy Save」を使った方法が挙げられます。
しかし、以上の方法によるセーブ・ロード機能は以下のデメリットがあります。
PlayerPrefs | 処理が遅い、データが分割される、保存先がレジストリ、セーブデータの改ざん |
JSON | データの可変性、バージョン管理が複雑 |
Easy Save | 有料($75.90←およそ1万円) |
JSONはおすすめの方法ですが、本記事では、別の方法として、バイナリを使ってセーブデータを管理します。
バイナリを使えば、複数のセーブデータの管理も可能になります。
本記事では、セーブ・ロード機能の第一歩として、クイックセーブとクイックロードの実装をします。
- ノベルゲームの作り方を知りたい。
- クイックセーブとクイックロードの使い方を知りたい。
クイックセーブ・クイックロード
ノベルゲームにおける「QuickSave」と「QuickRoad」は、プレイヤーがゲームをよりスムーズに進行させるための機能です。
通常のセーブやロードは、セーブボタンを押して、用意された100個程度のセーブが保存できて、それぞれをロードボタンを押して、でそのシーンまで戻ることができます。
一方で、クイックセーブとクイックロードは、1つ、2つと数少ないですが、短時間で手軽にゲームの状態を保存・読み込みすることができます。
クイックセーブとクイックロードは、プレイヤーにとって便利な機能であり、ゲームの進行を効率化することができます。
特にノベルゲームではストーリーの流れや選択肢の結果によって展開が変わるため、プレイヤーが自由にセーブ・ロードできることは重要な要素となります。
選択肢でも重要なシーンでもないけれど、セーブしたい。
そんなときに役立つのがクイックセーブとクイックロードの機能になります。
クイックセーブ
クイックセーブは、プレイヤーが現在のゲームの進行状況を瞬時に保存する機能です。
特定のポイントでゲームを一時停止し、その時点の状態を保存します。
例えば、表示されているテキストや選択肢の進行度などを保存します。
通常、ノベルゲームのクイックセーブはメニューやシステムボタンからアクセスできるようになっています。
クイックロード
クイックロードは、クイックセーブで保存されたゲームの状態を瞬時に読み込む機能です。
プレイヤーはクイックロードを選択することで、最後に行ったクイックセーブの状態からゲームを再開できます。
クイックロードを使用すると、瞬時に前回のセーブポイントからゲームを再開することができます。
クイックセーブとクイックロードの実装
ここまで、クイックセーブとクイックロードの機能と実用性を理解したところで、ここからはノベルゲームに実装していきます。
通常のセーブ・ロードに比べて、クイックセーブとクイックロードは変数の値を互いに交換する操作のみで非常に簡単に実装できます。
交換をする変数「A」・「B」として具体的に考えます。
//クイックセーブ
A=B;
//クイックロード
B=A;
本記事で紹介するソースコードでは、Aは「csvcontroler.i」、Bは「QPoint」となります。
「csvcontroler.i」は前回まで使用していたスクリプト「csvcontroler.cs」において静的なint型変数「i」を用いています。
ソースコード
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);
}
}
Unity学習ができる教本
タイトル | 対象 | 特徴 |
Unityの教科書 2023完全対応版 | 入門・初心者 | プログラミング未経験でも、ゲーム制作したい人 |
マンガでわかる Unityゲーム開発入門 | 入門・初心者 | Unityを挫折したけど、もう一度挑戦したい人 2Dゲームの作成をマンガで丁寧に解説 |
作って学べる Unity本格入門 | 中級者~ | RPG、特に3Dゲームを作りながら学習したい人 |
Unity ソーシャルゲーム開発ガイド | 中・上級者 | ガチャ・ログインボーナスなどのソシャゲの機能を開発したい人 |
解説
今回のスクリプトでは、名前空間の変更がありません。
「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 = csvcontroler.i;
// クイックロード
csvcontroler.i = QPoint;
クイックセーブでは、「csvcontroler.i」の値を「QPoint」に代入し、クイックロードではその逆の操作を行います。
クイックセーブとクイックロードは、ノベルゲームにおいて重要な要素であり、プレイヤーが自由にゲームの進行を管理できるようにするための機能です。
これにより、プレイヤーは選択肢やストーリーの展開によって影響を受ける前に、自由にセーブ・ロードすることができます。