Unityでライブラリを使うには
本チュートリアルは今までと少し異なる用途を想定したものです。本チュートリアルではWindows
のみをターゲットとした.NETアプリケーションではなく、ゲームエンジンであるUnityEngine上でBaku.LibqiDotNet
を利用する方法を紹介します。
1. Unityが利用できる環境
Windows
で32bitのUnity Editorを用いるか、Mac
のUnity Editorを用いてBaku.LibqiDotNet
と連携した開発が可能です。
本記事以外の話題は基本的にWindows
に焦点を絞ってきましたが、Unity
の場合はターゲットとするプラットフォームが広く取れるため、原理的にはラップ元であるlibqi
がサポートされる全てのプラットフォームでBaku.LibqiDotNet
とUnityを連携させたアプリケーションを動作させられます。
とはいうものの、パッケージの体裁として現状ではWindows
とMac
のみがサポートされています。これら以外のOS(デスクトップのLinux
やAndroid
など)上でBaku.LibqiDotNet
を用いたUnityアプリケーションを動かしたい場合でも、マネージライブラリであるBaku.LibqiDotNet.dll
はそのまま利用できます。ただし、動作させたいOSに対応したlibqi
のネイティブライブラリをUnityプロジェクトのAssetへ正しく配置する必要があることに注意してください。例えばUnityでビルドしたプログラムをLinux(Ubuntu)
上で動作させたい場合、libqic.so
やlibqi.so
をはじめとするshared objectライブラリを配布されたNAOqi SDKなどからコピーしてくる必要があります。
2. Unity用ライブラリの利用
Unity用のパッケージファイル(.unitypackage
)はNuGetでは提供していません。筆者がUnity
向けにビルドしたパッケージをGoogle Driveに公開しているので、こちらからパッケージを取得してください。なるべく新しいバージョンを利用することを推奨しています。
Unitypackageの利用上のポイントは以下の3点です。
- Windowsの場合32bitのUnity Editorを使わないとデバッグ実行が出来ません。
- パッケージの導入方法についてはzipファイル内の
readme.txt
に記載しています。 - ライブラリの内容は基本的にNuGetパッケージとほぼ同一ですが、Macに対応するためにNuGetパッケージに含まれないフォルダを追加で持っています。
.NETアプリケーションと同様のライブラリを移植しているため、Unityに特有な機能は一切提供していません。
Unity向けパッケージに含まれるBaku.LibqiDotNet.dll
はNuGetパッケージに含まれるBaku.LibqiDotNet.dll
とほぼ一致していますが、下記の2点のみが異なります。
- NuGetパッケージ版ではターゲットアーキテクチャが
x86
とされているのに対し、Unity向けパッケージではAnyCPU
がターゲット - NuGetパッケージ版では
DllImport
で指定するアンマネージライブラリ名がqic.dll
であるのに対し、Unity向けパッケージでは拡張子のないqic
という名前指定が使われている
とくにDllImport
に関する設定の差により、NuGetパッケージのライブラリをUnityに持ち込んだり、逆にUnity用のライブラリを.NETアプリケーション用に使おうとしても失敗します。ご注意ください。
上記の差異が存在する理由も簡単に補足しておきます。
第一にUnity向けパッケージでターゲットアーキテクチャがAnyCPU
となっている理由ですが、これはWindows/Macの両方に対応するためです。Baku.LibqiDotNet
がラップしているアンマネージライブラリがWindowsでは32bit、Mac版では64bitのみのサポートとなっているため、マネージドライブラリはAnyCPU
ターゲットであることが必須となっています。これに対してNuGetパッケージ版はWindowsでの利用のみを想定しているため、動作しないx64
での実行を防ぐ目的でx86
がターゲットとなっています。
第二にDllImport
の参照先が変わっている理由ですが、これについてはUnityマニュアルにUnityに特有なDllImport
の利用法が記載されているので、それに従っているだけです。
3. 把握済みの問題
Windows
以外のOSでBaku.LibqiDotNet
とUnityを連携させたアプリケーションを作成する場合、バイナリデータの送受信は(多分)できません。この制約は、Baku.LibqiDotNet
がラップしている元のアンマネージライブラリであるlibqi-capi
の機能が部分的に実装されていないことに由来します。
ただしWindows
に関してはソースからビルドし直して対策を行っているので同様の問題はありません。対策の大まかな指針についてはGitHubのissueに掲載しているので、他のOSでどうにかバイナリデータを扱いたい場合は参考にしてください。
補足: GitHubの最新ソースをUnity用にビルドする
上で書いたようにUnity向けのパッケージはビルドして配布されていますが、アンマネージライブラリ群をUnityパッケージから取得し、ライブラリ本体であるBaku.LibqiDotNet.dll
についてだけ最新のソースを反映することも可能です。手順は次のようになります。
- Baku.LibqiDotNetのソースを取得する。あるいは手元でソースコードを適宜書き換える。
- ターゲットアーキテクチャを
AnyCPU
にし、構成をRelease
にする(※Debug
構成でもいいですが動作速度などの理由からオススメできません) Baku.LibqiDotNet
プロジェクトのプロパティでコンパイルシンボルとしてUNITY
を定義- ビルドする
- ビルド結果のうち
Baku.LibqiDotNet.dll
およびBaku.LibqiDotNet.xml
をUnityのAssetに含まれる既存のファイルから置き換える
UNITY
というシンボルを定義する理由ですが、これはソース中のDllImportSetting.cs
でコンパイルシンボルに応じてDllImport
属性に渡すファイル名を切り替えているためです。推奨はしませんが、シンボルによる分岐を用いずソースファイル自体を手作業で書き換えることによって、参照先ファイル名を切り替えても問題ありません。