この記事はUnityを用いた「恋愛・ホラー風ノベルゲーム」の作り方講座の第14回です。
前回は文字装飾機能をノベルゲームの会話システムに実装しました。
前回の記事:
今回はセーブデータをJSON形式で作成してセーブ・ロードするセーブデータシステムを作成します。
そして作ったセーブデータシステムとここまでに作成してきた選択肢付き会話システムによるシナリオ分岐をセーブ・ロード機能を用いて管理します。
ノベルゲームのセーブデータの作り方 シナリオ進行をJSON形式で管理する
次にセーブデータに触れておきたいと思います。
ゲームでは何かしらデータを保管しておく必要が出てきます。
そういったデータを保管する方法はいくつかありますが、今回はよく使われるJSONデータでのセーブデータを簡単に作成してみましょう。
JSONとは
ファイル形式の一つで「ファイル名.json」というファイル名になります。
JSONとはJavaScript Object Notationの略です。 JavaScriptというプログラミング言語におけるオブジェクトの書き方を参考に作られたデータフォーマット(データの記述形式)のことです。
ですが、一定の決まりをもった文字列なので手書きで編集したりもできます。
セーブデータの作成
ではまずはセーブデータになるクラスを作成します。
新しく「SaveData.cs」というスクリプトを「Assets/AppMain/99_Common/」フォルダ内に作成しましょう。
1 2 3 4 5 6 7 8 9 10 11 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SaveData { // セーブする番号. public int StoryNumber = 0; // テスト用の文字列. public string TestString = "テスト"; } |
とても簡単で「Start()」や「Update()」も必要なく、「MonoBehaviour」の継承も必要ありません。
「storyNumber」という「int」の変数と、テスト用に「testString」という「string」の変数を用意しておきます。
今回のノベルゲーム講座ではストーリー進行度だけで管理できてしまうのでとてもシンプルなデータになっています。本格的なノベルゲームを開発する際は登場人物の親密度ステータスなどもセーブデータに含めたくなるかもしれませんね。
セーブデータ→JSONの変換
まずはこのデータをJSONにして確認してみます。
どこでも構わないのですがGameシーンを開いている状態であるという前提で(開いてなかったら開きましょう)、「GameView.cs」に処理を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class GameView : ViewBase { ・・・ void Start() { var data = new SaveData(); data.StoryNumber = 100; data.TestString = "書き換え"; var json = JsonUtility.ToJson( data ); Debug.Log( json ); } ・・・ } |
「Start()」関数に追加します。
あくまでテスト用なので後で消します。
まず「data」という変数に「new SaveData()」で新しく「SaveData」を作成します。
その「data」の「StoryNumber」を「100」、「TestString」を「書き換え」と変更します。
次が重要です。
この関数を使用してJsonを作成します。
その返り値を「json」という変数で受け取ります。この時「json」は「string」です。
最後にその「json」をログで出しておきましょう。
ではGameシーンを実行してログを見てみます。
1 |
{"StoryNumber":100,"TestString":"書き換え"} |
これが結果です。わかりにくいので改行を入れて整形してみます。
1 2 3 4 |
{ "StoryNumber":100, "TestString":"書き換え" } |
この形がJsonデータの基本形です。(JSONは改行を入れても値には影響しません)
一番外側は「{ }」で囲みます。囲まれた部分が一つのデータとなります。
そして値の変数名は「” “」で囲まれます。なので変数名は「”StoryNumber”」と「”TestString”」です。
値との間には「 : 」があります。
その次に値であるintの「100」やstringの「”書き換え”」が書かれています。
変数の区切りは「 , 」です。
そしてこの値は文字列なのでこのまま文字列のファイル「.json」ファイルとして出力ができます。当然メモ帳などで開けます。
JSON→データ
次にJSONの値をデータに変換するテストをしておきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
・・・ public class GameView : ViewBase { ・・・ void Start() { var data = new SaveData(); data.StoryNumber = 100; data.TestString = "書き換え"; var json = JsonUtility.ToJson( data ); Debug.Log( json ); var _data = JsonUtility.FromJson<SaveData>(json); Debug.Log(_data); } ・・・ } |
追加したのは最後の2行だけです。
この関数を使用することで、JSONの文字列を型名に変換します。ログを見るとたしかにjsonデータが型名データに変わっています。
テストはここまでになります。「Start()」関数内の処理は削除しておきましょう。
データのセーブ処理とロード処理の作成
これからセーブデータのロード、セーブ処理を作成しますが、これをどのように扱うかによって作成する場所が変わってきます。
今回はあくまで機能を紹介する程度にとどめますので今あるスクリプトに追加する形にしますが、実際にゲームを作成する際にはシングルトンなどを活用してどこからでも利用できるようにすることも考えるといいでしょう。
シングルトンを用いてセーブデータシステムを開発した関連記事:
それではセーブシステムを作成していきます。
今回はどのシーンでも継承される作りになっている「ViewBase.cs」に処理を追加しておきます。
ここであればどこかのViewからなら特に意識もせず使用できます。
セーブシステム用ファイルチェック処理の実装
まずはセーブ、ロードの一環として、セーブシステム用のファイル・フォルダがあるかどうかのチェックを行い、なければ新しく作成する処理を実装します。
これで簡易的ではありますが、選択肢を選んだ後に再度実行した場合に選択肢の後から処理が再生されるようになりました。
↑UnityエディタでHomeシーンから再生した場合にちゃんとゲームの途中から開始されていることがわかります。
(追記) Homeにセーブデータをリセットする処理を追加する
データがセーブされると次に再生するとき以降最初からゲームを開始できなくなってしまうので、データをリセットする処理を作成しておきましょう。
まずはHomeにボタンを作成します。
「ゲーム開始」ボタンをコピーして、
1 2 3 |
PosX = 0 PosY = -270 PosZ = 0 |
に移動します。
中のテキストを「セーブデータリセット」に変更し、FontSizeを「40」に変更します。
「HomeView.cs」に処理を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
・・・ public class HomeView : ViewBase { ・・・ // -------------------------------------------- // セーブデータをリセット. // -------------------------------------------- public void OnSavedataResetButtonClicked() { var data = Load(); data.StoryNumber = 0; data.TestString = ""; Save( data ); } } |
「OnSavedataResetButtonClicked()」関数を追加します。
まず「var data = Load();」でデータをロードします。
「HomeView」は「ViewBase」を継承していますので、「Load()」関数を使用できます。
その後、読み込んだ「data」の値「StoryNumber」を初期値「0」に、「TestString」を「””」(空欄)に変更します。
「TestString」の初期値は「テスト」でしたが、この値に意味はないので空欄にしてしまって大丈夫です。
そして書き換えが終わったら「Save( data );」を実行してデータをセーブし初期化の完了です。
では、作成したボタンにこの関数をはめておきましょう。
できたら、一度セーブするところまで会話をすすめて一度Homeに戻ってリセットしてまた最初から実行できることを確認しておきましょう。
最後に
ここまでで今回のノベルゲームの作り方講座は終了になります。
UI遷移処理や会話処理やシナリオ分岐はノベルゲームやテキストタイプのアドベンチャーゲーム等に限らずどんなゲームにでも使われるものです。
ぜひ今回の講座内容をオリジナルゲーム開発に活用していただけたら嬉しいです。
最後に、ここまでの講座の内容を実装したプロジェクトファイルのダウンロードページを用意したので必要に応じてご利用ください。
コメント