Godot 4.6.2:字典属性/键访问无效问题及梯子数组优化需求
问题解决与优化方案
一、"Invalid access to property or key" 报错修复
你报错的核心原因是遍历字典时拿字符串键去索引数组:
在player_layer_nav函数里,for num in ladders遍历的是字典的键(比如"ladder_one"这种字符串),但one_ladder是数组,只能用数字索引(0、1、2),用字符串当索引自然会报错。
修复方法(两种选其一)
方法1:调整遍历方式,匹配数组索引
func player_layer_nav(): if playerNode.layerPlat == layerPlatBarrel: chase(playerNode) if playerNode.layerPlat < layerPlatBarrel: # 按数组下标遍历,对应字典的value顺序 for index in range(one_ladder.size()): var ladder_info = ladders.values()[index] if ladder_info["level"] == layerPlatBarrel: chase(one_ladder[index])
方法2:合并数据结构(更简洁)
把梯子节点和层级信息合并到一个数组里,彻底避免索引不匹配问题:
# 替换原来的one_ladder和ladders变量定义 var ladders := [] func _ready() -> void: # 直接存储节点+层级的组合 ladders = [ {"node": ladder_parent.get_node("ladder_zero_lower"), "level": 1}, {"node": ladder_parent.get_node("ladder_one_lower"), "level": 2}, {"node": ladder_parent.get_node("ladder_two_lower"), "level": 2} ] # 修改后的寻路函数 func player_layer_nav(): if playerNode.layerPlat == layerPlatBarrel: chase(playerNode) if playerNode.layerPlat < layerPlatBarrel: for ladder in ladders: if ladder["level"] == layerPlatBarrel: chase(ladder["node"])
二、自动收集梯子节点的简便方法
不用手动逐个写get_node,通过遍历父节点子节点自动收集,步骤如下:
方法1:用分组筛选
- 给所有梯子节点添加分组(比如命名为
Ladder) - 在
_ready里自动收集:
func _ready() -> void: ladders = [] # 遍历父节点下所有子节点,筛选属于Ladder分组的梯子 for child in ladder_parent.get_children(): if child.is_in_group("Ladder"): # 给梯子节点加@export var level: int 来存储层级 ladders.append({"node": child, "level": child.level})
方法2:用脚本类型筛选
如果所有梯子都挂载了自定义脚本(比如Ladder.gd):
func _ready() -> void: ladders = [] for child in ladder_parent.get_children(): if child is Ladder: # Ladder是你的梯子脚本类名 ladders.append({"node": child, "level": child.level})
以后加新梯子,只要放到ladder_parent下并设置好分组/脚本+层级,代码会自动收集,不用手动修改数组。
额外小问题提醒
你代码里的find_layer函数有语法错误,条件判断缺了比较运算符,比如position.y 490应该改成position.y > 490(根据你的层级逻辑调整方向),否则运行会报错。
内容的提问来源于stack exchange,提问作者Cole Lecavalier




