Unity: Как получить номер стороны колайдера которой он прикоснулся к другому колайдеру

283
26 марта 2021, 07:10

есть два объекта, например: два электрических проводника - два куска провода, которые имеют по два оголенных конца соответственно. На проводах есть колайдеры и мне нужно чтобы при поднесении одного оголенного конца провода к другому оголенному концу провода выводилось каким именно концом первого провода(первым концом или вторым) я соприкоснулся со вторым куском провода. Есть вроде бы свойства типо .contacts для определения точки соприкосновения, но ничего так и не вышло. Пытался сделать два бокс колайдера по одному на концах, чтобы знать каким колайдером точно прикоснулся, но не знаю как в коде идентифицировать их по отдельности. Так что надеюсь на вашу помощь. Заранее Спасибо!

Answer 1

Проще, наверное, всё таки сделать два коллайдера) если вы не хотите отлавливать касания посреди коллайдера. Можете хоть круглые для аутентичности.

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

class ColliderHandler : MonoBehaviour
{
    public event Action<Collision> OnColliderEnterEvent = delegate { };
    public event Action<Collision> OnColliderExitEvent = delegate { };
    void OnCollisionEnter(Collision collision) => OnColliderEnterEvent (collision);
    void OnCollisionExit(Collision collision) => OnColliderExitEvent(collision);
}

class Wire : MonoBehaviour
{
    [SerializeField]
    ColliderHandler _left;
    [SerializeField]
    ColliderHandler _right;
    private void OnEnable()
    {
        _left.OnColliderEnterEvent += OnLeftEnter;
        _left.OnColliderExitEvent += OnLeftExit;
        _right.OnColliderEnterEvent += OnRightEnter;
        _right.OnColliderExitEvent += OnRightExit;
    }
    private void OnDisable()
    {
        _left.OnColliderEnterEvent -= OnLeftEnter;
        _left.OnColliderExitEvent -= OnLeftExit;
        _right.OnColliderEnterEvent -= OnRightEnter;
        _right.OnColliderExitEvent -= OnRightExit;
    }
    private void OnLeftExit(Collision2D obj)
    {
    }
    private void OnLeftEnter(Collision2D obj)
    {
    }
    private void OnRightEnter(Collision2D obj)
    {
    }
    private void OnRightExit(Collision2D obj)
    {
    }
}

Делаете объект-родитель "Провод" ему добавляете Wire, объекту делаете два чайлда - "КонецПровода" и добавляете им компоненты Collider2d (или любой другой какой вам нужен) и компонент ColliderHandler.

READ ALSO
Умножение матрицы на вектор c# WPF

Умножение матрицы на вектор c# WPF

нужно умножить матрицу на вектор, при этом должна быть доступна полная манипуляция с матрицей, сколько бьюсь никак не получается, помогите,...

104
Как получить значение слайдера?

Как получить значение слайдера?

В WPF/MVVM приложении в модели нужно получить значение слайдера из формы, как это сделать? Мой метод не работает

138
Не удаётся преобразовать строку в дату

Не удаётся преобразовать строку в дату

Нужно преобразовать строку (string) "Ноя 2018" в дату (DateTime)Делаю все внутри конструктора Xamarin

111
Написать linq аналог алгоритма

Написать linq аналог алгоритма

Необходимо найти индекс элемента, максимально приближенного к среднему арифметическому и записать в linq форме

122