Object

派生: AudioServer, CameraServer, ClassDB, DisplayServer, EditorFileSystemDirectory, EditorInterface, EditorPaths, EditorSelection, EditorUndoRedoManager, EditorVCSInterface, Engine, EngineDebugger, FramebufferCacheRD, Geometry2D, Geometry3D, Input, InputMap, IP, JavaClassWrapper, JavaScriptBridge, JNISingleton, JSONRPC, MainLoop, Marshalls, MovieWriter, NativeMenu, NavigationMeshGenerator, NavigationServer3D, Item, OpenXRExtensionWrapperExtension, OpenXRInteractionProfileMetadata, OS, Performance, PhysicsDirectBodyState2D, PhysicsDirectBodyState3D, PhysicsDirectSpaceState2D, PhysicsDirectSpaceState3D, PhysicsServer2D, PhysicsServer2DManager, PhysicsServer3D, PhysicsServer3DManager, PhysicsServer3DRenderingServerHandler, ProjectSettings, RefCounted, RenderData, RenderingDevice, RenderingServer, RenderSceneData, ResourceLoader, ResourceSaver, ResourceUID, S3ExtensionManager, ScriptLanguage, ShaderIncludeDB, TextServerManager, ThemeDB, TileData, Time, TranslationServer, TreeItem, UndoRedo, UniformSetCacheRD, WorkerThreadPool, XRServer, XRVRS

引擎中所有其他类的基类。

描述

一种高级的Variant类型。引擎中的所有类都继承自Object。每个类可以定义新的属性、方法或信号,供所有继承类使用。例如,Sprite实例可以调用Item.add_child(),因为它继承自Item

您可以使用Object.new()在S3Script中创建新实例,或者使用new i3DObject在C#中创建新实例。

要删除Object实例,请调用free()。这对大多数继承Object的类来说是必要的,因为它们不自行管理内存,否则在不再使用时会导致内存泄漏。有几个类负责内存管理。例如,RefCounted(以及扩展的Resource)在不再被引用时会自行删除,Item在被释放时会删除其子节点。对象可以附加Script。一旦Script被实例化,它实际上成为基础类的扩展,允许它定义和继承新的属性、方法和信号。在Script中,_get_property_list()可以被重写,以多种方式自定义属性。这允许它们在编辑器中可用,以列表的形式显示选项,分成组,保存到磁盘等。脚本语言提供了更简单的方法来自定义属性,例如使用@S3Script.@export注释。3D非常动态。一个对象的脚本,因此它的属性、方法和信号,可以在运行时更改。因此,有时可能会出现这样的情况,例如,一个方法所需的属性可能不存在。为了防止运行时错误,请查看set()get()call()has_method()has_signal()等方法。请注意,这些方法比直接引用慢得多。在S3Script中,您还可以使用in运算符检查给定的属性、方法或信号名是否存在于对象中:

var item = Item.new()
print("name" in item)         # Prints true
print("get_parent" in item)   # Prints true
print("tree_entered" in item) # Prints true
print("unknown" in itemc)      # Prints false

通知是对象通常发送和接收的int常量。例如,在每个渲染帧上,SceneTreeItem.NOTIFICATION_PROCESS通知树内的节点。节点接收它并可以调用Item.Update()进行更新。要使用通知,请参阅notification()_notification()

最后,每个对象还可以包含元数据(关于数据的数据)。set_meta()对于存储对象本身不依赖的信息很有用。

注意:与引用RefCounted不同,引用存储在变量中的对象可能会在未被设置为null时失效。若要检查对象是否已被删除,请不要将其与null进行比较。相反,请使用@GlobalScope.is_instance_valid()。建议使用RefCounted而非Object来存储数据的类继承。

注意:script不像大多数属性那样公开。要在代码中设置或获取对象的Script,请分别使用set_script()get_script()

注意:在布尔上下文中,如果Object等于null或已被释放,则Object将评估为false。否则,Object将始终评估为true。另请参阅@GlobalScope.is_instance_valid()

方法

Variant

_get(property: StringName) virtual

Array[Dictionary]

_get_property_list() virtual

void

_init() virtual

Variant

_iter_get(iter: Variant) virtual

bool

_iter_init(iter: Array) virtual

bool

_iter_next(iter: Array) virtual

void

_notification(what: int) virtual

bool

_property_can_revert(property: StringName) virtual

Variant

_property_get_revert(property: StringName) virtual

bool

_set(property: StringName, value: Variant) virtual

String

_to_string() virtual

void

_validate_property(property: Dictionary) virtual

void

