Recherche…


Introduction

Une balise est une chaîne pouvant être appliquée pour marquer les types GameObject . De cette façon, il est plus facile d'identifier des objets GameObject particuliers via du code.

Une balise peut être appliquée à un ou plusieurs objets de jeu, mais un objet de jeu ne comporte toujours qu'une seule balise. Par défaut, la balise "Untagged" est utilisée pour représenter un objet GameObject qui n’a pas été intentionnellement balisé.

Création et application de balises

Les balises sont généralement appliquées via l'éditeur; Cependant, vous pouvez également appliquer des balises via un script. Toute balise personnalisée doit être créée via la fenêtre Balises et calques avant d'être appliquée à un objet de jeu.


Définition de balises dans l'éditeur

Avec un ou plusieurs objets de jeu sélectionnés, vous pouvez sélectionner une étiquette de l'inspecteur. Les objets de jeu porteront toujours une seule balise; Par défaut, les objets du jeu seront marqués comme "non marqués" . Vous pouvez également passer à la fenêtre Balises et calques en sélectionnant "Ajouter une balise ..." ; Cependant, il est important de noter que cela vous amène uniquement à la fenêtre Balises et calques . Tout tag que vous créez ne s'appliquera pas automatiquement à l'objet de jeu.

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


Définition de balises via un script

Vous pouvez directement modifier une balise d'objets de jeu via un code. Il est important de noter que vous devez fournir une balise à partir de la liste des balises actuelles. Si vous fournissez un tag qui n'a pas encore été créé, cela entraînera une erreur.

Comme détaillé dans d'autres exemples, l'utilisation d'une série de variables de static string , par opposition à l'écriture manuelle de chaque balise, peut garantir la cohérence et la fiabilité.


Le script suivant montre comment modifier une série de balises d'objets de jeu, en utilisant static string références de static string pour assurer la cohérence. Notez que chaque static string représente une balise déjà créée dans la fenêtre Balises et calques .

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;
        }
    }
}

Création de balises personnalisées

Que vous définissiez des balises via l'inspecteur ou via un script, les balises doivent être déclarées via la fenêtre Balises et calques avant d'être utilisées. Vous pouvez accéder à cette fenêtre en sélectionnant "Ajouter des balises ..." dans le menu déroulant des balises d'objets de jeu. Vous pouvez également trouver la fenêtre sous Edition> Paramètres du projet> Balises et calques .

Tags can contain spaces and punctuation.

Sélectionnez simplement le bouton + , entrez le nom souhaité et sélectionnez Enregistrer pour créer un tag. En sélectionnant le bouton - , vous supprimez l'étiquette en surbrillance. Notez que de cette manière, le tag sera immédiatement affiché comme "(Supprimé)" , et sera complètement supprimé lors du prochain rechargement du projet.

Sélectionner l'engrenage / cog en haut à droite de la fenêtre vous permettra de réinitialiser toutes les options personnalisées. Cela supprimera immédiatement toutes les balises personnalisées, ainsi que tout calque personnalisé que vous pouvez avoir sous "Tri des calques" et "Calques" .

Recherche de GameObjects par tag:

Les balises facilitent la localisation d'objets de jeu spécifiques. Nous pouvons rechercher un seul objet de jeu ou en chercher plusieurs.


Trouver un seul GameObject

Nous pouvons utiliser la fonction statique GameObject.FindGameObjectWithTag(string tag) pour rechercher des objets de jeu individuels. Il est important de noter que, de cette manière, les objets de jeu ne sont interrogés dans aucun ordre particulier. Si vous recherchez une étiquette qui est utilisé sur des objets de jeu multiples dans la scène, cette fonction ne sera pas en mesure de garantir quel objet jeu est retourné. En tant que tel, il est plus approprié quand on sait que seul un objet de jeu utilise une telle étiquette, ou lorsque nous ne sommes pas préoccupés par l'instance exacte de GameObject qui est retourné.

///<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);

Recherche d'un tableau d'instances GameObject

Nous pouvons utiliser la fonction statique GameObject.FindGameObjectsWithTag(string tag) pour rechercher tous les objets de jeu qui utilisent une balise particulière. Ceci est utile quand on veut parcourir un groupe d'objets de jeu particuliers. Cela peut également être utile si vous souhaitez trouver un seul objet de jeu, mais que plusieurs objets de jeu peuvent utiliser la même balise. Comme nous ne pouvons pas garantir l'instance exacte renvoyée par GameObject.FindGameObjectWithTag(string tag) , nous devons plutôt récupérer un tableau de toutes les instances potentielles de GameObject avec GameObject.FindGameObjectsWithTag(string tag) et analyser plus en détail le tableau résultant à la recherche de.

///<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.)
}

Comparaison de balises

Lorsque vous comparez deux GameObjects par des balises, il convient de noter que ce qui suit entraînerait une surcharge de Garbage Collector car une chaîne est créée à chaque fois:

if (go.Tag == "myTag")
{ 
    //Stuff 
}

Lorsque vous effectuez ces comparaisons dans Update () et dans un autre callback Unity (ou une boucle), vous devez utiliser cette méthode sans allocation de tas:

if (go.CompareTag("myTag")
{ 
    //Stuff 
}

De plus, il est plus facile de conserver vos tags dans une classe statique.

public static class Tags
{
    public const string Player = "Player";
    public const string MyCustomTag = "MyCustomTag";
}

Ensuite, vous pouvez comparer en toute sécurité

if (go.CompareTag(Tags.MyCustomTag)
{ 
    //Stuff 
}

De cette façon, vos chaînes de mots-clés sont générées au moment de la compilation et vous limitez les implications des fautes d'orthographe.


Tout comme conserver les balises dans une classe statique, il est également possible de les stocker dans une énumération:

public enum Tags
{
    Player, Ennemies, MyCustomTag;
}

et puis vous pouvez le comparer en utilisant la toString() enum toString() :

if (go.CompareTag(Tags.MyCustomTag.toString())
{ 
    //Stuff 
}


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow