Godot报错:Invalid call. Nonexistent function 'set' in base 'Nil' 求助
解决Godot反应堆计数器的空引用错误
问题梳理
你在制作反应堆核心数值计数器时遇到两类错误:
- 最初把
panel_frame和panel作为check_signal()的局部变量时,出现节点未在场景树中无法获取路径、**找不到节点"frame/Panel"**的错误——这是因为函数执行时节点还没完成场景树加载,get_node()无法定位目标节点。 - 改成
onready全局变量后,在检查器中修改value_from_model时出现**"Invalid call. Nonexistent function 'set' in base 'Nil'."**错误——这是因为检查器修改变量时,节点还未完成初始化,onready变量尚未赋值,此时调用panel_frame.set()或panel.set()会触发空引用错误。
解决方案
核心思路是在所有操作节点的代码前增加空引用检查,确保只有节点初始化完成后才执行相关逻辑。以下是修改后的完整代码:
extends MarginContainer export var obj = "" export var expr_list = {"sig": ""} export(int) var value_from_model setget set_val onready var panel_frame = get_node("frame") onready var panel = get_node("frame/Panel") func set_val(val): value_from_model = val # 修改进度条宽度前先检查节点是否存在 if panel_frame != null: panel_frame.margin_right = value_from_model # 调用样式检查前先确保节点已初始化 if panel_frame != null and panel != null: check_signal() func check_signal(): var new_style = StyleBoxFlat.new() var for_panel = StyleBoxFlat.new() new_style.border_width_top = 2 new_style.border_width_bottom = 2 new_style.border_width_left = 2 new_style.border_width_right = 2 new_style.border_color = Color("#1bf408") new_style.bg_color = Color("#0b0e0e") panel_frame.add_stylebox_override("panel", new_style) for_panel.bg_color = Color("#1bf408") panel.add_stylebox_override("panel", for_panel) func _ready(): check_signal() set_val(value_from_model)
关键改动说明
- 空引用检查:在
set_val()中调用check_signal()前,先判断panel_frame和panel是否不为空,避免节点未初始化时执行样式修改逻辑。 - 样式设置优化:用
add_stylebox_override()代替set(),这是Godot推荐的样式覆盖方式,比直接调用set()更稳定,也更符合API设计规范。 - 颜色值规范:将字符串颜色值转为
Color类型,避免潜在的类型转换问题。
补充说明
检查器中修改变量时,Godot会直接触发set_val()回调,此时节点可能还没进入场景树,所以必须加空检查;onready变量会在节点进入场景树后、_ready()执行前赋值,因此_ready()中调用相关逻辑是安全的。
内容的提问来源于stack exchange,提问作者Nika
相关产品推荐
相关产品推荐

