マネージプラグインは Visual Studio などのツールで作成されたマネージ .NET アセンブリです。それらは、.NET コードのみが含まれているため、.NET ライブラリでサポートされていない機能にアクセスできません。ただし、Unity がスクリプトのコンパイルに使用する標準の .NET ツールは、マネージコードにアクセスできます。そのため、プラグインが Unity の外でコンパイルされ、そのソースが使用できない場合があるという点を除いて、マネージプラグインコードと Unity スクリプトコードの間で使用上の違いはほとんどありません。
通常、Unity はスクリプトをプロジェクトにソースファイルとして保存し、ソースが変更されたときにコンパイルします。ただし、外部コンパイラーを用いてスクリプトを DLL (Dynamic Link Library) としてコンパイルすることもできます。その後 .dll ファイルをプロジェクトに加え、含まれるクラスを通常のスクリプトと同様にオブジェクトにアタッチできます。コンパイルされた DLL は、Unityでは マネージプラグイン と呼ばれます。
一般的に、Unity では DLL よりもスクリプトの方がはるかに簡単に作業できます。ただし、Unity がサポートしていないコンパイラーをコードに使用したい場合や、サードパーティの Mono コードを .dll ファイルに追加したい場合、あるいは Unity のコードをソースなしで提供したい場合などがあります。.dll ファイルを作成して Unity プロジェクトに追加することは、これらの制限を回避するための最も簡単な方法です。
マネージプラグインを作成するには、最初に適切なコンパイラーが必要です。.NET コードを生成するすべてのコンパイラーが Unity で動作するというわけではないため、大量の作業に着手する前にコンパイラーをいくつのコードでテストしておくことが必要です。もし、DLL に Unity API に依存するコードがまったく含まれていない場合は、適切なコンパイラー設定を使用してそのコードを簡単にに .dll ファイルにコンパイルすることができます。
Unity API を使いたい場合は、Unity 独自の DLL をコンパイラーで利用できるようにする必要があります。macOS では、DLL はアプリケーションバンドルに含まれています。DLL を見るには、コンピューターで Unity.app
ファイル (Applications/Unity/Hub/Editor/[バージョン番号]/Unity.app
)を探し、Unity.app
を右クリックして、Show Package Contents を選択してください。
macOS の場合、Unity の DLL のパスは以下の通りです。
/Applications/Unity/Unity.app/Contents/Managed/UnityEngine
Windows の場合、Unity の DLL のパスは以下の通りです。
C:\Program Files\Unity\Editor\Data\Managed\UnityEngine
UnityEngine
フォルダーには、多数のモジュールの .dll ファイルが含まれており、これらを参照することで、必要な特定の名前空間にアクセスすることができます。さらに、いくつかの名前空間では Unity プロジェクトのコンパイルされたライブラリへの参照を必要とします (例えば、UnityEngine.UI
)。このライブラリは、プロジェクトフォルダーのディレクトリにあります。
~\Library\ScriptAssemblies
DLL をコンパイルするときの正確なオプションは使用するコンパイラーにより異なります。例えば Mono C# コンパイラー mcs
、のコマンドラインは Mac OS では以下の通りです。
mcs -r:/Applications/Unity/Unity.app/Contents/Managed/UnityEngine/UnityEngine.UIModule.dll -target:library ClassesForDLL.cs
ここで、-r
オプションはビルドに含むライブラリへのパスを指定し、この場合は UnityEngine.UIModule
ライブラリです。-target
オプションは、どのビルドが必要であるか指定し、“library” という単語は DLL ビルドを意味するために用いられています。最後に、コンパイルするソースファイルは ClassesForDLL.cs
です。コンパイラーは、このファイルが使用中の作業フォルダー内にあることを前提としていますが、必要であればファイルをフルパス指定できます。すべてがうまく行くと、結果の .dll ファイルはソースファイルと同じフォルダーに表示されます。
いったん DLL をコンパイルすると、他のすべてのアセットと同様に、Unity プロジェクトにドラッグアンドドロップできます。マネージプラグインには三角形マークがあり、これをクリックして開くとライブラリの中のクラスを表示できます。MonoBehaviour
から派生するクラスは通常のスクリプトと同様にゲームオブジェクト上にドラッグアンドドロップできます。MonoBehaviour
以外のクラスは他のスクリプトから通常の方法で直接使用できます。
ここでは、Visual Studioで簡単な DLL をビルドして統合する方法と、DLL のデバッグセッションに必要な準備について説明します。
Visual Studio を開き、新しいプロジェクトを作成します。File > New > Project と移動し、Visual C# > Class Library を選択します。
新しいライブラリの以下の情報を入力します。
DLLTest
という名前を使用)。次に、Unity DLL への参照を追加します。Visual Studio で、ソリューションエクスプローラーの References のコンテキストメニューを開き、Add Reference を選択します。次に、Browse > Browse > select file を選択します。
この段階で、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));
}
}
このスクリプトをシーンのゲームオブジェクトにアタッチして再生すると、Unity は DLL からのコードの出力を Console ウィンドウに表示します。
unsafe C# コード のコンパイルを Unity でサポートするには、Edit > Project Settings > Player の順に移動します。Other Settings セクションを展開して Allow ‘unsafe’ Code チェックボックスをチェックします。