是否可以在 运行 时间内 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
并使用它的结果来更新检查器面板。
我正尝试在工具模式下添加或隐藏脚本变量,如下所示:
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
并使用它的结果来更新检查器面板。