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类的存档系统】