“我正在参加掘金社区游戏创意投稿大赛个人赛,详情请看:游戏创意投稿大赛”
原文: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 自带的序列化方法即可,它支持我们平时用到的各种对象。这意味着更少的错误,以及更少的代码。