【Unity】 スクリプトから新しいタグを追加する


Unityでスクリプトから新しいタグを追加する方法について。バージョンは5で、スクリプト例はC#です。

スクリプト

以下の例を適当なゲームオブジェクトにコンポーネントとして追加します。実行すると、 AddTag メソッドに渡した文字列が新しいタグとして追加されていきます。

TagHelper.cs
using UnityEngine;
using UnityEditor;

public class TagHelper : MonoBehaviour {

    void Start () {
        AddTag("HogeTag01");
        AddTag("HogeTag02");
        AddTag("HogeTag03");
    }

    static void AddTag(string tagname) {
        UnityEngine.Object[] asset = AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset");
        if ((asset != null) && (asset.Length > 0)) {
            SerializedObject so = new SerializedObject(asset[0]);
            SerializedProperty tags = so.FindProperty("tags");

            for (int i = 0; i < tags.arraySize; ++i) {
                if (tags.GetArrayElementAtIndex(i).stringValue == tagname) {
                    return;
                }
            }

            int index = tags.arraySize;
            tags.InsertArrayElementAtIndex(index);
            tags.GetArrayElementAtIndex(index).stringValue = tagname;
            so.ApplyModifiedProperties();
            so.Update();
        }
    }

    void Update () {
    }
}

参考ページの例では、新しいタグを常に配列の0番目に挿入していましたが、それだとTag0だったタグが新しく追加される度にTag1、Tag2...と移動してしまいます。結果として、あるゲームオブジェクトにTag0のタグをセットしていた場合、それが一番最後に追加したタグに変わってしまう、などの良くないことが起こります。なので、この例ではtagsの末尾に新しいタグを追加していくようにしました。

結果

スクリプトで追加したタグが反映されました。
ただ、この方法で追加されたタグは当然ながらゲーム終了と共に無くなります。開始前にも存在していないので、使い時としては、ゲーム中に生成されるゲームオブジェクトに連番で動的にセットしたいタグがある場合などでしょうか。

参考ページ

Is it possible to create a tag programmatically?