Unity中LeapMotion脚本运行报错Argument is out of range求助
问题根源与修复方案
嘿,我一眼就揪出你遇到的「Argument is out of range」异常的核心原因了——当Leap Motion没检测到手时,你依然在尝试访问空的hands列表的第一个元素,再加上几个代码逻辑小问题,直接导致程序崩溃。咱们一步步来修复:
1. 先理清核心问题点
- 重复初始化控制器:你在
Update()里每帧都执行controller = new Controller();,这会不断创建新的Leap控制器实例,既浪费资源还可能导致帧数据读取异常。 - 未保护空列表访问:你虽然写了
frame.Hands.Count > 0的判断,但只包裹了一行无关紧要的代码,后面访问hands[0]的逻辑完全暴露在判断外,没手的时候自然触发索引越界。 - 变量名拼写错误:
fristHand应该是firstHand,HandPalmYam应该是HandPalmYaw(对应Leap API里的姿态属性),虽然不致命,但会降低代码可读性。
修复后的完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; using Leap; using Leap.Unity; public class iliketomoveit : MonoBehaviour { // 提前声明控制器,避免每帧重复创建 Controller controller; float HandPalmPitch; float HandPalmYaw; // 修正拼写错误 float HandPalmRoll; float HandWristRot; void Start () { // 仅在初始化时创建一次控制器实例 controller = new Controller(); } void Update () { Frame frame = controller.Frame(); List<Hand> hands = frame.Hands; // 把所有依赖手部数据的逻辑都包裹在这个判断里 if (hands.Count > 0) { Hand firstHand = hands[0]; // 修正拼写错误 // 从有效手部实例中读取姿态数据 HandPalmPitch = firstHand.PalmNormal.Pitch; HandPalmRoll = firstHand.PalmNormal.Roll; HandPalmYaw = firstHand.PalmNormal.Yaw; // 修正拼写错误 HandWristRot = firstHand.WristPosition.Pitch; // 打印调试信息 Debug.Log("Pitch :" + HandPalmPitch); Debug.Log("Roll :" + HandPalmRoll); Debug.Log("Yaw :" + HandPalmYaw); // 修正拼写错误 // 根据Yaw值控制物体平移 if (HandPalmYaw > -2f && HandPalmYaw < 3.5f) { transform.Translate(new Vector3(0, 0, 1 * Time.deltaTime)); } else if (HandPalmYaw < -2.2f) { transform.Translate(new Vector3(0, 0, -1 * Time.deltaTime)); } } // 没检测到手时什么都不做,彻底避免索引越界 } }
额外优化小建议
- 可以加入手部置信度判断:比如只有当
firstHand.Confidence > 0.8f时才执行控制逻辑,过滤掉不稳定的手部检测数据,避免误操作。 - 如果需要支持双手控制,可以分别处理
hands[0]和hands[1],但记得每次都先判断列表长度是否足够。
内容的提问来源于stack exchange,提问作者ravi tanwar
相关产品推荐
相关产品推荐

