Проблема с условием в RaycastHit2D [РЕШЕНО]

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Проблема с условием в RaycastHit2D [РЕШЕНО]

Сообщение Ivan74 16 мар 2019, 10:51

Помогите разобраться, что не так.

Делаю обнаружение через Raycast:

Синтаксис:
Используется csharp
private void Check()
    {
        float high = 1.1f, step = 0.35f;
        for (float i = -0.1f; i < high; i += step)
        {
            RaySidePointStart = transform.up * i + transform.position;

            RaycastHit2D RaySide = Physics2D.Raycast(RaySidePointStart, vectorSideRay, rayDistanceSide, LayerWall);
            Debug.DrawRay(RaySidePointStart, vectorSideRay * rayDistanceSide, Color.blue);
            if (RaySide.collider != null)
            {
                TouchedWall = true;
                Debug.Log("This is WALL!!!");
            }
            else if (RaySide.collider == null)
            {
                TouchedWall = false;
            }
        }


и происходит такая бяка:
Изображение

Т.е. флаг не срабатывает если верхний лучик не касается.
Что не так в условии? Или в чём-то еще?
Последний раз редактировалось Ivan74 17 мар 2019, 21:52, всего редактировалось 1 раз.
Ivan74
UNец
 
Сообщения: 18
Зарегистрирован: 12 мар 2018, 14:00

Re: Проблема с условием в RaycastHit2D

Сообщение seaman 16 мар 2019, 23:18

Добавьте return в первый if. Т.е. если стена найдена - больше не ищем
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Проблема с условием в RaycastHit2D

Сообщение Ivan74 17 мар 2019, 01:52

seaman писал(а):Добавьте return в первый if. Т.е. если стена найдена - больше не ищем

Так флаг срабатывает, но остальная логика (что вне цикла) ломается напрочь :-o
Ivan74
UNец
 
Сообщения: 18
Зарегистрирован: 12 мар 2018, 14:00

Re: Проблема с условием в RaycastHit2D

Сообщение Ivan74 17 мар 2019, 02:11

Debug отрабатывает все лучи, в любом порядке и количестве, как собственно и "TouchedWall" если его вручную сбрасывать.
Я вообще не пойму как так получается, что если, именно верхний луч "нулевой", то флаг сброшен...
Ivan74
UNец
 
Сообщения: 18
Зарегистрирован: 12 мар 2018, 14:00

Re: Проблема с условием в RaycastHit2D

Сообщение AngryCat 17 мар 2019, 11:15

Ivan74 писал(а):Помогите разобраться, что не так.

Делаю обнаружение через Raycast:

Синтаксис:
Используется csharp
private void Check()
    {
        float high = 1.1f, step = 0.35f;
        for (float i = -0.1f; i < high; i += step)
        {
            RaySidePointStart = transform.up * i + transform.position;

            RaycastHit2D RaySide = Physics2D.Raycast(RaySidePointStart, vectorSideRay, rayDistanceSide, LayerWall);
            Debug.DrawRay(RaySidePointStart, vectorSideRay * rayDistanceSide, Color.blue);
            if (RaySide.collider != null)
            {
                TouchedWall = true;
                Debug.Log("This is WALL!!!");
            }
            else if (RaySide.collider == null)
            {
                TouchedWall = false;
            }
        }


и происходит такая бяка:
Изображение

Т.е. флаг не срабатывает если верхний лучик не касается.
Что не так в условии? Или в чём-то еще?

Убери это else if (RaySide.collider == null)
{
TouchedWall = false;
}
Проблема в том, что 3 луча касаются стены и перемнная isWall становится true, НО тот рейкаст, который отрисовывается последним и не касается стены просто перебивает isWall на false
Здесь могла бы быть ваша реклама.
Аватара пользователя
AngryCat
Старожил
 
Сообщения: 716
Зарегистрирован: 20 июл 2018, 22:29
Skype: Дискорд - Флеш#4099

Re: Проблема с условием в RaycastHit2D

Сообщение AngryCat 17 мар 2019, 11:17

Ivan74 писал(а):Debug отрабатывает все лучи, в любом порядке и количестве, как собственно и "TouchedWall" если его вручную сбрасывать.
Я вообще не пойму как так получается, что если, именно верхний луч "нулевой", то флаг сброшен...

Верхний отрисовывается последним. В цикле это прописано. Они рисуются в порядке возрастания, снизу вверх.
Здесь могла бы быть ваша реклама.
Аватара пользователя
AngryCat
Старожил
 
Сообщения: 716
Зарегистрирован: 20 июл 2018, 22:29
Skype: Дискорд - Флеш#4099

Re: Проблема с условием в RaycastHit2D

Сообщение AngryCat 17 мар 2019, 11:19

Тебе нудно чтоб все 4 касались стены, чтобы переменная становилась на true, а если хоть одна не какается, то false. Я правильно понимаю?
Здесь могла бы быть ваша реклама.
Аватара пользователя
AngryCat
Старожил
 
Сообщения: 716
Зарегистрирован: 20 июл 2018, 22:29
Skype: Дискорд - Флеш#4099

Re: Проблема с условием в RaycastHit2D

Сообщение Ivan74 17 мар 2019, 11:29

Убери это else if (RaySide.collider == null)
{
TouchedWall = false;
}

Если я это уберу, то что будет флаг сбрасывать?
AngryCat писал(а):Тебе нудно чтоб все 4 касались стены, чтобы переменная становилась на true, а если хоть одна не какается, то false. Я правильно понимаю?

Мне нужно чтобы: хоть все 4 касались, хоть каждый по отдельности (любой один), тогда true. Если все не касаются, тогда false.
Ну как единый луч, только из четырёх.
Ivan74
UNец
 
Сообщения: 18
Зарегистрирован: 12 мар 2018, 14:00

Re: Проблема с условием в RaycastHit2D

Сообщение seaman 17 мар 2019, 13:44

Вы вообще пробуете что Вам советуют? Или Вы умнее нас? Тогда зачем спрашивать?
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Проблема с условием в RaycastHit2D

Сообщение Ivan74 17 мар 2019, 15:29

seaman писал(а):Вы вообще пробуете что Вам советуют? Или Вы умнее нас? Тогда зачем спрашивать?

Если бы я не пробовал, то не отписывался бы.
То, что предложил AngryCat, было опробовано ещё до него. И это очевидно и без проб.
Ваше предложение (за что Вам спасибо), было предварительно испробовано, и на него дан ответ. Он выше.

P.S. Я никогда не ставлю себя выше других, чего и Вам советую.
Ivan74
UNец
 
Сообщения: 18
Зарегистрирован: 12 мар 2018, 14:00

Re: Проблема с условием в RaycastHit2D

Сообщение Ivan74 17 мар 2019, 19:39

seaman писал(а):Добавьте return в первый if. Т.е. если стена найдена - больше не ищем


break надо использовать.
Моя вина: сразу не сказал, что в методе помимо цикла ещё есть логика.
Спасибо!
Ivan74
UNец
 
Сообщения: 18
Зарегистрирован: 12 мар 2018, 14:00

Re: Проблема с условием в RaycastHit2D

Сообщение seaman 17 мар 2019, 21:39

Чем break в данном случае отличается от return?
Разьве что в пером посте не весь метод приведен и после цикла еще что-то делается.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Проблема с условием в RaycastHit2D

Сообщение Ivan74 17 мар 2019, 21:50

seaman писал(а):Чем break в данном случае отличается от return?
Разьве что в пером посте не весь метод приведен и после цикла еще что-то делается.

Да, делается. Но я не стал засорять первый пост лишним (он к рейкасту не относится) кодом, вот и возникло недопонимание.
В любом случае, спасибо!
Ivan74
UNец
 
Сообщения: 18
Зарегистрирован: 12 мар 2018, 14:00

Re: Проблема с условием в RaycastHit2D

Сообщение AngryCat 17 мар 2019, 22:53

Ivan74 писал(а):
Убери это else if (RaySide.collider == null)
{
TouchedWall = false;
}

Если я это уберу, то что будет флаг сбрасывать?
AngryCat писал(а):Тебе нудно чтоб все 4 касались стены, чтобы переменная становилась на true, а если хоть одна не какается, то false. Я правильно понимаю?

Мне нужно чтобы: хоть все 4 касались, хоть каждый по отдельности (любой один), тогда true. Если все не касаются, тогда false.
Ну как единый луч, только из четырёх.
Тогда делай то, что я написал выше " Убери это else if (RaySide.collider == null)
{
TouchedWall = false;
}"
А вообще я расписал так, чтобы ты мог сам сделать вывод и понять как нужно
Здесь могла бы быть ваша реклама.
Аватара пользователя
AngryCat
Старожил
 
Сообщения: 716
Зарегистрирован: 20 июл 2018, 22:29
Skype: Дискорд - Флеш#4099


Вернуться в Почемучка

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

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