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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:54:28