Godot:保存/加载数据

1,498 阅读2分钟

“我正在参加掘金社区游戏创意投稿大赛个人赛,详情请看:游戏创意投稿大赛

原文:Saving/loading data :: Godot Recipes (kidscancode.org)

作者:# Chris Bradfield

问题

如何保存和加载数据

解决方法

Godot的 I/O系统是围绕着File对象进行的。我们可以通过创建一个新的 File 对象并调用 open()方法来打开一个文件。

var file = File.new()
file.open("user://myfile.name", File.READ)

警告:

用户数据应该只存储在user://路径。虽然res://在编辑器运行的时候可以用,但当项目被导出时,res://路径就变成了只读的资源文件。

第二个参数是 "模式标志",它可以是下列几项之一:

  • File.READ
  • File.WRITE
  • File.READ_WRITE
  • File.WRITE_READ

储存数据

我们可以使用特定的数据类型(store_float()store_string()等等)保存数据,或者使用通用的store_var(),这会使用 Godot 自带的序列化方法保存数据,包括对象这样的复杂数据。

从一个简单的例子开始:保存玩家的得分。我们可以写一个函数,每当需要保存分数时就可以调用。

var score_file = "user://score.save"

func save_score():
    var file = File.new()
    file.open(score_file, File.WRITE)
    file.store_var(highscore)
    file.close()

注意:

不要忘记关闭文件。

保存分数意味着我们需要在游戏开始时加载它。

func load_score():
    var file = File.new()
    if file.file_exists(score_file):
        file.open(score_file, File.READ)
        highscore = file.get_var()
        file.close()
    else:
        highscore = 0

读取文件之间应该要记得检查是否存在。如果不存在我们可以做一些别的处理。比如说使用默认值。

保存对象

你可以保存的不仅仅是基本的数据类型。使用store_var()的full_objects参数,你可以保存任何对象,包括自定义对象。例如,假设你有一个定义的自定义对象。

我们不仅仅可以保存基本的数据类型,还可以使用store_var()保存对象。 例如如下的对象:


extends Node
class_name CustomObject

var a = 10

func say_hello():
    print("hello")

然后我们的保存/加载像这样。

var score_file = "user://score.save"
var c = CustomObject.new()

func save_to_file():
    var file = File.new()
    file.open(score_file, File.WRITE)
    file.store_var(c, true)
    file.close()


func load_from_file():
    var file = File.new()
    if file.file_exists(score_file):
        file.open(score_file, File.READ)
        c = file.get_var(true)
        file.close()
var c

func _ready():
    load_from_file()
    c.say_hello()

Json 保存数据

可能有的人会问是否可以使用json保存数据。

我的看法是:

不要使用 Json

虽然 Godot 支持Json,但是保存数据并不是Json 的作用,它的目的更多是作为数据交换格式。

作为游戏数据的保存方式,Json会有相当大的限制,比如各种没有浮点数。诸如此类的问题会让我们花费大浪的精力做数据的转换和验证。

我们使用Godot 自带的序列化方法即可,它支持我们平时用到的各种对象。这意味着更少的错误,以及更少的代码。