WisdomSoft - for your serial experiences.

DLLと携帯可能コード

Visual Studio などの開発環境でビルドされた .NET Framework の DLL を Unity から参照し、呼び出すことができます。依存関係に基づいた機能ごとに DLL に分離することで、コードの携帯性を高められます。

DLLをUnityで使用する

DLL(Dynamic Link Library) は、外部のプログラムに読み込まれて使用されることが前提とされる、それ単体では実行できないプログラムの部品です。C# など .NET Framework で開発された DLL はアセンブリと呼ばれる実行単位を持ち、型情報などを含むマニフェストやリソースが含まれています。これを、他のアセンブリから参照することで DLL 内のコードを利用できます。Unity スクリプトそれ自体も Unity によって DLL にコンパイルされ、エンジンに組み込まれる形を取っています。

Unity で開発するゲームにおいても、有効なアセンブリを含む他の DLL を参照できます。つまり、Visual Studio などを使って作られた .NET Framework 用の DLL を Unity に組み込むことができます。

開発しているゲームに依存するスクリプトは Unity エディタでアセットとして管理され Unity によってコンパイルされますが、他のプロジェクトと共有されるコードや、Unity に依存しない再利用可能なコードは DLL として分離されるべきです。また、DLL 化された既存資産やサードパーティ製のライブラリを再利用することも可能です。

おおまかに、Unity で DLL を利用する理由は以下のようなものでしょう。

  • Unity で利用可能な既存資産が DLL で存在する
  • 開発するコードで Unity に依存しない部分を分離する
  • 再利用可能な Unity 用のライブラリを開発する(コードを非公開にしたい)

この場では Visual Studio 2013 で DLL を作成し、Unity で DLL のコードを呼び出します。Visual Studio を起動し「ファイル」メニューから「新規作成」→「プロジェクト」項目を選択してください。図1のような「新しいプロジェクト」ダイアログが表示されます。

図1 「クラス ライブラリ」の作成
図1 「クラス ライブラリ」の作成

左部のリストから「インストール済み」→「テンプレート」→「Visual C#」項目を選択し、中央に表示された一覧から「クラス ライブラリ」を選択します。「名前」テキストボックスに任意のプロジェクト名を入力し「OK」ボタンを押してください。

あとは、このライブラリに含めるコードを記述してビルドするだけです。

コード1
namespace SampleLib
{
    public class SampleMessenger
    {
        public static string Message 
        { 
            get
            {
                return "Stand by Ready!";
            }
        }
    }
}
実行結果
コード1 実行結果

コード1の SampleMessenger クラスは静的な Message プロパティを持つだけの単純なクラスです。Unity から、コード1で作成した DLL を読み込めれば、上記の Message プロパティから文字列を取り出せるはずです。

Unity プロジェクトの「Assets」フォルダ以下に上記で作成した DLL を複製すれば、自動的に DLL への参照が追加されます。

図2 アセットとして配置されたDLL
図2 アセットとして配置されたDLL

これで、SampleLib 名前空間内の型に Unity スクリプトからアクセスできます。SampleMessenger クラス Message プロパティから文字列を取得できます。

コード2
using UnityEngine;
using SampleLib;

public sealed class Sample : MonoBehaviour
{
    void Start()
    {
        Debug.Log (SampleMessenger.Message);
    }
}
実行結果
コード2 実行結果

コード2コード1で作成した DLL を含む Unity プロジェクトで有効です。実行結果から、正しく文字列が取得できていることが確認できます。

この結果から、Unity に依存しないコードを DLL として独立させ、Unity 以外の多様なプロジェクトで再利用できることが理解できます。例えば Web サービスを ASP.NET で開発し、クライアントを Unity で開発する場合、双方に共通するデータやロジックは DLL として共有できます。このようなコードを複数プラットフォームに携帯可能な状態に分離することで、重複を最小限に開発を進められます。

ただし、Unity で利用できる API は実行エンジンの Mono に依存しており、最新の .NET Framework の API が使えるわけではありません。利用できる API はビルド設定(Api Compatibility Level)によっても異なりますが、既定の設定である「.NET 2.0 Subset」の場合、C# 3.0 相当の機能があり、LINQ までは使えます。一方で、Task クラスや async/await を使った非同期処理には対応していません。

Unity で利用できる API の詳細は Mono Compatibility を参照してください。

Unity 依存ライブラリ

前述の DLL は Unity には依存しない純粋な .NET Framework の基本型を使って作られたものでした。これは Unity に限らず複数のプラットフォームで使われる DLL に必要な構成です。

一方で、特定のゲームプロジェクトには依存しない、複数の Unity プロジェクトで再利用されるようなコードは Unity に依存した DLL として開発することが可能です。この場合、DLL から Unity エンジンの API を参照し、Unity に依存した型を利用できます。MonoBehaviour クラスを継承したスクリプトを DLL 化するような場合は、この構成になるでしょう。

Unity に依存するプロジェクトは、以下の場所に配置されている UnityEngine.dll を参照しなければなりません。パスは既定の設定によるものなので、環境やインストール構成によって異なることがあります。

  • Windows - C:\Program Files (x86)\Unity\Editor\Data\Managed\UnityEngine.dll
  • Mac OS - /Applications/Unity.app/Contents/Frameworks/Managed/UnityEngine.dll

ゲーム内でスクリプトが使用する型の多くが UnityEngine.dll 内にあります。よって、上記の DLL をプロジェクト参照に追加してビルドを行ってください。

UnityEngine.dll を参照する DLL プロジェクトであれば Unity 依存のクラスを利用できます。もちろん、Unity スクリプトと同じように、MonoBehaviour を継承するクラスを作成できます。

図3 UnityEngine.dll を参照する DLL プロジェクト
図3 アセットとして配置されたDLL

DLL が MonoBehaviour を含んでいる場合、Unity の「Project」ビューで DLL ファイルを展開することができ、ゲームオブジェクトにドロップしてスクリプトとして設定できます。

図4 MonoBehaviour を含む DLL
図4 MonoBehaviour を含む DLL

特定のプロジェクトに依存しない再利用性の高い機能は DLL として分離することで、コード管理や共有がしやすくなります。また、ソースコードを公開せずに機能だけを公開する目的で DLL を使うこともできます。

外部リンク