Unity Raycast2D 结果不如预期?

Unity Raycast2D results are not as expected?

我目前正在做一个涉及积木堆叠的练习项目。它有点类似于堆叠游戏(街机游戏),除了我的版本使用自由形式的移动而不是基于网格的移动。

我有 3 个积木预制件:SingleBlock、DoubleBlock、TripleBlock。

我这样构造它们中的每一个:父对象是一个空的游戏对象,我的 MovementScript 移动它们 left/right,而子对象是带有 BoxCollider2D 的方块精灵。

MovementScript 附加到空游戏对象(父对象),以便块集统一移动 left/right,物有所值。

对于实际的堆叠逻辑,我使用Raycast2D 来检测下面是否有块。但问题是我得到的结果是出乎意料的。

这是我当前代码的一个片段:

foreach(Transform t in currentBlockSet.transform)
            {
                // get all the children of this blockset. to do this, we use the transform beause it is IEnumerable
                GameObject block = t.gameObject;
                RaycastHit2D hit = Physics2D.Raycast(block.transform.position, Vector3.down, rayCastLength); // 0.5f raycast length
                //Debug.DrawRay(block.transform.position, Vector3.down * rayCastLength);
                if(hit.collider != null)
                {
                    // this means there is a block below, we hit something
                    Debug.Log("True");


                }
                else
                {
                    Debug.Log("False");
                }

            }

每次玩家停止正在移动的当前块集时都会调用此代码。

问题是我的日志中总是出现 true,即使我故意没有正确对齐块集。我从来没有得到 false 即使我偏离了我的对齐方式。为什么会这样?

我想说的是场景中没有其他东西。只是方块而已,不可能有别的物体碰撞。

我的逻辑或使用方式是否有问题 Raycast2D

感谢任何帮助。

我相信正在发生的事情是 Raycast2D 正在检测它发射的方块。由于您使用块的 transform.position 作为 Raycast 的原点,这意味着 Raycast 将从块的中心发射。

为了对此进行测试,我稍微修改了您的代码,以便它以相同的方式触发 Raycast,但不是只记录 "True" 我记录了被击中的对象的名称。

void Update ()
{
    RaycastHit2D hit = Physics2D.Raycast(this.transform.position, Vector3.down, 0.5f); // 0.5f raycast length

    if (hit.collider != null)
    {
        Debug.Log(hit.collider.gameObject.name);
    }
    else
    {
        Debug.Log("False");
    }

当 运行 时,Raycast 检测到的对象正如预期的那样是 Raycast 的来源对象。

为了解决这个问题,我建议将一个空的子游戏对象添加到您的名为 "RaycastOrigin" 的块中。将此 GameObject 放置在块的正下方,使其位于块的盒子碰撞器之外。然后你从 "RaycastOrigin" 而不是方块 transform.position 发射 Raycast 这样,Raycast 就不会击中其发射的方块,而是下方的方块。