Я наконец понял, почему мои маски слоев для моего кода столкновения с землей не работают. Я использовал, NameToLayer()
чтобы получить нужный мне слой, но маски слоя используют сдвиг битов, чтобы фактически установить значение маски слоя. Это чрезвычайно необычно, и я не вижу причин, почему это не обрабатывается в коде позади. Почему мы должны использовать такой код:
mask = 1 << LayerMask.NameToLayer("Default");
когда как то так
mask = LayerMask.NameToLayer("Default");
имеет более интуитивный смысл и работает аналогично остальной части Unity API?
Ответы:
Это чрезвычайно эффективно. Вот и все, что нужно - сравнение строк в качестве очевидного примера медленнее в 10 раз. И физические вычисления должны быть очень оптимизированы, поэтому хорошо, что кто-то, кто знал, что происходит, написал это таким образом.
Таким образом, очевидный последующий вопрос - почему это не обернуто во вспомогательный метод для обработки преобразования и сдвига битов. Я думаю, что на самом деле никто не дошел до этого - я свернул свою собственную полезную вспомогательную утилиту, и это обычная практика.
источник
Использование сдвига битов позволяет учитывать несколько слоев в одной физической операции:
Без смещения битов вам будет разрешено осуществлять радиопередачу в одном слое и только в одном. В то время как со сдвигом битов, вы можете raycast в нескольких конкретных слоях:
Вы также можете выполнять Raycast на всех слоях, кроме определенных:
Если вы посмотрите на «Диспетчер слоев» в Unity, слои можно рассматривать как индексы простого одномерного массива .
РЕДАКТИРОВАТЬ: я никогда не видел его раньше, но у
LayerMask
класса есть функция полезности, чтобы получить «вычисляемую» маску слоя с учетом имен слоев:Допустим
UserLayerA
иUserLayerB
десятый и одиннадцатый слои. Они будут иметь значения уровня пользователя 10 и 11. Чтобы получить значение маски слоя, их имена могут быть переданы в GetMask. Аргумент может быть либо списком их имен, либо массивом строк, хранящих их имена. В этом случае возвращаемое значение будет 2 ^ 10 + 2 ^ 11 = 3072.Ссылка на документацию: https://docs.unity3d.com/ScriptReference/LayerMask.GetMask.html
источник
|
вместо целочисленного сложения+
, целочисленное сложение может привести к неожиданному поведению.LayerMask.NamesToLayers(params string[] layerNames)