データの保存と復帰
データマネージャーのグローバル変数を作ろう
ゲームのデータは、シーンをまたいで保持する必要があります。そのためデータを管理するスクリプトは、グローバル変数として登録します。
「ファイルシステム」ドックのres://singletonフォルダーを右クリックして、「新規作成」>「スクリプト」を選びます。
「スクリプト作成」ダイアログが開きますので、「テンプレート」のチェックボックスを外し、「パス」をres://singleton/data_manager.gdにして「作成」ボタンを押します。
次にトップメニューの「プロジェクト」>「プロジェクト設定」を選び、「プロジェクト設定」ダイアログを開きます。そして「グローバル」タブ>「自動読み込み」タブを表示します。
「パス」の横にフォルダーアイコンがあるのでクリックします。そして、作成したres://singleton/data_manager.gdを選択して、「追加」ボタンを押します。
そうすると、「名前」が「DataManager」、「パス」が「res://singleton/data_manager.gd」という項目が追加されます。
データを管理するスクリプト
data_manager.gdをダブルクリックして「Script」ビューで開きます。data_manager.gdに、次のようにデータ管理をおこなうプログラムを書きます。
extends Node
const PATH_SAVE_DATA = "user://save.dat"
var record_array = []
func _ready() -> void:
# ファイルアクセスのテスト
load_from_file()
record_array = [true, false, true]
save_to_file()
load_from_file()
DirAccess.remove_absolute(PATH_SAVE_DATA)
func load_from_file() -> void:
if FileAccess.file_exists(PATH_SAVE_DATA):
var file = FileAccess.open(PATH_SAVE_DATA, FileAccess.READ)
var json_string = file.get_as_text()
var tmp_data = JSON.parse_string(json_string)
if tmp_data != null:
record_array = tmp_data
print("record_array: " + str(record_array))
else:
print("Not exist.")
func save_to_file() -> void:
var file = FileAccess.open(PATH_SAVE_DATA, FileAccess.WRITE)
var json_string = JSON.stringify(record_array)
file.store_string(json_string)
データはJSON形式でシリアライズ化します。他の方法もありますが、外部のプログラムとも連携可能な一般的な形式を利用します。
スクリプトの解説1 冒頭部分
PATH_SAVE_DATAは、ユーザーデータの保存先です。
const PATH_SAVE_DATA = "user://save.dat"
user://で指定する保存先は、実行環境によって異なります。
開発マシンでの確認は、トップメニューの「プロジェクト」>「ユーザーデータフォルダーを開く」で確認できます。
たとえばWindowsでは次のパスになります。
>C:\Users\<ユーザー名>\AppData\Roaming\Godot\app_userdata\<プロジェクト名>
record_arrayは、成績を保存する配列です。
var record_array = []
クリアしたレベルはtrue、未クリアのレベルはfalseで表します。
スクリプトの解説2 データの読み込み
データの読み込みをおこなうload_from_file関数を見ていきます。
ファイル操作はFileAccessクラスを使います。FileAccess.file_exists関数で存在確認をおこなえます。
func load_from_file() -> void: if FileAccess.file_exists(PATH_SAVE_DATA): # 存在する場合 else: # 存在しない場合
次はファイルの読み込み部分です。
var file = FileAccess.open(PATH_SAVE_DATA, FileAccess.READ) var json_string = file.get_as_text()
FileAccess.open(パス, FileAccess.READ)で、読み込みモードでファイルハンドルを開きます。
開いたファイルハンドルは、closeをおこなわなくても、関数から出るなどスコープが外れれば自動で閉じます。
そして、file.get_as_text関数でテキストを読み込みます。
次はJSONのパースです。
var tmp_data = JSON.parse_string(json_string) if tmp_data != null: record_array = tmp_data
JSON.parse_string関数を使います。成功すればパースされたデータが返ります。失敗した場合はnullになります。
スクリプトの解説3 データの書き込み
続いて、ファイルの書き込みをおこなうsave_to_file関数を見ていきます。
func save_to_file() -> void: var file = FileAccess.open(PATH_SAVE_DATA, FileAccess.WRITE) var json_string = JSON.stringify(record_array) file.store_string(json_string)
FileAccess.open(パス, FileAccess.WRITE)で、書き込みモードでファイルハンドルを開きます。
GDScriptのデータをJSONテキストにするにはJSON.stringify関数を使います。
そして、file.store_string関数でテキストを書き込みます。
ファイルの読み書きには、他にもさまざまな関数が用意されています。
FileAccess — Godot Engine (4.4) documentation in English
スクリプトの解説4 _ready
最後に、_ready関数を見ていきます。
func _ready() -> void: # ファイルアクセスのテスト load_from_file() record_array = [true, false, true] save_to_file() load_from_file() DirAccess.remove_absolute(PATH_SAVE_DATA)
最初にデータを読み込み(この時はまだデータがない)、データを保存して、再度データを読み込みます。そして最後にデータを消します。
ファイルの削除はDirAccess.remove_absolute関数でおこなえます。
「DirAccess」には、さまざまなファイル操作の関数が用意されています。
DirAccess — Godot Engine (4.4) documentation in English
実行確認
この状態で、どのシーンでもよいので実行してください。グローバル変数として登録しているので、どこから実行してもインスタンス化されます。
実行すると、出力欄に次のように表示されます。
Not exist. record_array: [true, false, true]
一度目のload_from_file関数では、ユーザーデータがないのでNot exist.と表示されます。
二度目のload_from_file関数では、保存したデータがあるのでrecord_array: [true, false, true]と表示されます。
