Unityで、自作Assetをdllファイルにコンパイルする

  • 48
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

自作Assetをdllにコンパイルしたい

Unity Asset Store で自作Assetを販売してみたいと思うのだが、
ソースコードをそのままの形で配布したくない。
販売されているAssetの中には、dllにコンパイルされているものもあるので、
コンパイルは可能のようだ。

で、どうやるか探ってみた。

コンソールで普通にコンパイルしてみた

http://docs-jp.unity3d.com/Documentation/Manual/UsingDLL.html

をみると、mono c#コンパイラを使ってコンパイルするといいらしい。

$ mcs -r:/Applications/Unity/Unity.app/Contents/Frameworks/Managed/Un\
ityEngine.dll -r:/Applications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEditor.dll -target:library -out:Foo.dll *.cs

作成されたdllファイルを、ためしに作ったプロジェクトのAssete/Foo/Pluginsディレクトリに、
ファインダー上でコピーして、Unityに戻ると自動でインポートしてくれる。。。が、エラーがでた。

エラーメッセージは、こんな感じ↓

Method not found: 'System.Reflection.MethodInfo.op_Inequality'

コンソールであがいてみた

調べてみると、このエラーは.NETのバージョンの違いで起きるようだ。
http://stackoverflow.com/questions/14194195/litjson-through-exception-on-centos-using-mono

Monoプロジェクトからとってきたコンパイラの問題かと思い、Unityに同梱されているコンパイラに変更してみる。ついでに、シェルスクリプトを書いてみた。(dmcsの位置は、Macでの場合です。)

compile.sh
#!/bin/bash                                                                                                                                          
/Applications/Unity/MonoDevelop.app/Contents/Frameworks/Mono.framework/Commands/dmcs -r:/Applications/Unity/Unity.app/Contents/Frameworks/Managed/Un\
ityEngine.dll -r:/Applications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEditor.dll -target:library -out:$1 *.cs

これを、コンソール上で呼び出す。

$ chmod +x compile.sh
$ ./compile.sh foo.dll

が、作成されたdllを前述のフォルダに突っ込んでやると、またも同じエラー。

Mono Developでコンパイル

あきらめて、Mono-Developでコンパイルしたら、うまくいった。

参考URL

[Unity3D]UnityのスクリプトをDLL化する

ここで気をつけたいのは、Mono Developで新規にライブラリ(DLL)用のプロジェクトを作成すること。
Unity上で*.csファイルをダブルクリックするとMono Developに飛び、あらかじめ作成されているらしきプロジェクトが表示されるが、このプロジェクト上でDLLを作成しようとするとハマる。新規プロジェクトを作って、そこで作業するのが良いようです。

一応、手順をメモ。
1.Mono Developでライブラリ(DLL)用のプロジェクトを新規作成
2.プロジェクトにAssetに含めたいソースを追加する。
3.メニューバーの「ビルド」から「(プロジェクト名)をビルド」を選択

以上。

補足

コンソール上でも、フレームワーク関連のオプションをうまく与えてやればなんとかなるのかな、と思わなくもない…。
時間があったら、やってみよう。

コンソール上でうまくいった

どうやら、monoのコンパイラを間違えていたようです。
MonoDevelop.appに含まれているものではなく、Unity.appに含まれているほうを使うとうまくいきました。
書き直したシェルスクリプトが以下。

compile.sh
#!/bin/bash                                                                                                                                          
/Applications/Unity/Unity.app/Contents/Frameworks/Mono/bin/smcs -r:/Applications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEngine.dll -r:/App\
lications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEditor.dll -target:library -out:$1 *.cs

これで、

$ chmod +x compile.sh
$ ./compile.sh foo.dll

としてやったら、動きました。