カテゴリー別アーカイブ: Unity

UnityでOpenCVのネイティブプラグインを利用してみる

凹みTipsさん(http://tips.hecomi.com/entry/2014/01/16/011727)がOpenCVを使って書いたネイティブプラグインをUnityから使っていたので僕も真似してみることにしてみました。
(基本的には凹みTipsさんと同じなので差分のところだけ)

参考程度ですが、私の開発環境はMacでUnityは4.3を利用しています。

1.OpenCVをビルドする。
MacでOpenCVを利用する場合、homebrew等でインストールするのが楽で良いです。
でも、Unityのネイティブプラグインを使う場合32bitで作らねばならず、homebrewでは32bitビルドしてもうまくいかないため、CMakeを利用してOpenCVのソースからビルドする必要があります。

CMAKE_OSX_ARCHITECTURESにi386;x86_64と値を設定してやれば32bitでも使えるようになります。
また、BUILD_SHARED_LIBSのチェックも外して、スタティックライブラリとしてビルドされるようにしました。
(凹みTipsさんはdylibでやってたのですが何故かうまく行かなかった…)

2.Bundleを作る
WindowsではDLLですが、MacではBundleを作ります。
Xcodeで新しいプロジェクトを作る時にBundleを設定すればいけると思います。

凹みTipsさんからソースをそのまま利用させてもらいました。

3.Unityに読み込む
ここは特に引っかかることなく成功。

1.のあたりで結構引っかかってうまく行かなかったのですが、じっくり差分のところを文字に起こしてみると意外とシンプルな感じになりました。

Dll Not Found Exceptionで苦しんだ時

基本的にはUnityでDLLを使うときはAsset/PluginsフォルダにDLL突っ込めばDLLは使える

参考 テラシュールウェア [Unity3D]UnityのスクリプトをDLL化する
http://terasur.blog.fc2.com/blog-entry-312.html
でもたまーにAのDLLが更にBのDLLを必要としている時があって、AのDLLは入れてるのにBのDLLが無いためにA のDLLで「Dll Not Found Exception」と出ることがある。
入ってるのに「なんでや!?」ってなる時は多分コレが原因だと思う。

 

そこでAのDLLが他のDLLに依存してるか調べるツールがあるので使ってみると非常に便利
DependencyWalker
http://www.dependencywalker.com/

これで調べるとたまーに思いがけないDLLがひっそり依存してたりするので、DLLをどっかから拾ったりして使うときにタイトルのエラーで動かない時は試してみるといいかも。

Unityでframeworkを読み込む

frameworkで提供されているライブラリをMacのUnityで読み込む方法のメモ

基本的にはdylibと同じっぽく、configファイルを編集すればいいみたい
/Applications/Unity/Unity.app/Contents/Frameworks/Mono/etc/mono/config
にdllmapを定義する
参考:http://forum.unity3d.com/threads/173728-Has-anyone-done-OpenCL-Unity-on-Mac

↑のページ見るとエイリアスを指定しても大丈夫みたいだけど、僕はうまく行かなかった
なので、エイリアスの参照先を指定したらうまく動いた

<dllmap dll=”Sample” target=”/Users/user1/<ProjectName>/Assets/Plugins/Sample.framework/Versions/A/Sample” os=”osx” />

みたいな感じ。
ひと通りコレでライブラリ系読み込めるようになったはずなので作業が進むはず!!