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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:10:32