使用 @tool 在 Godot 4 编辑器中获取参数

问题描述 投票:0回答:1

我正在尝试使用 @tool 和 @export 将参数从编辑器传递到我的脚本。 我的代码运行正常,但我无法在编辑器中将布尔值设置为“开”或“关”。

@tool
extends Sprite2D

@export var show_sprites = false:
    set(show):
        if show:
            _renderSprites()
        else:
            _clearSprites()

有人可以告诉我如何正确实现 @export 以便它可以采用布尔参数吗?

我一直在使用的解决方法是: 我使用整数作为导出变量,然后:当我为整数设置非零值时, 编辑器更新以显示我的精灵,但不会将参数更新为我输入的数字(保持 0)。 然后我可以在编辑器中重置参数来运行我的 _clearSprites() 函数。

过去几天我已经研究过这个问题,但没有取得太大进展: https://docs.godotengine.org/en/stable/tutorials/plugins/running_code_in_the_editor.html

rendering editor godot
1个回答
0
投票

您没有设置变量。您需要将其设置在设置器中...

类似这样的:

@export var show_sprites := false:
    set(mod_value):
        show_sprites = mod_value
        if show_sprites:
            _renderSprites()
        else:
            _clearSprites()

您还可以通过检查正在设置的值是否与实际值相同来避免多余的工作:

@export var show_sprites := false:
    set(mod_value):
        if show_sprites == mod_value:
            return

        show_sprites = mod_value
        if show_sprites:
            _renderSprites()
        else:
            _clearSprites()

如果您所做的更改只有在节点准备就绪时才会发生(例如,因为它需要访问其他节点),那么您可能会从将其提取到单独的方法中受益,因此节点准备就绪之前的任何更改都可以延迟,直到节点已准备就绪:

@export var show_sprites := false:
    set(mod_value):
        if show_sprites == mod_value:
            return

        show_sprites = mod_value
        if is_node_ready():
            update_show_sprites()


func update_show_sprites() -> void:
    if show_sprites:
        _renderSprites()
    else:
        _clearSprites()


func _ready() -> void:
    update_show_sprites()

如果还需要支持节点从场景树中移除、修改变量,然后将节点添加回场景树的情况,我们可以在节点退出场景树时调用

request_ready
,所以Godot下次进入场景树时会再次调用
_ready

@export var show_sprites := false:
    set(mod_value):
        if show_sprites == mod_value:
            return

        show_sprites = mod_value
        if is_node_ready():
            update_show_sprites()


func update_show_sprites() -> void:
    if show_sprites:
        _renderSprites()
    else:
        _clearSprites()


func _ready() -> void:
    update_show_sprites()


func _exit_tree() -> void:
    request_ready()

顺便说一下,如果您修改了其他属性,或者您为属性设置的值与请求的值不同,或者出于某种原因该属性没有在检查器中更新...调用

notify_property_list_changed()
以便 Godot 读取属性再次更新检查员。

调用

notify_property_list_changed()
会导致戈多调用
get_property_list
。因此,如果您有一个动态属性列表(您可以通过覆盖
_get_property_list
来获得),您可以调用
notify_property_list_changed()
来告诉 Godot 该列表已更改(因此得名)。


如果您需要控制默认值,请覆盖

_property_can_revert
_property_get_revert

© www.soinside.com 2019 - 2024. All rights reserved.