ドキュメント

Unity Engine

Unity Engine

# マネージプラグイン

Details on using managed plug-ins.
読み終わるまでの所要時間 13 分最終更新 1ヶ月前

マネージプラグインとは、Unity の外部で作成し、Visual Studio などのツールで動的リンクライブラリ (DLL) にコンパイルした .NET アセンブリ です。
マネージプラグインは、Unity プロジェクトの Assets フォルダーにソースファイルとして格納される標準の C# スクリプトとは処理が異なります。Unity では標準の C# スクリプトに変更があるたびにコンパイルを行いますが、DLL は事前にコンパイルされているので変更はありません。コンパイルされた .dll ファイルをプロジェクトに追加し、そこに含まれるクラスを ゲームオブジェクト に標準のスクリプトと同じ方法でアタッチできます。
C# のマネージドコードの詳細については、Microsoft のマネージコードに関するドキュメント を参照してください。
マネージプラグインは .NET コードのみで書かれているため、.NET ライブラリでサポートされていない機能は利用できません。ただし、マネージコードは Unity がスクリプトのコンパイルに使用する標準の .NET ツールを利用できます。
Unity で DLL を使用する場合、スクリプトを使用する場合よりも多くのステップが必要です。ただし、.dll ファイルを作成して Unity プロジェクトに追加すると便利な場合もあります。例えば以下のような場合です。
  • Unity が対応しないコードでコンパイラーを使いたい。
  • サードパーティの .NET コードを .dll ファイルに加えたい。
  • Unity にソース無しでコードを供給したい。
このページでは、マネージプラグインを作成するための一般的なメソッドと、マネージプラグインの作成方法、Visual Studio を使用したデバッグセッションの設定方法について説明します。

ネイティブプラグインの作成

マネージプラグインを作成するには、DLL を作成する必要があります。これを行うには、以下のような適切なコンパイラーが必要です。
.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 ファイルは、ソースファイルと同じフォルダーに表示されます。

マネージプラグインの使用

DLL をコンパイルしたら、他のアセットと同じように .dll ファイルを Unity プロジェクトにドラッグできます。これにより、以下が行えるようになります。
  • マネージプラグインを展開して、ライブラリ内のそれぞれのクラスを表示。
  • MonoBehaviour から派生したクラスをゲームオブジェクトにドラッグ。
  • 他のスクリプトから MonoBehaviour 以外のクラスを直接使用。

クラスが見えるように拡張された DLL

Visual Studio で DLL を作成

ここでは、以下を説明します。
  • Visual Studio で簡単な DLL サンプルをビルドして統合する方法
  • Unity で DLL のデバッグセッションを準備する方法。

プロジェクトの設定

  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 のコードを作成

  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); } }}
  1. プロジェクトをビルドして、DLL ファイルとそのデバッグシンボルを生成します。

Unity で DLL をデバッグ

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)); }}
  1. このスクリプトをシーンのゲームオブジェクトにアタッチして、再生ボタンをクリックします。
Unity は、DLL からのコードの出力をコンソールウィンドウに表示します。

unsafe な C# コードのコンパイル

unsafe C# コード は、メモリに直接アクセスできるコードです。セキュリティリスクがないことをコンパイラーが検証できないため、デフォルトでは有効になっていません。
以下の場合に unsafe コードを使う場合があります。
  • ポインターを使用してメモリにアクセスする。
  • Raw メモリを割り当てる。
  • ポインターを用いてメソッドを呼び出す。
unsafe C# コードのコンパイルに対応するには、Edit > Project Settings > Player > Other Settings の順に移動し、Allow Unsafe Code を有効にします。
詳細は、unsafe コードに関する Microsoft ドキュメント を参照してください。

追加リソース