Вы можете взглянуть на эту ветку , чтобы получить более подробные объяснения того, как именно работают LayerMasks.
Вкратце: LayerMask в основном является значением типа int. Он представляет собой двоичную 32-битную систему флагов, в которой вы включаете (1
) и выключаете (0
) определенные индексы уровня. Так, например значение
0000 0000 0000 0000 0000 0000 0000 0101
| |
| |layer1
|
|layer3
означает, что layer1 и layer3 должны быть включены и в десятичном формате имеют значение 5
.
Конечно, есть варианты сделать эту маску постоянной. Простейшим способом будет один раз вывести
LayerMask mask = LayerMask.GetMask("Terrarin");
Debug.Log(mask.value);
, который даст вам десятичное представление маски слоя. И чем вы можете просто использовать
// 256 e.g. is the layer9
// the first entry after Unity's 8 default layers
LayerMask mask = 256;
или, если вы уже знаете индекс нужного слоя, вы также можете просто использовать
LayerMask mask = 1 << 9;
Или используйте эти Двоичные -> Десятичный преобразователь & Десятичный -> Двоичный преобразователь
Конечно, вы можете сделать это только в Update
, но зачем создавать его каждый кадр? Если вы все равно жестко закодируете его, вы можете использовать const
или, как сказано в другом ответе, просто получить значение один раз в Awake
.
Я тоже не понимаю твоих опасений по поводу "объема". Пока это остается частным, это не имеет значения
.. наоборот: ваше решение Update
выделяет и уничтожает mask
снова и снова -> больше работы для GC.
Однако я бы НЕ рекомендовал это!
Это очень плохой дизайн по двум причинам:
Позднее изменение дизайна, и вам придется изменить код. Вы переименовываете слой, вы должны изменить код. Вы хотите добавить слой к маске позже, чем вам сначала придется пересчитать значения. и т.д ...
Это делает ваш код на 0% гибким и пригодным для повторного использования! Представьте, что теперь у вас закончена система Raycaster. Теперь вы хотите, чтобы другой объект в сцене просвечивал другой слой ... Итак, вы бы предпочли скопировать весь сценарий, просто чтобы изменить жестко закодированный слой (я надеюсь, что нет), или вы бы предпочли использовать тот же сценарий и просто изменить слой значение.
Таким образом, на самом деле, на мой взгляд, лучшим решением было бы никогда жестко кодировать имена слоев / индексы / маски вообще, а лучше позволить разработчику настроить его в инспекторе. Вы по-прежнему можете задать ему жестко заданное значение по умолчанию, например,
[SerializeField] private LayerMask mask = 256;
это дает вам поле в Инспекторе, где вы можете просто выбрать ваши слои. Вы даже можете изменить их во время выполнения по причинам отладки.