2024-11-21-Godot存档
存档实现
基本思路
使用 Resource 类
图片,音频,脚本,都以此格式调用
默认状态下无法保存任何东西
但是可以以此创建新类
创建代码 >> 选择代码继承自 Rersource
创建 class_name SceneData
保存玩家状态,创建二位矢量变量
想以文件形式保存,需要加@export 关键词
希望保存方向 就保存关键词
C# 写法
1 | using Godot; |
保存按钮的设计
通过实例化 SceneData 来进行数据保存
通过@export 关键词设置的变量可以连接到Player的对象,获取Player对象的属性。
通过player.get_child(0)获取第一个子节点
然后就可以访问字节点的内容
然后设置实例化的对象的属性,将对象使用ResourceSaver.save()来保存即可。
save()方法填两个参数,资源对象和路径。
路径可以选择user://
不同的文件后缀名会存在不同的编码
res后缀为二进制格式
tres后缀为可阅读编码格式
Example Code:
1 | public void _on_save(){ |
读取存档
通过 ResourceLoader.load()方法直接读取存档文件即可。
1 | var data = ResourceLoader.load() as SceneData |
ps: 注意这里使用load返回后需要转为SceneData对象,否则无法访问相关属性
上述为代码为GDScript C#应该有其他的写法
读取后将玩家的属性设置为存档中的内容即可
Example Code:
1 | public void _on_load(){ |
More Example About PackedScene
SAVE部分
节点的各种属性(大小,位置,状态)都可以打包为 PackedScene
@export var box_array: Array[PackedScene]
通过一个Array来保存所有物体的状态
- 获取所有物体的方法
- 使用
group分组功能 可以获得同属于此组的节点 - 属于同一组的物体会被打上同一个标签
- 于
Node>>>Group面板设置分组 - 通过
get_tree().get_nodes_in_group("Box")获取全部Box标签的物体
- 使用
示例代码
1 | var boxes = get_tree().get_nodes_in_group("Box") |
LOAD部分
先把当前箱子节点删了,然后通过存档来设置和创建节点。
- 通过
get_tree().get_nodes_in_group("Box")获取全部Box标签的物体 - 然后将其循环遍历所有物体
- 使用
box.queue_free()删除当前存在的箱子节点 - 同时循环所有的存档中的box 并 使用
box.instantiate()将其转换为节点 - 使用
get_tree().current_scene.add_child(box_node)将其加入到场景树中
加载碰撞体
勾选Freeze属性让其无法参与物理计算
设置 box_node.freeze = ture
1 | var data = ResourceLoader.load("路径") as SceneData |
知识点来源于:
【【Godot干货】优雅地保存任何数据!基于Resource类的存档系统】