最終確認日

Godotのstore_varとget_varについて

Godot の FileAccess.store_var() および get_var() は、変数の順序付き保存と読み出しを行うためのAPIであり、変数名(キー)を伴わない。

FileAccess

保存と読み込み

store_var(value) は、値そのものをバイナリでファイル末尾に追加保存する。 get_var() は、保存された順序に従って値を1つずつ読み出す。

読み出しは逐次的で、最初の get_var() で最初に保存された値が返され、2回目で2番目の値……というように連続する。

「同じ変数名」で保存しても上書きされない

var foo = 1
file.store_var(foo)  # 1が保存される
foo = 2
file.store_var(foo)  # 2が別エントリとして保存される(上書きではない)
  • 上記の場合、ファイルには [1, 2] という2つの値が保存される。
  • get_var() で1回目に1、2回目に2が返る。

上書きしたい場合

  • FileAccess.open(path, FileAccess.WRITE) を使ってファイルを上書きモードで開き、必要なデータだけを保存し直す。
var file = FileAccess.open("user://highscore.save", FileAccess.WRITE)
file.store_var(highscore)  # 既存の内容をすべて破棄して1つだけ保存
file.close()

名前付きで複数データを保存したい場合

  • Dictionary を使って明示的にキーと値を保持し、保存する。
var data = { "high_score": 1000, "level": 5 }
file.store_var(data)

# 読み込み
var data = file.get_var()
print(data["high_score"])
  • こうすることで、順序に依存せず柔軟にデータを取り出せる。

メモ

次のようなスクリプトの場合、毎回 FileAccess.WRITE により全てをまっさらな状態にしてhighscoreの値が1行のみが記録されている状態になっているはず。

var save_file_path = "user://highscore.save"

func save_score():
    var file = FileAccess.open(save_file_path, FileAccess.WRITE)
    file.store_var(highscore)
    print("Saveing highscore to disk ...")
    file.close()


func load_score():
    if FileAccess.file_exists(save_file_path):
        var file = FileAccess.open(save_file_path, FileAccess.READ)
        highscore = file.get_var()
        print("Loaded highscore from file: ", str(highscore))
        file.close()
    else:
        highscore = 0
        print("Save file doesn't exist.")
サイトアイコン
公開日
更新日