如何在“for”循环中访问特定的光线投射命中?

时间:2018-01-26 21:21:56

标签: c# for-loop unity3d raycasting

我有一个循环,从我的角色底部绘制4个光线投射,用于检测与物体的碰撞。我的问题是如果raycast#1和raycast#4与不同的对象发生碰撞,它们会从两个对象返回值。

我想这样做,以便我只在光线投射#4上找到一个点击,如果这不会返回命中,那么我检查光线投射#3等。一旦我有一个命中我会检查与光线投射相撞的对象的值。我尝试使用RaycastHits [],但我相信这是为了在你想要分析所有光线投射中的多个命中时使用,而不仅仅是单个光线投射。

for (int i = 0; i < VerticalRayCount; i++)
{
    Vector2 rayOrigin = (directionY == -1) ? RaycastOrigin.bottomLeft : RaycastOrigin.topLeft;
    rayOrigin += Vector2.right * (VerticalRaySpacing * i + deltaMovement.x);

    RaycastHit2D hit = Physics2D.Raycast(rayOrigin, Vector2.up * directionY, rayLength, collisionMask);

    Debug.DrawRay(rayOrigin, Vector2.up * directionY * rayLength, Color.red);

    if (directionY == -1)
    {
        if (directionX == 1)
        {
            if (i == VerticalRayCount -1)
            {
                if (hit)
                {
                    if (currentPlatform != hit.collider.gameObject)
                    {
                        var platform = hit.collider.gameObject.GetComponent<IPlatform>();
                        currentPlatform = hit.collider.gameObject;
                    }
                }
            }
            else if (i == 0)
            {
                if (hit)
                {
                    if (currentPlatform != hit.collider.gameObject)
                    {
                        var platform = hit.collider.gameObject.GetComponent<IPlatform>();
                        currentPlatform = hit.collider.gameObject;
                    }
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我在你的代码中看到两个问题:

  • 在您的for循环中currentPlatform最后点击全部覆盖。
  • 但是,自从你检查if(currentPlatform != hit.collider.gameObject)后,如果有多个点击,它将会在最后两次点击之间切换。发生这种情况是因为它击中了第一个并设置它。比第二次击中不等于第一击,所以它被覆盖。因此,下一次currentPlatform仍然是第二次击中并再次被新循环的第一次击中覆盖并且总是这样继续。

要避免第二次删除if(currentPlatform != hit.collidergameObject)

你应该在点击后添加break;,这样for循环就不会继续其他光线投射,而是立即退出for循环。因此,您只能获得一次点击而不会覆盖它们。

...
    if(hit)
    {
        var platform = hit.collider.gameObject.GetComponent<IPlatform>();
        currentPlatform = hit.collider.gameObject;

        // here add break so the for loop is not continued
        break;
    }
...

通过这种方式,currentPlattform总是具有第一次击中的值。