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

Unity代码偶现Argument is out of range异常排查求助

搞定ArgumentOutOfRangeException异常的实用方案

嘿,我一眼就看到问题出在哪了——你在访问finP[1]的时候,这个列表里的元素数量根本不够2个!要么触发事件还没执行(finP是空的),要么nodeScript.FinalPath返回的路径点太少,导致finP长度不够,直接越界报错。咱们一步步来解决:

先给列表加个“安全锁”

在apple()方法里,每次访问finP的索引之前,必须先检查列表长度。如果元素不够,直接跳过逻辑或者重置方向,避免报错:

void apple() {
    // 先确认finP至少有2个元素,不然啥也别干
    if (finP.Count < 2) {
        direction = Vector2.zero; // 也可以保持当前方向,看你需求
        return;
    }

    // *重点!浮点数别直接用==比,用近似相等判断才靠谱*
    float targetY = finP[1].transform.localPosition.y;
    if (Mathf.Approximately(transform.localPosition.y, targetY)) {
        float targetX = finP[1].transform.localPosition.x;
        if (transform.localPosition.x > targetX) {
            Debug.Log("left");
            direction = Vector2.left;
        } else {
            Debug.Log("right");
            direction = Vector2.right;
        }
    } else {
        float targetY1 = finP[1].transform.localPosition.y;
        if (transform.localPosition.y > targetY1) {
            direction = Vector2.down;
        }
        float targetY0 = finP[0].transform.localPosition.y;
        if (transform.localPosition.y < targetY0) {
            direction = Vector2.up;
        }
    }
}

给触发事件加个“保险”

在OnTriggerEnter2D填充finP的时候,不仅要检查每个找到的GameObject是否存在,还要最后确认列表长度够不够:

public void OnTriggerEnter2D(Collider2D other) {
    if (other.gameObject.tag == "pallet") {
        finP.Clear();
        foreach(string var in nodeScript.FinalPath) {
            Debug.Log("en script " + var);
            GameObject obj = GameObject.Find(var);
            // 找不到对象就别加进去,还得打个警告提醒你
            if (obj != null) {
                finP.Add(obj);
            } else {
                Debug.LogWarning($"找不到名为{var}的GameObject,路径点缺失!");
            }
        }
        // 提前检查长度,省得后面报错
        if (finP.Count < 2) {
            Debug.LogError("FinalPath里的路径点不够2个,移动逻辑没法正常跑!");
        } else {
            Debug.Log(finP[1]);
        }
    }
}

修复一个隐藏的坑:浮点数比较

你原来用==比较两个位置的y值,这在Unity里几乎永远不会触发——因为物体移动是用Time.deltaTime一点点累加的,位置是浮点数,很难精确等于目标值。换成Mathf.Approximately来判断近似相等,这样方向切换的逻辑才能正常工作。

额外的小建议

在Start()里加个检查,确保nodeScript能正常获取,避免空引用:

void Start() {
    GameObject p16Obj = GameObject.Find("P16");
    if (p16Obj != null) {
        nodeScript = p16Obj.GetComponent<Node>();
    } else {
        Debug.LogError("找不到名为P16的GameObject,Node组件获取失败!");
    }
}

这样改完,不仅能解决当前的索引越界异常,还能把那些隐藏的逻辑坑填上,让你的敌人移动更稳定~

内容的提问来源于stack exchange,提问作者Tom Unsworth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:01:40