【GDevelop】セーブデータを JSON 化するとメリットしか無い件

ハイスコアやプレイヤー名、所持品やストーリーの進行状況など、ゲームのデータを保存するためのセーブ機能は、昨今のゲームには必要不可欠なものです。

GDevelop にもデータを保存するために「ストレージ」という機能が用意されています。

このストレージ機能は、PC でもスマホでも、アプリでもブラウザ(HTML5)でも、ちゃんと機能してくれるという、とてもありがたい機能なのですが、書き込みと読み込みが数値とテキストにしか対応していないという、残念な一面もあります😥

構造体や配列、さらには真偽値も保存できたほうが絶対便利なのですが、残念ながら執筆時点(v5.0.121)では、そのような機能は用意されていません。

さらに、たくさん保存したいデータが有る場合、ひとつずつアクションを組まなければいけないのも手間です。

しかし、JSON というデータ形式を利用すれば、これらの問題を一気に解決することができます!😆

JSON ってなに?

JSON の詳しい説明は割愛します。ググってくださいw🤤
ちなみに読み方はジェイソンです。

一応、超ざっくりに説明すると JavaScript と互換性のあるテキストデータフォーマットのことです。
↓こんなふうに書くことができます。 

{"名前":"パンダコ", "Lv":3,"アイテム":["やくそう","賢者の石"]}

ちなみに GDevelop のプロジェクトデータ(game.json)も JSON で保存されてますね。

なんで JSON を使うの?

JSON なら GDevelop の構造体も配列も真偽値も表現することができます。

さらに上記の通り、JSON はテキストデータです。

つまり GDevelop のどんな変数でも、「テキストを書き込む」アクションで保存することができます👏

どうやって JSON で保存するの?

それでは具体的に、どのようにイベントを組めば良いのかご説明します。

この例では次のようなシーン変数があり、これを保存したいと思います。

色々なデータを「セーブデータ」という構造体の変数に、まとめている点がポイントです。

ひとつの変数にまとめることで、1回のアクションで必要なデータ全てを保存できるようにしています。(必ずしもひとつにまとめなければいけない、ということではありません)

このデータを JSON 化して保存するイベントは次のようになります。

右クリックすると、セーブする条件にしています。

「テキストを書き込む」アクションのパラメーターは次のようにしています↓

ここで注目してほしいのは「テキスト」パラメーターの欄です。
ToJSON() を使用していますが、これはシーン変数を JSON に変換してくれる関数です。

他にもグローバル変数やオブジェクト変数を変換するための関数も用意されています。
それらは式の入力補助(正式名称知らない😅)の「変換」の中にあるので、適宜使い分けてください。

グローバル変数用は GlobalVarToJSON() で、オブジェクト変数用は ObjectVarToJSON() です。

この関数とアクションだけで、変数が JSON に変換されて保存されます😉

保存されたデータは Developer Tools で確認することができます。
Developer Tools の使い方については「そこそこ役立つ Developer Tools で出来ること」をご覧ください。

↑先の例で保存したデータが、JSON で保存されていることが確認できますね。

ちなみに完全に余談なのですが、ストレージ機能の各アクションや条件の説明文にある「要素」とは、入力欄の「グループ」のことです……
ややこしいですが、英語の原文がそうなっているので、日本語でもこうなっています😅

JSON で保存されたデータを読み込もう!

セーブしたら当然ロードも必要ですね。
今度は保存したデータを読み込んで、変数に格納する方法をご説明します。

読み込みのイベントは、次のようになります。

まず、左クリックでロードを開始させたかったので、最初のイベントに「マウスの Left ボタンを放した直後」条件を設定しています。

次に、サブイベントで、まだセーブデータが無い場合の処理をおこなっています。
セーブデータがない場合は、先に保存を実行する、というイベントです。
この処理のおかげで、存在しないデータを JSON として解析すると発生するエラーを、回避することができます。

なお、このイベントの条件は反転されている点に注意してください。

つまり、「セーブデータが存在しない」場合に実行される条件になっています。

また、このエラー回避イベントはゲームの構造によっては、必ずしもこのタイミングでおこなわなければならない処理ではありませんが、この例では参考としてここに組み込んでみました。(おかげでちょっとややこしくなっちゃった😋)

そして続く3つ目のイベントで、セーブデータ(JSON)を読み込んで、その JSON を GDevelop の変数に変換する、という処理をしてロード完了です。

このイベントには、ふたつのアクションがありますが、ひとつ目のアクションでは、読み込んだ JSON をシーン変数「セーブデータ」に格納し、ふたつ目のアクションでは、その JSON を解析して再度シーン変数に入れ直す、ということをしています。

ただ単にセーブデータを読み込んだだけでは、テキストデータ(JSON)が変数に格納されるだけなので、ちゃんと JSON を解析して、GDevelop が扱える変数に変換する必要がある点に注意してください。

JSON を解析して、変数に変換するアクションは「その他のアクション」の「ネットワーク」内にあります。

このアクションも、対象となる変数に合わせて、使い分けてください。

ちなみになんでネットワーク内にあるかというと、JSON はネットワークを介したデータの送受信によく使われるからです🧐

まとめ

今回組んだイベントの全体像は次のようになります。

JSON を利用することで、セーブ・ロードの機能をとてもシンプルに組むことができます。
ぜひ活用してみてくださいネ😉

[2021年11月11日追記]
セーブデータを改竄(かいざん)から守りたい場合は「セーブデータは暗号化しよう!」をご覧ください。

コメント

このブログの人気の投稿

ブラウザ上で動く GDevelop オンライン版を試してみた感想

GDevelop の「イベント」を正しく理解しよう

4ian 氏が Google 辞めて GDevelop に全振りする件