Unity手部追踪增益调整报错:手部位置为无限大问题排查
问题排查与代码修正
核心问题分析
成员变量未正确初始化
你在Start()方法中重新声明了Vector3 posOrigin局部变量,导致类的私有成员posOrigin始终保持默认的Vector3(0,0,0),而非handRenderer的初始位置,这是计算逻辑混乱的根源。参数顺序完全颠倒
transfo()方法定义的参数顺序是(origin, actual),但调用时你传入的是(handRenderer当前位置, posOrigin初始位置),导致差值计算逻辑完全反向,若增益值较大,极易引发数值异常。缺少空引用校验
未检查hand和handRenderer是否正确赋值,一旦引用为空,不仅会触发空引用错误,还可能导致后续计算出现非法数值。
修正后的代码
// Variables public GameObject hand; public GameObject handRenderer; private Vector3 posOrigin; // Settings public float gain = 1f; // 提供默认增益值,避免未赋值风险 // Start is called before the first frame update void Start() { if (handRenderer != null) { // 直接给成员变量赋值,避免局部变量覆盖 posOrigin = handRenderer.transform.position; } else { Debug.LogError("请在Inspector中为handRenderer赋值!"); } } // Update is called once per frame void Update() { // 引用为空时直接跳过,避免异常 if (hand == null || handRenderer == null) return; Vector3 currentHandPos = handRenderer.transform.position; // 修正参数顺序:传入初始位置origin,当前位置actual float dx = transfo(posOrigin.x, currentHandPos.x); float dz = transfo(posOrigin.z, currentHandPos.z); // 计算并设置目标位置 hand.transform.position = new Vector3(posOrigin.x + dx, 0, posOrigin.z + dz); } float transfo(float origin, float actual) { return gain * (actual - origin); }
额外排查建议
- 先在Inspector中确认
hand和handRenderer的引用是否正确指向了对应的对象。 - 测试时先将
gain设为1f,确认基础追踪逻辑正常后,再逐步调整增益值(避免过大的增益导致数值溢出)。 - 若
handRenderer的位置本身就出现无限大/NaN,需优先排查手部追踪模块的问题:比如设备连接状态、SDK初始化是否正常、追踪目标是否被正确识别。
内容的提问来源于stack exchange,提问作者Solar
相关产品推荐
相关产品推荐

