コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】Unity プロジェクトにスクリプトを追加せずにエディタを拡張する方法

はじめに

この記事は「Unity Advent Calendar 2017」の 12/6 分の記事です
昨日は kaiware007 さんの「Unityでマリオオデッセイの雲海を再現してみた」でした
明日は sassembla さんの「実機上でテスト実行/結果収集するツールの紹介」です

目次

エディタを拡張する2つの方法

通常、エディタ拡張を行う場合は
Unity プロジェクトに「Editor」という名前のフォルダを作成して
その中にスクリプトを追加してコードを記述していきます

f:id:baba_s:20171130184339p:plain

これは 「Unity のプロジェクト単位」でエディタを拡張するモノで、
簡単な手順で好きな機能をエディタに追加できてとてもお手軽ですが、
Unity にはコレとは別に、「Unity.exe 単位」でのエディタ拡張の手段が用意されています

f:id:baba_s:20171130203119p:plain

例えば、上記のスクリーンショットでは
Project ビューにファイルが存在しないのに
Unity のメニューに「KoganeBlog>Hoge」という項目が追加されています

これは「Unity.exe 単位」でエディタを拡張したモノであり、この方法を使うと
Unity プロジェクトにスクリプトを追加せずにエディタを拡張することができます

この記事では、Unity.exe 単位でのエディタ拡張の方法を紹介していきます

検証環境

  • Unity 2017.1.1f1
  • Visual Studio Community 2017
  • Windows 10

Unity.exe 単位でのエディタ拡張

使ってみる

まずは Unity.exe 単位のエディタ拡張を実際に使ってみましょう

  1. Unity を起動している場合は終了しておく
  2. 下記の URL にアクセスして「KoganeBlogExt.zip」をダウンロードする
    https://www.dropbox.com/s/fh88efciec29e6g/KoganeBlogExt.zip?dl=0
  3. ダウンロードした「KoganeBlogExt.zip」を展開する
  4. 展開した「KoganeBlogExt」フォルダを
    「C:\Program Files\Unity\Editor\Data\UnityExtensions\Unity」にコピーする

f:id:baba_s:20171201210711p:plain

これで、Unity.exe 単位のエディタ拡張の反映が完了したので
この状態で Unity を起動して新規プロジェクトを作成してみます
すると、一見何も変わっていないように見えますが

f:id:baba_s:20171201211255p:plain

Unity エディタを再起動するメニューが「File>Restart」に追加されていたり

f:id:baba_s:20171201211323p:plain

空のゲームオブジェクトを原点に作成するメニューが
「GameObject>Create Empty At Zero」に追加されていたり

f:id:baba_s:20171201211401p:plain

Transform の Inspector に値をリセットするボタンが追加されていたり

f:id:baba_s:20171201211423p:plain

アセットのファイルパスをコピーするメニューが追加されていたりと、
エディタが拡張されていることがわかります

解説

f:id:baba_s:20171201210711p:plain

さきほど、「KoganeBlogExt」フォルダを
「C:\Program Files\Unity\Editor\Data\UnityExtensions\Unity」にコピーしましたが
この時にエディタ拡張の機能が反映されています

f:id:baba_s:20171201212052p:plain

「KoganeBlogExt」フォルダの中を見てみると
4つのフォルダが入っていることがわかります
このそれぞれのフォルダの中にエディタ拡張用のファイルが格納されています

f:id:baba_s:20171201212331p:plain

例えば一番上の「KBAssetPathCopyer」フォルダを開いてみると
「Editor」フォルダと「ivy.xml」ファイルが入っており

f:id:baba_s:20171201212530p:plain

「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 で作成していきます

プロジェクトの作成

f:id:baba_s:20171202095529p:plain

まず、Visual Studio のメニューの「ファイル>新規作成>プロジェクト」を選択します

f:id:baba_s:20171202095537p:plain

次に、「Visual C#」の「クラスライブラリ(.NET Framework)」を選択して
ソリューション名や保存場所は適当に設定して「OK」を押します

ターゲットフレームワークの変更

f:id:baba_s:20171202095551p:plain

プロジェクトを作成したら「ソリューション エクスプローラー」で
「Properties」を選択して開きます

f:id:baba_s:20171202095608p:plain

そして「ターゲット フレームワーク」を「.NET Framework 3.5」に変更します

f:id:baba_s:20171202095630p:plain

変更時に上記の確認ダイアログが表示されたら「OK」を押します

参照の追加

f:id:baba_s:20171202100245p:plain

次に「ソリューション エクスプローラー」で「参照」を右クリックして
「参照の追加」を選択します

f:id:baba_s:20171202100403p:plain

「参照マネージャー」が表示されたら
左のメニューで「参照」を選択してから右下の「参照」ボタンを押します

f:id:baba_s:20171202101030p:plain

「参照するファイルの選択」が表示されたら
「C:\Program Files\Unity\Editor\Data\Managed」フォルダを開いて
「UnityEditor.dll」と「UnityEngine.dll」を選択して「追加」を押します

f:id:baba_s:20171202101216p:plain

そして、「UnityEditor.dll」と「UnityEngine.dll」が追加されていることが確認できたら
「OK」ボタンを押します

アセンブリの設定

f:id:baba_s:20171202101501p:plain

次は「ソリューション エクスプローラー」で
「Properties」内の「AssemblyInfo.cs」を選択して開きます

f:id:baba_s:20171202101850p:plain

そして、4行目に using UnityEngine;
17行目に [assembly: AssemblyIsEditorAssembly] を追加します

エディタ拡張用のプログラムの実装

以上で下準備が完了したので
いよいよエディタ拡張用のプログラムを実装していきます

f:id:baba_s:20171202102411p:plain

「ソリューション エクスプローラー」で「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 を作成します

f:id:baba_s:20171202102922p:plain

Visual Studio のメニューの「ビルド>ソリューションのビルド」を選択します

ビルドが完了したら
「【ソリューションの保存場所】\ClassLibrary1\bin\Debug」フォルダを開きます

f:id:baba_s:20171202111650p:plain

そして「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 に反映していきます

f:id:baba_s:20171202105110p:plain

まず、適当な場所に「ClassLibrary1」という名前でフォルダを作成します

f:id:baba_s:20171202110145p:plain

次に、さきほど作成した「ivy.xml」を「ClassLibrary1」フォルダ内に追加して、
さらに、「Editor」という名前のフォルダを作成します

f:id:baba_s:20171202110249p:plain

そして、さきほど作成した「ClassLibrary1.dll」を
「Editor」フォルダ内に追加します

f:id:baba_s:20171202110604p:plain

最後に、この「ClassLibrary1」フォルダを
「C:\Program Files\Unity\Editor\Data\UnityExtensions\Unity」に追加します

これで、Unity.exe にエディタ拡張を反映することができたので、
Unity を起動して新規プロジェクトを作成してみます

f:id:baba_s:20171202111022p:plain

すると、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」の時点で使えるようになっており
当時、安藤 圭吾さんがブログで紹介されています

関連記事