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

Posted

技术标签:

【中文标题】统一使用未分配的局部变量(CS0165)光线投射[重复]【英文标题】:Use of unassigned local variable (CS0165) Raycasting in unity [duplicate] 【发布时间】:2021-07-22 03:21:40 【问题描述】:

我有这段脚本,我收到了这个错误,我不明白为什么

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);

【问题讨论】:

您正在使用短路 || 运算符 - 如果 CastRayFrontLeft(out HitFL) 返回 true,则不会调用任何其他方法...所以您希望分配给 @ 什么值987654328@、HitBLHitBR 在那种情况下?如果您希望所有方法被调用,您应该使用| 而不是||。我会将其添加为答案,但尚不清楚您真正想要发生什么。 我会试试的,我想要的是,如果四条光线中的一条击中某物,则设置为接地。谢谢你,我不知道这种行为。 一般来说:如果这些光线投射中的任何一个失败了怎么办?您为什么要尝试使用没有击中任何东西并因此可能返回 null 的普通 Raycast? ...而且我从未见过有人会总结法线向量并取平均值...在我看来没有意义..您宁愿只使用一个 Raycast 的一击中的一个法线真的撞到了什么…… @derHugo 现在我想我会得到一个空指针异常或类似的东西,我会增加安全性甚至重新编写整个脚本,我只是很惊讶地看到一个错误在我没有想到这种表达的有效性之前,那种感觉 【参考方案1】:

问题在于 C# 的短路评估。当术语与|| (OR) 结合使用时,如果第一个返回 false,则仅计算第二个术语,否则,无需计算结果即可知道结果。

因此,将代码更改为:

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;

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

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)。因此,您应该只考虑实际击中的光线。

【讨论】:

谢谢,vs 现在不返回任何错误,因此这种行为(对于 ||)是每种编程语言共有的还是仅适用于 c#? 有成千上万种编程语言。有些会,有些不会。请注意,这在以下情况下非常实用:if (i < a.Length && a[i] == x),其中第一部分确保数组索引在边界内。仅当第一个返回 true 时才评估第二个术语。否则,这会爆炸。 这可能仍然无法按预期工作!查看对问题的评论 是的。解决了一个问题。下一个出现! :-(

以上是关于统一使用未分配的局部变量(CS0165)光线投射[重复]的主要内容,如果未能解决你的问题,请参考以下文章

csharp 团结,光线投射,bulletholes.cs

使用光线投射和实例化对象问题检查与多边形碰撞器的碰撞(统一)

我如何添加光线投射统一命中的对象并将它们添加到列表中

使用光线投射防止破折号穿过墙壁

使用空分配修复“使用未分配的局部变量”。为啥?

Libgdx Box2d Raycast无法投射多条光线