You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Godot 4.4.dev1程序化修改的场景嵌入纹理导出失效求助

Godot 4.4.dev1 导出后HUD纹理加载与输入事件失效问题

我使用Godot 4.4.dev1创建了两个HUD场景:技能场景与键盘按键场景,二者均通过导出变量在编辑器中为子节点加载纹理。编辑器内运行时一切正常,但导出至Windows或Web平台后纹理无法加载。

开启Editable Children可部分解决该问题(如截图中1键及右下角首个技能显示正常),但存在三点弊端:

  • 需手动开启Editable Children
  • 将场景进一步嵌套到其他场景后,该方法失效
  • 导出后按键的_input事件无法触发(按下1键本应显示按压状态,但无响应)

已尝试的排查操作:

  • 怀疑是tool脚本导致问题,注释@tool语句后无任何变化
  • 尝试论坛建议的重父节点代码,未解决问题:
func _ready() -> void:
    self.tree_entered.connect(_on_tree_entered)

func _on_tree_entered():
    var root_node = get_tree().current_scene
    self.owner = root_node
    mask.owner = root_node
    ability_icon.owner = root_node

HUD技能场景代码

@tool
extends Control

class_name HUDAbility

@export var ability_icon_64_x_64_px: Texture:
    set(value):
        if not is_node_ready():
            await ready
        ability_icon_64_x_64_px = value
        ability_icon.texture = value
@export var is_round: bool = false:
    set(value):
        if not is_node_ready():
            await ready
        is_round = value
        if is_round:
            mask.set_clip_children_mode(Control.ClipChildrenMode.CLIP_CHILDREN_ONLY)
        else:
            mask.set_clip_children_mode(Control.ClipChildrenMode.CLIP_CHILDREN_DISABLED)


@onready var mask: TextureRect = $Mask
@onready var ability_icon: TextureRect = $Mask/AbilityIcon
@onready var level_label = $LevelLabel


var current_level: int = 0


func update_level(level: int):
    current_level = level
    if current_level > 0:
        level_label.text = str(current_level)
        self.show()
        level_label.show()
    else:
        self.hide()
        level_label.hide()

键盘按键场景代码

@tool
extends Control


@export var key_enum: Key:
    set(value):
        if not is_node_ready():
            await ready
        key_enum = value
        key_name = OS.get_keycode_string(key_enum)
@export var key_name: String:
    set(value):
        if not is_node_ready():
            await ready
        key_name = value
        var filename = path + "keyboard_" + value
        var extension = ".png"
        var unpressed_filename = filename + "_outline" + extension
        var pressed_filename = filename + extension
        if ResourceLoader.exists(unpressed_filename):
            key_unpressed.texture = load(unpressed_filename)
        else:
            key_unpressed.texture = null
        if ResourceLoader.exists(pressed_filename):
            key_pressed.texture = load(pressed_filename)
        else:
            key_pressed.texture = null


@onready var key_unpressed = $Key_Unpressed
@onready var key_pressed = $Key_Pressed
@onready var path: String = "res://assets/ui/icons/input/keys_flat/"


func _input(event):
    if event is InputEventKey and event.pressed:
        if event.keycode == key_enum:
            key_unpressed.hide()
            key_pressed.show()
    if event is InputEventKey and not event.pressed:
        if event.keycode == key_enum:
            key_pressed.hide()
            key_unpressed.show()

相关截图

  • 编辑器视图:编辑器视图
  • 编辑器内运行效果(1键处于按压状态):编辑器内运行效果
  • Windows导出后运行效果:Windows导出后运行效果

目前按键仍可接收鼠标事件,寻求代码修复或替代解决方案。

内容的提问来源于stack exchange,提问作者Dragonforge Development

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 20:35:57