unity3d
Stichworte
Suche…
Einführung
Ein Tag ist eine Zeichenfolge, die zum Markieren von GameObject
Typen verwendet werden kann. Auf diese Weise können bestimmte GameObject
Objekte einfacher über Code identifiziert werden.
Ein Tag kann auf ein oder mehrere Spielobjekte angewendet werden, ein Spielobjekt hat jedoch immer nur ein Tag. Standardmäßig wird das Tag "Untagged" verwendet, um ein GameObject
, das nicht absichtlich markiert wurde.
Tags erstellen und anwenden
Tags werden normalerweise über den Editor angelegt. Sie können Tags jedoch auch über ein Skript anwenden. Jedes benutzerdefinierte Tag muss über das Fenster " Tags & Layer" erstellt werden , bevor es auf ein Spielobjekt angewendet wird.
Tags im Editor einstellen
Wenn Sie ein oder mehrere Spielobjekte ausgewählt haben, können Sie im Inspector ein Tag auswählen. Spielobjekte tragen immer ein einzelnes Tag. Standardmäßig werden Spielobjekte als "Nicht getagged" gekennzeichnet . Sie können auch zum Fenster " Tags & Layer " wechseln, indem Sie "Add Tag ..." auswählen. Es ist jedoch wichtig zu beachten, dass Sie nur zum Fenster Tags & Layers gelangen . Alle von Ihnen erstellten Tags werden nicht automatisch auf das Spielobjekt angewendet.
Tags über Skript einstellen
Sie können ein Spielobjekt-Tag direkt über den Code ändern. Es ist wichtig zu beachten , dass Sie einen Tag aus der Liste der aktuellen Tags muss; Wenn Sie ein Tag angeben, das noch nicht erstellt wurde, führt dies zu einem Fehler.
Wie in anderen Beispielen beschrieben, kann die Verwendung einer Reihe static string
Variablen im Gegensatz zum manuellen Schreiben jedes Tags die Konsistenz und Zuverlässigkeit gewährleisten.
Das folgende Skript veranschaulicht, wie wir eine Reihe von Spielobjekt-Tags ändern können, indem static string
Referenzen verwendet werden, um die Konsistenz zu gewährleisten. Beachten Sie die Annahme, dass jede static string
ein Tag darstellt, das bereits im Fenster Tags & Layers erstellt wurde .
using UnityEngine;
public class Tagging : MonoBehaviour
{
static string tagUntagged = "Untagged";
static string tagPlayer = "Player";
static string tagEnemy = "Enemy";
/// <summary>Represents the player character. This game object should
/// be linked up via the inspector.</summary>
public GameObject player;
/// <summary>Represents all the enemy characters. All enemies should
/// be added to the array via the inspector.</summary>
public GameObject[] enemy;
void Start ()
{
// We ensure that the game object this script is attached to
// is left untagged by using the default "Untagged" tag.
gameObject.tag = tagUntagged;
// We ensure the player has the player tag.
player.tag = tagUntagged;
// We loop through the enemy array to ensure they are all tagged.
for(int i = 0; i < enemy.Length; i++)
{
enemy[i].tag = tagEnemy;
}
}
}
Benutzerdefinierte Tags erstellen
Unabhängig davon, ob Sie Tags über den Inspector oder über Skript festlegen, müssen Sie Tags vor der Verwendung über das Fenster Tags & Layers deklarieren. Sie können auf dieses Fenster zugreifen, indem Sie in einem Dropdown-Menü für Spielobjekte-Tags "Tags hinzufügen" auswählen. Alternativ finden Sie das Fenster unter Bearbeiten> Projekteinstellungen> Tags und Ebenen .
Wählen Sie einfach die Schaltfläche + , geben Sie den gewünschten Namen ein und wählen Sie Speichern , um ein Tag zu erstellen. Durch Auswahl der Schaltfläche - wird das aktuell hervorgehobene Tag entfernt. Beachten Sie, dass das Tag auf diese Weise sofort als "(entfernt)" angezeigt wird und beim nächsten Laden des Projekts vollständig entfernt wird.
Durch Auswählen des Zahnrads / Zahnrads oben rechts im Fenster können Sie alle benutzerdefinierten Optionen zurücksetzen. Dadurch werden alle benutzerdefinierten Tags sowie alle unter "Sortierebenen" und "Ebenen" vorhandenen benutzerdefinierten Ebenen sofort entfernt.
Suche nach GameObjects nach Tag:
Tags machen es besonders einfach, bestimmte Spielobjekte zu finden. Wir können nach einem einzelnen Spielobjekt oder nach mehreren Objekten suchen.
Ein einzelnes GameObject
Wir können die statische Funktion GameObject.FindGameObjectWithTag(string tag)
, um nach einzelnen Spielobjekten zu suchen. Es ist wichtig anzumerken, dass auf diese Weise Spielobjekte nicht in einer bestimmten Reihenfolge abgefragt werden. Wenn Sie nach einem Tag suchen, das für mehrere Spielobjekte in der Szene verwendet wird, kann diese Funktion nicht garantieren, welches Spielobjekt zurückgegeben wird. Daher ist es sinnvoller, wenn wir wissen, dass nur ein Spielobjekt einen solchen Tag verwendet, oder wenn wir uns nicht um die genaue Instanz von GameObject
, die zurückgegeben wird.
///<summary>We create a static string to allow us consistency.</summary>
string playerTag = "Player"
///<summary>We can now use the tag to reference our player GameObject.</summary>
GameObject player = GameObject.FindGameObjectWithTag(playerTag);
Suchen eines Arrays von GameObject
Instanzen
Wir können die statische Funktion GameObject.FindGameObjectsWithTag(string tag)
, um nach allen Spielobjekten zu suchen, die ein bestimmtes Tag verwenden. Dies ist nützlich, wenn eine Gruppe bestimmter Spielobjekte durchlaufen werden soll. Dies kann auch nützlich sein, wenn wir ein einzelnes Spielobjekt suchen möchten, aber möglicherweise mehrere Spielobjekte haben, die dasselbe Tag verwenden. Da wir nicht garantieren können, welche Instanz von GameObject.FindGameObjectWithTag(string tag)
, müssen Sie stattdessen ein Array aller potenziellen GameObject
Instanzen mit GameObject.FindGameObjectsWithTag(string tag)
und das resultierende Array weiter analysieren, um die Instanz zu finden, die wir sind Auf der Suche nach.
///<summary>We create a static string to allow us consistency.</summary>
string enemyTag = "Enemy";
///<summary>We can now use the tag to create an array of all enemy GameObjects.</summary>
GameObject[] enemies = GameObject.FindGameObjectsWithTag(enemyTag );
// We can now freely iterate through our array of enemies
foreach(GameObject enemy in enemies)
{
// Do something to each enemy (link up a reference, check for damage, etc.)
}
Tags vergleichen
Beim Vergleich zweier GameObjects nach Tags sollte Folgendes beachtet werden: Garbage Collector verursacht Mehraufwand, da jedes Mal eine Zeichenfolge erstellt wird:
if (go.Tag == "myTag")
{
//Stuff
}
Wenn Sie diese Vergleiche in Update () und einem anderen normalen Callback (oder einer Schleife) von Unity durchführen, sollten Sie diese Methode ohne Heap-Zuweisung verwenden:
if (go.CompareTag("myTag")
{
//Stuff
}
Außerdem ist es einfacher, Ihre Tags in einer statischen Klasse zu halten.
public static class Tags
{
public const string Player = "Player";
public const string MyCustomTag = "MyCustomTag";
}
Dann können Sie sicher vergleichen
if (go.CompareTag(Tags.MyCustomTag)
{
//Stuff
}
Auf diese Weise werden Ihre Tag-Zeichenfolgen zur Kompilierzeit generiert und Sie begrenzen die Auswirkungen von Rechtschreibfehlern.
Genauso wie Tags in einer statischen Klasse gehalten werden, ist es auch möglich, sie in einer Aufzählung zu speichern:
public enum Tags
{
Player, Ennemies, MyCustomTag;
}
und dann können Sie es mit der Methode enum toString()
:
if (go.CompareTag(Tags.MyCustomTag.toString())
{
//Stuff
}