수색…


소개

태그는 GameObject 유형을 표시하는 데 적용 할 수있는 문자열입니다. 이 방법으로 코드를 통해 특정 GameObject 객체를 쉽게 식별 할 수 있습니다.

태그는 하나 이상의 게임 개체에 적용될 수 있지만 게임 개체에는 항상 하나의 태그 만 있습니다. 기본적으로 "Untagged"라는 태그 는 의도적으로 태그가 지정되지 않은 GameObject 를 나타내는 데 사용됩니다.

태그 생성 및 적용

태그는 일반적으로 편집기를 통해 적용됩니다. 그러나 스크립트를 통해 태그를 적용 할 수도 있습니다. 모든 맞춤 태그는 게임 개체에 적용되기 전에 태그 및 레이어 창을 통해 만들어야합니다.


편집기에서 태그 설정하기

하나 이상의 게임 객체를 선택하면 속성에서 태그를 선택할 수 있습니다. 게임 객체는 항상 단일 태그를 전달합니다. 기본적으로 게임 개체는 "태그 가 지정되지 않은 "태그 가 지정됩니다. "태그 추가 ..."를 선택하여 태그 및 레이어 창으로 이동할 수도 있습니다. 그러나 이것은 단지 Tags & Layers 창으로 이동한다는 점에 유의해야합니다. 생성 한 태그는 게임 개체에 자동으로 적용 되지 않습니다 .

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


스크립트를 통해 태그 설정하기

코드를 통해 게임 개체 태그를 직접 변경할 수 있습니다. 현재 태그 목록에서 태그를 제공 해야 한다는 점에 유의 해야 합니다. 아직 작성되지 않은 태그를 제공하면 오류가 발생합니다.

다른 예제에서 자세히 설명했듯이, 각 태그를 수동으로 작성하는 것과는 대조적으로 일련의 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 can contain spaces and punctuation.

+ 버튼을 선택하고 원하는 이름을 입력 한 다음 저장 을 선택하여 태그를 만드 십시오 . - 버튼을 선택하면 현재 강조 표시된 태그가 제거됩니다. 이 방법으로 태그는 즉시 "(제거됨)" 으로 표시되며 프로젝트가 다음에 다시로드 될 때 완전히 제거됩니다.

창의 오른쪽 상단에서 톱니 바퀴 / 톱니 바퀴를 선택하면 모든 맞춤 옵션을 재설정 할 수 있습니다. 그러면 "레이어 정렬""레이어"에서 가질 수있는 사용자 지정 레이어와 함께 모든 사용자 정의 태그가 즉시 제거됩니다.

태그로 GameObject 찾기 :

태그를 사용하면 특정 게임 개체를 쉽게 찾을 수 있습니다. 우리는 하나의 게임 객체를 찾거나 여러 개의 객체를 찾을 수 있습니다.


단일 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.)
}

태그 비교

태그로 두 개의 GameObject를 비교할 때 매번 문자열이 생성 될 때 다음과 같이 가비지 수집기 오버 헤드가 발생합니다.

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 
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow