先日、Unityからロジック部分を切り離せるのか検討してみたところ、いけそうだったので、今度は切り離したロジック部分をDLLにして外部から利用する方法を調べました。環境はWindowsです。
Unity(MONO)の機能を使ってDLLをビルド
お手軽なことに、Unity側に存在する機能をそのまま使えました。smcs.batです。
※ こちらのページを参考にさせていただきました。
前回のサンプルを使い、実際にビルドしてみたコマンドがこちらです(ディレクトリ名は一部置換しています)。
例
"C:\Program Files\Unity\Editor\Data\Mono\bin\smcs.bat" -target:library -r:C:\Users\main\Desktop\hogemoge\UniRx.dll -r:C:\Users\main\Desktop\hogemoge\config.dll -out:jikken.dll /recurse:C:\Users\main\Desktop\etc\jikken\github\unity-sample\Assets\Scripts\Models\*.cs
UnityEngine、UnityEditorには依存していないため、UniRxと、それからConfigクラスのダミーをDLL化したものだけ読み込ませています。
DLLを呼んでみる
試しに作成されたDLLを参照するコンソールアプリケーションのプロジェクトを一つ作り、下記のコードを実行してみます。
Program.cs
using System;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var hoge = new Number(5);
hoge.Pow();
Console.WriteLine(hoge.Value.ToString());
}
}
}
無事に動作しました。
余談: 他には?
上記の手段以外にも、
- 別プロジェクトでDLLを作成しておいて、それをUnityから読む
- シンボリックリンクを使ってスクリプトを共有
といった方法があるようです。
が、前者は実験してみたところiOSで動作しませんでした。後者はかなり力技です。
今のところ、Unity内のスクリプトをDLL化するのはsmcs.batを利用するのが総合的に見て一番なのかなという印象です。