一度拾ったアイテムは、シーンが推移してまた元の場所に戻ってきても復活しない、というルールを作りたかった。そのためには、ゲーム内のアイテム一つ一つにユニークな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は、リンクする際にこれらの付帯情報を解釈して、コードの役割を決めている。
参考にしたもの
- ExtendingtheUnityEditor 日本語の大変親切丁寧な資料
- Unity - Extending the Editor 公式はUnityScriptだけど、ほとんど全機能について解説されている