通常、スクリプトはプロジェクトにソースファイルとして保存され、ソースが変更されたときに Unity によりコンパイルされます。ただし、外部コンパイラーを用いてスクリプトを ダイナミックリンクライブラリ (DLL) としてコンパイルすることもできます。その結果の DLL はプロジェクトに加えられ、含まれるクラスは通常のスクリプトと同様にオブジェクトにアタッチできます。
通常、Unity では、DLL を扱うよりもスクリプトの方がずっと簡単です。ただし、DLL の形式で提供されるサードパーティ製の Mono コードにアクセスできる場合があります。独自のコードを開発するときに、Unity でサポートされていないコンパイラーを使用したい場合は、コードを 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/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/Managed/UnityEngine.dll -target:library ClassesForDLL.cs
ここで、-r オプションはビルドに含むライブラリへのパスを指定し、この場合は UnityEngine ライブラリです。-target オプションは、どのビルドが必要であるか指定し、“library” という文字列は DLL ビルドを選択するために用いられています。最後に、コンパイルするソースファイルは ClassesForDLL.cs です (このファイルは使用中の作業フォルダー内にあることが前提ですが、必要であればファイルをフルパス指定できます)。すべてがうまく行くと、結果の DLL ファイルはすぐにソースファイルと同じフォルダーに表示されます。
いったんコンパイルされると、DLL は他のすべてのアセットと同様に、Unity プロジェクトにドラッグアンドドロップできます。DLL アセットには三角形マークがあり、これをクリックして開くとライブラリの中のクラスを表示します。MonoBehaviour から派生するクラスは通常のスクリプトと同様にゲームオブジェクト上にドラッグアンドドロップできます。MonoBehaviour 以外のクラスは他のスクリプトから通常の方法で直接使用できます。
ここでは、Visual Studioで簡単な DLL をビルドして統合する方法と、DLL のデバッグセッションに必要な準備について説明します。
最初に、Visual Studio を開き、新しいプロジェクトを作成します。Visual Studio で、File > New > Project と移動し、Visual C# > Class Library を選択します。
新しいライブラリの情報を入力します。
次に、Unity DLL への参照を追加します。Visual Studio で、ソリューションエクスプローラーの References のコンテキストメニューを開き、Add Reference を選択します。次に、オプション Browse > Browse > select file を選択します。
この段階で、必要な DLL ファイルを選択できるようになります。Mac OS X ではファイルは以下の場所にあります。
Applications/Unity.app/Contents/Managed/UnityEngine.dll
Windows では、パスは以下のとおりです。
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 ファイルとそのデバッグシンボルを生成します。
この例では、Unityで新しいプロジェクトを作成し、ビルドファイル <project folder>/bin/Debug/DLLTest.dll を Assets フォルダーにコピーします。次に、Assets 内に “Test” という名前の C# スクリプトを作成し、その内容を以下のコードに置き換えます。
using UnityEngine;
using System.Collections;
using DLLTest;
public class Test : MonoBehaviour {
void Start () {
MyUtilities utils = new MyUtilities();
utils.AddValues(2, 3);
print("2 + 3 = " + utils.c);
}
void Update () {
print(MyUtilities.GenerateRandom(0, 100));
}
}
最後に、スクリプトをシーン上のオブジェクトにアタッチして再生します。DLL からのコードの出力は Console ウィンドウに表示されます。
まず、DLL のデバッグシンボルを準備します。Visual Studio のコマンドプロンプトで、<project folder>\bin\Debug\DLLTest.pdb をパラメーターとして渡します。
Program Files\Unity\Editor\Data\Mono\lib\mono\2.0\pdb2mdb.exe
次に、変換したファイル <project folder>\bin\Debug\DLLTest.dll.mdb を Assets/Plugins にコピーします。
この設定が完了すれば、Unity 上で DLL を使用するコードを通常の方法でデバッグできます。デバッグに関する詳細は スクリプティングツール を参照してください。
‘unsafe’ C# コード のコンパイルを Unity でサポートすることができます。これを行うには、Edit > Project Settings の順に移動し、Player カテゴリを選択します。Other Settings パネルを展開して Allow ‘unsafe’ Code チェックボックスをチェックします。
2018–03–20 限られた 編集レビュー で修正されたページ
MonoDevelop は 2018.1 以降 Visual Studio に置き換えられました
Allow ‘unsafe’ Code チェックボックス__ は 2018.1 で追加