7
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

【Godot】セーブデータの保存方法

概要

このページでは、Godot Engineでゲームデータをセーブ、ロードする方法について説明をします

ファイルの読み込みと書き込み

ファイル書き込みは以下の記述で行います

ファイルを書き込む
# Fileオブジェクト生成
var f = File.new()

# ファイルを書き込みモードで開く
f.open("user://savedata.txt", File.WRITE)

# "test save" という文字を書き込む
f.store_string("test save")

# ファイルを閉じる
f.close()

このファイルを読み込む場合は以下のように記述します

ファイルを読み込む
# Fileオブジェクト生成
var f = File.new()

if f.file_exists("user://savedata.txt"):
  # ファイルが存在していたら読み込みモードで開く
  f.open("user://savedata.txt", File.READ)

  # テキストを取得
  print(f.get_as_text())

  # ファイルを閉じる
  f.close()

保存場所

Godot では「ユーザーパス (user://)」でファイル書き込みを行った場合以下の場所に保存されます

  • Windows: %APPDATA%\Godot\ [プロジェクト名]
  • macOS: ~/Library/Application Support/Godot/[プロジェクト名]

セーブデータが正しく書き込まれたかどうか確認する場合には、このパスにあるファイルをテキストエディタで開いて確認します。

この情報に関する公式ドキュメントは以下のページです
* GODOT DOCS >> I/O >> データパス

JSON形式で保存する

JSONへの変換処理を使用すると、辞書型のデータがそのままテキストとして保存できて便利です。
例えば書き込み処理は以下のように記述します。

JSON書き込み
# セーブデータ
var data = {
  "name": "hero", # プレイヤー名
  "hp": 10 # HP
}

# JSONテキストに変換
var s = JSON.print(data, "\t")


var f = File.new()
f.open("user://savedata.txt", File.WRITE)
f.store_string(s)
f.close()

保存された savedata.txt を開くと以下のようなテキストファイルが作成されています。

savedata.txt
{
    "name": "hero",
    "hp": 10
}

読み込み処理は以下のようになります

JSON読み込み
var f = File.new()
if f.file_exists("user://savedata.txt"):
    # セーブデータが存在するので読み込める
    f.open("user://savedata.txt", File.READ)
    var s = f.get_as_text()
    # JSONテキストを変換
    var err = JSON.parse(s)
    if err.error == OK:
        # 正常に変換できた
        print("name: %s"%err.result["name"])
        print("hp: %d"%err.result["hp"])
    else:
        # 失敗したら新規にセーブデータを作成する
        pass
else:
    # 存在しない場合は新規にセーブデータを作成する
    pass

ゲーム開始時にこの処理を呼び出し、セーブデータを読み込むようにします。
もしファイルが存在しない場合はセーブデータを新規作成し、JSONからの変換が失敗する場合も新規作成するようにします

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
7
Help us understand the problem. What are the problem?