Godot 4:获取EncodedObjectAsID对应场景数据及解决保存异常
在Godot 4中解决store_var保存对象得到EncodedObjectAsID的问题
问题根源
你遇到的EncodedObjectAsID是Godot默认序列化行为导致的:store_var默认只会保存非内置对象的引用ID,而非对象的实际数据。一旦游戏重启,这个ID就会失效,无法还原成原来的对象。
如何避免保存为EncodedObjectAsID格式
有两种可靠的解决方式:
1. 让自定义类继承Resource
Resource是Godot专门设计用于序列化的类型,默认会完整保存对象的所有@export标记的属性。修改你的Level类:
# Level.gd extends Resource @export var level_id: String func _init(id: String): level_id = id
这样再用store_var保存时,会直接存储Level对象的实际数据,而不是引用ID。
2. 强制序列化完整对象(针对继承Object的类)
如果你的Level类必须继承Object,调用store_var时传入第二个参数true(full_objects=true),强制Godot序列化对象的完整数据:
func save_data(): var file = FileAccess.open(save_file, FileAccess.WRITE) if file: # 开启完整对象序列化 file.store_var(my_data, true) file.close()
注意:这种方式要求类中需要保存的属性都是可序列化的类型(比如字符串、数字、Resource等),复杂的对象引用可能仍会出现问题。
如何从已保存的EncodedObjectAsID恢复数据
如果已经保存了EncodedObjectAsID格式的数据,重启游戏后无法直接恢复成原对象,因为ID只在当前会话有效。如果是在同一会话内读取,可以尝试用instance_from_id()临时恢复:
func load_data(): var file = FileAccess.open(save_file, FileAccess.READ) if file: var loaded_data = file.get_var() file.close() if loaded_data.levels.size() > 0: var encoded_obj = loaded_data.levels[0] if encoded_obj is EncodedObjectAsID: # 仅同一会话内有效 loaded_data.levels[0] = instance_from_id(encoded_obj.id) return loaded_data return null
但这只是临时方案,建议改用前面的方法重新保存完整数据,避免后续出现问题。
内容的提问来源于stack exchange,提问作者ztvmark
相关产品推荐
相关产品推荐

