Saya akhirnya tahu mengapa layer mask saya untuk kode tumbukan tanah saya tidak berfungsi. Saya menggunakan NameToLayer()
untuk mendapatkan layer yang saya butuhkan, tetapi layer mask menggunakan bit shifting untuk benar-benar menetapkan nilai layer mask. Ini sangat tidak biasa dan saya tidak melihat alasan mengapa ini tidak ditangani dalam kode di belakang. Mengapa kita harus menggunakan kode seperti ini:
mask = 1 << LayerMask.NameToLayer("Default");
ketika sesuatu seperti ini:
mask = LayerMask.NameToLayer("Default");
masuk akal lebih intuitif dan bekerja mirip dengan sisa Unity API?
Jawaban:
Ini sangat performant. Hanya itu yang ada padanya - membandingkan string sebagai contoh yang jelas lebih lambat dengan faktor 10. Dan perhitungan fisika harus sangat dioptimalkan, jadi ada baiknya bahwa seseorang yang tahu apa yang terjadi menulisnya dengan cara ini.
Jadi pertanyaan tindak lanjut yang jelas adalah - mengapa ini tidak dibungkus dengan metode pembantu untuk menangani konversi dan pergeseran bit. Saya pikir tidak ada yang benar-benar melakukannya - saya telah menggulung utilitas pembantu yang bagus dan itu adalah praktik umum.
sumber
Menggunakan bit shifting memungkinkan Anda untuk memperhitungkan banyak lapisan dalam satu operasi fisika:
Tanpa menggeser sedikit, Anda akan diizinkan untuk raycast dalam satu layer dan hanya satu. Sementara dengan sedikit pergeseran, Anda dapat raycast di beberapa lapisan tertentu:
Anda juga dapat raycast di setiap lapisan kecuali yang spesifik:
Jika Anda melihat "Manajer layer" di Unity, layer dapat dilihat sebagai indeks array satu dimensi yang sederhana .
EDIT: Saya belum pernah melihatnya sebelumnya, tetapi
LayerMask
kelas memiliki fungsi utilitas untuk mendapatkan lapisan "dikomputasi" diberi nama lapisan:Misalkan
UserLayerA
danUserLayerB
adalah lapisan kesepuluh dan kesebelas. Ini akan memiliki nilai-nilai Layer Pengguna dari 10 dan 11. Untuk mendapatkan nilai layer mask mereka nama mereka dapat diteruskan ke GetMask. Argumen dapat berupa daftar nama mereka atau array string yang menyimpan nama mereka. Dalam hal ini nilai pengembaliannya adalah 2 ^ 10 + 2 ^ 11 = 3072.Tautan ke dokumentasi: https://docs.unity3d.com/ScriptReference/LayerMask.GetMask.html
sumber
|
bukannya penambahan bilangan bulat+
saat membuat penyatuan topeng, penambahan bilangan bulat mungkin menghasilkan perilaku yang tidak terduga.LayerMask.NamesToLayers(params string[] layerNames)