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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:12:27