You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 08:10:05