add_user_signal(signal: String, arguments: Array = [])

Variant

call(method: StringName, ...) vararg

Variant

call_deferred(method: StringName, ...) vararg

Variant

callv(method: StringName, arg_array: Array)

bool

can_translate_messages() const

void

cancel_free()

Error

connect(signal: StringName, callable: Callable, flags: int = 0)

void

disconnect(signal: StringName, callable: Callable)

Error

emit_signal(signal: StringName, ...) vararg

void

free()

Variant

get(property: StringName) const

String

get_class() const

Array[Dictionary]

get_incoming_connections() const

Variant

get_indexed(property_path: ItemPath) const

int

get_instance_id() const

Variant

get_meta(name: StringName, default: Variant = null) const

Array[StringName]

get_meta_list() const

int

get_method_argument_count(method: StringName) const

Array[Dictionary]

get_method_list() const

Array[Dictionary]

get_property_list() const

Variant

get_script() const

Array[Dictionary]

get_signal_connection_list(signal: StringName) const

Array[Dictionary]

get_signal_list() const

StringName

get_translation_domain() const

bool

has_connections(signal: StringName) const

bool

has_meta(name: StringName) const

bool

has_method(method: StringName) const

bool

has_signal(signal: StringName) const

bool

has_user_signal(signal: StringName) const

bool

is_blocking_signals() const

bool

is_class(class: String) const

bool

is_connected(signal: StringName, callable: Callable) const

bool

is_queued_for_deletion() const

void

notification(what: int, reversed: bool = false)

void

notify_property_list_changed()

bool

property_can_revert(property: StringName) const

Variant

property_get_revert(property: StringName) const

void

remove_meta(name: StringName)

void

remove_user_signal(signal: StringName)

void

set(property: StringName, value: Variant)

void

set_block_signals(enable: bool)

void

set_deferred(property: StringName, value: Variant)

void

set_indexed(property_path: ItemPath, value: Variant)

void

set_message_translation(enable: bool)

void

set_meta(name: StringName, value: Variant)

void

set_script(script: Variant)

void

set_translation_domain(domain: StringName)

String

to_string()

String

tr(message: StringName, context: StringName = &"") const

String

tr_n(message: StringName, plural_message: StringName, n: int, context: StringName = &"") const


信号

property_list_changed() 🔗

调用notify_property_list_changed()时发出。


script_changed() 🔗

更改对象的脚本时发出。

注意:当这个信号发出时,新脚本还没有初始化,如果需要访问新脚本,用CONNECT_DEFERRED推迟到这个信号的连接。


枚举

enum ConnectFlags: 🔗

ConnectFlags CONNECT_DEFERRED = 1

延迟连接在空闲时间(在帧结束时)而不是立即触发它们的Callables。

ConnectFlags CONNECT_PERSIST = 2

持久连接在对象序列化时存储(例如使用PackedScene.pack()时)。在编辑器中,通过Node扩展坞创建的连接始终持久化。

ConnectFlags CONNECT_ONE_SHOT = 4

发射后,一次性连接会自行断开。

ConnectFlags CONNECT_REFERENCE_COUNTED = 8

引用计数的连接可以多次分配给同一个Callable。每次断开都会减少内部计数器。只有当计数器达到0时,信号才会完全断开。


常量

NOTIFICATION_POSTINITIALIZE = 0 🔗

对象初始化时收到的通知,在附加其脚本之前。内部使用。

NOTIFICATION_PREDELETE = 1 🔗

对象即将被删除时收到的通知。可以像面向对象编程语言中的析构函数一样使用。

NOTIFICATION_EXTENSION_RELOADED = 2 🔗

对象完成热重载时收到的通知。此通知仅针对扩展类和派生类发送。


方法说明

Variant _get(property: StringName) virtual 🔗

重写此方法以自定义get()的行为。应该返回给定的property的值,或者如果property应该正常处理,则返回null

结合_set()_get_property_list(),此方法允许定义自定义属性,这对编辑器插件特别有用。请注意,属性必须存在于get_property_list()中,否则不会调用此方法。

func _get(property):
    if property == "fake_property":
        print("Getting my property!")
        return 4

func _get_property_list():
    return [
        { "name": "fake_property", "type": TYPE_INT }
    ]

Array[Dictionary] _get_property_list() virtual 🔗

重写此方法以提供由引擎处理的附加属性的自定义列表。

应该返回一个属性列表,作为字典的Array。结果被添加到get_property_list()的数组中,并且应该以相同的方式格式化。每个Dictionary必须至少包含nametype条目。

