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导出后运行效果:

目前按键仍可接收鼠标事件,寻求代码修复或替代解决方案。
内容的提问来源于stack exchange,提问作者Dragonforge Development
相关产品推荐
相关产品推荐

