Ich habe endlich herausgefunden, warum meine Ebenenmasken für meinen Bodenkollisionscode nicht funktionierten. Ich habe verwendet NameToLayer()
, um die Ebene zu erhalten, die ich brauchte, aber Ebenenmasken verwenden Bitverschiebung, um den Ebenenmaskenwert tatsächlich festzulegen. Dies ist äußerst ungewöhnlich und ich sehe keinen Grund, warum dies im Code dahinter nicht behandelt wird. Warum müssen wir Code wie diesen verwenden:
mask = 1 << LayerMask.NameToLayer("Default");
wenn so etwas:
mask = LayerMask.NameToLayer("Default");
macht intuitiver Sinn und funktioniert ähnlich wie der Rest der Unity-API?
Antworten:
Dies ist äußerst performant. Das ist alles, was es zu tun gibt - der Vergleich von Strings als offensichtliches Beispiel ist um den Faktor 10 langsamer. Und physikalische Berechnungen müssen sehr optimiert werden. Es ist also gut, dass jemand, der wusste, was los ist, es so geschrieben hat.
Die offensichtliche Folgefrage lautet also: Warum ist dies nicht in eine Hilfsmethode eingewickelt, um die Konvertierung und Bitverschiebung zu handhaben? Ich denke, dass niemand wirklich dazu gekommen ist - ich habe mein eigenes nützliches Hilfsprogramm aufgerollt, und das ist die übliche Praxis.
quelle
Mit der Bitverschiebung können Sie mehrere Schichten in einer physikalischen Operation berücksichtigen:
Ohne Bitverschiebung könnten Sie in einer Schicht und nur in einer Schicht strahlen. Während der Bitverschiebung können Sie Raycasts in mehreren spezifischen Ebenen durchführen:
Sie können auch Raycasts in allen Ebenen mit Ausnahme bestimmter senden :
Wenn Sie sich den "Ebenenmanager" in Unity ansehen , können Ebenen als Indizes eines einfachen eindimensionalen Arrays angesehen werden .
EDIT: Ich habe es noch nie gesehen, aber die
LayerMask
Klasse hat eine Utility-Funktion, um die "berechnete" Ebenenmaske mit den Ebenennamen zu erhalten:Angenommen,
UserLayerA
undUserLayerB
sind die zehnte und elfte Schicht. Diese haben einen Benutzerebenenwert von 10 und 11. Um ihren Ebenenmaskenwert zu erhalten, können ihre Namen an GetMask übergeben werden. Das Argument kann entweder eine Liste ihrer Namen oder ein Array von Zeichenfolgen sein, in denen ihre Namen gespeichert sind. In diesem Fall beträgt der Rückgabewert 2 ^ 10 + 2 ^ 11 = 3072.Link zur Dokumentation: https://docs.unity3d.com/ScriptReference/LayerMask.GetMask.html
quelle
|
anstelle der Ganzzahladdition verwenden,+
wenn Sie Masken zusammenfassen. Die Ganzzahladdition kann zu unerwartetem Verhalten führen.LayerMask.NamesToLayers(params string[] layerNames)