J'ai enfin compris pourquoi mes masques de calque pour mon code de collision au sol ne fonctionnaient pas. J'utilisais NameToLayer()
pour obtenir le calque dont j'avais besoin, mais les masques de calque utilisent le décalage de bits pour définir la valeur du masque de calque. C'est extrêmement inhabituel et je ne vois aucune raison pour laquelle cela n'est pas géré dans le code derrière. Pourquoi devons-nous utiliser un code comme celui-ci:
mask = 1 << LayerMask.NameToLayer("Default");
quand quelque chose comme ça:
mask = LayerMask.NameToLayer("Default");
est plus intuitif et fonctionne de manière similaire au reste de l'API Unity?
Réponses:
C'est extrêmement performant. C'est tout ce qu'il y a à faire - comparer les chaînes comme l'exemple évident est plus lent d'un facteur 10. Et les calculs physiques doivent être très optimisés, il est donc bon que quelqu'un qui savait ce qui se passe l'écrive de cette façon.
Donc, la question de suivi évidente est - pourquoi n'est-ce pas enveloppé dans une méthode d'aide pour gérer la conversion et le décalage de bits. Je pense que personne n'y est vraiment parvenu - j'ai créé mon propre utilitaire d'assistance astucieux et c'est la pratique courante.
la source
L'utilisation du décalage de bits vous permet de prendre en compte plusieurs couches en une seule opération physique:
Sans décalage de bit, vous seriez autorisé à diffuser des rayons en une seule couche et une seule. Avec le décalage de bits, vous pouvez diffuser des rayons en plusieurs couches spécifiques:
Vous pouvez également diffuser des rayons dans toutes les couches sauf celles spécifiques:
Si vous regardez le "Gestionnaire de calques" dans Unity, les calques peuvent être considérés comme les indices d'un simple tableau à une dimension .
EDIT: Je ne l'ai jamais vu auparavant, mais le
LayerMask
classe a une fonction utilitaire pour obtenir le masque de calque "calculé" étant donné les noms des calques:Supposer
UserLayerA
que ceUserLayerB
sont les dixième et onzième couches. Ceux-ci auront une valeur de couche utilisateur de 10 et 11. Pour obtenir leur valeur de masque de couche, leurs noms peuvent être passés dans GetMask. L'argument peut être soit une liste de leurs noms, soit un tableau de chaînes stockant leurs noms. Dans ce cas, la valeur de retour sera 2 ^ 10 + 2 ^ 11 = 3072.Lien vers la documentation: https://docs.unity3d.com/ScriptReference/LayerMask.GetMask.html
la source
|
au niveau du bit au lieu de l'ajout d'entiers+
lors de l'union des masques, l'ajout d'entiers peut produire un comportement inattendu.LayerMask.NamesToLayers(params string[] layerNames)