Почему рабочий код не хочет работать должным образом?

Программирование на Юнити.

Почему рабочий код не хочет работать должным образом?

Сообщение Kakaha_228 27 мар 2023, 22:06

Суть проблемы такова: делаю симулятор разного вида общественного транспорта, в том числе троллейбуса. Механика штанг троллейбуса такова: штанга имеет дочерний объект, при помощи которого смотрит в сторону провода. Работает это так: штанга ищёт объект провода с тегом WireR (для правого провода и WireL для левого), у найденного объекта находит ближайшую точку в его меш коллайдере и стотрит в эту точку. Для поиска использую 2 радиуса: малый и большой. Когда штанга идёт по проводу, она пользуется малым радиусом относительно её дочернего объекта, чтобы искать не соседний провод, а следующий, иначе будет она прыгать между проводами на местах, где провода одной линии проходят близко друг к другу (стрелки, пересечения и т.п.). Большой радиус используется когда штанга опущена и по этому на малом радиусе найти провод не может. Всё это работает отлично. Вот только проблема в том, что когда штанга на малом радиусе покидает провод даже за пределы малого радиуса, она его не всегда забывает. Объяснить это я никак не могу. Вот просто еду, отъезжаю далеко от проводов, одна штанга сигналит о слёте, а другая продолжает тянуться в сторону последнего провода, а то и обе могу тянуть в сторону последнего провода, ну или же обе будут сигналить о слёте (в таком случае включается зуммер). Чаще всего правая штанга не забывает провод, а левая без проблем его забудет. Как объяснить такое поведение и как это исправить? Вот часть кода, отвечаящая за поиск провода на малом радиусе:
Синтаксис:
Используется csharp
Collider[] hitColliders = Physics.OverlapSphere(connectPoint.position, radius);
            float minDistance = float.MaxValue;
            foreach (Collider collider in hitColliders)
            {
                if (collider.gameObject.CompareTag(wireTag))
                {
                    float distance = Vector3.Distance(transform.position, collider.ClosestPoint(connectPoint.position));
                    if (distance < minDistance)
                    {
                        wire = collider.gameObject;
                        minDistance = distance;
                    }
                    else
                    {
                        wire = null;
                    }
                }
                else if (!collider.gameObject.CompareTag(wireTag))
                {
                    wire = null;
                }
            }

Сразу хочу подметить, что в случае слёта штанг, они не ищут провод на большом радиусе (уверен кто-нибудь об этом подумает). У меня есть булевая, отвечающая за то, что штанги подняты или опущены и если они подняты, то выполняется код, указанный выше, а если нет, то другой код.
Я понимаю, что код может ввыглядеть немного не грамотно, т.к. я его делал исходя из документации и форумов, но лучше я уже не осилил.
Как видно, в данном коде часто использую "wire = null;" чтобы принудительно забыть последний объект, если он находится вне радиуса. И это работает, но не всегда... Как решить данную проблему?
Да не нужна мне подпись...
Аватара пользователя
Kakaha_228
UNIт
 
Сообщения: 60
Зарегистрирован: 21 фев 2021, 14:12

Re: Почему рабочий код не хочет работать должным образом?

Сообщение 1max1 28 мар 2023, 01:15

А сработает ли wire = null, когда hitColliders.Length будет 0?
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Почему рабочий код не хочет работать должным образом?

Сообщение Kakaha_228 28 мар 2023, 12:31

1max1 писал(а):hitColliders.Length будет 0

Гениально!!! ПОчему я сразу не догадался до этого... Спасибо, это решило проблему!
Да не нужна мне подпись...
Аватара пользователя
Kakaha_228
UNIт
 
Сообщения: 60
Зарегистрирован: 21 фев 2021, 14:12


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6