如何在没有实例化的情况下检查节点是否有 属性?
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 常量。
我正在尝试检查某个节点类型是否具有 属性
实际上不需要创建它的实例
像这样:
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 常量。