如何在没有实例化的情况下检查节点是否有 属性?

How to check if node has property without instancing?

我正在尝试检查某个节点类型是否具有 属性
实际上不需要创建它的实例

像这样:

print("z_index" in Position2D);

类 在 ClassDB

如果我们谈论的是 build-in class(不是您创建的自定义 class,而是 Godot 的一部分),您可以使用 ClassDB 得到 属性:

var properties := ClassDB.class_get_property_list("Position2D")

类 来自 Godot 脚本

如果 class 不在 ClassDB 中(这是自定义 classes 的情况),但您有脚本,则可以使用脚本获取 属性列表:

var properties := preload("res://custom_class.gd").get_script_property_list()

如果您没有脚本,也许您可​​以找到它。此代码使用隐藏的项目设置 "_global_script_classes" 找到 class 的脚本路径,给定您要查找的 name_of_class,并加载它:

if ProjectSettings.has_setting("_global_script_classes"):
    for x in ProjectSettings.get_setting("_global_script_classes"):
        if x.class == name_of_class:
            return load(x.path)

其他classes

但是,上述方法并不适用于所有类型的脚本。在那些情况下,恐怕最好的方法就是实例化它。您仍然可以从实例中获取属性并缓存它们(也许将它们放入字典中),这样您就不会在每次需要查询时都创建一个新实例:

var properties := (CustomClass.new()).get_property_list()

查询属性

不管你是怎么得到属性列表的,都可以用同样的方式查询。例如,此代码查找名称为 "z_index" 的 属性 并获取其类型:

var found := false
var type := TYPE_NIL
for property in properties:
    if property.name == "z_index":
        found = true
        type = property.type
        break

prints(found, type)

类型是 Variant.Type 常量。