Проблемы столкновения тайловой карты Unity2D

Я работаю над игрой и использую новые функции Tilemap. Пока они работают фантастически. Так легко поднять уровень. Однако я сталкиваюсь с проблемами при отражении лазера на коллайдерах тайловой карты. Как вы можете видеть на GIF-изображении ниже, первые несколько лазеров отражают хорошо, но иногда в небольшой трещине, где встречаются коллайдеры, я получаю нежелательное поведение для моего лазера.

Лазер состоит из небольшого гранулированного объекта рендеринга спрайтов с рендерером следа для цвета позади и кругового коллайдера.

Вот мой код столкновения. Где direction - это переменная класса Vector2, а rb - это компонент RigidBody2D объекта GameObject, спрятанный в функции Start().

if (collision.collider.gameObject.layer == LayerMask.NameToLayer ("Terrain")) {
    direction = Vector2.Reflect (direction, collision.contacts[0].normal);
    rb.velocity = direction.normalized*GameManager.instance.bouncySpeed;
}

Что я могу предпринять, чтобы избежать такого поведения?

введите здесь описание изображения


person jamesmpw    schedule 25.01.2018    source источник
comment
Вы пробовали поставить ELSE на свой IF и поместить туда журнал, чтобы увидеть, возвращает ли условие false (какой-то другой слой, кроме Terrain)?   -  person C. Parcell    schedule 25.01.2018


Ответы (1)


Я думаю, что условие вернет true, поскольку лазер перенаправлен. Но какая-то переменная где-то не так.

Попробуйте напечатать direction, collision.contacts[0].normal, collision.contacts.Length, GameManager.instance.bouncySpeed и rb.velocity.

if (collision.collider.gameObject.layer == LayerMask.NameToLayer ("Terrain")) {
    direction = Vector2.Reflect (direction, collision.contacts[0].normal);
    rb.velocity = direction.normalized*GameManager.instance.bouncySpeed;

    Debug.Log("////////");
    Debug.Log("direction: " + direction);
    Debug.Log("collision.contacts[0].normal: " + collision.contacts[0].normal);
    Debug.Log("collision.contacts.Length: " + collision.contacts.Length);
    Debug.Log("GameManager.instance.bouncySpeed: " + GameManager.instance.bouncySpeed);
    Debug.Log("rb.velocity: " + rb.velocity);
    Debug.Log("////////");
}

Сравните эти значения при работе и при ошибке. Также разместите их здесь, если не обнаружите, что не так

person Basile Perrenoud    schedule 26.01.2018
comment
Спасибо за ответ. Оказывается, я мог бы сделать все коллайдеры одним коллайдером, используя компонент Composite Collider в игровом объекте TileMap. Это устранило эти проблемы с коллизиями для меня. Еще раз спасибо за ваше время. - person jamesmpw; 27.01.2018