# # マネージプラグイン

> Details on using managed plug-ins.

マネージプラグインとは、Unity の外部で作成し、Visual Studio などのツールで動的リンクライブラリ (DLL) にコンパイルした [.NET アセンブリ](/engine/6000.0/manual/scripting/environment-and-tools/overview-of-dot-net-in-unity/dotnet-profile-support.md) です。

マネージプラグインは、Unity プロジェクトの Assets フォルダーにソースファイルとして格納される標準の C# スクリプトとは処理が異なります。Unity では標準の C# スクリプトに変更があるたびにコンパイルを行いますが、DLL は事前にコンパイルされているので変更はありません。コンパイルされた .dll ファイルをプロジェクトに追加し、そこに含まれるクラスを **ゲームオブジェクト** に標準のスクリプトと同じ方法でアタッチできます。

C# のマネージドコードの詳細については、[Microsoft のマネージコードに関するドキュメント](https://docs.microsoft.com/en-us/dotnet/standard/managed-code) を参照してください。

マネージプラグインは .NET コードのみで書かれているため、.NET ライブラリでサポートされていない機能は利用できません。ただし、マネージコードは Unity がスクリプトのコンパイルに使用する標準の .NET ツールを利用できます。

Unity で DLL を使用する場合、スクリプトを使用する場合よりも多くのステップが必要です。ただし、.dll ファイルを作成して Unity プロジェクトに追加すると便利な場合もあります。例えば以下のような場合です。

* Unity が対応しないコードでコンパイラーを使いたい。
* サードパーティの .NET コードを .dll ファイルに加えたい。
* Unity にソース無しでコードを供給したい。

このページでは、マネージプラグインを作成するための一般的なメソッドと、マネージプラグインの作成方法、Visual Studio を使用したデバッグセッションの設定方法について説明します。

## ネイティブプラグインの作成##creating-a-managed-plug-in

マネージプラグインを作成するには、DLL を作成する必要があります。これを行うには、以下のような適切なコンパイラーが必要です。

