是否可以在 运行 时间内 add/hide 导出变量?

Is it possible to add/hide export variables during run time?

我正尝试在工具模式下添加或隐藏脚本变量,如下所示:

tool

...

export(int) var number_of_appendages=0 setget number_of_appendages_changed

func number_of_appendages_changed(new_val):
    number_of_appendages=new_val;
    _get_property_list()

func _get_property_list():
    
    var variables_list=[]
    for i in number_of_appendages:
        for j in 2:
            variables_list.append({
                    "hint": PROPERTY_HINT_RANGE if j==1 else  PROPERTY_HINT_NONE,
                    "hint_string":"-360, 360,30" if j==1 else "",
                    "usage": PROPERTY_USAGE_DEFAULT,
                    "name": "appendage "+String(i+1)+"/"+("name" if j==0 else "length"),
                    "type": TYPE_REAL if j==1 else TYPE_STRING
                })

    return variables_list

显然这行不通,但是如果我创建了最大数量的附属物然后只相应地切换可见性呢?

伪代码:

tool 

...

export(int) var number_of_appendages=0 setget number_of_appendages_changed
const max_appendages=5

func number_of_appendages_changed(new_val):
    number_of_appendages=new_val;
    
    for i in max_appendages:
        if(i>number_of_appendages):
            HIDE_GROUP("Appendage "+String(i+1))

func _get_property_list():
    
    var variables_list=[];
    
    for i in max_appendages:
        for j in 2:
            variables_list.append({
                    "hint": PROPERTY_HINT_RANGE if j==1 else  PROPERTY_HINT_NONE,
                    "hint_string":"-360, 360,30" if j==1 else "",
                    "usage": PROPERTY_USAGE_DEFAULT,
                    "name": "appendage "+String(i+1)+"/"+("name" if j==0 else "length"),
                    "type": TYPE_REAL if j==1 else TYPE_STRING
                })

    return variables_list

这样的事情可能吗?还是有任何其他方法可以实现我想要完成的目标?

你所拥有的与你必须要做的很接近。 与你想出的伪代码不同

如您所知,Godot 调用 _get_property_list 来确定要在检查器面板中显示的内容。

然而,当你这样称呼它时:

func number_of_appendages_changed(new_val):
    number_of_appendages=new_val;
    _get_property_list()

它什么都不做。是的,_get_property_list 是 运行,但是它的结果会怎样呢?越来越小了。

相反,这样做:

func number_of_appendages_changed(new_val):
    number_of_appendages=new_val;
    property_list_changed_notify()

通过那个调用 property_list_changed_notify 你告诉 Godot 调用 _get_property_list 并使用它的结果来更新检查器面板。