Поиск…
Вступление
Тег - это строка, которая может применяться для обозначения типов GameObject
. Таким образом, упрощается идентификация определенных объектов GameObject
помощью кода.
Тег можно применить к одному или нескольким игровым объектам, но игровой объект всегда будет иметь только один тег. По умолчанию тег «Untagged» используется для представления GameObject
, который не был специально помечен.
Создание и применение тегов
Теги обычно применяются через редактор; однако вы также можете применять теги через скрипт. Любой пользовательский тег должен быть создан через окно « Теги и слои» перед тем, как его применить к игровому объекту.
Установка тегов в редакторе
При выборе одного или нескольких игровых объектов вы можете выбрать тег из инспектора. Объекты игры всегда будут иметь один тег; по умолчанию игровые объекты будут помечены как «Без тегов» . Вы также можете перейти в окно « Теги и слои» , выбрав «Добавить тег ...» ; однако важно отметить, что это приведет вас только к окну Tags & Layers . Любой тэг создается не будет автоматически применяться к объекту игры.
Настройка тегов через скрипт
Вы можете напрямую изменить тег игровых объектов через код. Важно отметить, что вы должны предоставить тег из списка текущих тегов; если вы добавите тег, который еще не был создан, это приведет к ошибке.
Как указано в других примерах, использование серии static string
переменных в отличие от ручной записи каждого тега может обеспечить согласованность и надежность.
Следующий сценарий демонстрирует, как мы можем изменить ряд тегов игровых объектов, используя static string
ссылки на static string
для обеспечения согласованности. Обратите внимание на предположение, что каждая static string
представляет собой тег, который уже был создан в окне « Теги и слои» .
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;
}
}
}
Создание пользовательских тегов
Независимо от того, устанавливаете ли вы теги через Inspector или через скрипт, теги должны быть объявлены через окно Tags & Layers перед использованием. Вы можете получить доступ к этому окну, выбрав «Добавить теги ...» в раскрывающемся меню тега игровых объектов. Кроме того, вы можете найти окно в разделе « Редактирование»> «Настройки проекта»> «Метки и слои» .
Просто выберите кнопку + , введите нужное имя и выберите « Сохранить», чтобы создать тег. При выборе кнопки - удаляется текущий выделенный тег. Обратите внимание, что таким образом тег будет немедленно отображаться как «(Удалено)» и будет полностью удален, когда проект будет перезагружен.
Выбор шестерни / зубца в правом верхнем углу окна позволит вам сбросить все пользовательские параметры. Это немедленно удалит все пользовательские теги вместе с любым настраиваемым слоем, который у вас может быть в разделе «Сортировка слоев» и «Слои» .
Поиск GameObjects по тегу:
Метки делают его особенно удобным для определения определенных игровых объектов. Мы можем искать один игровой объект или искать несколько.
Поиск единого GameObject
Мы можем использовать статическую функцию GameObject.FindGameObjectWithTag(string tag)
для поиска отдельных игровых объектов. Важно отметить, что таким образом игровые объекты не запрашиваются в каком-либо конкретном порядке. Если вы ищете тег, который используется в нескольких игровых объектах в сцене, эта функция не сможет гарантировать, какой игровой объект будет возвращен. Таким образом, более удобно, когда мы знаем, что только один игровой объект использует такой тег или когда нас не беспокоит точный экземпляр 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);
Поиск массива экземпляров GameObject
Мы можем использовать статическую функцию GameObject.FindGameObjectsWithTag(string tag)
чтобы искать все игровые объекты, которые используют определенный тег. Это полезно, когда мы хотим итерации через группу определенных игровых объектов. Это также может быть полезно, если мы хотим найти один игровой объект, но можем иметь несколько игровых объектов с использованием одного и того же тега. Поскольку мы не можем гарантировать точный экземпляр , возвращаемый GameObject.FindGameObjectWithTag(string tag)
, мы должны вместо этого получить массив всех потенциальных GameObject
экземпляров с GameObject.FindGameObjectsWithTag(string tag)
, и далее анализировать полученный массив , чтобы найти экземпляр мы находимся находясь в поиске.
///<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.)
}
Сравнение тегов
При сравнении двух GameObjects по тегам следует отметить, что следующее приведет к сбоям в работе сборщика мусора, поскольку строка создается каждый раз:
if (go.Tag == "myTag")
{
//Stuff
}
При выполнении этих сравнений внутри Update () и другого обратного вызова обычного или единственного Unity вы должны использовать этот метод без кучи:
if (go.CompareTag("myTag")
{
//Stuff
}
Кроме того, ваши теги проще хранить в статическом классе.
public static class Tags
{
public const string Player = "Player";
public const string MyCustomTag = "MyCustomTag";
}
Тогда вы можете безопасно сравнивать
if (go.CompareTag(Tags.MyCustomTag)
{
//Stuff
}
таким образом, ваши строки тегов генерируются во время компиляции, и вы ограничиваете последствия орфографических ошибок.
Так же, как сохранение тегов в статическом классе, можно также сохранить его в перечислении:
public enum Tags
{
Player, Ennemies, MyCustomTag;
}
и затем вы можете сравнить его с помощью метода enum toString()
:
if (go.CompareTag(Tags.MyCustomTag.toString())
{
//Stuff
}