Raycast没有在不同的Y位置返回任何命中

时间:2016-01-10 19:38:40

标签: c# debugging unity3d raycasting

我看到了Raycast的一个奇怪问题。下面代码的基本思想是:当玩家进入墙壁但是按下F键时,他们会执行墙翻。我通过光线检查确定它们确实撞到了墙壁而不是其他物体,并且靠近墙壁进行翻转。

所以在第一级,一切都很好。在下一个级别,翻盖不起作用。最初我认为第二层的墙不能有碰撞器或设置为isTrigger或其他东西,三重检查一切。然后我在相关代码中添加了大量的Debug语句,看看发生了什么,令我惊讶的是,在第二级时,Raycast从未发生任何事情!即使调试光线明显穿过墙壁,其设置方式与1级墙壁​​的设置方式相同。这是一个洋红色调试光线的图像,清晰地穿过2级墙壁:

Debug ray goes through wall!

左下角是screencap中显示的墙的检查员值,它不会返回光线投射。右下方是1层的墙,确实可以正常工作。您可以看到它们的设置方式完全相同(因为它们的方向不同,所以它们的X和Z刻度会被翻转,但同样方向的墙也会出现同样的错误。)

基本上,我能在1级和2级墙之间辨别的唯一区别是水平本身处于不同的Y位置,这不应以任何方式影响光线投射。我很不知道为什么它在1级工作但不在2级或更高级。

if (Input.GetKey(KeyCode.F)){
    // Raycast to see if we hit a wall
    RaycastHit hit;
    Vector3 fwd = transform.TransformDirection(Vector3.forward);
    Debug.DrawRay(this.transform.position, fwd, Color.magenta, 2.0f);
    if (Physics.Raycast(this.transform.position, fwd, out hit, 2.0f)){
        if (hit.collider.gameObject.name.Contains("Wall")){
            Debug.LogWarning("WALLFLIP: Attempted wallFlip, raycast did indeed hit a wall!");
            // Stuff happens here such as flip animation, not relevant
        }
    }else{
        Debug.LogWarning("WALLFLIP: Raycast hit nothing");
    }
}

UPDATE 1:看到一个建议使用RaycastAll()而不是Raycast()的SO线程。实现时,RaycastAll()返回级别1中长度为1的列表,但返回级别2中的空列表,确认即使调试光线明显没有,光线也不会命中任何内容。

更新2: Saw this SO thread关于在FixedUpdate()而不是Update()中执行Raycast内容。所以我将WallFlip代码从Update更改为FixedUpdate,没有看到任何变化。在FixedUpdate级别1中工作时,但在级别2中不返回光线投射命中。

更新3:感谢用户Sharundaar,我现在知道2级的楼层正在干扰Raycast(请参阅下面的答案)。仍然感到困惑的是,这并没有发生在1级,或者为什么地板没有在Raycast()上回击。下面是2级楼层游戏对象的检查员(除了xyz位置和X Z刻度之外,等级1的楼层是相同的)。我之前从未遇到过的相当奇怪的问题,但是从玩家的位置偏移了0.5f Y的偏移。 *耸肩*

Floor interferes

1 个答案:

答案 0 :(得分:1)

所以从你的来源我设法让它在另一个层面上工作。问题是你的 transform.position 在地下很滑,所以光线投射到了地板而不是墙壁(我不知道它为什么在第一层专门工作)。

我所做的如下:

Vector3 raycastOffset = new Vector3(0, 0.5f, 0);
if (Physics.Raycast(this.transform.position + raycastOffset, fwd, out hit, 2.0f))

这当然是一个快速解决方案,您需要进一步调查。

我也改变了

Vector3 fwd = transform.TransformDirection(Vector3.forward);

通过

Vector3 fwd = transform.forward;

应该更干净。

经过一些调查后,您的问题实际上存在于地板实体中,我认为它本质上是MeshCollider无法很好地计算碰撞,尝试用正确调整的盒式对撞机替换它并查看它引导您的位置。