C#
3DCG
Unity3D

Unity3Dを拡張してIDを自動生成する

More than 5 years have passed since last update.

一度拾ったアイテムは、シーンが推移してまた元の場所に戻ってきても復活しない、というルールを作りたかった。そのためには、ゲーム内のアイテム一つ一つにユニークなIDを割り当てて、アイテムを拾うたびに、そのIDを配列に記録しなければならない。アイテムは大量にあるので、IDをいちいち個別に設定するのは面倒くさい。

というわけで、UnityEditorを拡張して、ユニークIDの自動生成機能を作ってみた。

GenerateUniqueID.cs
using UnityEditor;
using UnityEngine;
using System.Collections;

public class GenerateUniqueID {
    [MenuItem("Tools/Generate Unique IDs")]
    public static void Generate() {
        foreach (var gameobj in Selection.gameObjects) {
            var script = gameobj.GetComponent<CollectionItemScript>();
            if (script) {
                script.UniqueID = script.GetInstanceID();
            }
        }
    }
}

こんな感じのスクリプトをAssets/Editorフォルダに入れてやると、UnityのメニューバーにTools/Generate Unique IDsという項目ができる。それをクリックすると、現在選択中のGameObjectのCollectionItemScriptコンポーネントにユニークなID(int型)が付与される。

今日覚えたこと

  • UnityはAssets/Editorに置いてあるスクリプトを勝手にコンパイルする。しかもそれがEditorの拡張なら、その場でリンクして機能を組み込んでくれる。
  • メニューアイテム以外にも、Inspectorやシーンビューも自分で作り替えることができる。
  • Unityの拡張性ぱねー
  • [MenuItem(...)]はAttributeというもので、クラスやメンバ、メソッドに関する付帯情報を示している。この情報は、共通中間言語(CIL)にコンパイルされてもそのまま残る。おそらくUnityは、リンクする際にこれらの付帯情報を解釈して、コードの役割を決めている。

参考にしたもの