Почему рабочий код не хочет работать должным образом?
Добавлено: 27 мар 2023, 22:06
Суть проблемы такова: делаю симулятор разного вида общественного транспорта, в том числе троллейбуса. Механика штанг троллейбуса такова: штанга имеет дочерний объект, при помощи которого смотрит в сторону провода. Работает это так: штанга ищёт объект провода с тегом WireR (для правого провода и WireL для левого), у найденного объекта находит ближайшую точку в его меш коллайдере и стотрит в эту точку. Для поиска использую 2 радиуса: малый и большой. Когда штанга идёт по проводу, она пользуется малым радиусом относительно её дочернего объекта, чтобы искать не соседний провод, а следующий, иначе будет она прыгать между проводами на местах, где провода одной линии проходят близко друг к другу (стрелки, пересечения и т.п.). Большой радиус используется когда штанга опущена и по этому на малом радиусе найти провод не может. Всё это работает отлично. Вот только проблема в том, что когда штанга на малом радиусе покидает провод даже за пределы малого радиуса, она его не всегда забывает. Объяснить это я никак не могу. Вот просто еду, отъезжаю далеко от проводов, одна штанга сигналит о слёте, а другая продолжает тянуться в сторону последнего провода, а то и обе могу тянуть в сторону последнего провода, ну или же обе будут сигналить о слёте (в таком случае включается зуммер). Чаще всего правая штанга не забывает провод, а левая без проблем его забудет. Как объяснить такое поведение и как это исправить? Вот часть кода, отвечаящая за поиск провода на малом радиусе:
Сразу хочу подметить, что в случае слёта штанг, они не ищут провод на большом радиусе (уверен кто-нибудь об этом подумает). У меня есть булевая, отвечающая за то, что штанги подняты или опущены и если они подняты, то выполняется код, указанный выше, а если нет, то другой код.
Я понимаю, что код может ввыглядеть немного не грамотно, т.к. я его делал исходя из документации и форумов, но лучше я уже не осилил.
Как видно, в данном коде часто использую "wire = null;" чтобы принудительно забыть последний объект, если он находится вне радиуса. И это работает, но не всегда... Как решить данную проблему?
Синтаксис:
Используется 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;
}
}
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;" чтобы принудительно забыть последний объект, если он находится вне радиуса. И это работает, но не всегда... Как решить данную проблему?