使用未分配的局部变量 (CS0165) 统一光线投射

Use of unassigned local variable (CS0165) Raycasting in unity

我有一段自己制作的脚本,但出现此错误,我不明白为什么

RaycastHit HitFL, HitFR, HitBL, HitBR;

grounded = CastRayFrontLeft(out HitFL) || CastRayFrontRight(out HitFR) ||
           CastRayBackLeft(out HitBL) || CastRayBackRight(out HitBR);
VehiculeNormal = ((  HitFL.normal
                   + HitFR.normal
                   + HitBL.normal
                   + HitBR.normal) / 4).normalized;

如您所见,.net 认为 HitFR BL 和 BR 没有分配,但它们就在上面。

我开始认为布尔表达式的执行在 CastRayFrontLeft(out HitFL) 之后停止,因为它是唯一不会抛出错误的表达式,但我不明白为什么它应该那样工作。

我发现这个问题的任何答案都无济于事,因为在他们的答案中,他们没有像我在我的答案中那样赋值。

如果有人能帮助我,我将不胜感激。

编辑:

以下是自定义函数相关的代码

private bool CastRayFrontRight(out RaycastHit hit)
{
    return Physics.Raycast(RayCasterFrontRight.position, -transform.up, out hit, .5f);
}

public bool CastRayFrontLeft(out RaycastHit hit)
{
    return Physics.Raycast(RayCasterFrontLeft.position, -transform.up, out hit, .5f);
}

private bool CastRayBackRight(out RaycastHit hit)
{
    return Physics.Raycast(RayCasterBackRight.position, -transform.up, out hit, .5f);
}

public bool CastRayBackLeft(out RaycastHit hit)
{
    return Physics.Raycast(RayCasterBackLeft.position, -transform.up, out hit, .5f);
}

问题是C#的短路求值。当项与 || (OR) 组合时,如果第一项 returns 为假,则仅评估第二项,因为否则,无需评估即可知道结果。

因此,将代码更改为:

var castFL = CastRayFrontLeft(out HitFL);
var castFR = CastRayFrontRight(out HitFR);
var castBL = CastRayBackLeft(out HitBL);
var castBR = CastRayBackRight(out HitBR);
grounded = castFL || castFR || castBL || castBR;
VehiculeNormal = ((  HitFL.normal
                   + HitFR.normal
                   + HitBL.normal
                   + HitBR.normal) / 4).normalized;

作为替代方案,您还可以将这些项与按位或运算符组合 |:

grounded = CastRayFrontLeft(out HitFL) | CastRayFrontRight(out HitFR) | 
           CastRayBackLeft(out HitBL) | CastRayBackRight(out HitBR);
VehiculeNormal = ((  HitFL.normal
                   + HitFR.normal
                   + HitBL.normal
                   + HitBR.normal) / 4).normalized;

但是,正如@derHugo 所指出的,您的几何逻辑存在一个根本问题。如果光线未命中,则生成的法线将为 (0, 0, 0)。因此,您应该只考虑实际击中的射线。