C# 在unity中使用未分配局部变量(CS0165)光线投射

C# 在unity中使用未分配局部变量(CS0165)光线投射,c#,unity3d,raycasting,C#,Unity3d,Raycasting,我有一个脚本,我做了,我得到这个错误,我不明白为什么 raycastthitfl、HitFR、HitBL、HitBR; 接地=CastRayFrontLeft(外HitFL)| CastRayFrontRight(外HitFR)|| CastRayBackLeft(外HitBL)| CastRayBackRight(外HitBR); 车辆正常=((HitFL.normal +正常 +正常 +HitBR.normal)/4)正常化; 如您所见,.net认为HitFR BL和BR未分配,但它们就

我有一个脚本,我做了,我得到这个错误,我不明白为什么

raycastthitfl、HitFR、HitBL、HitBR;
接地=CastRayFrontLeft(外HitFL)| CastRayFrontRight(外HitFR)||
CastRayBackLeft(外HitBL)| CastRayBackRight(外HitBR);
车辆正常=((HitFL.normal
+正常
+正常
+HitBR.normal)/4)正常化;

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

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

对于这个问题,我找到的任何答案都帮不上忙,因为在他们的家里,他们没有像我在我的家里那样给我赋值

如果有男孩能帮助我,我将不胜感激

编辑:

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

private bool CastRayFrontRight(out raycast hit)
{
返回物理.Raycast(RayCasterFrontRight.position,-transform.up,out hit,.5f);
}
公共bool CastRayFrontLeft(超出raycast命中)
{
返回物理.Raycast(RayCasterFrontLeft.position,-transform.up,out hit,.5f);
}
二等兵布尔·卡斯特雷巴克利特(出击)
{
返回物理.Raycast(RayCasterBackRight.position,-transform.up,out hit,.5f);
}
公共bool CastRayBackLeft(未命中)
{
返回物理.Raycast(RayCasterBackLeft.position,-transform.up,out hit,.5f);
}

问题在于C#的短路评估。当术语与
|
(或)组合时,如果第一个术语返回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)。因此,您应该只考虑实际命中的光线。

您使用的是短路<代码> < <代码> >运算符。如果<代码> CastRayFrontLeft(out HitFL)< /C>返回true,则不会调用其他方法。那么在这种情况下,您希望为
HitFR
HitBL
HitBR
分配什么值呢?如果希望调用所有方法,则应使用
|
而不是
|
。我想加上这个作为答案,但不清楚你到底想发生什么。我试试看,如果四条射线中的一条击中了什么东西,我想把它固定下来。谢谢你,我不知道这种行为。一般来说:如果这些光线投射失败了怎么办?为什么要尝试使用未命中任何对象的光线投射法线,从而可能返回
null
。。。而且我从来没见过有人会把法向量求和,然后取平均值。。。在我看来没有道理。。你宁愿只使用一个正常的一次命中的一个光线投射,它实际上击中了一些东西…@derHugo现在我想我会得到一个空指针异常或类似的东西,我会增加安全性,甚至重新编写整个脚本,在我想到表达式的有效性之前,我只是非常惊讶地看到了这种错误。谢谢,vs现在不返回任何错误,因此这种行为(对于| |)是每种编程语言都有,还是仅仅对于c#?有成千上万种编程语言。有的有,有的没有。请注意,这在以下情况下非常实用:
if(i
,其中第一部分确保数组索引在边界内。第二项仅在第一项返回
true
时计算。否则,这会爆炸。尽管如此,这可能仍然不能像预期的那样工作!请参见对问题的评论是。解决了一个问题。下一个出现!:-(