はじめに
この記事は「Unity Advent Calendar 2017」の 12/6 分の記事です
昨日は kaiware007 さんの「Unityでマリオオデッセイの雲海を再現してみた」でした
明日は sassembla さんの「実機上でテスト実行/結果収集するツールの紹介」です
目次
- はじめに
- 目次
- エディタを拡張する2つの方法
- 検証環境
- Unity.exe 単位でのエディタ拡張
- 通常のエディタ拡張と何が違う?
- Unity.exe 単位でのエディタ拡張の作り方
- Unity.exe への反映
- おわりに
- おまけ
- 関連記事
エディタを拡張する2つの方法
通常、エディタ拡張を行う場合は
Unity プロジェクトに「Editor」という名前のフォルダを作成して
その中にスクリプトを追加してコードを記述していきます
これは 「Unity のプロジェクト単位」でエディタを拡張するモノで、
簡単な手順で好きな機能をエディタに追加できてとてもお手軽ですが、
Unity にはコレとは別に、「Unity.exe 単位」でのエディタ拡張の手段が用意されています
例えば、上記のスクリーンショットでは
Project ビューにファイルが存在しないのに
Unity のメニューに「KoganeBlog>Hoge」という項目が追加されています
これは「Unity.exe 単位」でエディタを拡張したモノであり、この方法を使うと
Unity プロジェクトにスクリプトを追加せずにエディタを拡張することができます
この記事では、Unity.exe 単位でのエディタ拡張の方法を紹介していきます
検証環境
- Unity 2017.1.1f1
- Visual Studio Community 2017
- Windows 10
Unity.exe 単位でのエディタ拡張
使ってみる
まずは Unity.exe 単位のエディタ拡張を実際に使ってみましょう
- Unity を起動している場合は終了しておく
- 下記の URL にアクセスして「KoganeBlogExt.zip」をダウンロードする
https://www.dropbox.com/s/fh88efciec29e6g/KoganeBlogExt.zip?dl=0 - ダウンロードした「KoganeBlogExt.zip」を展開する
- 展開した「KoganeBlogExt」フォルダを
「C:\Program Files\Unity\Editor\Data\UnityExtensions\Unity」にコピーする
これで、Unity.exe 単位のエディタ拡張の反映が完了したので
この状態で Unity を起動して新規プロジェクトを作成してみます
すると、一見何も変わっていないように見えますが
Unity エディタを再起動するメニューが「File>Restart」に追加されていたり
空のゲームオブジェクトを原点に作成するメニューが
「GameObject>Create Empty At Zero」に追加されていたり
Transform の Inspector に値をリセットするボタンが追加されていたり
アセットのファイルパスをコピーするメニューが追加されていたりと、
エディタが拡張されていることがわかります
解説
さきほど、「KoganeBlogExt」フォルダを
「C:\Program Files\Unity\Editor\Data\UnityExtensions\Unity」にコピーしましたが
この時にエディタ拡張の機能が反映されています
「KoganeBlogExt」フォルダの中を見てみると
4つのフォルダが入っていることがわかります
このそれぞれのフォルダの中にエディタ拡張用のファイルが格納されています
例えば一番上の「KBAssetPathCopyer」フォルダを開いてみると
「Editor」フォルダと「ivy.xml」ファイルが入っており
「Editor」フォルダ内には「KBAssetPathCopyer.dll」が含まれています
そして、「KBAssetPathCopyer」以外のフォルダの中身も同様の内容になっています
つまり、
- 「ivy.xml」という名前の XML ファイル
- エディタ拡張用の DLL ファイル
を用意して、
「C:\Program Files\Unity\Editor\Data\UnityExtensions\Unity」フォルダに追加すれば
「Unity.exe 単位でのエディタ拡張」を行うことができます
通常のエディタ拡張と何が違う?
最初にも軽く述べましたが、通常、エディタ拡張を行う場合は
Unity プロジェクトに「Editor」という名前のフォルダを作成して
その中にスクリプトを追加してコードを記述していきます
この方法はとても簡単で、誰でも気軽に実装できる反面、
Unity のプロジェクト単位でエディタを拡張することになるため
他の Unity プロジェクトで同様のエディタ拡張を使いたい場合、
各 Unity プロジェクトに同じスクリプトやアセットを導入する必要があります
しかし、Unity.exe 単位でエディタを拡張する場合は
Unity プロジェクトにスクリプトを追加しなくても、
共通のエディタ拡張の機能を使うことができます
なので、自分がよく使うエディタ拡張を Unity.exe に一度反映してしまえば
それ以降は何もしなくても常にそのエディタ拡張の機能を使えるようになります
Unity.exe 単位でのエディタ拡張の作り方
Unity.exe 単位でのエディタ拡張を実装する時は
- 「ivy.xml」という名前の XML ファイル
- エディタ拡張用の DLL ファイル
この2つのファイルを用意する必要があります
まずは「エディタ拡張用の DLL ファイル」の作り方を紹介していきます
エディタ拡張用の DLL ファイルの作成
エディタ拡張用の DLL ファイルは
Visual Studio や MonoDevelop などでクラスライブラリとして作成します
ここでは Visual Studio Community 2017 で作成していきます
プロジェクトの作成
まず、Visual Studio のメニューの「ファイル>新規作成>プロジェクト」を選択します
次に、「Visual C#」の「クラスライブラリ(.NET Framework)」を選択して
ソリューション名や保存場所は適当に設定して「OK」を押します
ターゲットフレームワークの変更
プロジェクトを作成したら「ソリューション エクスプローラー」で
「Properties」を選択して開きます
そして「ターゲット フレームワーク」を「.NET Framework 3.5」に変更します
変更時に上記の確認ダイアログが表示されたら「OK」を押します
参照の追加
次に「ソリューション エクスプローラー」で「参照」を右クリックして
「参照の追加」を選択します
「参照マネージャー」が表示されたら
左のメニューで「参照」を選択してから右下の「参照」ボタンを押します
「参照するファイルの選択」が表示されたら
「C:\Program Files\Unity\Editor\Data\Managed」フォルダを開いて
「UnityEditor.dll」と「UnityEngine.dll」を選択して「追加」を押します
そして、「UnityEditor.dll」と「UnityEngine.dll」が追加されていることが確認できたら
「OK」ボタンを押します
アセンブリの設定
次は「ソリューション エクスプローラー」で
「Properties」内の「AssemblyInfo.cs」を選択して開きます
そして、4行目に using UnityEngine;
、
17行目に [assembly: AssemblyIsEditorAssembly]
を追加します
エディタ拡張用のプログラムの実装
以上で下準備が完了したので
いよいよエディタ拡張用のプログラムを実装していきます
「ソリューション エクスプローラー」で「Class1.cs」を選択して開いて
下記のソースコードを貼り付けます
using UnityEditor; using UnityEngine; namespace ClassLibrary1 { public class Class1 { [MenuItem( "Tools/Hello world!" )] private static void HelloWorld() { Debug.Log( "Hello world!" ); } } }
これは、Unity のメニューに「Tools>Hello world!」という項目を追加して
それが押されたら「Hello world!」と出力するだけのエディタ拡張です
今回はこのエディタ拡張を Unity.exe に適用していきます
DLL のビルド
これでエディタ拡張の機能の実装が完了したので
最後にソリューションをビルドして DLL を作成します
Visual Studio のメニューの「ビルド>ソリューションのビルド」を選択します
ビルドが完了したら
「【ソリューションの保存場所】\ClassLibrary1\bin\Debug」フォルダを開きます
そして「ClassLibrary1.dll」が作成されていれば、
エディタ拡張用の DLL ファイルの準備が完了です
「ivy.xml」という名前の XML ファイルの作成
次は「ivy.xml」という名前の XML ファイルを作成します
この「ivy.xml」というファイルは、
エディタ拡張のバージョンや作成者の名前などの情報を記述しておくファイルです
<?xml version="1.0" encoding="utf-8"?> <ivy-module version="2.0"> <info version="【バージョン】" organisation="【作成者の名前】" module="【エディタ拡張の名前】" e:packageType="UnityExtension" e:unityVersion="【Unity のバージョン】" xmlns:e="http://ant.apache.org/ivy/extra" /> <publications xmlns:e="http://ant.apache.org/ivy/extra"> <artifact name="Editor/【DLL のファイル名(拡張子なし)】" type="dll" ext="dll" /> </publications> </ivy-module>
ファイルのフォーマットはこのようになっており、
「バージョン」「作成者の名前」「エディタ拡張の名前」「Unity のバージョン」
「DLL のファイル名(拡張子なし)」を記述する必要があります
<?xml version="1.0" encoding="utf-8"?> <ivy-module version="2.0"> <info version="1.0.0" organisation="hoge" module="ClassLibrary1" e:packageType="UnityExtension" e:unityVersion="2017.1.1f1" xmlns:e="http://ant.apache.org/ivy/extra" /> <publications xmlns:e="http://ant.apache.org/ivy/extra"> <artifact name="Editor/ClassLibrary1" type="dll" ext="dll" /> </publications> </ivy-module>
今回作成したエディタ拡張の場合は上記のような記述になります
テキストエディタを開いて上記のコードをコピペして
「ivy.xml」という名前で保存してください
Unity.exe への反映
ここまでの手順で
- 「ivy.xml」という名前の XML ファイル
- エディタ拡張用の DLL ファイル
の用意ができたので、いよいよ Unity.exe に反映していきます
まず、適当な場所に「ClassLibrary1」という名前でフォルダを作成します
次に、さきほど作成した「ivy.xml」を「ClassLibrary1」フォルダ内に追加して、
さらに、「Editor」という名前のフォルダを作成します
そして、さきほど作成した「ClassLibrary1.dll」を
「Editor」フォルダ内に追加します
最後に、この「ClassLibrary1」フォルダを
「C:\Program Files\Unity\Editor\Data\UnityExtensions\Unity」に追加します
これで、Unity.exe にエディタ拡張を反映することができたので、
Unity を起動して新規プロジェクトを作成してみます
すると、Project ビューにファイルが存在しないのに
Unity メニューに「Tools>Hello world!」が追加されており、
これを選択すると「Hello world!」と出力されることがわかります
以上が、Unity.exe 単位でのエディタ拡張のやり方になります
おわりに
今回は「Hello world!」と出力されるだけのエディタ拡張を
Unity.exe に反映する方法を紹介しましたが、通常のエディタ拡張と同様に
Scene ビューや Hierarchy、Project ビューや Inspector も拡張することができます
他にも Asset Store や GitHub で公開されている便利なエディタ拡張を
この記事で紹介したやり方で DLL 化して ivy.xml を用意すれば
Unity.exe に反映することができるため、
Unity を自分好みのエディタにカスタマイズしていくことができます
興味がある方はぜひこの記事を参考に試してみて頂ければと思います
おまけ
この記事で紹介してきた「Unity.exe 単位でのエディタ拡張」は
Unity の「Module Manager」と呼ばれる機能を使用しているのですが、
実はこの機能は 2014 年にリリースされた「Unity4.6」の時点で使えるようになっており
当時、安藤 圭吾さんがブログで紹介されています