自作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での場合です。)
#!/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
ここで気をつけたいのは、Mono Developで新規にライブラリ(DLL)用のプロジェクトを作成すること。
Unity上で*.csファイルをダブルクリックするとMono Developに飛び、あらかじめ作成されているらしきプロジェクトが表示されるが、このプロジェクト上でDLLを作成しようとするとハマる。新規プロジェクトを作って、そこで作業するのが良いようです。
一応、手順をメモ。
1.Mono Developでライブラリ(DLL)用のプロジェクトを新規作成
2.プロジェクトにAssetに含めたいソースを追加する。
3.メニューバーの「ビルド」から「(プロジェクト名)をビルド」を選択
以上。
補足
コンソール上でも、フレームワーク関連のオプションをうまく与えてやればなんとかなるのかな、と思わなくもない…。
時間があったら、やってみよう。
コンソール上でうまくいった
どうやら、monoのコンパイラを間違えていたようです。
MonoDevelop.appに含まれているものではなく、Unity.appに含まれているほうを使うとうまくいきました。
書き直したシェルスクリプトが以下。
#!/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
としてやったら、動きました。