You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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:用分组筛选

  1. 给所有梯子节点添加分组(比如命名为Ladder
  2. _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

火山引擎 最新活动