Godot角色切换系统中数组引用返回<Object#null>问题求助
解决Godot角色切换系统中数组节点引用为null的问题
核心问题原因
变量初始化阶段直接使用$节点路径获取子节点时,Godot的节点树还未完全加载完成,导致无法正确获取节点引用,返回<Object#null>。
解决方案
1. 延后数组初始化到_ready()函数
将数组的初始化逻辑移至_ready()中,此时节点树已完全构建,能正确获取子节点:
var Chars: Array[Node2D] = [] var charnum = 0 var transitioning = false var CurChar: Node2D func _ready() -> void: # 此时节点树已加载完成,可正确获取子节点 Chars = [$Papery, $Erasey, $Pencily] # 初始化默认激活角色 CurChar = Chars[charnum]
2. 验证节点路径正确性
确保$Papery、$Erasey、$Pencily是当前脚本所在节点的直接子节点。如果节点是嵌套结构,需使用完整路径(比如$CharacterGroup/Papery),可在编辑器中右键节点选择「复制节点路径」来获取准确路径。
3. 修复无效的await逻辑
原代码中的await $Camera2D.global_position - CurChar.global_position < Vector2(5,5)无法触发等待,因为await需要监听信号或协程完成。推荐两种优化方式:
方式一:使用Tween实现平滑相机移动(推荐)
func _input(event: InputEvent) -> void: if event.is_action_pressed("q") and not transitioning: transitioning = true # 用取模简化循环切换逻辑,无需判断边界 charnum = (charnum + 1) % Chars.size() CurChar = Chars[charnum] # 创建Tween实现平滑移动 var tween = create_tween() tween.set_trans(Tween.TRANS_QUAD) tween.tween_property($Camera2D, "global_position", CurChar.global_position, 0.3) # 等待移动完成 await tween.finished transitioning = false
方式二:循环检测相机距离
func _input(event: InputEvent) -> void: if event.is_action_pressed("q") and not transitioning: transitioning = true charnum = (charnum + 1) % Chars.size() CurChar = Chars[charnum] # 循环检测相机与目标角色的距离 while $Camera2D.global_position.distance_to(CurChar.global_position) > 5: # 等待下一帧再检测 await get_tree().process_frame transitioning = false
4. 调试验证
在_ready()中添加打印逻辑,确认节点引用是否正确:
func _ready() -> void: Chars = [$Papery, $Erasey, $Pencily] for index, char in Chars: if char == null: print("警告:索引 %d 的角色节点为null,请检查路径" % index) else: print("成功获取角色节点:%s" % char.name)
内容的提问来源于stack exchange,提问作者Miles Muehlbach
相关产品推荐
相关产品推荐

