首页 文章

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

提问于
浏览
0

我看到了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中的空列表,确认即使调试光线明显执行,光线也不会命中任何内容 .

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

UPDATE 3: 感谢用户Sharundaar,我现在知道2级的楼层正在干扰Raycast(见下面的答案) . 仍然对此没有感到困惑't occur in level 1, or why the floor doesn' t对Raycast()的回击 . 下面是2级楼层游戏对象的检查员(除了xyz位置和X Z刻度之外,等级1的楼层是相同的) . 非常奇怪的问题我've never encountered before, but hey Raycasting from the player'的位置偏移0.5f Y工作 . 耸肩

Floor interferes

1 回答

  • 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无法很好地计算碰撞,尝试用正确调整的盒式对撞机替换它,看看它引导你的位置 .

相关问题