C#

Можно ли считать расстояние до LayerMask в юнити?

Здравствуйте уважаемые знатоки. Столкнулся с проблемой делая 2D игру на юнити. Мне нужно считывать расстояние до объекта с определенным слоем. Раньше я просто читывал расстояние до объекта, но сейчас это мне не подходит. Пользовался вот такой штукой:
Collider2D[] colliders = Physics2D.OverlapCircleAll(GroundCheck.position, CheckRadius);
OnGround = colliders.Length > 0;
Может есть какой-то способ так же просто найти расстояние до определенного слоя? Пытался читать документацию, но там все максимально не понятно.
Доброго времени суток!
Расстояние до слоя - операция, которой нет в физических движках попросту потому, что она априори очень (ОЧЕНЬ) дорогостоящая в смысле производительности.

Для вашей проблемы есть классическое решение.
1) Пусть вам интересна игровая ситуация, когда от персонажа, до слоя L расстояние не менее X.
2) Прикрепите к вашему персонажу дочерний объект с триггер-коллайдером типа CircleCollider2D.
3) Задайте этому коллайдеру радиус X.
4) К тому же объекту добавляется Rigidbody2D типа Kinematic.

Дальше два пути:
а) (оптимальный) Туда же добавляете скрипт, который слушает OnTriggerEnter2D() и OnTriggerExit2D() - таким образом этот объект сам будет обрабатывать триггер-события данного коллайдера - и в коде c помощью счётчика отслеживайте, сколько раз коллайдер входил и выходил из объекта на слое L; когда счётчик > 0, условие близости к слою L выполняется.
б) (не оптимальный) В методе FixedUpdate() скрипта на персонаже проверяете результат функции Physics2D.IsTouchingLayers(collider, layerMask) - где коллайдер это тот самый CircleCollider2D, а layerMask это маска для слоя L.

Обратите внимание, благодаря тому, что здесь добавляется объект с коллайдером и собственным Kinematic Rigidbody - этот объект САМ отвечает за обработку событий типа OnCollisionEnter2D() и OnTriggerEnter2D().
Игорь Волков
Игорь Волков
5 779
Лучший ответ
Расстояние найти можно. Но только до конкретного объекта, а не до слоя, т. к. слой - это может быть несколько объектов, и до какого из них конкретно ты хочешь найти расстояние - никто кроме тебя не знает ;)

В общем случае, расстояние между двумя объектами, получается так:
float my_dist = Vector3.Distance(obj1.transform.position, obj2.transform.position);
Alex Coles
Alex Coles
7 947
Арестак Сарксян а нет метода чтобы если в определенном радиусе был определенный слой, то допустим - прыжок разрешен?
Alex Coles Есть, через Physics2D.OverlapBox/Circle/Capsule/Whatever или Raycast. Там можно задать и маску слоя, что бы получать коллизию только с указанными слоями. Но ты написал, что оно тебе, по какой-то причине, не подходит. Других способов, на вскидку не скажу. Сам бы делал именно так.