在GDScript中为Button按钮设置自定义字体不生效如何解决
问题原因
- 你编写的
_fonts()函数从未被调用过,内部的字体设置逻辑完全没有执行 - 节点引用逻辑错误:你的脚本本身就继承自
Button类,还在_fonts()中用$Button查找子节点Button,但你是在_ready()中才动态创建Button子节点,就算调用_fonts()时节点也尚未生成,必然触发空引用错误 - 未初始化属性就调用:
_process逻辑中没有先给按钮初始化custom_fonts/font属性,直接get该属性会得到null,调用null.font_data就会触发你运行日志里的空引用报错 - 动态创建的New Game按钮没有绑定任何自定义字体配置,默认使用系统字体,自然不会显示你导入的自定义字体
修复方案
逻辑调整说明
你可以直接用当前继承Button的脚本本身作为按钮,不需要额外创建子Button,省去路径查找的冗余逻辑,降低出错概率。
修复后完整代码
extends Button # 预加载字体资源,避免运行时重复加载 const CUSTOM_FONT_DATA = preload("res://Mandala Vintage.ttf") func _ready(): # 初始化当前按钮的自定义字体 var dynamic_font = DynamicFont.new() dynamic_font.font_data = CUSTOM_FONT_DATA # 可按需设置字体大小,示例:dynamic_font.size = 32 set("custom_fonts/font", dynamic_font) # 直接设置当前按钮的文本和点击事件,无需额外创建子按钮 text = "New Game" connect("pressed", self, "_on_button_pressed") # 按钮点击事件回调 func _on_button_pressed(): print("Create a new window here") # 若要保留按ui_accept切换字体的逻辑,可保留以下代码 var is_using_custom_font = true var default_font_data = null func _process(_delta): if Input.is_action_just_pressed("ui_accept"): var current_dynamic_font = get("custom_fonts/font") if not current_dynamic_font: return # 首次切换时保存默认字体 if not default_font_data: default_font_data = current_dynamic_font.font_data if is_using_custom_font: current_dynamic_font.font_data = default_font_data else: current_dynamic_font.font_data = CUSTOM_FONT_DATA is_using_custom_font = not is_using_custom_font
额外注意事项
- 确认字体文件的名称、路径和代码中书写的内容完全一致,没有拼写错误
- 如果字体显示过小,可给
DynamicFont的size属性设置合适的数值 - 检测单次按键触发建议用
is_action_just_pressed,避免长按触发多次逻辑
内容的提问来源于stack exchange,提问作者RockZombie
相关产品推荐
相关产品推荐

