使用未分配的局部变量 (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)。因此,您应该只考虑实际击中的射线。
我有一段自己制作的脚本,但出现此错误,我不明白为什么
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)。因此,您应该只考虑实际击中的射线。