W końcu zorientowałem się, dlaczego moje maski warstw dla mojego kodu kolizji z ziemią nie działają. Używałem, NameToLayer()
aby uzyskać potrzebną warstwę, ale maski warstw używają przesunięcia bitowego, aby faktycznie ustawić wartość maski warstwy. Jest to niezwykle nietypowe i nie widzę żadnego powodu, dla którego nie byłoby to obsługiwane w kodzie z tyłu. Dlaczego musimy używać takiego kodu:
mask = 1 << LayerMask.NameToLayer("Default");
gdy coś takiego:
mask = LayerMask.NameToLayer("Default");
ma bardziej intuicyjny sens i działa podobnie do reszty interfejsu API Unity?
Odpowiedzi:
To jest niezwykle wydajne. To wszystko - porównywanie ciągów, ponieważ oczywisty przykład jest wolniejszy dziesięciokrotnie. A obliczenia fizyki muszą być bardzo zoptymalizowane, więc dobrze, że ktoś, kto wiedział, co się dzieje, napisał to w ten sposób.
Zatem oczywistym pytaniem jest - dlaczego nie jest to zawarte w metodzie pomocniczej do obsługi konwersji i zmiany bitów. Myślę, że tak naprawdę nikt tego nie dotarł - zwinąłem swoją własną sprytną pomocniczkę i jest to powszechna praktyka.
źródło
Korzystanie z przesunięcia bitowego pozwala uwzględnić wiele warstw w jednej operacji fizycznej:
Bez przesuwania bitów, możesz raycastować w jednej warstwie i tylko w jednej. Podczas przesuwania bitów możesz raycast na wielu określonych warstwach:
Możesz także raycastować na wszystkich warstwach oprócz określonych:
Jeśli spojrzysz na „Menedżera warstw” w Unity, warstwy mogą być postrzegane jako wskaźniki prostej tablicy jednowymiarowej .
EDYCJA: Nigdy wcześniej go nie widziałem, ale
LayerMask
klasa ma funkcję użyteczną do uzyskania „obliczonej” maski warstwy, biorąc pod uwagę nazwy warstw:Załóżmy
UserLayerA
iUserLayerB
są dziesiątą i jedenastą warstwą. Będą miały wartości warstwy użytkownika 10 i 11. Aby uzyskać wartość maski warstwy, ich nazwy można przekazać do GetMask. Argumentem może być lista ich nazw lub tablica ciągów przechowujących ich nazwy. W takim przypadku zwracana wartość będzie wynosić 2 ^ 10 + 2 ^ 11 = 3072.Link do dokumentacji: https://docs.unity3d.com/ScriptReference/LayerMask.GetMask.html
źródło
|
zamiast dodawania liczb+
całkowitych, dodawanie liczb całkowitych może powodować nieoczekiwane zachowanie.LayerMask.NamesToLayers(params string[] layerNames)