Jump to content
Unity Insider Forum

LayerMasks definieren


Hrungdak

Recommended Posts

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 4 weeks later...

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. :P

Link zu diesem Kommentar
Auf anderen Seiten teilen

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. :P

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...