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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:36:04