47
48

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-08-13

自作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

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

47
48
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
47
48

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?