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常量。例如,在每个渲染帧上,SceneTree用Item.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()。
方法¶
信号¶
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 }
]
public override Variant _Get(StringName property)
{
if (property == "FakeProperty")
{
S3.Print("Getting my property!");
return 4;
}
return default;
}
public override i3D.Collections.Array<i3D.Collections.Dictionary> _GetPropertyList()
{
return
[
new i3D.Collections.Dictionary()
{
{ "name", "FakeProperty" },
{ "type", (int)Variant.Type.Int },
},
];
}
Array[Dictionary] _get_property_list() virtual 🔗
重写此方法以提供由引擎处理的附加属性的自定义列表。
应该返回一个属性列表,作为字典的Array。结果被添加到get_property_list()的数组中,并且应该以相同的方式格式化。每个Dictionary必须至少包含name和type条目。
您可以使用_property_can_revert()和_property_get_revert()来自定义此方法添加的属性的默认值。
下面的示例显示了一个数字列表,显示为从ZERO到FIVE的单词,其中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
[Tool]
public partial class MyNode : Item
{
private int _numberCount;
[Export]
public int NumberCount
{
get => _numberCount;
set
{
_numberCount = value;
_numbers.Resize(_numberCount);
NotifyPropertyListChanged();
}
}
private i3D.Collections.Array<int> _numbers = [];
public override i3D.Collections.Array<i3D.Collections.Dictionary> _GetPropertyList()
{
i3D.Collections.Array<i3D.Collections.Dictionary> properties = [];
for (int i = 0; i < _numberCount; i++)
{
properties.Add(new i3D.Collections.Dictionary()
{
{ "name", $"number_{i}" },
{ "type", (int)Variant.Type.Int },
{ "hint", (int)PropertyHint.Enum },
{ "hint_string", "Zero,One,Two,Three,Four,Five" },
});
}
return properties;
}
public override Variant _Get(StringName property)
{
string propertyName = property.ToString();
if (propertyName.StartsWith("number_"))
{
int index = int.Parse(propertyName.Substring("number_".Length));
return _numbers[index];
}
return default;
}
public override bool _Set(StringName property, Variant value)
{
string propertyName = property.ToString();
if (propertyName.StartsWith("number_"))
{
int index = int.Parse(propertyName.Substring("number_".Length));
_numbers[index] = value.As<int>();
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!")
public override void _Notification(int what)
{
if (what == NotificationPredelete)
{
S3.Print("Goodbye!");
}
}
注意:基类Object定义了一些通知(NOTIFICATION_POSTINITIALIZE和NOTIFICATION_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应正常处理,则返回false。property的确切设置方式取决于此方法的实现。
结合_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 }
]
private i3D.Collections.Dictionary _internalData = new i3D.Collections.Dictionary();
public override bool _Set(StringName property, Variant value)
{
if (property == "FakeProperty")
{
// Storing the value in the fake property.
_internalData["FakeProperty"] = value;
return true;
}
return false;
}
public override i3D.Collections.Array<i3D.Collections.Dictionary> _GetPropertyList()
{
return
[
new i3D.Collections.Dictionary()
{
{ "name", "FakeProperty" },
{ "type", (int)Variant.Type.Int },
},
];
}
覆盖此方法以自定义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
[Tool]
public partial class MyNode : Item
{
private bool _isNumberEditable;
[Export]
public bool IsNumberEditable
{
get => _isNumberEditable;
set
{
_isNumberEditable = value;
NotifyPropertyListChanged();
}
}
[Export]
public int Number { get; set; }
public override void _ValidateProperty(i3D.Collections.Dictionary property)
{
if (property["name"].AsStringName() == PropertyName.Number && !IsNumberEditable)
{
var usage = property["usage"].As<PropertyUsageFlags>() | PropertyUsageFlags.ReadOnly;
property["usage"] = (int)usage;
}
}
}
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 }
])
AddUserSignal("Hurt",
[
new i3D.Collections.Dictionary()
{
{ "name", "damage" },
{ "type", (int)Variant.Type.Int },
},
new i3D.Collections.Dictionary()
{
{ "name", "source" },
{ "type", (int)Variant.Type.Object },
},
]);
Variant call(method: StringName, ...) vararg 🔗
调用对象上的method并返回结果。此方法支持可变数量的参数,因此参数可以以逗号分隔的列表形式传递。
var node = Item3D.new()
node.call("rotate", Vector3(1.0, 0.0, 0.0), 1.571)
var node = new Item3D();
node.Call(Item3D.MethodName.Rotate, new Vector3(1f, 0f, 0f), 1.571f);
注意:在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)
var node = new Item3D();
node.CallDeferred(Item3D.MethodName.Rotate, new Vector3(1f, 0f, 0f), 1.571f);
另请参阅 Callable.call_deferred().
注意: 在C#中,当提及内置的i3D方法时, method 必须使用下划线分隔的书写格式(即snake_case)。建议使用在 MethodName 类中公开的名称,以避免每次调用时都分配一个新的 StringName 对象。
注意: 如果您希望将函数调用推迟一帧,请参考 SceneTree.process_frame 和 SceneTree.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])
var node = new Item3D();
node.Callv(Item3D.MethodName.Rotate, [new Vector3(1f, 0f, 0f), 1.571f]);
注意:在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])
public override void _Ready()
{
var button = new Button();
// C# 支持将信号作为事件进行传递,因此我们可以采用这种常用的结构:
button.ButtonDown += OnButtonDown;
// 假定存在一个名为 `Player` 的类,该类定义了一个 `hit` 信号。
var player = new Player();
// 当我们需要绑定额外参数时,就可以使用 lambda 表达式。
player.Hit += () => OnPlayerHit("sword", 100);
}
private void OnButtonDown()
{
S3.Print("Button down!");
}
private void OnPlayerHit(string weaponType, int damage)
{
S3.Print($"Hit with weapon {weaponType} for {damage} 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!")
public override void _Ready()
{
var button = new Button();
// 选项 1: 在 C# 中,我们可以将信号视为事件,并使用这种约定俗成的语法进行连接:
button.ButtonDown += OnButtonDown;
// 选项 2: 将来自方法组的可调用对象,与 i3DObject.Connect() 方法进行连接。
button.Connect(Button.SignalName.ButtonDown, Callable.From(OnButtonDown));
// 选项 3: 将使用目标对象和方法名称构建的可调用对象,与 i3DObject.Connect() 方法进行连接。
button.Connect(Button.SignalName.ButtonDown, new Callable(this, MethodName.OnButtonDown));
}
private void OnButtonDown()
{
S3.Print("Button down!");
}
尽管所有选项都有相同的结果(button的BaseButton.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])
public override void _Ready()
{
// 假定存在一个名为 `Player` 的类,该类定义了一个 `hit` 信号。
var player = new Player();
// 使用能够创建一个闭包的 lambda 表达式,该闭包会捕获额外的参数。
// lambda 函数仅接收由信号的委托所定义的参数。
player.Hit += (hitBy, level) => OnPlayerHit(hitBy, level, "sword", 100);
// 在发出信号时添加的参数会首先被传递。
player.EmitSignal(SignalName.Hit, "Dark lord", 5);
}
// 在发出信号时,我们会传递两个参数 (`hit_by`, `level`),
// 在连接时再绑定两个参数 (`weapon_type`, `damage`).
private void OnPlayerHit(string hitBy, int level, string weaponType, int damage)
{
S3.Print($"Hit by {hitBy} (level {level}) with weapon {weaponType} for {damage} 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")
EmitSignal(SignalName.Hit, "sword", 100);
EmitSignal(SignalName.GameOver);
注意:在C#中,当引用内置的i3D方法时,signal必须使用蛇形命名法。建议使用SignalName类中公开的名称,以避免每次调用时分配新的StringName。
void free() 🔗
从内存中删除对象。预先存在的对对象的引用无效,任何访问它们的尝试都将导致运行时错误。使用@GlobalScope.is_instance_valid()检查引用将返回false。
Variant get(property: StringName) const 🔗
返回给定property的Variant值。如果property不存在,则此方法返回null。
var node = Node2D.new()
node.rotation = 1.5
var a = node.get("rotation") # a is 1.5
var node = new Node2D();
node.Rotation = 1.5f;
var a = node.Get(Node2D.PropertyName.Rotation); // a is 1.5
注意:在C#中,当引用内置的i3D方法时,property必须使用蛇形命名法。建议使用PropertyName类中公开的名称,以避免每次调用时分配新的StringName。
以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
var node = new Node2D();
node.Position = new Vector2(5, -10);
var a = node.GetIndexed("position"); // a is Vector2(5, -10)
var b = node.GetIndexed("position:y"); // b is -10
注意:在C#中,当引用内置的i3D方法时,property_path必须使用蛇形命名法。建议使用PropertyName类中公开的名称,以避免每次调用时分配新的StringName。
注意:此方法不支持SceneTree中节点的实际路径,仅支持子属性路径。在节点的上下文中,使用Item.get_item_and_resource()代替。
返回对象的唯一实例ID。此ID可以保存在EncodedObjectAsID中,并可用于通过@GlobalScope.instance_from_id()检索此对象实例。
注意:此ID仅在当前会话期间有用。如果ID通过网络发送或稍后从文件加载,它将不对应于类似的对象。
Variant get_meta(name: StringName, default: Variant = null) const 🔗
返回给定条目name的对象元数据值。如果该条目不存在,则返回default。如果default为null,也会生成错误。
注意:根据StringName.is_valid_identifier()方法,元数据的名称必须是有效的标识符。
注意:名称以下划线开头的元数据(_)被认为是仅编辑元数据。仅编辑元数据不会显示在检查器中,也不应该被编辑,尽管仍然可以通过这种方法找到。
Array[StringName] get_meta_list() const 🔗
以StringName的Array形式返回对象的元数据条目名称。
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;
注意:args和return的字典格式与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属性。
返回对象的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
var sprite2D = new Sprite2D();
sprite2D.IsClass("Sprite2D"); // Returns true
sprite2D.IsClass("Item"); // Returns true
sprite2D.IsClass("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.
var player = new Node2D();
player.SetScript(S3.Load("res://player.s3"));
player.Notification(NotificationEnterTree);
// The call order is i3DObject -> Item -> Node2D -> player.s3.
player.Notification(NotificationEnterTree, true);
// The call order is player.s3 -> Node2D -> Item -> i3DObject.
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)
var node = new Node2D();
node.Set(Node2D.PropertyName.GlobalScale, new Vector2(8, 2.5f));
S3.Print(node.GlobalScale); // Prints (8, 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
var node = new Node2D();
node.Rotation = 1.5f;
node.SetDeferred(Node2D.PropertyName.Rotation, 3f);
S3.Print(node.Rotation); // Prints 1.5
await ToSignal(GetTree(), SceneTree.SignalName.ProcessFrame);
S3.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)
var node = new Node2D();
node.SetIndexed("position", new Vector2(42, 0));
node.SetIndexed("position:y", -10);
S3.Print(node.Position); // Prints (42, -10)
注意:在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,尽管某些类型无法正确序列化。
如果value为null,则删除该条目。这相当于使用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。默认为"<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 🔗
使用项目设置中配置的翻译目录翻译message或plural_message。可以指定进一步的context来帮助翻译。
如果can_translate_messages()为false,或者没有可用的翻译,则此方法返回message或plural_message,而不进行更改。参见set_message_translation()。
n是消息主题的数量。翻译系统使用它来获取当前语言的正确复数形式。
注意:负数和float可能无法正确应用于某些可数主题。建议使用tr()处理这些情况。
注意:此方法不能在没有Object实例的情况下使用,因为它需要can_translate_messages()方法。要在静态上下文中翻译字符串,请使用TranslationServer.translate_plural()。