获取 Y-position 个方框碰撞器 BORDERS

Get Y-position of box collider BORDERS

首先是一些背景信息,我正在制作一个类似于 Flappy Bird 的移动应用程序,除了它是语音控制的。这个想法是让这个应用程序成为有语音问题(单调)的人的练习工具。当用户发出高音时小鸟向上飞,低音时小鸟向下飞。

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

我的管道是由 Parallaxer 脚本生成的预制件。预制件 object 由三个孩子组成:

  1. 顶部管道的 Sprite(带有盒子对撞机)
  2. 代表管道开口的盒子碰撞体
  3. 底部管道的 Sprite(带有盒子对撞机)

现在我需要访问管道开口的上边界和下边界的Y-positions。我尝试过的解决方案使用 Raycasts。我投射了两条光线,都从预制件 Object 的位置开始。由于管道开口(盒式碰撞器)位于预制件的中间,因此两条射线都在盒式碰撞器内开始。一条光线向上,应该与上边界碰撞,另一条光线向下,应该与下边界碰撞。但是 returned 位置与起点完全相同......所以我假设光线投射实际上 return 对撞机本身的 位置 他们击中,而不是它实际击中的位置。我不确定我的陈述,但只有这样才能解释为什么它不起作用。这是问题的说明(用油漆制作):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 更容易的解决方案!

在评论中的信息之后,我认为光线投射的方法可能不起作用,因为碰撞器太多了。还要考虑一下,如果您在对撞机内部开始光线投射,光线投射将立即命中。

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

在 class 的字段中设置要检查的碰撞器,并将其传递给检查器 window。

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);
}

你只需要在Raycast方法中添加一个LayerMask,然后在Editor/Project Settings中你可以看到物理层矩阵来告诉哪些层可以击中其他层,使Layer1 只命中 Layer2Layer2 只命中 Layer1 就完成了。