* [Visual Studio](https://visualstudio.microsoft.com/)
* [MsBuild](https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild?view=vs-2019)
* [.NET SDK](https://docs.microsoft.com/en-us/dotnet/core/sdk)

.NET コードを生成するすべてのコンパイラーが Unity と互換性があるわけではないため、大量の作業に着手する前にいくつかのコードでコンパイラーをテストするようにしてください。DLL の作成に使用するメソッドは、DLL に Unity API コードが含まれているかどうかによって異なります。

* DLL に Unity API コードが含まれている場合、コンパイル前に Unity 自体の DLL をコンパイラーで利用可能にする必要があります。

  1. Unity の DLL を探すには以下を行います。

     * Windows の場合、`C:\Program Files\Unity\Hub\Editor\<version-number>\Editor\Data\Managed\UnityEngine` に移動します。

     * macOS の場合

       1. コンピュータで `Unity.app` ファイルを探します。macOS の場合、Unity の DLL のパスは `/Applications/Unity/Hub/Editor/<version-number>/Unity.app/Contents/Managed/UnityEngine` です。
       2. `Unity.app` を右クリックします。
       3. **Show Package Contents** を選択します。

  2. `UnityEngine` フォルダーには、多くのモジュールの .dll ファイルが含まれています。これらを参照し、スクリプトで使用できるようにします。名前空間によっては、Unity プロジェクトからコンパイルされたライブラリ (例えば、`UnityEngine.UI`) への参照も必要です。プロジェクトフォルダーのディレクトリ `~\Library\ScriptAssemblies` でこれを探します。

* DLL に Unity API コードが含まれていない場合、または Unity の DLL をすでに利用可能にしている場合、コンパイラーのドキュメントに従って .dll ファイルをコンパイルしてください。DLL をコンパイルするための正確なオプションは、使用するコンパイラーによります。例えば、Roslyn コンパイラーのコマンドライン `csc` は、macOS では次のようになります。

`csc /r:/Applications/Unity/Hub/Editor/<version-number>/Unity.app/Contents/Managed/UnityEngine.dll /target:library /out:MyManagedAssembly.dll /recurse:*.cs`

以下の例の説明:

* `/r` オプションで、ビルドに加えるライブラリへのパス (ここでは、`UnityEngine` ライブラリ) を指定します。
* `/target` オプションで、必要なビルドのタイプを指定します。"library" は DLL ビルドを意味します。
* `/out` でライブラリ名を指定します。この場合、"MyManagedAssembly.dll" となります。
* 追加したいソースファイルの名前を入力します。`/recurse` メソッドを使用して、現在の作業ディレクトリとサブフォルダーにある ".cs'" で終わるすべてのファイルを追加します。結果の .dll ファイルは、ソースファイルと同じフォルダーに表示されます。

## マネージプラグインの使用##using-a-managed-plug-in

DLL をコンパイルしたら、他のアセットと同じように .dll ファイルを Unity プロジェクトにドラッグできます。これにより、以下が行えるようになります。

* マネージプラグインを展開して、ライブラリ内のそれぞれのクラスを表示。
* MonoBehaviour から派生したクラスをゲームオブジェクトにドラッグ。
* 他のスクリプトから MonoBehaviour 以外のクラスを直接使用。


**クラスが見えるように拡張された DLL:**
![](/api/media?file=/engine/6000.0/media/images/managed-plugin.png)

## Visual Studio で DLL を作成##create-a-dll-with-visual-studio

ここでは、以下を説明します。

* Visual Studio で簡単な DLL サンプルをビルドして統合する方法
* Unity で DLL のデバッグセッションを準備する方法。

### プロジェクトの設定##setting-up-the-project

1. Visual Studio を起動し、新しいプロジェクトを作成します。

2. **File** > **New** > **Project** > **Visual C#** > **.Net Standard** > **Class Library (.NET Standard)** の順に選択します。

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

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

4. Unity DLL をスクリプトで利用できるようにします。Visual Studio で、ソリューションエクスプローラーの **References** のコンテキストメニューを開き、**Add Reference** > **Browse** > **Select File** の順に選択します。

5. UnityEngine フォルダーで、必要な .dll ファイルを選択します。

### DLL のコードを作成##coding-the-dll

1. この例では、ソリューションブラウザーでデフォルトクラスの名前を `MyUtilities` に変更します。
2. コードを以下のように置き換えてください。

```
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);
        }
    }
}
```

3. プロジェクトをビルドして、DLL ファイルとそのデバッグシンボルを生成します。

## Unity で DLL をデバッグ##debugging-a-dll-in-unity

Unity で DLL のデバッグセッションを設定するには、以下を行います。

1. Unity で新規プロジェクトを作成し、ビルドした .dll ファイル (例えば、`<project folder>/bin/Debug/DLLTest.dll`) を Assets フォルダーにコピーします。
2. Assets フォルダーに Test という C# スクリプトを作成します。
3. そのコンテンツを、DLL で作成したクラスの新しいインスタンスを作成し、その関数を使用して出力を **Console** ウィンドウに表示するスクリプトに置き換えます。例えば、上のセクションの DLL のテストスクリプトを作成するには、以下のコードをコピーしてください。

```
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));
     }
}
```

4. このスクリプトをシーンのゲームオブジェクトにアタッチして、再生ボタンをクリックします。

Unity は、DLL からのコードの出力をコンソールウィンドウに表示します。

## unsafe な C# コードのコンパイル##compiling-unsafe-c-code

[unsafe C# コード](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/unsafe) は、メモリに直接アクセスできるコードです。セキュリティリスクがないことをコンパイラーが検証できないため、デフォルトでは有効になっていません。

以下の場合に unsafe コードを使う場合があります。

* ポインターを使用してメモリにアクセスする。
* Raw メモリを割り当てる。
* ポインターを用いてメソッドを呼び出す。

unsafe C# コードのコンパイルに対応するには、**Edit** > **Project Settings** > **Player** > **Other Settings** の順に移動し、**Allow Unsafe Code** を有効にします。

詳細は、[unsafe コードに関する Microsoft ドキュメント](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/unsafe-code) を参照してください。

## 追加リソース##additional-resources

* [ネイティブプラグイン](/engine/6000.0/manual/scripting/compilation-and-code-reload/plug-ins/native.md)
* [デスクトップ用プラグイン](/engine/6000.0/manual/scripting/compilation-and-code-reload/plug-ins/for-desktop.md)
* [ネイティブプラグインインターフェース](/engine/6000.0/manual/scripting/compilation-and-code-reload/plug-ins/native-plugin-interface.md)
