ゼニガネブログ

ゲーム開発のための小ネタなど。現在はUnityメインでやってます

【Unity】右クリックメニューから一発で自作コンポーネント持ちGameObjectを作成するエディタ拡張

f:id:zenigane138:20191111200315g:plain

unity1weekなどでUnityでさくっと物を作る時に、「1個の自作コンポーネントがアタッチされたGameObject(名前はだいたいそのコンポーネント名)」を作る事が多かったのでそれを簡単な操作で実現するためのスクリプトです。

導入している場合

1.Projectビューで自作コンポーネント(.csファイル)を右クリックして「Create GameObject With Selected Component」をクリック
→完成!

導入していない場合

1.Hierarchyビューで何もない所を右クリックorCreateをクリックからCreate Emptyを選択しGameObjectを作成
2.自作コンポーネントをAddComponentから探すorドラッグアンドドロップでアタッチ
3.HierarchyビューでGameObjectを選択してF2を押すorInspectorビューで名前欄を選択してコンポーネント名の入力
→完成!

コンポーネント名がやたらと短い時以外はコピペしてくる派なので更にめんどくさい!

個人的には2番が特にだるいです。
AddComponentからやるパターンだと前の入力内容を消すなりたどっていくなりとにかく面倒なので使ってないです。
ドラッグ&ドロップパターンだとInspectorビューにドラッグしてくるときにAddComponentより下側で離さないといけないのが地味にだるい。

導入方法

Editorフォルダ以下に↓のProjectWindowCreateGameObject.csを入れるだけ!

 使用方法

Projectビューで自作コンポーネント(MonoBehaviourを継承した.csファイル)で右クリックをして表示されたメニューから「Create GameObject With Selected Component」をクリックするだけ!

解説みたいなの

Selection.GetFilteredにSelectionMode.DeepAssetsを使用しているので、フォルダに対して右クリックして「Create GameObject With Selected Component」を選択するとそのフォルダ以下の全てのアセットが対象になります。
その挙動が気に入らない場合は、SelectionMode.Assetsに変更するとフォルダに対して右クリックした時はそのフォルダだけが対象になります。
SelectionMode.Assetsにすると複数同時処理が出来なくなるというわけではなく、Ctrlを押しながらクリックして複数選択状態にした後に「Create GameObject With Selected Component」で同時処理もいけます。
ちなみに処理対象が複数ある場合は、実行前に確認ダイアログを表示するように作ってあるのでSelectionMode.DeepAssetsのままで問題ないと思います!

GameObject名がそのままコンポーネント名になるのが気に入らない方はprefix、suffixを設定したりGameObjectNameTypeをComponentから変更する事である程度柔軟に対応できます。
「Create GameObject With Selected Component(Sample1)」やSample2を実行する事でなんとなく理解出来ると思います!
こっそりRectTransformにも対応しています。

MenuItemに設定してあるパスが気に入らない方は適当に好きなパスに書き換えちゃって下さい。
最初はUnityエディタにあわせてAssets/Create/以下に作成しましたが、マウス操作がめんどいので今のAssets/直下にしてあります。
Unity 2017.3以上の場合はAssemblyDefinitionFileにも対応しています!・・・が、AssemblyDefinitionFile使うレベルのプロジェクトだと使わない気がする!

あとがき

個人的に必要だった機能は今のバージョンで全部入っていますが、高機能化したものを誰か作ってくれてもいいんだよ!
・指定オブジェクトの子として作成
・同一アセンブリ内に名前空間違いの同名クラスが見つかった場合にエラー扱いにせず自動で正しい方を選ぶ
命名パターンをMenuItem/メソッド単位で分けずに実行時にEditorWindowを開いて決める