LINUX.ORG.RU

unity определить другие коллайдеры которые пересекаются с моим коллайдером

 


0

1

Пытаюсь найти как сделать такое, казалось бы, простое действие.

К примеру у меня есть объект (завод/шахта), к этому объекту я добавил 2d box collider. Также я добавил ему скрипт Factory.cs В этом скрипте есть к примеру функция (аля корутина) void Dig() которая раз в секунду хочет проверить какие ресурсы есть в области коллайдера завода и выкопать их.

Мои попытки нагуглить как это сделать приводят к достаточно старым вопросам на answers.unity.com ~2013 года где в ответе говорят что либо это невозможно. Либо что нужно руками добавлять в список при OnTriggerEnter2D, и удалять при OnTriggerExit2D. Либо предлагают метод поиска коллайдеров в области сферы / коробки - а не любых коллайдеров

Мне такое решение кажется ну очень неудобным и непонятным. Также оно не работает без добавления rigitbody2D.

Неужели в 2020 нет удобного способа посмотреть с кем мой объект пересекается?

[UPD] Потенциально это то что мне нужно, https://docs.unity3d.com/ScriptReference/Physics2D.OverlapCollider.html [/UPD]

★★★

Последнее исправление: abs (всего исправлений: 1)

Вот щас пришел к такому решению, но это мягко говоря костыль

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Factory : MonoBehaviour {

        GameObject lastFoundResource;

	void Start () {

        InvokeRepeating("Dig", 0f, 1f);
	}


    void Dig() {
        if (lastFoundResource) {
            lastFoundResource.transform.position = transform.Find("outputPlace").position;

        }
    }

    private void OnTriggerStay2D(Collider2D other)
    {
        lastFoundResource = other.gameObject;
    }
}

abs ★★★
() автор топика
Последнее исправление: abs (всего исправлений: 1)
Ответ на: комментарий от RedEyedMan666
Returns
bool Whether any of the collider(s) attached to this rigidbody are touching any colliders on the specified layerMask or not

Это возвращает да/нет - а мне хотелось бы список коллайдеров / ресурсов на територии завода

abs ★★★
() автор топика
Ответ на: комментарий от abs

а мне хотелось бы список коллайдеров / ресурсов на територии завода

Объект поддерживает список коллайдеров, …?

anonymous
()
Ответ на: комментарий от RedEyedMan666

С которыми соприкасался? Или вообще весь список?

у завода есть коллайдер - область в которой он «копает» - хочу получить те ресурсы которые пересекают коллайдер

abs ★★★
() автор топика
Ответ на: комментарий от RedEyedMan666

Оно, это как раз то о чем я говорил - ответы из 2014, и меня удивляет что в 2020 нет способа проще.

Более того насколько я понял в том способе еще нужно следить за объектами которые удаляются и руками опять же чистить свой список

abs ★★★
() автор топика
Ответ на: комментарий от abs

еще нужно следить за объектами которые удаляются и руками опять же чистить свой список

Звучит логично. Если список у тебя кастомный, то никакой библиотечный метод тут не поможет. Создаешь цикл в своем методе и в нем же проверяешь/даляешь лишнее по каким-нибудь тегам.

RedEyedMan666
()
Ответ на: комментарий от RedEyedMan666

Давай немного другой пример - вместо завода персонаж - он тоже умеет копать, и умеет ходить.

Предположим персонаж копает когда игрок нажимает клавишу, и делает он это редко (раз в 10 минут к примеру).

Получается что я все равно должен создать список, все эти десять минут пока я хожу по ресурсам добавлять/удалять их, только ради того чтоб раз в 10 минут воспользоваться этими данными.

Звучит сложно, низкопроизводительно и нелогично

abs ★★★
() автор топика
Ответ на: комментарий от abs

Получается что я все равно должен создать список, все эти десять минут пока я хожу по ресурсам добавлять/удалять их, только ради того чтоб раз в 10 минут воспользоваться этими данными.

Мне кажется, ты усложняешь. Может просто добавишь анимацию копания и отобразишь постепенное уменьшение количества ресурса в процентах? (текстом в области HUD), предварительно связав ресурс источника в % (например, угольной шахты) с анимацией. Ресурс кончается и анимация прекращается. Либо прекращается по повторному нажатию клавиши.

RedEyedMan666
()
Ответ на: комментарий от abs

Я не знаю как у тебя ресурсы реализованы. Если ты хочешь, чтобы источник визуально истощался, то это скорее всего будет несколько сложнее.

