WisdomSoft - for your serial experiences.

タグ

ゲーム内にある無数のオブジェクトを論理的に関連付ける情報としてタグを利用できます。タグを用いてオブジェクトを分類し、スクリプトからタグを用いて検索できます。

オブジェクトの種別・分類

ゲーム内のオブジェクトが増えると、名前や階層だけでは管理が難しくなることがあります。このような時、同質のオブジェクトをまとめて管理する方法にタグが考えられます。タグを用いることで、名前や階層に依存することなく、オブジェクトの分類が可能です。

オブジェクトが保有するタグは tag プロパティから設定または取得できます。

GameObject クラス tag プロパティ
public string tag { get; set; }

このプロパティにはタグを表す文字列を指定します。タグは事前に Unity エディタ上で設定されているタグのいずれかでなければなりません。未定義のタグを設定しようとした場合は実行時に例外が発生します。デフォルトでは、以下のタグが用意されています。

  • Untagged
  • Respawn
  • Finish
  • EditorOnly
  • MainCamera
  • Player
  • GameController

このうち Untagged はタグが設定されていない状態を表します。

Unity エディタ上でオブジェクトにタグを設定するには「Inspector」ウィンドウにある「Tag」コンポボックスをクリックして表示されたリストから選択します。

図1 Tag
Tag

ユーザー定義のタグを追加するには Unity エディタ上の「Tag Manager」を用います。「Tag Manager」を表示するには、図1にあるドロップメニューの下部にある「Add Tag....」項目を選択してください。

図2 タグの追加
タグの追加

「Inspector」ウィンドウに「Tag Manager」が表示されるので、このうちの「Tags」項目内にある「Size」オプションにユーザー定義のタグの数を指定します。すると、「Size」オプションで指定した数だけ Element 1 ~ Element N までの入力項目が表示されるので、任意のタグ名を入力してください。

コード1
using UnityEngine;

public class Test : MonoBehaviour
{
	void Start()
	{
		GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
		cube.tag = "Player";
	}
}
実行結果
コード1 実行結果

コード1はスクリプトから生成したオブジェクトの tag プロパティに "Player" という文字列を設定しています。生成されたオブジェクトを選択して「Inspector」ウィンドウの「Tag」コンボボックスを見ると、正しく Player タグとして認識されていることが確認できます。

タグの検索

スクリプトでは、オブジェクトに設定されているタグから検索できます。単一のオブジェクトを取得する場合は GameObject クラスの FindWithTag() メソッドを使います。

GameObject クラス FindWithTag() メソッド
public static GameObject FindWithTag(string tag)

このメソッドは有効なオブジェクトの中から tag パラメータに指定された名前と同じタグを持つオブジェクトを返します。オブジェクトが見つからない場合は null を返します。

タグが複数のオブジェクトに設定されている場合、タグが設定されているオブジェクトを全て取得するには FindGameObjectsWithTag() メソッドを使います。

GameObject クラス FindGameObjectsWithTag() メソッド
public static GameObject[] FindGameObjectsWithTag(string tag)

戻り値が配列であることを除いて、基本的な振る舞いは FindWithTag() メソッドと同じです。tag パラメータに指定した名前と同じタグを持つオブジェクトを検索し、その配列を返します。

例えば、プレイヤーが操作する対象である Player タグを持つオブジェクトがシーン内に 1 つしかないのであれば FindWithTag() メソッドで検索します。逆に、敵キャラクターを表す Enemy タグは複数のオブジェクトに設定されるでしょう。すべての敵に対して共通の制御を行うスクリプトは FindGameObjectsWithTag() メソッドで Enemy タグを持つオブジェクトを一度に取得できます。

コード2
using UnityEngine;

public class Test : MonoBehaviour
{
	GameObject[] magicalGirls;
	void Start()
	{
		magicalGirls = GameObject.FindGameObjectsWithTag("MagicalGirl");
	}
	void Update()
	{
		foreach(GameObject magicalGirl in magicalGirls)
			magicalGirl.transform.Rotate(0, 1, 0);
	}
}
実行結果
コード2 実行結果

コード2はユーザー定義の MagicalGirl タグを FindGameObjectsWithTag() メソッドを用いて検索しています。このスクリプトを実行するシーンでは、複数のオブジェクトに MagicalGirl タグが既に設定されているものとします。

FindGameObjectsWithTag() メソッドは指定したタグを持つオブジェクトすべてを GameObject の配列として返します。コード2では、配列で得られたすべてのオブジェクトを Rotate() メソッドで回転させます。正しくタグが設定されていれば、MagicalGirl タグを持つすべてのオブジェクトが回転するはずです。