获取盒对撞机BORDERS的Y位置

时间:2019-05-16 14:02:34

标签: unity3d raycasting

首先,请提供一些背景信息,除了语音控制外,我正在制作一个类似于Flappy Bird的移动应用程序。想法是将此应用程序作为有语音问题(单调)的人的练习工具。当使用者高音调时,小鸟会向上飞;当使用者低音调时,小鸟会向下飞。

该应用程序链接到一个网站,语音教练可以在该网站上跟踪用户的进度。为此,我将有关用户游戏性能的数据保存到数据库中。更具体地说,每次鸟通过管道开口时,我都会保存他正确产生的螺距值,以及代表管道开口上下边界的两个“阈值螺距值”。

我的管道是由Parallaxer脚本生成的预制件。 Prefab对象包含三个子代:

  1. 顶部管子的精灵(带有盒碰撞器)
  2. 一个代表管道开口的盒子对撞机
  3. 底部管道的精灵(带有盒碰撞器)

现在,我需要访问管道开口的上边界和下边界的Y位置。我尝试过的解决方案使用Raycasts。我投射了两条光线,两者都是从“预制对象”的位置开始的。由于管道开口(对撞机)位于预制件的中间,因此两条光线内部对撞机开始。一束光线向上,应该与上边界碰撞,而另一束光线向下,应该与下边界碰撞。但是返回的位置与起点完全相同...因此,我假设光线投射实际上返回了它们所命中的对撞机本身的位置,而不是其实际命中位置的位置。我不确定我的发言,但是只有这可以解释为什么它不起作用。这是问题的说明(用油漆制作):https://prnt.sc/npcckq

我还提供了当前代码:

Debug.Log("Spawn position of pipe is " + t.position.y);  //Gives ex. 4.58
RaycastHit2D hit1 = Physics2D.Raycast(t.position, Vector2.up);
RaycastHit2D hit2 = Physics2D.Raycast(t.position, -Vector2.up);
if (hit1.collider != null && hit2.collider != null)
{
        Debug.Log("Upper border: " + hit1.point.y); //Also gives 4.58
        Debug.Log("Lower border: " + hit2.point.y); //Also gives 4.58
}

我将不胜感激,以帮助您完成这项工作,甚至感谢比使用Raycasts更容易的解决方案!

2 个答案:

答案 0 :(得分:0)

在评论中的信息之后,我认为使用raycast的方法可能无法正常工作,因为对撞机太多。还要考虑一下,如果在对撞机内启动光线投射,光线投射会立即命中。

因此,更好的选择是使用对撞机边界。
考虑这种方法要求对撞机位于游戏对象的同一脚本上。

在类的字段中设置要检查的对撞机,并将其传递到检查器窗口中。

public BoxCollider2D_colliderToCheck;

我将代码分为两部分。

1找到对撞机

您可以使用它找到对撞机。

//get the collider
var collider = _colliderToCheck.GetComponent<BoxCollider2D>();

如果您有更多的对撞机,则可以使用这样的标签。

BoxCollider2D _colliderToCheck = null;

var colliders = GetComponentsInChildren<BoxCollider2D>(true);

for (int i = 0; i < colliders.Length; i++)
    if (colliders[i].transform.CompareTag("DesiredTag"))
        _colliderToCheck = colliders[i];

2找到边界

//get the extents
var yHalfExtents = collider.bounds.extents.y;
//get the center
var yCenter = collider.bounds.center.y;
//get the up border
float yUpper = transform.position.y + (yCenter + yHalfExtents);
//get the lower border
float yLower = transform.position.y + (yCenter - yHalfExtents);
Debug.Log("Upper border: " + yUpper );
Debug.Log("Lower border: " + yLower );

上一次备份

从我看到的情况来看,您发送了2个射线广播,一个下降,而另一个上升,但是来源相同(t.position)。

Physics2D.Raycast - Unity Docs

我要做的第一件事就是尝试更改射线广播的原点的位置。

您可以通过执行此操作来实现。

RaycastHit2D hit1 = Physics2D.Raycast(new Vector2(t.position.x, t.position.y-100), Vector2.up);
RaycastHit2D hit2 = Physics2D.Raycast(new Vector2(t.position.x, t.position.y+100), -Vector2.up);
if (hit1.collider != null && hit2.collider != null)
{
        Debug.Log("Upper border: " + hit1.point.y);
        Debug.Log("Lower border: " + hit2.point.y);
}

答案 1 :(得分:0)

您只需要在Raycast方法中添加LayerMask,然后在Editor/Project Settings中可以看到物理层矩阵来判断哪些层可以击中其他层,使Layer1击中仅Layer2Layer2仅命中Layer1并完成。