RedEyedMan666
()
Ответ на: комментарий от RedEyedMan666

Ресурс кончается и анимация прекращается. Либо прекращается по повторному нажатию клавиши.

Ну я могу и так, ресурсов может быть мало. Но все равно в моем примере с игроком - он 10 минут может ходить, и пересекаться с ресурсами - значит мне придется их постоянно добавлять/удалять ради того чтоб раз в 10 минут покопать их

abs ★★★
() автор топика
Ответ на: комментарий от abs

Можешь записать видео с твоей сценой? Мне не совсем непонятно о чем именно речь. Если ты о Collision Shapes (коллайдеры), то навярняка у них имеются режимы активации и деактивации столкновений для коллайдеров. Тогда тебе не придется их удалять и добавлять заново.

RedEyedMan666
()
Ответ на: комментарий от abs

Ты в Unity недавно?

Я тоже вот влез в геймдев меньше года назад, но у меня движок другой, опенсорсный. И хотя он отличается от Unity, принцип внутреннего устройства все равно везде одинаковый.

RedEyedMan666
()
Ответ на: комментарий от RedEyedMan666

Ты в Unity недавно?

Да, это хобби. Так то я фронтенд. Щас скину скрин

abs ★★★
() автор топика
Ответ на: комментарий от RedEyedMan666

https://ibb.co/sCt8zvn

Дом - это завод. 
зеленая область - это коллайдер где завод может собирать ресурсы
Белый и желтый слиток - железо и медь 
Синий робот - игрок, он тоже может собирать ресурсы, его коллайдер круглый возле ног
abs ★★★
() автор топика
Ответ на: комментарий от abs

Необычно для меня. Я ожидал увидеть 3D-модельку завода с коллайдером и поле с ресурсами (тоже 3D) неподалеку со своим коллайдером…

В общем, тебе проще узнать способ деактивации/активации коллизий в юнити.

RedEyedMan666
()
Ответ на: комментарий от RedEyedMan666

В общем, тебе проще узнать способ деактивации/активации коллизий в юнити.

Не совсем понимаю, есть возможность «усыпить» объект, но как мне это поможет?

abs ★★★
() автор топика

Мои попытки нагуглить как это сделать приводят к достаточно старым вопросам на answers.unity.com ~2013 года где в ответе говорят что либо это невозможно. Либо что нужно руками добавлять в список при OnTriggerEnter2D, и удалять при OnTriggerExit2D.

Можно еще например по требованию вызывать что-то типа Physics.BoxCastAll или Physics.SphereCastAll или ему подобные функции - такой вариант должен работать и без навешивания rigidbody. Ну а дальше ковыряй полученный перечень хитов как тебе нравится.

nrader
()
Последнее исправление: nrader (всего исправлений: 1)
Ответ на: комментарий от nrader

Можно еще например по требованию вызывать что-то типа Physics.BoxCastAll или Physics.SphereCastAll или ему подобные функции - такой вариант должен работать и без навешивания rigidbody. Ну а дальше ковыряй полученный перечень хитов как тебе нравится.

Да, находил это, но что мне делать в случае если у меня будет не стандартная форма коллайдера?

К примеру у меня завод повернут на 45 градусов, я могу этим методом Physics.BoxCastAll пользоваться для такого случая?

abs ★★★
() автор топика
Ответ на: комментарий от abs

Сам расчитывай

любой коллайдер это верхний левый угол x и правый нижний y берёшь объекты перебираешь и если у объекта верхний левый x больше, а нижний левый y меньше то это объект целиков в зоне коллайдера с которым идёт сравнение. Быстро и надёжно. Та же самая логика и для частичного вхождения =) Хотя наверное в юнити есть искоробночные варианты которые сами всё считают

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от abs

Кастить ты будешь в любом случае бокс или сферу, от того какая у тебя цель будет лишь зависеть где они пересекутся.

nrader
()
Ответ на: комментарий от LINUX-ORG-RU

любой коллайдер это верхний левый угол x и правый нижний y берёшь объекты перебираешь и если у объекта верхний левый x больше, а нижний левый y меньше то это объект целиков в зоне коллайдера с которым идёт сравнение. Быстро и надёжно.

Нет, это определенно говнокод, нарушает DRY в хламину. Есть очень мощный физический движок юнити, и делать руками это совсем неадекватно и неправильно.

И еще раз - у меня коллайдер потенциально будет повернут на 45 градусов

abs ★★★
() автор топика
Ответ на: комментарий от anonymous

Да, спасибо! Это очень похоже на то что мне нужно.

abs ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.