您可以使用_property_can_revert()_property_get_revert()来自定义此方法添加的属性的默认值。

下面的示例显示了一个数字列表,显示为从ZEROFIVE的单词,其中number _count控制列表的大小:

@tool
extends Item

@export var number_count = 3:
    set(nc):
        number_count = nc
        numbers.resize(number_count)
        notify_property_list_changed()

var numbers = PackedInt32Array([0, 0, 0])

func _get_property_list():
    var properties = []

    for i in range(number_count):
        properties.append({
            "name": "number_%d" % i,
            "type": TYPE_INT,
            "hint": PROPERTY_HINT_ENUM,
            "hint_string": "ZERO,ONE,TWO,THREE,FOUR,FIVE",
        })

    return properties

func _get(property):
    if property.begins_with("number_"):
        var index = property.get_slice("_", 1).to_int()
        return numbers[index]

func _set(property, value):
    if property.begins_with("number_"):
        var index = property.get_slice("_", 1).to_int()
        numbers[index] = value
        return true
    return false

注意:此方法旨在用于高级目的。对于大多数常见用例,脚本语言提供了更简单的方法来处理属性。请参阅@S3Script.@export@S3Script.@export_enum@S3Script.@export_group等。如果要自定义导出的属性,请使用_validate_property()

注意:如果对象的脚本不是@S3Script.@tool,则不会在编辑器中调用此方法。


void _init() virtual 🔗

