Ricerca…
introduzione
Un tag è una stringa che può essere applicata per contrassegnare i tipi GameObject
. In questo modo, è più facile identificare determinati oggetti GameObject
tramite codice.
Un tag può essere applicato a uno o più oggetti di gioco, ma un oggetto di gioco avrà sempre solo un tag. Per impostazione predefinita, il tag "Untagged" è utilizzato per rappresentare un oggetto GameObject
che non è stato etichettato intenzionalmente.
Creazione e applicazione di tag
I tag vengono in genere applicati tramite l'editor; tuttavia, puoi anche applicare i tag tramite script. Qualsiasi tag personalizzato deve essere creato tramite la finestra Tag e livelli prima di essere applicato a un oggetto di gioco.
Impostazione dei tag nell'editor
Con uno o più oggetti di gioco selezionati, puoi selezionare un tag dall'ispettore. Gli oggetti di gioco porteranno sempre un singolo tag; per impostazione predefinita, gli oggetti del gioco verranno contrassegnati come "Non contrassegnati" . Puoi anche passare alla finestra Tag e livelli , selezionando "Aggiungi tag ..." ; tuttavia, è importante notare che questo porta solo alla finestra Tag e livelli . Qualsiasi tag che crei non verrà automaticamente applicato all'oggetto del gioco.
Impostazione dei tag tramite Script
Puoi modificare direttamente un tag di oggetti di gioco tramite codice. È importante notare che è necessario fornire un tag dall'elenco dei tag correnti; se fornisci un tag che non è già stato creato, si verificherà un errore.
Come illustrato in altri esempi, l'utilizzo di una serie di variabili static string
anziché la scrittura manuale di ciascun tag può garantire coerenza e affidabilità.
Il seguente script dimostra come possiamo cambiare una serie di tag di oggetti di gioco, usando riferimenti di static string
per garantire coerenza. Notare che ogni static string
rappresenta un tag che è già stato creato nella finestra Tag e livelli .
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;
}
}
}
Creazione di tag personalizzati
Indipendentemente dall'impostazione dei tag tramite Inspector o tramite script, i tag devono essere dichiarati tramite la finestra Tag e livelli prima dell'utilizzo. È possibile accedere a questa finestra selezionando "Aggiungi tag ..." dal menu a discesa dei tag degli oggetti di gioco. In alternativa, puoi trovare la finestra sotto Modifica> Impostazioni progetto> Tag e livelli .
Basta selezionare il pulsante + , inserire il nome desiderato e selezionare Salva per creare un tag. Selezionando il pulsante - si rimuoverà il tag attualmente evidenziato. Si noti che in questo modo, il tag verrà immediatamente visualizzato come "(Rimosso)" e verrà completamente rimosso al prossimo riavvio del progetto.
Selezionando la ruota dentata / ingranaggio dalla parte superiore destra della finestra, potrai ripristinare tutte le opzioni personalizzate. Questo rimuoverà immediatamente tutti i tag personalizzati, insieme a qualsiasi livello personalizzato che puoi avere sotto "Ordinamento livelli" e "Livelli" .
Ricerca di oggetti di gioco per tag:
I tag rendono particolarmente facile localizzare oggetti di gioco specifici. Possiamo cercare un singolo oggetto di gioco o cercare più oggetti.
Trovare un singolo GameObject
Possiamo utilizzare la funzione statica GameObject.FindGameObjectWithTag(string tag)
per cercare singoli oggetti di gioco. È importante notare che, in questo modo, gli oggetti di gioco non vengono interrogati in alcun ordine particolare. Se cerchi un tag che viene utilizzato su più oggetti di gioco nella scena, questa funzione non sarà in grado di garantire quale oggetto di gioco viene restituito. Come tale, è più appropriato sapere che solo un oggetto di gioco usa tale tag, o quando non siamo preoccupati per l'esatta istanza di GameObject
che viene restituita.
///<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);
Trovare una matrice di istanze GameObject
Possiamo utilizzare la funzione statica GameObject.FindGameObjectsWithTag(string tag)
per cercare tutti gli oggetti di gioco che utilizzano un determinato tag. Questo è utile quando vogliamo iterare attraverso un gruppo di oggetti di gioco particolari. Questo può anche essere utile se vogliamo trovare un singolo oggetto di gioco, ma potrebbe avere più oggetti di gioco che usano lo stesso tag. Come non possiamo garantire l'esatto istanza restituita dal GameObject.FindGameObjectWithTag(string tag)
, dobbiamo invece recuperare una matrice di tutti i potenziali GameObject
istanze con GameObject.FindGameObjectsWithTag(string tag)
, e analizzare ulteriormente la matrice risultante per trovare l'istanza siamo cercando.
///<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.)
}
Confronto di tag
Quando si confrontano due oggetti GameObjects per tag, si dovrebbe notare che quanto segue causerebbe un sovraccarico di Garbage Collector ogni volta che viene creata una stringa:
if (go.Tag == "myTag")
{
//Stuff
}
Quando si eseguono tali confronti all'interno di Update () e di altri callback di Unity regolari (o di un ciclo), è necessario utilizzare questo metodo di allocazione heap-free:
if (go.CompareTag("myTag")
{
//Stuff
}
Inoltre è più facile mantenere i tag in una classe statica.
public static class Tags
{
public const string Player = "Player";
public const string MyCustomTag = "MyCustomTag";
}
Quindi puoi confrontare in modo sicuro
if (go.CompareTag(Tags.MyCustomTag)
{
//Stuff
}
in questo modo, le stringhe di tag vengono generate in fase di compilazione e si limitano le implicazioni degli errori di ortografia.
Proprio come mantenere i tag in una classe statica, è anche possibile archiviarli in un'enumerazione:
public enum Tags
{
Player, Ennemies, MyCustomTag;
}
e quindi puoi confrontarlo usando il metodo enum toString()
:
if (go.CompareTag(Tags.MyCustomTag.toString())
{
//Stuff
}