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のような「新しいプロジェクト」ダイアログが表示されます。
左部のリストから「インストール済み」→「テンプレート」→「Visual C#」項目を選択し、中央に表示された一覧から「クラス ライブラリ」を選択します。「名前」テキストボックスに任意のプロジェクト名を入力し「OK」ボタンを押してください。
あとは、このライブラリに含めるコードを記述してビルドするだけです。
namespace SampleLib { public class SampleMessenger { public static string Message { get { return "Stand by Ready!"; } } } }
コード1の SampleMessenger クラスは静的な Message プロパティを持つだけの単純なクラスです。Unity から、コード1で作成した DLL を読み込めれば、上記の Message プロパティから文字列を取り出せるはずです。
Unity プロジェクトの「Assets」フォルダ以下に上記で作成した DLL を複製すれば、自動的に DLL への参照が追加されます。
これで、SampleLib 名前空間内の型に Unity スクリプトからアクセスできます。SampleMessenger クラス Message プロパティから文字列を取得できます。
using UnityEngine; using SampleLib; public sealed class Sample : MonoBehaviour { void Start() { Debug.Log (SampleMessenger.Message); } }
コード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 を継承するクラスを作成できます。
DLL が MonoBehaviour を含んでいる場合、Unity の「Project」ビューで DLL ファイルを展開することができ、ゲームオブジェクトにドロップしてスクリプトとして設定できます。
特定のプロジェクトに依存しない再利用性の高い機能は DLL として分離することで、コード管理や共有がしやすくなります。また、ソースコードを公開せずに機能だけを公開する目的で DLL を使うこともできます。