Object
Inherited By: ARVRServer, AudioServer, CameraServer, ClassDB, EditorFileSystemDirectory, EditorNavigationMeshGenerator, EditorSelection, EditorVCSInterface, Engine, Geometry, GodotSharp, IP, Input, InputMap, JNISingleton, JSON, JSONRPC, JavaClassWrapper, JavaScript, MainLoop, Marshalls, Node, OS, Performance, Physics2DDirectBodyState, Physics2DDirectSpaceState, Physics2DServer, PhysicsDirectBodyState, PhysicsDirectSpaceState, PhysicsServer, ProjectSettings, Reference, ResourceLoader, ResourceSaver, Time, TranslationServer, TreeItem, UndoRedo, VisualScriptEditor, VisualServer
所有非内置类型的基类。
描述
每个不是内置类型的类都继承自这个类。
您可以从脚本语言构造对象,使用 GDScript 中的 Object.new()
、C# 中的 new Object
或 VisualScript 中的“构造对象”节点。
对象不管理内存。如果类继承自 Object,则必须手动删除它的实例。为此,请从您的脚本中调用 free 方法或从 C++ 中删除该实例。
一些继承 Object 的类添加了内存管理。 Reference 就是这种情况,它对引用进行计数,并在不再被引用时自动删除自己。 Node 是另一种基本类型,在从内存中释放时删除其所有子节点。
对象导出属性,这些属性主要用于存储和编辑,但在编程中并不是那么有用。属性在 _get_property_list 中导出并在 _get 和 _set 中处理。然而,脚本语言和 C++ 有更简单的方法来导出它们。
在GDScript中可以使用 in
直接测试属性成员。
var n = Node2D.new()
print("position" in n) # 打印 "True"。
print("other_property" in n) # 打印 "False"。
只要键存在,in
运算符将评估为 true
,即使值为 null
。
对象也会收到通知。通知是一种将不同事件通知给对象的简单方法,因此它们可以一起处理。见 _notification。
注意: 与对 Reference 的引用不同,对存储在变量中的对象的引用可能会在没有警告的情况下变得无效。因此,建议对数据类使用 Reference 而不是 Object
。
注意:由于一个错误,你不能使用 Object.new()
创建一个“普通”对象。请使用 ClassDB.instance("Object")
。这个错误只适用于Object本身,而不是它的任何子类,如Reference。
教程
方法
信号
- script_changed ( )
当对象的脚本被更改时触发。
枚举
enum ConnectFlags:
CONNECT_DEFERRED = 1 —- 在延迟模式下连接一个信号。这样,信号发射被储存在一个队列中,然后在空闲时间发出。
CONNECT_PERSIST = 2 —- 当对象序列化为文件时,将保存持久连接。
CONNECT_ONESHOT = 4 —- 信号触发后断开一次性连接。
CONNECT_REFERENCE_COUNTED = 8 —- 连接一个信号作为引用计数。这意味着一个给定的信号可以多次连接到同一个目标,并且只有在没有引用时才会完全断开连接。
常量
NOTIFICATION_POSTINITIALIZE = 0 —- 在对象初始化时调用。在脚本中不可用。
NOTIFICATION_PREDELETE = 1 —- 在要删除对象之前调用。
方法说明
虚方法,可以被重载以定制 get 的返回值。
返回给定的属性。如果 property
不存在,返回 null
。
- Array _get_property_list ( ) virtual
虚方法,可以被重载以定制 get_property_list 的返回值。
返回对象的属性列表为一个 Array 的字典。
每个属性的 Dictionary 必须至少包含 name: String
和 type: int
(见Variant.Type)条目。另外,它还可以包括 hint: int
(见 PropertyHint)、hint_string: String
,以及 usage: int
(见 PropertyUsageFlags)。
- void _init ( ) virtual
当对象被初始化时被调用。
- void _notification ( int what ) virtual
每当对象收到一个通知时就会被调用,这个通知在what
中由一个常量来标识。基类 Object
有两个常量 NOTIFICATION_POSTINITIALIZE 和 NOTIFICATION_PREDELETE,但是诸如 Node 等子类定义了更多的通知,这些通知也是由这个方法接收。
虚方法,可以被重载以定制 set 的返回值。
设置一个属性。如果 property
存在,返回 true
。
- String _to_string ( ) virtual
虚方法,可以被重载以定制 to_string 的返回值,从而在对象被转换为字符串的地方,例如用 print(obj)
表示。
返回一个代表该对象的 String 字符串。如果没有被覆盖,默认为 "[ClassName:RID]"
。
添加一个用户定义的signal
。参数是可选的,但可以作为一个字典的Array来添加,每个字典包含name: String
和type: int
(见Variant.Type)条目。
在对象上调用method
并返回结果。这个方法支持可变数量的参数,所以参数以逗号分隔的列表形式传递。下面是个实例:
call("set", "position", Vector2(42.0, 0.0))
注意: 在C#中,如果方法是由内置的Godot节点定义的,那么方法名必须被指定为snake_case。这不适用于用户定义的方法,在那里你应该使用与C#源代码中相同的约定(通常是PascalCase)。
- void call_deferred ( String method, … ) vararg
在空闲时间调用对象上的method
。这个方法支持可变数量的参数,所以参数是以逗号分隔的列表形式传递。下面是个例子:
call_deferred("set", "position", Vector2(42.0, 0.0))
注意: 在C#中,如果方法名称是由内置的Godot节点定义的,必须指定为snake_case。这不适用于用户定义的方法,在那里你应该使用与C#源代码中相同的约定(通常是PascalCase)。
在对象上调用method
并返回结果。与call相反,这个方法不支持可变数量的参数,而是期望所有的参数都通过一个Array。
callv("set", [ "position", Vector2(42.0, 0.0) ])
- bool can_translate_messages ( ) const
如果该对象可以翻译字符串,则返回true
。参阅set_message_translation和tr。
将信号 signal
连接到目标 target
对象上的方法 method
。将可选的绑定 binds
作为一个 Array 的参数传递给调用。这些参数将在调用 emit_signal 中使用的任何参数之后传递给方法。使用 flags
设置延迟或一次性连接。请参阅 ConnectFlags 常量。
一个信号 signal
与同一方法 method
只能连接一次。除非之前在连接信号时使用了 CONNECT_REFERENCE_COUNTED,否则在进行重复连接时会抛出错误。为避免这种情况,首先使用 is_connected 检查是否已有连接。
如果 target
在游戏生命周期中被销毁,连接将丢失。
例子:
connect("pressed", self, "_on_Button_pressed") # BaseButton 信号
connect("text_entered", self, "_on_LineEdit_text_entered") # LineEdit 信号
connect("hit", self, "_on_Player_hit", [ Weapon_type, damage ]) # 用户自定义信号
传递给 connect 的 binds
与调用 emit_signal 时使用的参数的关系示例:
connect("hit", self, "_on_Player_hit", [ Weapon_type, damage ]) # 武器类型和伤害最后传递
emit_signal("hit", "Dark lord", 5) # 先传递 "Dark lord" 和 5
func _on_Player_hit(hit_by, level, Weapon_type, damage):
print("被 %s(等级 %d)使用武器 %s 击中,造成 %d 点伤害" % [hit_by, level, weapon_type, damage])
将 信号
与给定 目标
上的 方法
断开。
如果您尝试断开不存在的连接,该方法将引发错误。使用 is_connected 确保连接存在。
- void emit_signal ( String signal, … ) vararg
发射给定的信号
。这个信号必须存在,所以它应该是这个类或其父类中的一个内置信号,或者是一个用户定义的信号。这个方法支持可变数量的参数,所以参数是以逗号分隔的列表形式传递。例子。
emit_signal("hit", weapon_type, damage)
emit_signal("game_over")
- void free ( )
立即从内存中删除对象。对于 Node,您可能希望使用 Node.queue_free 将节点排队以在当前帧的末尾安全删除。
重要提示: 如果你有一个指向一个对象的变量,一旦对象被释放,它将 不会 分配为 null
。相反,它会指向一个先前释放的实例,您应该在尝试调用其方法或访问其属性之前使用 @GDScript.is_instance_valid 对其进行验证。
返回给定property
的Variant值。如果该property
不存在,这将返回null
。
注意: 在C#中,如果属性是由内置的Godot节点定义的,那么属性名必须被指定为snake_case。这不适用于用户定义的属性,在那里你应该使用与C#源代码中相同的约定(通常是PascalCase)。
- String get_class ( ) const
注意: get_class 不考虑class_name
的声明。如果对象有一个class_name
的定义,基类名称将被返回。
- Array get_incoming_connections ( ) const
返回一个 Array,元素为字典,包含与该对象相连的信号信息。
每个 Dictionary 包含三个字符串条目。
source
是对信号发出者的引用。signal_name
是连接信号的名称。method_name
是信号所连接的方法的名称。
获取由给定的 NodePath 索引的对象的属性。节点路径应该是相对于当前对象的,可以使用冒号字符(:
)来访问嵌套属性。例如:"position:x"
或 "material:next_pass:blend_mode"
。
注意:虽然该方法的参数是 NodePath 节点路径,但是它实际并不支持指向场景树中 Node 节点的路径,只能使用冒号分隔的子属性路径。针对节点的话,请改用 Node.get_node_and_resource。
- int get_instance_id ( ) const
返回对象的唯一实例ID。
这个ID可以保存在EncodedObjectAsID中,并且可以用@GDScript.instance_from_id来检索对象实例。
返回给定name
的对象的元数据条目。
- PoolStringArray get_meta_list ( ) const
将该对象的元数据作为 PoolStringArray 返回。
- Array get_method_list ( ) const
将该对象的方法及其签名作为 Array 返回。
- Array get_property_list ( ) const
将该对象的属性列表作为 Array 返回,元素为字典。
每个属性的 Dictionary 至少包含 name: String
和 type: int
(见 Variant.Type)条目。另外,它还可以包括 hint: int
(见PropertyHint)、hint_string: String
,以及usage: int
(见PropertyUsageFlags)。
- Reference get_script ( ) const
返回该对象的Script实例,如果没有指定,则返回null
。
返回给定signal
的连接的Array。
- Array get_signal_list ( ) const
将信号列表作为 Array 返回,元素为字典。
如果找到一个具有给定name
的元数据条目,则返回true
。
如果对象包含给定的method
,返回true
。
如果给定的signal
存在,返回true
。
如果给定的用户定义的signal
存在,返回true
。只有使用add_user_signal添加的信号才被考虑在内。
- bool is_blocking_signals ( ) const
如果启用了信号发射阻断,则返回true
。
如果对象从给定的 class
中继承,则返回 true
。另请参阅 get_class。
注: is_class 没有考虑 class_name
声明。如果对象有 class_name
定义,is_class 将为该名称返回 false
。
如果给定 信号
、目标
和 方法
存在连接,则返回 true
。
- bool is_queued_for_deletion ( ) const
如果为该对象调用了Node.queue_free方法,返回true
。
向对象发送一个给定的通知,这也将触发对该对象继承的所有类的_notification方法的调用。
如果reversed
是true
,_notification首先在对象自己的类上被调用,然后再到其连续的父类上。如果reversed
是false
,_notification首先在最高的祖先(Object
本身)上被调用,然后向下到其连续的继承类。
- void property_list_changed_notify ( )
通知编辑器属性列表已经改变,以便编辑器插件能够考虑到新的值。在导出构建时没有任何作用。
- void remove_meta ( String name )
从对象的元数据中删除给定条目。另见 set_meta。
为给定的属性赋一个新值。如果 property
不存在,则不会发生任何事情。
注意:在 C# 中,如果属性名由内置的 Godot 节点定义,则必须将其指定为 snake_case。这不适用于用户定义的属性,在这些属性中,您应该使用与 C# 源中相同的约定(通常是 PascalCase)。
- void set_block_signals ( bool enable )
如果设置为true
,信号发射被阻止。
在当前帧的物理完成之后,将给定属性赋一个新值。这相当于通过call_deferred调用set,即call_deferred("set", property, value)
。
注意:在c#中,属性名必须指定为snake_case,如果它是由内置的Godot节点定义的。这并不适用于用户定义的属性,因为您应该使用与c#源代码(通常是PascalCase)相同的约定。
为NodePath标识的属性分配一个新值。节点路径应该相对于当前对象,可以使用冒号(:
)访问嵌套属性。举例如下:
set_indexed("position", Vector2(42, 0))
set_indexed("position:y", -10)
print(position) # (42, -10)
- void set_message_translation ( bool enable )
定义对象是否可以转换字符串(通过调用tr)。默认启用。
添加、更改或删除对象元数据中的给定条目。元数据被序列化并且可以采用任何 Variant 值。
要从对象的元数据中删除给定条目,请使用 remove_meta。如果元数据的值设置为 null
,也会删除元数据。这意味着您还可以使用 set_meta("name", null)
删除 "name"
的元数据。
- void set_script ( Reference script )
将脚本分配给对象。每个对象都可以有一个分配给它的脚本,用于扩展其功能。
如果对象已经有一个脚本,则前一个脚本实例将被释放,它的变量和状态将丢失。新脚本的_init方法将被调用。
- String to_string ( )
返回一个表示对象的 String。如果没有覆盖,默认为 "[ClassName:RID]"
。
可以通过重写 _to_string 方法来自定义 String 表示。
使用在项目设置中配置的翻译目录翻译消息。
仅在启用消息翻译时(默认如此)有效,否则返回未修改的 message
。请参阅 set_message_translation。