通常,スクリプトはプロジェクトにソースファイルとして保持され,ソースが変更されたときにUnity によりコンパイルされます。しかし外部コンパイラを用いてスクリプトを__ダイナミック リンク ライブラリ__ (DLL) としてコンパイルすることも出来ます。結果の DLL は次にプロジェクトに追加して,それに含まれるクラスは通常のスクリプトと同様にオブジェクトにアタッチできます。
一般的にDLLよりもスクリプトで作業をしたほうが簡単です。しかし,DLL 形式で提供された サードパーティ製 Mono コードをアクセスしないといけない場合があります。自身のコードを開発するとき,Unity によりサポートされないコンパイラを使用できる場合があり(例えば F#),コードを DLL としてコンパイルし Unity プロジェクトに追加することが出来ます。さらに,ソースコードを提供することなくUnity コードを提供したい場合があり(例えば Asset Store プロダクトなど),その場合に DLL はこれを実現する簡単な方法です。
DLL を作成するには,最初に適切なコンパイラが必要です。.NETコードを生成する全てのコンパイラは Unity で動作することが保証されていないため,大量の作業に着手する前にコンパイラを何らかのコードでテストしておくことが賢明です。もし DLL がUnity APIに依存するコードが何もない場合,適切なコンパイラ オプションを使用してシンプルに DLL とすることができます。もし Unity API が使用したい場合, Unity 自身の DLL をコンパイラで利用可能とする必要があります。 Mac ではこれらはアプリケーション バンドルに含まれます(コンテキストメニューからShow Package Contentsコマンドを使用することでバンドルの内部構造が見れます。Unity アプリケーションを右クリックまたは Ctrl を押しながらクリックします):-
Unity DLL へのパスは通常,
/Applications/Unity/Unity.app/Contents/Frameworks/Managed/
…であり,2 つの DLL は UnityEngine.dll および UnityEditor.dll と名前がついています。
Windows では,DLL は Unity アプリケーションについてきたフォルダにあります。パスは通常
C:\Program Files\Unity\Editor\Data\Managed
…であり,DLL のファイル名は Mac OS 向けと同じです。
DLL をコンパイルするときの正確なオプションは使用されるコンパイラにより幅があります。例えば Mono C# コンパイラ,すなわち mcs,のコマンドラインは Mac OS では次のように見えます:-
mcs -r:/Applications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEngine.dll -target:library ClassesForDLL.cs
ここで,-r オプションはビルドに含めるべきライブラリへのパスを指定し,この場合は UnityEngine ライブラリです。 -target オプションによりどのビルドが必要であるか指定し, “library” という文字列は DLL ビルドを選択するために用いられています。最後に,コンパイルするソースファイルは ClassesForDLL.cs です(このファイルがカレントの作業フォルダにあることが前提ですが,必要であればファイルをフルパス指定できます)。全てがうまく行く前提で,結果の DLL ファイルはソースフォルダと同じ場所に表示さます。
一回コンパイルされた後,DLL は他の全てのアセットと同様に,Unity プロジェクトにドラッグ&ドロップできます。DLL アセットにはたたまれた 三角形マーク があり,ライブラリの中の別クラスを明らかにします。MonoBehaviour から得られるクラスは通常のスクリプトと同様にゲームオブジェクト上にドラッグ&ドロップできます。非MonoBehaviour クラスは他のスクリプトから通常の方法で直接使用できます。
このセクションでは 簡単な DLL でのサンプルをビルドして,.NET ライブラリを生成するメジャーな IDE である MonoDevelop および Visual Studio と統合する方法を学びます。このセクションではさらに DLL のデバッグ セッションを準備する方法も説明します。
まず,MonodevelopかVisual Studioで新規プロジェクトを作成します。Monodevelopでは
で を選択し,Visual Studioでは から を選択します。新規ライブラリの情報を入力します:
次に,Unity DLLの参照を追加しなければいけません。Monodevelopでは,ソリューション ブラウザで_コンテキストメニュー_を開き(右クリック),
を選択し, のオプションを選択します。Visual Studioでは,ソリューション エクスプローラでコンテキストメニューを開き(右クリック), を選択し, のオプションを選択します。At this stage, you will have the option to select the required DLL file. On Mac OSX, the file can be found at
Applications/Unity.app/Contents/Frameworks/Managed/UnityEngine.dll
…while on Windows, the path is
Program Files\Unity\Editor\Data\Managed\UnityEngine.dll
このサンプルでは,ソリューション ブラウザ でクラスの名前を “MyUtilities” にリネームしたうえ,次のコードと置き換えます:
using System;
using UnityEngine;
namespace DLLTest {
public class MyUtilities {
public int c;
public void AddValues(int a, int b) {
c = a + b;
}
public static int GenerateRandom(int min, int max) {
System.Random rand = new System.Random();
return rand.Next(min, max);
}
}
}
最後にプロジェクトをビルドして DLL ファイルおよびそのデバッグシンボルを生成します。
このサンプルでは<project folder>/bin/Debug/DLLTest.dll
として作成したものをUnityプロジェクトへコピーし,C# スクリプトとして “Test” を Assets フォルダに作成し,次のコードと置き換えます:
using UnityEngine;
using System.Collections;
using DLLTest;
void Start () {
MyUtilities utils = new MyUtilities();
utils.AddValues(2, 3);
print("2 + 3 = " + utils.c);
}
void Update () {
print(MyUtilities.GenerateRandom(0, 100));
}
最後にスクリプトをシーン上のオブジェクトにアタッチして(すなわち Main Camera),シーンを実行します。出力結果は Console ウィンドウで見られます。
Firstly, you should repare the debug symbols for the DLL. In MonoDevelop, copy the built file <project folder>/bin/Debug/DLLTest.dll.mdb
into the Assets/Plugins folder. In Visual Studio, execute
Program Files\Unity\Editor\Data\Mono\lib\mono\2.0\pdb2mdb.exe
in the command prompt, passing <project folder>\bin\Debug\DLLTest.pdb
as a parameter. Then, copy the converted file <project folder>\bin\Debug\DLLTest.dll.mdb
into Assets/Plugins.
Next, open the “Test” script in MonoDevelop. Make sure the Unity debugger is enabled from the Tools menu (Windows) or MonoDevelop-Unity menu (MacOS). The option you need from this menu is
.With this setup completed, you can debug code that uses the DLL in Unity in the usual way. See the Scripting Tools section for further information about debugging.