kruasan1
@kruasan1
Indie Game Developer

Как проверить что Raycast ни во что не врезался?

У меня есть скрипт который показывает текст при наведении на обьект с тегом "Eaten"
void EatObject ()
    {
        RaycastHit hit;
        if (Physics.Raycast(Camera.transform.position, Camera.transform.forward, out hit, range, ~IgnoreMe))
        {
            if (hit.collider.tag == "Eaten")
            {
                BtnE.SetActive(true);
                Debug.Log("сьедобно");
                isWorkThat = true;
            }
            else
            {
                isWorkThat = false;
                BtnE.SetActive(false);
            }
        }
    }

Проблема в том, что у луча есть дистанция и если словить момент когда я смотрю на обьект и отхожу от него, то надпись остается и не исчезает. Нужно сделать так чтобы она исчезала когда я нахожусь далеко от обьекта и даже если смотрю на него, она также должна исчезать.
  • Вопрос задан
  • 99 просмотров
Пригласить эксперта
Ответы на вопрос 3
freeExec
@freeExec
Участник OpenStreetMap
Так а где код, когда Raycast вернул false?
Ответ написан
WNeZRoS
@WNeZRoS
Если Physics.Raycast вернул false, то "Raycast ни во что не врезался".

В вашем коде надо у первого if добавить else блок, и там напить обработку этого случая.
Но без дублирования кода будет проще после isWorkThat = true; добавить return;, а содержимое else блока перенести в конец функции после всех if.
Ответ написан
Комментировать
@Swish123
Хочется стать хорошим программистом...
Верхний комментатор написал все правильно, просто не очень понятно. Я сам искал ответ на похожий с вашим вопрос, увидел нижний комментарий и с начала не до понял, а потом как резко понял.
Держите готовый код:
void EatObject()
{
    RaycastHit hit;
    if (Physics.Raycast(Camera.transform.position, Camera.transform.forward, out hit, range, ~IgnoreMe))
    {
        if (hit.collider.tag == "Eaten")
        {
            BtnE.SetActive(true);
            Debug.Log("сьедобно");
            isWorkThat = true;
        }
        else
        {
            isWorkThat = false;
            BtnE.SetActive(false);
        }
    }
    else
    {
       //Здесь то что вы хотели сделать когда рейкаст не попадает в объект
    }
}


Вкратце Physics.Raycast может возвращать значение false когда ни во что не врезается, это работает точно так же как и булиан переменная.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы