Получить Y-позицию коллайдера с рамкой - PullRequest
0 голосов
/ 16 мая 2019

Сначала немного информации, я делаю мобильное приложение, похожее на Flappy Bird, за исключением его голосового управления. Идея состоит в том, чтобы иметь это приложение в качестве учебного пособия для людей с проблемами голоса (однообразие). Птица летит вверх, когда пользователь делает высокий шаг, и вниз, когда он низкий.

Приложение связано с веб-сайтом, на котором тренер по вокалу может следить за прогрессом пользователя. Для этого я сохраняю данные о производительности игры пользователя в базу данных. Более конкретно, каждый раз, когда птица проходит через отверстие в трубе, я сохраняю значения шага, которые он правильно создал, вместе с двумя «пороговыми значениями шага», которые представляют верхнюю и нижнюю границы отверстия трубы.

Мои каналы - это префабы, сгенерированные скриптом Parallaxer. Сборный объект состоит из трех дочерних элементов:

  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 голосов
/ 17 мая 2019

Вам просто нужно добавить LayerMask к методу Raycast, а затем в Editor/Project Settings вы можете увидеть матрицу физического слоя, чтобы сказать, какие слои могут поразить другие, сделать Layer1 ударом только Layer2 и Layer2 хит только Layer1 и готово.

0 голосов
/ 16 мая 2019

После информации в комментариях, я думаю, что подход с raycast может не работать, потому что слишком много коллайдеров.Также учтите, что если вы запустите радиопередачу ВНУТРИ коллайдера, радиопередача начнется сразу.

Так что лучшим вариантом будет использование границ коллайдера.
Учтите, что при таком подходе коллайдер должен находиться на одном и том жескрипт игрового объекта.

Установите коллайдер, который вы хотите проверить, в полях класса и передайте его в окне инспектора.

public BoxCollider2D_colliderToCheck;

Я разбил код на 2 секции.

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