当对象的脚本被实例化时调用,通常是在对象在内存中初始化之后(通过S3Script中的Object.new(),或者C#中的new i3DObject)。它也可以定义为接受参数。这种方法类似于大多数编程语言中的构造函数。

注意:如果_init()定义了必需的参数,则只能直接创建带有脚本的Object。如果使用任何其他方式(如PackedScene.instantiate()Item.duplicate()),脚本的初始化将失败。


Variant _iter_get(iter: Variant) virtual 🔗

返回当前可迭代值。iter存储迭代状态,但与_iter_init()_iter_next()不同,状态应该是只读的,因此没有Array包装器。


bool _iter_init(iter: Array) virtual 🔗

初始化迭代器。iter存储迭代状态。由于S3Script不支持通过引用传递参数,因此使用单元素数组作为封装器。只要迭代器没有到达末尾,就返回true

示例:

class MyRange:
    var _from
    var _to

    func _init(from, to):
        assert(from <= to)
        _from = from
        _to = to

    func _iter_init(iter):
        iter[0] = _from
        return iter[0] < _to

    func _iter_next(iter):
        iter[0] += 1
        return iter[0] < _to

    func _iter_get(iter):
        return iter

func _ready():
    var my_range = MyRange.new(2, 5)
    for x in my_range:
        print(x) # Prints 2, 3, 4.

注意:或者,您可以忽略iter并使用对象的状态代替,请参阅在线文档中的示例。请注意,在这种情况下,您无法在嵌套循环中重复使用相同的迭代器实例。此外,如果您想多次重用同一实例,请确保在此方法中重置迭代器的状态。


bool _iter_next(iter: Array) virtual 🔗

将迭代器移动到下一次迭代。iter存储迭代状态。由于S3Script不支持通过引用传递参数,因此使用单元素数组作为包装器。只要迭代器没有到达终点,就返回true


void _notification(what: int) virtual 🔗

当对象收到通知时被调用,该通知可通过与常量进行比较来在what中识别。另请参阅notification()

func _notification(what):
    if what == NOTIFICATION_PREDELETE:
        print("Goodbye!")

注意:基类Object定义了一些通知(NOTIFICATION_POSTINITIALIZENOTIFICATION_PREDELETE)。继承的类如Item定义了更多的通知,这些通知也通过这个方法接收。


bool _property_can_revert(property: StringName) virtual 🔗

重写此方法以自定义给定property的还原行为。如果property具有自定义默认值并且在检查器停靠坞中可以还原,则应返回true。使用_property_get_revert()指定property的默认值。

注意:无论property的当前值如何,此方法必须一致返回。


Variant _property_get_revert(property: StringName) virtual 🔗

重写此方法以自定义给定property的还原行为。应返回property的默认值。如果默认值与property的当前值不同,将在检查器停靠区中显示还原图标。

注意:_property_can_revert()也必须被覆盖才能调用此方法。


bool _set(property: StringName, value: Variant) virtual 🔗

覆盖此方法以自定义set()的行为。应将property设置为value并返回true,如果property应正常处理,则返回falseproperty确切设置方式取决于此方法的实现。

结合_get()_get_property_list(),该方法允许定义自定义属性,这对编辑器插件特别有用。请注意,属性必须出现在get_property_list()中,否则此方法不会被调用。

var internal_data = {}

func _set(property, value):
    if property == "fake_property":
        # Storing the value in the fake property.
        internal_data["fake_property"] = value
        return true
    return false

func _get_property_list():
    return [
        { "name": "fake_property", "type": TYPE_INT }
    ]

String _to_string() virtual 🔗

覆盖此方法以自定义to_string()的返回值,从而自定义对象作为String的表示形式。

func _to_string():
    return "Welcome to i3D!"

func _init():
    print(self)       # Prints "Welcome to i3D!"
    var a = str(self) # a is "Welcome to i3D!"

void _validate_property(property: Dictionary) virtual 🔗

覆盖此方法以自定义现有属性。除了使用_get_property_list()添加的属性外,所有属性信息都通过此方法处理。字典中的内容与_get_property_list()中的内容相同。

@tool
extends Item

@export var is_number_editable: bool:
    set(value):
        is_number_editable = value
        notify_property_list_changed()
@export var number: int

func _validate_property(property: Dictionary):
    if property.name == "number" and not is_number_editable:
        property.usage |= PROPERTY_USAGE_READ_ONLY

void add_user_signal(signal: String, arguments: Array = []) 🔗

添加一个名为signal的用户自定义信号。可以将信号的可选参数作为字典数组添加,每个字典定义一个name String和一个type int(请参阅Variant.Type)。另请参阅has_user_signal()remove_user_signal()

add_user_signal("hurt", [
    { "name": "damage", "type": TYPE_INT },
    { "name": "source", "type": TYPE_OBJECT }
])

Variant call(method: StringName, ...) vararg 🔗

调用对象上的method并返回结果。此方法支持可变数量的参数,因此参数可以以逗号分隔的列表形式传递。

var node = Item3D.new()
node.call("rotate", Vector3(1.0, 0.0, 0.0), 1.571)

注意:在C#中,当引用内置的i3D方法时,method必须使用蛇形命名法。建议使用MethodName类中公开的名称,以避免每次调用时分配新的StringName


Variant call_deferred(method: StringName, ...) vararg 🔗

在空闲时间调用对象上的method。始终返回null,而不是方法的结果。

空闲时间主要发生在处理帧和物理帧的末尾。在其中,延迟调用将一直运行到没有剩余调用,这意味着您可以从其他延迟调用中延迟调用,它们仍将在当前空闲时间周期中运行。这意味着您不应该从自身(或从它调用的方法)调用延迟的方法,因为这会导致无限递归,就像您直接调用该方法一样。

此方法支持可变数量的参数,因此参数可以作为逗号分隔列表传递。

var node = Item3D.new()
node.call_deferred("rotate", Vector3(1.0, 0.0, 0.0), 1.571)

另请参阅 Callable.call_deferred().

注意: 在C#中,当提及内置的i3D方法时, method 必须使用下划线分隔的书写格式(即snake_case)。建议使用在 MethodName 类中公开的名称,以避免每次调用时都分配一个新的 StringName 对象。

注意: 如果您希望将函数调用推迟一帧,请参考 SceneTree.process_frameSceneTree.physics_frame 信号。

var node = Item3D.new()
# 创建一个可调用对象,并将参数绑定到节点的rotate()调用中。
var callable = node.rotate.bind(Vector3(1.0, 0.0, 0.0), 1.571)
# 将该可调用函数与process_frame信号相连接,这样它将在下一个处理帧中被调用。
# CONNECT_ONE_SHOT 会确保其仅在首次调用时执行,而不会在每一帧都执行。
get_tree().process_frame.connect(callable, CONNECT_ONE_SHOT)

Variant callv(method: StringName, arg_array: Array) 🔗

调用对象上的method并返回结果。与call()不同的是,该方法期望所有参数都包含在arg_array中。

var node = Item3D.new()
node.callv("rotate", [Vector3(1.0, 0.0, 0.0), 1.571])

注意:在C#中,当引用内置的i3D方法时,method必须使用蛇形命名法。建议使用MethodName类中公开的名称,以避免每次调用时分配新的StringName


bool can_translate_messages() const 🔗

如果允许对象使用tr()tr_n()翻译消息,则返回true。另请参见set_message_translation()


void cancel_free() 🔗

如果在NOTIFICATION_PREDELETE期间调用此方法,该对象将拒绝被释放并保持分配状态。这主要是一个用于错误处理的内部函数,以避免用户在不打算释放对象时释放对象。


Error connect(signal: StringName, callable: Callable, flags: int = 0) 🔗

通过名称将一个signal连接到一个callable。还可以添加可选的flags来配置连接的行为(请参阅ConnectFlags常量)。

一个信号只能一次连接到同一个Callable。如果该信号已被连接,则此方法返回@GlobalScope.ERR_INVALID_PARAMETER并推送错误消息,除非该信号使用CONNECT_REFERENCE_COUNTED连接。为了防止这种情况发生,请先使用is_connected()检查是否存在现有连接。如果callable的对象被释放,则连接将丢失。推荐的语法示例:连接信号是i3D中最常见的操作之一,API提供了许多选项来实现,详情请见下文。下面的代码块展示了推荐的方法。

func _ready():
    var button = Button.new()
    # 这里的 `button_down` 是一个信号的变体类型,因此我们应使用Signal.connect()方法,而非Object.connect()。
    # 请见下方的讨论,以获取有关该 API 更深入的概述。
    button.button_down.connect(_on_button_down)

    # 假定存在一个名为 `Player` 的类,该类定义了一个 `hit` 信号。
    var player = Player.new()
    # 我们再次使用 Signal.connect() 方法,并且还使用了 Callable.bind() 方法。
    # 这会返回一个带有参数绑定的新可调用对象。
    player.hit.connect(_on_player_hit.bind("sword", 100))

func _on_button_down():
    print("Button down!")

func _on_player_hit(weapon_type, damage):
    print("Hit with weapon %s for %d damage." % [weapon_type, damage])

``Object.connect()`` 或 ``Signal.connect()``?

如上文所述,连接信号的推荐方法并非 connect()。 下面的代码块展示了四种连接信号的选项,使用的是这种传统方法或者推荐的 Signal.connect(),并且可以使用隐式 Callable 或者手动定义的函数。

func _ready():
    var button = Button.new()
    # 选项 1: 对于一个已定义函数,将一个隐式可调用对象与 Object.connect() 方法进行连接。
    button.connect("button_down", _on_button_down)
    # 选项 2: 将使用目标对象和方法名称构建的可调用对象,与 Object.connect() 方法进行连接。
    button.connect("button_down", Callable(self, "_on_button_down"))
    # 选项 3: 对于一个已定义函数,将一个隐式可调用对象与 Signal.connect() 方法进行连接。
    button.button_down.connect(_on_button_down)
    # 选项 4: 将使用目标对象和方法名称构建的可调用对象,与 Signal.connect() 方法进行连接。
    button.button_down.connect(Callable(self, "_on_button_down"))

func _on_button_down():
    print("Button down!")

尽管所有选项都有相同的结果(buttonBaseButton.button_down信号将连接到_on_button_down),但选项3提供了最佳的验证:如果button_down Signal_on_button_down Callable未被定义,程序将在编译时抛出错误。另一方面,选项2只依赖字符串名称,并且只能在运行时验证这些名称:如果 "button_down" 不对应于一个信号,或者 "_on_button_down" 不是对象 self 中注册的方法,就会打印运行时错误。使用选项 1、2、或 4 的主要原因是,如果你真的需要使用字符串(例如根据从配置文件中读取的字符串来动态连接信号)。否则,选项3是推荐的(也是最快的)方法。

绑定和传递参数:

绑定参数的语法是通过Callable.bind(),它返回Callable的副本,并绑定其参数。

调用emit_signal()Signal.emit()时,也可以传递信号参数。下面的示例显示了这些信号参数和绑定参数之间的关系。

func _ready():
    # 假定存在一个名为 `Player` 的类,该类定义了一个 `hit` 信号。
    var player = Player.new()
    # 使用 Callable.bind().
    player.hit.connect(_on_player_hit.bind("sword", 100))

    # 在发出信号时添加的参数会首先被传递。
    player.hit.emit("Dark lord", 5)

# 在发出信号时,我们会传递两个参数 (`hit_by`, `level`),
# 在连接时再绑定两个参数 (`weapon_type`, `damage`).
func _on_player_hit(hit_by, level, weapon_type, damage):
    print("Hit by %s (level %d) with weapon %s for %d damage." % [hit_by, level, weapon_type, damage])

void disconnect(signal: StringName, callable: Callable) 🔗

按名称断开signal与给定callable的连接。如果连接不存在,则生成错误。使用is_connected()确保连接存在。


Error emit_signal(signal: StringName, ...) vararg 🔗

根据名称发出给定的signal。信号必须存在,因此它应该是这个类或其继承类之一的内置信号,或者是用户定义的信号(参见add_user_signal())。此方法支持可变数量的参数,因此参数可以作为逗号分隔的列表传递。

如果signal不存在或参数无效,则返回@GlobalScope.ERR_UNAVAILABLE

emit_signal("hit", "sword", 100)
emit_signal("game_over")

注意:在C#中,当引用内置的i3D方法时,signal必须使用蛇形命名法。建议使用SignalName类中公开的名称,以避免每次调用时分配新的StringName


void free() 🔗

从内存中删除对象。预先存在的对对象的引用无效,任何访问它们的尝试都将导致运行时错误。使用@GlobalScope.is_instance_valid()检查引用将返回false


Variant get(property: StringName) const 🔗

返回给定propertyVariant值。如果property不存在,则此方法返回null

var node = Node2D.new()
node.rotation = 1.5
var a = node.get("rotation") # a is 1.5

注意:在C#中,当引用内置的i3D方法时,property必须使用蛇形命名法。建议使用PropertyName类中公开的名称,以避免每次调用时分配新的StringName


String get_class() const 🔗

String的形式返回对象的内置类名。另请参见is_class()

注意:此方法忽略class_name声明。如果此对象的脚本定义了class_name,则返回基本的内置类名。


Array[Dictionary] get_incoming_connections() const 🔗

返回此对象接收到的信号连接的Array。每个连接都表示为一个Dictionary,其中包含三个条目:

-信号是对Signal的引用;

-callable是对Callable的引用;

-标志ConnectFlags的组合。


Variant get_indexed(property_path: ItemPath) const 🔗

获取由给定的property_path索引的对象属性。该路径应相对于当前对象的ItemPath,并可以使用冒号字符(:)访问嵌套属性。

示例: "position:x""material:next_pass:blend_mode"

var node = Node2D.new()
node.position = Vector2(5, -10)
var a = node.get_indexed("position")   # a is Vector2(5, -10)
var b = node.get_indexed("position:y") # b is -10

注意:在C#中,当引用内置的i3D方法时,property_path必须使用蛇形命名法。建议使用PropertyName类中公开的名称,以避免每次调用时分配新的StringName

注意:此方法不支持SceneTree中节点的实际路径,仅支持子属性路径。在节点的上下文中,使用Item.get_item_and_resource()代替。


int get_instance_id() const 🔗

返回对象的唯一实例ID。此ID可以保存在EncodedObjectAsID中,并可用于通过@GlobalScope.instance_from_id()检索此对象实例。

注意:此ID仅在当前会话期间有用。如果ID通过网络发送或稍后从文件加载,它将不对应于类似的对象。


Variant get_meta(name: StringName, default: Variant = null) const 🔗

返回给定条目name的对象元数据值。如果该条目不存在,则返回default。如果defaultnull,也会生成错误。

注意:根据StringName.is_valid_identifier()方法,元数据的名称必须是有效的标识符。

注意:名称以下划线开头的元数据(_)被认为是仅编辑元数据。仅编辑元数据不会显示在检查器中,也不应该被编辑,尽管仍然可以通过这种方法找到。


Array[StringName] get_meta_list() const 🔗

StringNameArray形式返回对象的元数据条目名称。


int get_method_argument_count(method: StringName) const 🔗

按名称返回给定method的参数数。

注意:在C#中,当引用内置i3D方法时,method必须在snake_case中。首选使用MethodName类中公开的名称,以避免在每次调用时分配新的StringName


Array[Dictionary] get_method_list() const 🔗

将此对象的方法及其签名作为字典的Array返回。每个Dictionary包含以下条目:

-名称是方法的名称,作为String

-参数是表示参数的字典的Array

-默认参数是作为变体Array的默认参数;

-标志MethodFlags的组合;

-id是方法的内部标识符int

-返回是返回值,作为Dictionary

注意:argsreturn的字典格式与get_property_list()的结果相同,尽管并非所有条目都被使用。


Array[Dictionary] get_property_list() const 🔗

以字典的Array形式返回对象的属性列表。每个Dictionary包含以下条目:

-名称是属性的名称,作为String

-类名是一个空的StringName,除非属性是@GlobalScope.TYPE_OBJECT并且它继承自一个类;

-类型是属性的类型,作为int(参见Variant.Type);

-提示如何编辑属性(参见PropertyHint);

-提示内容取决于提示(参见PropertyHint);

-用法PropertyUsageFlags的组合。

注意:在S3Script中,所有类成员都被视为属性。在C#和S3Extension中,可能需要使用装饰器或属性将类成员显式标记为i3D属性。


Variant get_script() const 🔗

返回对象的Script实例,如果没有附加脚本,则返回null


Array[Dictionary] get_signal_connection_list(signal: StringName) const 🔗

返回给定signal名称的连接Array。每个连接都表示为包含三个条目的Dictionary

-信号是对Signal的引用;

-callable是对连接的Callable的引用;

-标志ConnectFlags的组合。


Array[Dictionary] get_signal_list() const 🔗

以字典的Array形式返回现有信号的列表。

注意:由于实现,每个Dictionary的格式与get_method_list()的返回值非常相似。


StringName get_translation_domain() const 🔗

返回tr()tr_n()使用的翻译域的名称。另请参见TranslationServer


bool has_connections(signal: StringName) const 🔗

如果给定的signal名称上存在任何连接,则返回true

注意:在C#中,当引用内置的i3D方法时,signal必须snake_case。首选使用SignalName类中公开的名称,以避免在每次调用时分配新的StringName


bool has_meta(name: StringName) const 🔗

如果找到具有给定name的元数据条目,则返回true。另请参见get_meta()set_meta()remove_meta()

注意:根据StringName.is_valid_identifier()方法,元数据的名称必须是有效的标识符。

注意:名称以下划线开头的元数据(_)被认为是仅编辑元数据。仅编辑元数据不会显示在检查器中,也不应该被编辑,尽管仍然可以通过这种方法找到。


bool has_method(method: StringName) const 🔗

如果对象中存在给定的method名称,则返回true

注意:在C#中,当引用内置i3D方法时,method必须在snake_case中。首选使用MethodName类中公开的名称,以避免在每次调用时分配新的StringName


bool has_signal(signal: StringName) const 🔗

如果对象中存在给定的signal名称,则返回true

注意:在C#中,当引用内置i3D信号时,signal必须在snake_case中。首选使用SignalName类中公开的名称,以避免在每次调用时分配新的StringName


bool has_user_signal(signal: StringName) const 🔗

如果给定的用户定义的signal名称存在,则返回true。仅包含添加了add_user_signal()的信号。另请参见remove_user_signal()


bool is_blocking_signals() const 🔗

如果对象阻止其信号发出,则返回true。参见set_block_signals()


bool is_class(class: String) const 🔗

如果该对象继承自给定的class,则返回true。另请参阅get_class()

var sprite2d = Sprite2D.new()
sprite2d.is_class("Sprite2D") # Returns true
sprite2d.is_class("Item")     # Returns true
sprite2d.is_class("Item3D")   # Returns false

注意:此方法忽略了对象脚本中的class_name声明。


bool is_connected(signal: StringName, callable: Callable) const 🔗

如果给定的signal名称和callable之间存在连接,则返回true

注意:在C#中,当引用内置i3D信号时,signal必须在snake_case中。首选使用SignalName类中公开的名称,以避免在每次调用时分配新的StringName


bool is_queued_for_deletion() const 🔗

如果为对象调用了Item.queue_free()方法,则返回true


void notification(what: int, reversed: bool = false) 🔗

向对象所继承的所有类发送给定的what通知,触发_notification()的调用,从最高的祖先(Object类)开始,一直到对象的脚本。如果reversed的值为true,则调用顺序会被反转。

var player = Node2D.new()
player.set_script(load("res://player.s3"))

player.notification(NOTIFICATION_ENTER_TREE)
# The call order is Object -> Item -> Node2D -> player.s3.

player.notification(NOTIFICATION_ENTER_TREE, true)
# The call order is player.s3 -> Node2D -> Item -> Object.

void notify_property_list_changed() 🔗

发出property_list_changed信号。这主要用于刷新编辑器,以便正确更新检查器和编辑器插件。


bool property_can_revert(property: StringName) const 🔗

如果给定的property具有自定义默认值,则返回true。使用property_get_revert()获取property的默认值。

注意:此方法用于检查器停靠区显示还原图标。对象必须实现_property_can_revert()来自定义默认值。如果没有实现_property_can_revert(),此方法返回false


Variant property_get_revert(property: StringName) const 🔗

返回给定property的自定义默认值。使用property_can_revert()检查property是否具有自定义默认值。

注意:此方法用于检查器停靠区显示还原图标。对象必须实现_property_get_revert()来自定义默认值。如果没有实现_property_get_revert(),则此方法返回null


void remove_meta(name: StringName) 🔗

从对象的元数据中删除给定的条目name。另请参见has_meta()get_meta()set_meta()

注意:根据StringName.is_valid_identifier()方法,元数据的名称必须是有效的标识符。

注意:名称以下划线开头的元数据(_)被认为是仅编辑元数据。仅编辑元数据不会显示在检查器中,也不应该被编辑,尽管仍然可以通过这种方法找到。


void remove_user_signal(signal: StringName) 🔗

从对象中删除给定的用户信号signal。另请参见add_user_signal()has_user_signal()


void set(property: StringName, value: Variant) 🔗

value分配给给定的property。如果该属性不存在或给定的value的类型不匹配,则不会发生任何事情。

var node = Node2D.new()
node.set("global_scale", Vector2(8, 2.5))
print(node.global_scale) # Prints (8.0, 2.5)

注意:在C#中,当引用内置的i3D方法时,property必须使用蛇形命名法。建议使用PropertyName类中公开的名称,以避免每次调用时分配新的StringName


void set_block_signals(enable: bool) 🔗

如果设置为true,对象将无法发出信号。因此,emit_signal()和信号连接将不起作用,直到设置为false


void set_deferred(property: StringName, value: Variant) 🔗

在当前帧结束时,将value分配给给定的property。这相当于通过call_deferred()调用set()

var node = Node2D.new()
add_child(node)

node.rotation = 1.5
node.set_deferred("rotation", 3.0)
print(node.rotation) # Prints 1.5

await get_tree().process_frame
print(node.rotation) # Prints 3.0

注意:在C#中,当引用内置的i3D方法时,property必须使用蛇形命名法。建议使用PropertyName类中公开的名称,以避免每次调用时分配新的StringName


void set_indexed(property_path: ItemPath, value: Variant) 🔗

将新的value分配给由property_path标识的属性。该路径应相对于此对象的ItemPath,并可以使用冒号字符(:)访问嵌套属性。

var node = Node2D.new()
node.set_indexed("position", Vector2(42, 0))
node.set_indexed("position:y", -10)
print(node.position) # Prints (42.0, -10.0)

注意:在C#中,当引用内置的i3D方法时,property_path必须使用蛇形命名法。建议使用PropertyName类中公开的名称,以避免每次调用时分配新的StringName

注意:此方法不支持SceneTree中节点的实际路径,仅支持子属性路径。在节点的上下文中,使用Item.get_item_and_resource()代替。


void set_message_translation(enable: bool) 🔗

如果设置为true,则允许对象使用tr()tr_n()翻译消息。默认启用。另请参见can_translate_messages()


void set_meta(name: StringName, value: Variant) 🔗

在对象的元数据中添加或更改条目name。元数据value可以是任何Variant,尽管某些类型无法正确序列化。

如果valuenull,则删除该条目。这相当于使用remove_meta()。另请参见has_meta()get_meta()

注意:根据StringName.is_valid_identifier()方法,元数据的名称必须是有效的标识符。

注意:名称以下划线开头的元数据(_)被认为是仅编辑元数据。仅编辑元数据不会显示在检查器中,也不应该被编辑,尽管仍然可以通过这种方法找到。


void set_script(script: Variant) 🔗

script附加到对象,并实例化它。结果,调用脚本的_init()Script用于扩展对象的功能。

如果脚本已经存在,则分离其实例,并丢失其属性值和状态。仍保留内置属性值。


void set_translation_domain(domain: StringName) 🔗

设置tr()tr_n()使用的翻译域的名称。另请参见TranslationServer


String to_string() 🔗

返回表示对象的String。默认为"<ClassName#RID>"。覆盖_to_string()以自定义对象的字符串表示形式。


String tr(message: StringName, context: StringName = &"") const 🔗

使用项目设置中配置的翻译目录翻译message。可以指定进一步的context来帮助翻译。请注意,大多数Control节点会自动翻译其字符串,因此此方法对于格式化字符串或自定义绘制的文本非常有用。

如果can_translate_messages()false,或者没有可用的翻译,则此方法返回message而不进行更改。参见set_message_translation()

注意:此方法不能在没有Object实例的情况下使用,因为它需要can_translate_messages()方法。


String tr_n(message: StringName, plural_message: StringName, n: int, context: StringName = &"") const 🔗

使用项目设置中配置的翻译目录翻译messageplural_message。可以指定进一步的context来帮助翻译。

如果can_translate_messages()false,或者没有可用的翻译,则此方法返回messageplural_message,而不进行更改。参见set_message_translation()

n是消息主题的数量。翻译系统使用它来获取当前语言的正确复数形式。

注意:负数和float可能无法正确应用于某些可数主题。建议使用tr()处理这些情况。

注意:此方法不能在没有Object实例的情况下使用,因为它需要can_translate_messages()方法。要在静态上下文中翻译字符串,请使用TranslationServer.translate_plural()