LoginSignup
19

More than 5 years have passed since last update.

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

Posted at

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の末尾に新しいタグを追加していくようにしました。

結果

tag_helper.png

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

参考ページ

Is it possible to create a tag programmatically?

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19