LayerMask | Unity 2018.3f

163
26 июля 2019, 21:20
if (movement != Vector3.zero)
    {
        LayerMask myMask = 1 << 8;
        if (!Physics.Raycast(this.transform.position + Vector3.up, transform.forward, 1f))
        {
            _playerAnimator.SetBool("Walk", true);
        }
        else
        {
            _playerAnimator.SetBool("Walk", false);
        }
        _playerRigidbody.MovePosition(transform.position + movement);
        this.transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(movement.normalized), 4 * Time.deltaTime);
    }
    else
    {
        _playerAnimator.SetBool("Walk", false);
    }
}

Я хочу, чтобы этот Raycast не реагировал на триггеры. Для этого я создал отдельный слой (N9). Здесь все вроде нормально и синтаксис не нарушен, но тем не менее объект, который использует этот скрипт вообще ни на что не реагирует. Можете помочь, пожалуйста.

Answer 1

Маску вы может и задали (кстати, задали вы ее неверно), а где вы ее используете?

LayerMask myMask = 1 << 8;
if (!Physics.Raycast(this.transform.position + Vector3.up, transform.forward, 1f, ?где маска?))
{
    ...
}

Чтобы игнорировать 9 слой, нужно задать маску вот так: LayerMask myMask = !(1 << 9);

  1. 1 << 9 -> 10_0000_0000 - маска указывает только на 9й слой
  2. ~(1 << 9) -> 01_1111_1111 - маска указывает на все слои, кроме 9го

Чтобы рейкаст учитывал маску, а не использовал дефолтную, пишем:

LayerMask myMask = ~(1 << 9);
if (!Physics.Raycast(this.transform.position + Vector3.up, transform.forward, 1f, myMask))
{
    ...
}

А вообще для таких случаев в рейкасте есть специальный параметр QueryTriggerInteraction, который позволяет игнорировать вообще любые триггеры:

Physics.Raycast(
    this.transform.position + Vector3.up,
    transform.forward,
    1f,
    Physics.DefaultRaycastLayers,
    QueryTriggerInteraction.Ignore
)
Answer 2

Сделайте проще, заведите у себя в компоненте public переменную LayerMask, и используйте сравнение с уже настроенной через редактор переменной. Прописывать в коде номер маски не гуд. Если вам в последствии потребуется заменить слой или сделать более сложную маску из комбинации нескольких слоев, вы просто сделаете настройку через редактор не правя кода.

READ ALSO
Как скачать картинку с сайта?

Как скачать картинку с сайта?

Я пытаюсь сделать парсер на основе "AngleSharp"Я использую следующий код для скачивания:

285
Как пропускать пустые значения в INI файле?

Как пропускать пустые значения в INI файле?

Подскажите как пропускать чтение пустых параметров из INI файла, чтобы при загрузке формы не выдавало ошибку - нет логического значения

162
Преобразование сложной строки в массив

Преобразование сложной строки в массив

Есть строка вида[{"value":"imagine dragons","url":"\/artist\/547-imagine-dragons\/"}] хочу перевести его в массив для дальнейшей обработки, например, строку перевести в массив...

154