Unity Raycast2D的结果不如预期?

时间:2015-12-10 07:06:38

标签: unity3d raycasting

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

我有3个预制块:SingleBlock,DoubleBlock,TripleBlock。

我按照这样的方式对每个人进行了结构化:父对象是一个空的游戏对象,我的BoxCollider2D向左/向右移动它们,而子对象是带有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"); } } 的块精灵。

MovementScript附加到空游戏对象(父对象),以便块集向左/向右均匀移动,以实现它的价值。

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

以下是我当前代码的片段:

true

每次播放器停止正在移动的当前块集时,都会调用此代码。

问题是我总是在我的日志中获得false,即使我故意没有正确对齐块集。即使离开我的路线,我也永远不会得到Raycast2D。为什么会这样?

我想提一下场景中没有别的东西。它只是块,所以不能与另一个物体碰撞。

逻辑是否有问题,或者我使用owl:class1 rdfs:subClassOf [restriction1...], [restriction2...], [restriction3]. owl:class2 rdfs:subClassOf [restriction1...], [restriction2...]. 的方式是什么?

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我相信发生的事情是他们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源自的对象。

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