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.

The tag drop-down menu can be found directly below the game objects name in the Inspector window.


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 .

Tags can contain spaces and punctuation.

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 
}


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow