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
相关产品推荐
相关产品推荐

