请先阅读我对Play animation without invoking setget? 的回答。
不同之处在于我们将告诉 Godot 只存储其中一个。我们可以通过_get_property_list 做到这一点。因此,我们不会使用export。
例如我们可以这样做:
var example_value := 0
func _get_property_list() -> Array:
return [
{
name = "example_value",
type = TYPE_INT,
usage = PROPERTY_USAGE_EDITOR
}
]
并且编辑器会显示变量,因为它有PROPERTY_USAGE_EDITOR,但它不会被存储,因为它没有PROPERTY_USAGE_STORAGE。
如果它没有被存储,那么在加载 Godot 时不会找到它,也不会设置它(注意它可能在你告诉 Godot 不存储它之前已经存储了......再次保存资源将修复它,或者使用外部编辑)。
现在的问题是您根本没有保存价值。所以我们将有两个属性。一个只供编辑器使用,一个只用于存储。并且存储不会进行昂贵的过程。像这样:
tool
extends Node
var example_value := 0 setget set_example_value
func set_example_value(mod_value:int) -> void:
print("HELLO")
example_value = mod_value
var example_value_storage:int setget set_example_value_storage, get_example_value_storage
func get_example_value_storage() -> int:
return example_value
func set_example_value_storage(mod_value:int) -> void:
example_value = mod_value
func _get_property_list() -> Array:
return [
{
name = "example_value",
type = TYPE_INT,
usage = PROPERTY_USAGE_EDITOR
},
{
name = "example_value_storage",
type = TYPE_INT,
usage = PROPERTY_USAGE_STORAGE
}
]