Hrungdak Geschrieben 11. Juni 2015 Melden Share Geschrieben 11. Juni 2015 Ich habe eine Klasse geschrieben, die mir den Umgang mit LayerMasks sehr vereinfacht. Damit das auch allgemein zugängig wird, habe ich alle Methoden in eine statische Klasse namens LayerHelper gepackt: using UnityEngine; public static class LayerHelper { public static int GetLayerMask(params int[] layers) { int result = 0; foreach (int layer in layers) { result = result | (1 << layer); } return result; } public static int GetLayerMask(params string[] layers) { int result = 0; foreach (string layer in layers) { int layerNumber = LayerMask.NameToLayer(layer); result = result | (1 << layerNumber); } return result; } public static int GetLayerMaskWithout(params int[] layers) { int result = 0; foreach (int layer in layers) { result = result | (1 << layer); } return ~result; } public static int GetLayerMaskWithout(params string[] layers) { int result = 0; foreach (string layer in layers) { int layerNumber = LayerMask.NameToLayer(layer); result = result | (1 << layerNumber); } return ~result; } } Die Verwendung ist ganz einfach. Um eine Layermask zu bekommen, die die Layers UI und Water umfasst, kannst du damit folgende Methode benutzen: int waterAndUi = LayerHelper.GetLayerMask("UI", "Water"); Um alle Masken ausser "UI" und "Water" zu bekommen: int allButWaterAndUi = LayerHelper.GetLayerMaskWithout("UI", "Water"); Das Ganze geht auch mit Layernummern: int waterAndUi = LayerHelper.GetLayerMask(3, 4); int allButWaterAndUi = LayerHelper.GetLayerMaskWithout(3, 4); Ich benutze lieber die Layernamen, auch wenn's ein wenig langsamer ist. Kann man ja in Start machen. 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
LightYarn Geschrieben 11. Juni 2015 Melden Share Geschrieben 11. Juni 2015 Bitte nicht falsch verstehen, aber welchen Vorteil hat man damit gegenüber der Variante mit public LayerMask layerMask; Und der daraus resultierenden Auswahlliste der Layer im Inspector? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hrungdak Geschrieben 11. Juni 2015 Autor Melden Share Geschrieben 11. Juni 2015 Bitte nicht falsch verstehen, aber welchen Vorteil hat man damit gegenüber der Variante mit public LayerMask layerMask; Und der daraus resultierenden Auswahlliste der Layer im Inspector? Ich habe LayerMask im Inspektor nie verwendet, also kann ich dir darauf keine zufriedenstellende Antwort geben. Kannst du im Inspektor dann mehrere Masks auswählen oder bestimmte ausschließen? Alle bis auf eine wählen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
LightYarn Geschrieben 11. Juni 2015 Melden Share Geschrieben 11. Juni 2015 Ja, das kann man damit. Das Menü entspricht zum Beispiel dem bei Lichtern oder Kameras, wenn man gewisse Layer entweder davon ausschließen möchte Licht zu empfangen, oder der Kamera sagt "diese Layer nicht sehen". Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 11. Juni 2015 Melden Share Geschrieben 11. Juni 2015 Ja, das mit den Layermasken als Public Var geht natürlich. Aber sein Code liest ja in endeffekt alle einfach ein und sie sind dann nutzbar ohne eine Public Var erst zu bestücken. Ich finde das sehr gut, denn nachträgliche neu erzeugte Layer werden auch berücksichtigt und man kann irgendwo in irgendeinem Script einfach eine Zeile ändern und es läuft. Also da sehe ich schon viele Vorteile drin. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Ismoh Geschrieben 6. Juli 2015 Melden Share Geschrieben 6. Juli 2015 Ich habe eine Klasse geschrieben, die mir den Umgang mit LayerMasks sehr vereinfacht. Damit das auch allgemein zugängig wird, habe ich alle Methoden in eine statische Klasse namens LayerHelper gepackt: using UnityEngine; public static class LayerHelper { public static int GetLayerMask(params int[] layers) { int result = 0; foreach (int layer in layers) { result = result | (1 << layer); } return result; } public static int GetLayerMask(params string[] layers) { int result = 0; foreach (string layer in layers) { int layerNumber = LayerMask.NameToLayer(layer); result = result | (1 << layerNumber); } return result; } public static int GetLayerMaskWithout(params int[] layers) { int result = 0; foreach (int layer in layers) { result = result | (1 << layer); } return ~result; } public static int GetLayerMaskWithout(params string[] layers) { int result = 0; foreach (string layer in layers) { int layerNumber = LayerMask.NameToLayer(layer); result = result | (1 << layerNumber); } return ~result; } } Die Verwendung ist ganz einfach. Um eine Layermask zu bekommen, die die Layers UI und Water umfasst, kannst du damit folgende Methode benutzen: int waterAndUi = LayerHelper.GetLayerMask("UI", "Water"); Um alle Masken ausser "UI" und "Water" zu bekommen: int allButWaterAndUi = LayerHelper.GetLayerMaskWithout("UI", "Water"); Das Ganze geht auch mit Layernummern: int waterAndUi = LayerHelper.GetLayerMask(3, 4); int allButWaterAndUi = LayerHelper.GetLayerMaskWithout(3, 4); Ich benutze lieber die Layernamen, auch wenn's ein wenig langsamer ist. Kann man ja in Start machen. Ich bedanke mich recht herzlich für die extrem praktische "Extension". Man braucht einfach nicht sonnlos rummklicken (public LayerMask-Variante), außerdem kommt es bei mir sehr häufig vor, dass Elemente zur Laufzeit erstellt werden, sodass die "public LayerMask-Variante" nicht benutzt werden kann. Man muss dir eine positive Rückmeldung geben, sonst war es das erste (Vermutung) und letzte Schnipsel. 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hrungdak Geschrieben 7. Juli 2015 Autor Melden Share Geschrieben 7. Juli 2015 Ich bedanke mich recht herzlich für die extrem praktische "Extension". Man braucht einfach nicht sonnlos rummklicken (public LayerMask-Variante), außerdem kommt es bei mir sehr häufig vor, dass Elemente zur Laufzeit erstellt werden, sodass die "public LayerMask-Variante" nicht benutzt werden kann. Man muss dir eine positive Rückmeldung geben, sonst war es das erste (Vermutung) und letzte Schnipsel. Freut mich, wenn's dir hilft. Ob das das letzte Schnipsel war, wird sich rausstellen. Weiß ich, ob ich noch mal was zu Stande bringe? Allerdings freue ich mich genau so über konstruktive Kritik und der Hinweis von LightYarn ist an dieser Stelle durchaus angebracht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.