Edited at

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は、リンクする際にこれらの付帯情報を解釈して、コードの役割を決めている。


参考にしたもの