SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Godot Engine 2Dゲーム開発入門

【Godot Engine 2Dゲーム制作 Part4】UI部品を作成し、リストダイアログをつくろう

Godot Engine 2Dゲーム開発入門 第6回

データの保存と復帰

データマネージャーのグローバル変数を作ろう

 ゲームのデータは、シーンをまたいで保持する必要があります。そのためデータを管理するスクリプトは、グローバル変数として登録します。

 「ファイルシステム」ドックの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に、次のようにデータ管理をおこなうプログラムを書きます。

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]と表示されます。

次のページ
レベルの管理と自動保存

この記事は参考になりましたか?

Godot Engine 2Dゲーム開発入門連載記事一覧

もっと読む

この記事の著者

柳井 政和(ヤナイ マサカズ)

クロノス・クラウン合同会社 代表社員http://crocro.com/オンラインソフトを多数公開。プログラムを書いたり、ゲームを作ったり、記事を執筆したり、マンガを描いたり、小説を書いたりしています。「めもりーくりーなー」でオンラインソフト大賞に入賞。最近は、小説家デビューして小説も書いています(『裏切りのプログラム』他)。面白いことなら何でもOKのさすらいの企画屋です。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/21374 2025/08/07 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー