Unity 2D C#:两物体坐标均值加偏移设位置报-Infinity错误
问题根因
两个报错和穿地问题都是代码逻辑错误导致的,核心问题有3个:
- 平均值计算公式完全写错:你写的
finalpos.y = distanceobj1pos.y += distanceobj2pos.y / 2 + offset用了+=复合赋值符,实际逻辑是每帧把「distanceobj2的Y坐标/2 + 偏移量」累加到distanceobj1的Y值上再赋值给身体,根本不是计算两个腿目标的Y平均值。随着帧运行,Y值会持续往负方向暴跌,很快超出浮点数可表示的精度范围,变成-Infinity,触发无效赋值、包围盒异常两个报错,角色直接落到无限深的位置表现为穿地。 - 变量定义缺失:类成员中只声明了
distanceobj2的物体引用,没有定义distanceobj1的公开引用字段,若未在其他逻辑中给该变量赋值,运行时会触发空引用异常,进一步导致位置值异常。 - 射线检测无兜底逻辑:腿部目标靠射线检测吸附地面,如果射线因为碰撞体缺失、层级错误、角度问题没命中地面,返回的检测点坐标是无效值,直接参与计算也会触发位置异常。
修复后代码
public GameObject distanceobj1; // 补上缺失的第一个腿部目标引用字段 public GameObject distanceobj2; Vector3 distanceobj1pos; Vector3 distanceobj2pos; Vector3 finalpos; public float offset; void Update() { // 空引用校验,避免腿部目标未赋值时运行报错 if (distanceobj1 == null || distanceobj2 == null) return; // 获取当前帧两个腿部目标的位置 distanceobj1pos = distanceobj1.transform.position; distanceobj2pos = distanceobj2.transform.position; // 坐标合法性校验,过滤射线射空产生的NaN、无穷大异常值 if (float.IsInfinity(distanceobj1pos.y) || float.IsNaN(distanceobj1pos.y) || float.IsInfinity(distanceobj2pos.y) || float.IsNaN(distanceobj2pos.y)) { return; } finalpos.x = transform.position.x; // 正确计算两个腿部目标Y坐标的平均值,叠加偏移量 finalpos.y = (distanceobj1pos.y + distanceobj2pos.y) * 0.5f + offset; finalpos.z = transform.position.z; transform.position = finalpos; }
额外优化建议
- 给腿部目标的射线检测逻辑加命中判断:只有当
Physics.Raycast返回true(确认命中地面碰撞体)时,才更新腿部目标的位置,未命中时保留上一帧的合法位置,从源头避免异常坐标输入。 - 不要在位置更新逻辑中使用
+=/-=这类复合赋值做累加计算,身体的每帧位置必须基于当前帧腿部目标的实时坐标重新计算,否则很容易出现位置漂移、数值溢出问题。 - 检查地面碰撞体、射线层级设置,确保射线能稳定命中地面,不会出现射空情况。
内容的提问来源于stack exchange,提问作者Creamy
相关产品推荐
相关产品推荐

