Szukaj…
Wprowadzenie
Tag to ciąg znaków, który można zastosować do oznaczenia typów GameObject
. W ten sposób ułatwia identyfikację poszczególnych obiektów GameObject
za pomocą kodu.
Znacznik można zastosować do jednego lub więcej obiektów gry, ale obiekt gry zawsze będzie miał tylko jeden znacznik. Domyślnie znacznik „Nieoznaczony” jest używany do reprezentowania obiektu GameObject
, który nie został celowo oznaczony.
Tworzenie i stosowanie tagów
Tagi są zwykle stosowane przez edytor; Możesz jednak także zastosować tagi za pomocą skryptu. Każdy niestandardowy znacznik musi zostać utworzony w oknie Znaczniki i warstwy przed zastosowaniem go do obiektu gry.
Ustawianie tagów w edytorze
Po zaznaczeniu jednego lub więcej obiektów gry możesz wybrać znacznik z poziomu inspektora. Obiekty gry zawsze będą nosić jeden znacznik; domyślnie obiekty gry będą oznaczone jako „Nieoznaczone” . Możesz także przejść do okna Znaczniki i warstwy , wybierając „Dodaj znacznik ...” ; Należy jednak pamiętać, że prowadzi to tylko do okna Tagi i warstwy . Dowolny tag utworzeniu nie będzie automatycznie zastosować do obiektu gry.
Ustawianie tagów za pomocą skryptu
Możesz bezpośrednio zmienić znacznik obiektów gry za pomocą kodu. Należy pamiętać, że musisz podać tag z listy aktualnych tagów; jeśli podasz tag, który nie został jeszcze utworzony, spowoduje to błąd.
Jak szczegółowo opisano w innych przykładach, użycie szeregu zmiennych static string
ręcznego pisania każdego znacznika może zapewnić spójność i niezawodność.
Poniższy skrypt pokazuje, jak możemy zmienić serię znaczników obiektów gry, używając static string
odniesień do static string
aby zapewnić spójność. Zwróć uwagę na założenie, że każdy static string
reprezentuje znacznik, który został już utworzony w oknie Znaczniki i warstwy .
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;
}
}
}
Tworzenie niestandardowych tagów
Niezależnie od tego, czy ustawiasz tagi za pomocą Inspektora, czy skryptu, tagi muszą zostać zadeklarowane przed użyciem w oknie Tagi i warstwy . Aby uzyskać dostęp do tego okna, wybierz „Dodaj tagi ...” z menu rozwijanego znacznika obiektów gry. Alternatywnie możesz znaleźć okno w Edycja> Ustawienia projektu> Znaczniki i warstwy .
Po prostu wybierz przycisk + , wprowadź żądaną nazwę i wybierz Zapisz, aby utworzyć tag. Wybranie przycisku - usunie podświetlony tag. Pamiętaj, że w ten sposób znacznik zostanie natychmiast wyświetlony jako „(Usunięty)” i zostanie całkowicie usunięty przy następnym załadowaniu projektu.
Wybranie koła zębatego / koła zębatego w prawym górnym rogu okna pozwoli zresetować wszystkie niestandardowe opcje. Spowoduje to natychmiastowe usunięcie wszystkich niestandardowych tagów wraz z dowolną niestandardową warstwą, którą możesz mieć w „Sortowanie warstw” i „Warstwach” .
Znajdowanie GameObjects według tagów:
Znaczniki ułatwiają zlokalizowanie określonych obiektów gry. Możemy szukać jednego obiektu gry lub wielu.
Znalezienie pojedynczego obiektu GameObject
Możemy użyć funkcji statycznej GameObject.FindGameObjectWithTag(string tag)
aby wyszukać pojedyncze obiekty gry. Ważne jest, aby pamiętać, że w ten sposób obiekty gry nie są sprawdzane w określonej kolejności. Jeśli wyszukasz znacznik używany na wielu obiektach gry w scenie, ta funkcja nie będzie w stanie zagwarantować, który obiekt gry zostanie zwrócony. W związku z tym bardziej odpowiednie jest, gdy wiemy, że tylko jeden obiekt gry używa takiego znacznika lub gdy nie martwimy się dokładną instancją GameObject
obiektu GameObject
.
///<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);
Znajdowanie tablicy instancji GameObject
Możemy użyć funkcji statycznej GameObject.FindGameObjectsWithTag(string tag)
aby wyszukać wszystkie obiekty gry, które używają określonego tagu. Jest to przydatne, gdy chcemy iterować przez grupę konkretnych obiektów gry. Może to być również przydatne, jeśli chcemy znaleźć pojedynczy obiekt gry, ale może mieć wiele obiektów gry przy użyciu tego samego znacznika. Ponieważ nie możemy zagwarantować dokładną wystąpienie zwrócony przez GameObject.FindGameObjectWithTag(string tag)
, musimy zamiast odzyskać tablicę wszystkich potencjalnych GameObject
przypadkach z GameObject.FindGameObjectsWithTag(string tag)
, a następnie analizować wynikowy tablicę znaleźć instancję jesteśmy szukam.
///<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.)
}
Porównywanie tagów
Porównując dwa obiekty GameObject według znaczników, należy zauważyć, że następujące działania spowodowałyby narzut Garbage Collectora, ponieważ ciąg jest tworzony za każdym razem:
if (go.Tag == "myTag")
{
//Stuff
}
Podczas wykonywania tych porównań w ramach Update () i innych funkcji zwrotnych Unity (lub pętli), powinieneś użyć tej metody bez przydziału sterty:
if (go.CompareTag("myTag")
{
//Stuff
}
Ponadto łatwiej jest utrzymać tagi w klasie statycznej.
public static class Tags
{
public const string Player = "Player";
public const string MyCustomTag = "MyCustomTag";
}
Następnie możesz bezpiecznie porównać
if (go.CompareTag(Tags.MyCustomTag)
{
//Stuff
}
w ten sposób ciągi znaczników są generowane w czasie kompilacji, a Ty ograniczasz konsekwencje błędów ortograficznych.
Podobnie jak przechowywanie znaczników w klasie statycznej, możliwe jest również przechowywanie ich w wyliczeniu:
public enum Tags
{
Player, Ennemies, MyCustomTag;
}
a następnie możesz porównać to za pomocą metody enum toString()
:
if (go.CompareTag(Tags.MyCustomTag.toString())
{
//Stuff
}