Страница 1 из 1

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

СообщениеДобавлено: 16 мар 2019, 10:51
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;
            }
        }


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

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

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

СообщениеДобавлено: 16 мар 2019, 23:18
seaman
Добавьте return в первый if. Т.е. если стена найдена - больше не ищем

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

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

Так флаг срабатывает, но остальная логика (что вне цикла) ломается напрочь :-o

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

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

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

СообщениеДобавлено: 17 мар 2019, 11:15
AngryCat
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

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

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

Верхний отрисовывается последним. В цикле это прописано. Они рисуются в порядке возрастания, снизу вверх.

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

СообщениеДобавлено: 17 мар 2019, 11:19
AngryCat
Тебе нудно чтоб все 4 касались стены, чтобы переменная становилась на true, а если хоть одна не какается, то false. Я правильно понимаю?

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

СообщениеДобавлено: 17 мар 2019, 11:29
Ivan74
Убери это else if (RaySide.collider == null)
{
TouchedWall = false;
}

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

Мне нужно чтобы: хоть все 4 касались, хоть каждый по отдельности (любой один), тогда true. Если все не касаются, тогда false.
Ну как единый луч, только из четырёх.

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

СообщениеДобавлено: 17 мар 2019, 13:44
seaman
Вы вообще пробуете что Вам советуют? Или Вы умнее нас? Тогда зачем спрашивать?

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

СообщениеДобавлено: 17 мар 2019, 15:29
Ivan74
seaman писал(а):Вы вообще пробуете что Вам советуют? Или Вы умнее нас? Тогда зачем спрашивать?

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

P.S. Я никогда не ставлю себя выше других, чего и Вам советую.

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

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


break надо использовать.
Моя вина: сразу не сказал, что в методе помимо цикла ещё есть логика.
Спасибо!

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

СообщениеДобавлено: 17 мар 2019, 21:39
seaman
Чем break в данном случае отличается от return?
Разьве что в пером посте не весь метод приведен и после цикла еще что-то делается.

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

СообщениеДобавлено: 17 мар 2019, 21:50
Ivan74
seaman писал(а):Чем break в данном случае отличается от return?
Разьве что в пером посте не весь метод приведен и после цикла еще что-то делается.

Да, делается. Но я не стал засорять первый пост лишним (он к рейкасту не относится) кодом, вот и возникло недопонимание.
В любом случае, спасибо!

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

СообщениеДобавлено: 17 мар 2019, 22:53
AngryCat
Ivan74 писал(а):
Убери это else if (RaySide.collider == null)
{
TouchedWall = false;
}

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

Мне нужно чтобы: хоть все 4 касались, хоть каждый по отдельности (любой один), тогда true. Если все не касаются, тогда false.
Ну как единый луч, только из четырёх.
Тогда делай то, что я написал выше " Убери это else if (RaySide.collider == null)
{
TouchedWall = false;
}"
А вообще я расписал так, чтобы ты мог сам сделать вывод и понять как нужно