サーチ…
前書き
タグはGameObject
型をマークするために適用できる文字列です。このようにして、特定のGameObject
オブジェクトをコードで識別することが容易になります。
1つまたは複数のゲームオブジェクトにタグを適用できますが、ゲームオブジェクトには常に1つのタグしかありません。デフォルトでは、タグ「Untagged」は、意図的にタグ付けされていないGameObject
を表すために使用されます。
タグの作成と適用
タグは通常、エディタを介して適用されます。ただし、スクリプトを使用してタグを適用することもできます。すべてのカスタムタグは、ゲームオブジェクトに適用される前に[ タグとレイヤー]ウィンドウで作成する必要があります。
エディタでタグを設定する
1つまたは複数のゲームオブジェクトを選択した状態で、インスペクタからタグを選択できます。ゲームオブジェクトは常に1つのタグを持ちます。デフォルトでは、ゲームオブジェクトは「タグなし」としてタグ付けされます。 [ タグとレイヤー]ウィンドウに移動するには、[ タグを 追加...]を選択します。ただし、これは、[ タグとレイヤー]ウィンドウに移動するだけであることに注意することが重要です。作成したタグはゲームオブジェクトに自動的には適用されません 。
スクリプトによるタグの設定
コードを介してゲームオブジェクトタグを直接変更することができます。現在のタグのリストからタグを提供する必要があることに注意することが重要です。まだ作成されていないタグを指定すると、エラーになります。
他の例で詳述されているように、各タグを手動で書き込むのではなく、一連の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;
}
}
}
カスタムタグの作成
インスペクタを使用してタグを設定するか、スクリプトを使用してタグを設定するかにかかわらず、タグは使用前に[ タグとレイヤー]ウィンドウで宣言する必要があります。このウィンドウにアクセスするには、ゲームオブジェクトのタグドロップダウンメニューから[ タグを追加...]を選択します。または、 [編集]> [プロジェクト設定]> [タグとレイヤー]の順に選択してください 。
単に+ボタンを選択し、希望の名前を入力し、[ 保存]を選択してタグを作成します 。 -ボタンを選択すると、現在強調表示されているタグが削除されます。この方法では、タグはすぐに「(削除された)」と表示され、プロジェクトが次に読み込まれると完全に削除されます。
ウィンドウの右上にある歯車/歯車を選択すると、すべてのカスタムオプションをリセットできます。これにより、 「レイヤーの 並べ替え」および「レイヤー」の下にあるカスタムレイヤーとともに、すべてのカスタムタグが即座に削除されます。
タグによるゲームオブジェクトの発見:
タグを使用すると、特定のゲームオブジェクトの検索が特に簡単になります。 1つのゲームオブジェクトを探したり、複数のゲームオブジェクトを探すことができます。
単一のGameObject
見つける
静的関数GameObject.FindGameObjectWithTag(string tag)
を使用して個々のゲームオブジェクトを探すことができます。このように、ゲームオブジェクトは特定の順序で照会されないことに注意することが重要です。シーン内の複数のゲームオブジェクトで使用されているタグを検索する場合、この関数は返されるゲームオブジェクトを保証することはできません。したがって、このようなタグを使用するゲームオブジェクトが1つしかないことがわかっている場合、または返される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
静的関数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.)
}
タグの比較
タグで2つの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
}