Version: 2021.1
言語: 日本語
プラグインインスペクター
ネイティブプラグイン

マネージプラグイン

マネージプラグインは 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 以外のクラスは他のスクリプトから通常の方法で直接使用できます。

展開された DLL。複数クラスを表示
展開された DLL。複数クラスを表示

Visual Studio の利用

ここでは、Visual Studioで簡単な DLL をビルドして統合する方法と、DLL のデバッグセッションに必要な準備について説明します。

プロジェクトの設定

Visual Studio を開き、新しいプロジェクトを作成します。File > New > Project と移動し、Visual C# > Class Library を選択します。

新しいライブラリの以下の情報を入力します。

  • Name は名前空間です (この例では DLLTest という名前を使用)。
  • Location はプロジェクトの親フォルダーです。
  • Solution name はプロジェクトフォルダーです。

次に、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 ファイルとそのデバッグシンボルを生成します。

DLL を Unity で使用

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# コードのコンパイル

unsafe C# コード のコンパイルを Unity でサポートするには、Edit > Project Settings > Player の順に移動します。Other Settings セクションを展開して Allow ‘unsafe’ Code チェックボックスをチェックします。

プラグインインスペクター
ネイティブプラグイン