如何使用EncodedObjectAsID?求Godot实用代码示例
关于Godot中
get_instance_id()与EncodedObjectAsID的用法解析 核心概念快速梳理
get_instance_id():每个Godot对象实例都会被分配一个仅在当前运行会话唯一的整数ID,调用该方法可获取这个ID。EncodedObjectAsID:一种专门用于封装对象实例ID的类型,目的是让ID可以被安全序列化(比如写入文件、通过网络发送),明确标记这是一个对象ID的编码,避免和普通整数混淆。instance_from_id():通过对象的实例ID(或从EncodedObjectAsID中提取的ID),还原出对应的对象实例。
可运行示例
示例1:基础编码与还原流程
新建一个场景,添加一个Node2D节点,附加以下GDScript代码:
extends Node2D func _ready(): # 获取当前节点的实例ID var obj_id = get_instance_id() print("原始实例ID: ", obj_id) # 将ID封装为EncodedObjectAsID var encoded_id = EncodedObjectAsID.new(obj_id) print("EncodedObjectAsID实例: ", encoded_id) # 从EncodedObjectAsID中提取ID并还原对象 var restored_obj = instance_from_id(encoded_id.get_id()) print("还原的对象: ", restored_obj) print("是否为原对象: ", restored_obj == self)
运行后控制台会输出类似内容(实际ID随运行变化):
原始实例ID: 12345 EncodedObjectAsID实例: <EncodedObjectAsID#-9223372036854775808> 还原的对象: <Node2D#12345> 是否为原对象: True
示例2:序列化存储与读取(仅限当前会话)
注意:实例ID仅在当前游戏运行会话有效,重启游戏后所有ID会重新分配,所以这个示例仅适用于单次运行内的存储。
extends Node2D func _ready(): # 创建一个测试对象 var test_label = Label.new() test_label.text = "Hello World" add_child(test_label) # 编码并存储到ConfigFile var config = ConfigFile.new() var encoded_id = EncodedObjectAsID.new(test_label.get_instance_id()) config.set_value("Objects", "test_label", encoded_id) config.save("user://object_id.cfg") # 从配置文件读取并还原 var loaded_config = ConfigFile.new() if loaded_config.load("user://object_id.cfg") == OK: var loaded_encoded = loaded_config.get_value("Objects", "test_label") var restored_label = instance_from_id(loaded_encoded.get_id()) print("还原的Label文本: ", restored_label.text) # 输出 Hello World
示例3:在信号传递中使用EncodedObjectAsID
当需要在信号中传递对象引用,但又希望参数可以被序列化时(比如跨场景同步、网络传输),可以用EncodedObjectAsID:
# 发送方节点代码 extends Node2D signal object_selected(encoded_obj_id) func _on_button_pressed(): var target_node = $TargetNode emit_signal("object_selected", EncodedObjectAsID.new(target_node.get_instance_id())) # 接收方节点代码 extends Node2D func _ready(): $SenderNode.connect("object_selected", self, "_on_object_selected") func _on_object_selected(encoded_id): var selected_obj = instance_from_id(encoded_id.get_id()) print("选中的对象名称: ", selected_obj.name)
关键注意事项
- 实例ID仅在当前运行会话有效:游戏重启后,所有对象的ID会重新生成,之前存储的ID无法还原出正确对象。
- 若对象已被销毁,调用
instance_from_id()会返回null,使用前建议先判断对象是否存在:var restored_obj = instance_from_id(target_id) if restored_obj: # 对象存在,执行操作
内容的提问来源于stack exchange,提问作者cak3_lover
相关产品推荐
相关产品推荐

