OverlapAreaAll не находит коллайдер unity 2d
Ситуация такая: есть метод, который перемещает все коробки на уровне в начальное положение.
private void OnPlayerinteract(Transform player)
{
if (Vector2.Distance(player.position, transform.position) < TriggerDiastance)
{
for (int i = 0; i < boxes.Length; i++)
{
boxes[i].position = puzzleData.GetBoxPosIndex(i);
}
for (int i = 0; i < levers.Length; i++)
{
levers[i].SwitchLaver(puzzleData.GetLeverStateIndex(i));
}
}
RestartPuzzle?.Invoke();
}
Событие RestartPuzzle вызывает метод на нажимных плитах, чтобы они проверили, есть ли на них только что перемещенные коробки. Вот этот метод:
private void CheckColliders()
{
Collider2D[] collider2Ds = Physics2D.OverlapAreaAll(
new Vector2((transform.position.x - transform.localScale.x / 2 * 0.8f), (transform.position.y - transform.localScale.y / 2 * 0.8f)),
new Vector2((transform.position.x + transform.localScale.x / 2 * 0.8f), (transform.position.y + transform.localScale.y / 2 * 0.8f)));
Debug.DrawLine(
new Vector2((transform.position.x - transform.localScale.x / 2 * 0.8f), (transform.position.y - transform.localScale.y / 2 * 0.8f)),
new Vector2((transform.position.x + transform.localScale.x / 2 * 0.8f), (transform.position.y + transform.localScale.y / 2 * 0.8f)),
Color.blue,
100f);
foreach (var item in collider2Ds)
{
if (item.GetComponent<Presser>())
{
Debug.Log(item.name);
signalState = SignalState.On;
foreach (Interactable i in Interactables)
{
i.OnTriggerDone();
}
return;
}
}
}
Метод CheckColliders находит только коллайдер нажимной плиты, хотя коробка находится внутри области. Есть какие-то мысли?
Update: коллайдер находится если воспроизвести метод 2 раза(то есть для игрока нажать кнопку 2 раза). Выходит что коробка находится если уже стоит внутри зоны, если же она телепортируется из другого места то OverlapAreaAll ее не видит. Надеюсь это улучшит понимание проблемы
Update 2: если я проверяю коллайдер после задержки 0,05 секунды, все работает отлично, но как я могу сделать это без задержки? Это не должно быть проблемой, но почему Unity не может найти коллайдер, если его перемещение было сделано до проверки?
Ответы (1 шт):
Overlap значит что объект должен не просто касаться, а полностью находиться внутри зоны.
Для начала нормально отрисуй эту зону.
private List<Vector3> _targets = new List<Vector3>();
private void Update ()
{
Collider2D[] targets = Physics2D.OverlapAreaAll(
(Vector2)(transform.position - transform.localScale * 0.5f),
(Vector2)(transform.position + transform.localScale * 0.5f));
_targets.Clear();
_targets.AddRange(targets.Select(t => t.transform.position));
}
private void OnDrawGizmos ()
{
Gizmos.color = new Color(0, 0.4f, 1);
Gizmos.DrawWireCube(transform.position, transform.localScale);
Gizmos.color = new Color(1, 0.4f, 0);
float crossSize = 3;
foreach (Vector3 target in _targets)
{
Gizmos.DrawLine(target - Vector3.up * crossSize, target + Vector3.up * crossSize);
Gizmos.DrawLine(target - Vector3.right * crossSize, target + Vector3.right * crossSize);
}
}
Если условие на касание, то используется Physics2D.BoxCastAll().