今までも何度かやった経験はあるのだが、Unityで外部DLLのライブラリをコールする方法について、書いておく。
今回、いくらやっても動かず、5時間ぐらい格闘してしまったので、また同じことにならないように備忘録として、また、初めてやる人の参考として簡単にまとめておく。
DLLはVisual StudioのC++でビルドして作り、これをUnityにインポートして、Unity ScriptからC++のファンクションコールする、という流れである。今回、あまりに動かないんで、最後の最後、もっとも簡単なコードにして確認した。もちろん、この簡単コードはUnityのマニュアルにもあって、それとそれほど変わるところは無いんだが。
DLL側のコード
extern "C" __declspec(dllexport) int Add(int a, int b) { return(a + b); }
- Visual Studio 2015使用。C++のWin32アプリでDLLを選んでプロジェクトを作る(名前をdlltestとしよう)
- ごちゃごちゃファイルができるがそのままやってもいいけど、今回、メインのdlltest.cpp以外のstdafx.hとかそういうのは全部消しちゃった。
- 上記コードをdlltest.cppにコピペ(ヘッダーも何もなく、これだけ)
- ビルドする。設定はReleaseのx64。つまり64ビットDLL
- dlltest.dllができる
Unity側のコード
using UnityEngine; using System.Runtime.InteropServices; public class NewBehaviourScript : MonoBehaviour { [DllImport("dlltest")] public static extern int Add(int a, int b); void Start () { Debug.Log(Add(3, 7)); } }
- Unity 5.3.1 (64bit)を使用。
- Assetsの下にPluginsというフォルダを作り、そこにさっきできたdlltest.dllをドラグアンドドロップ
- C#のコード(NewBehaviourScript.cs) を作り、上記コードをコピペ
- 適当なオブジェクトにコードをアタッチ
- 再生ボタンを押して、コンソールに「10」が出たら成功(3足す7は10)
できてしまえば、まったく何でもないんだが、今回、
EntryPointNotFoundException: Add
NewBehaviourScript.Start () (at Assets/NewBehaviourScript.cs:10)
というエラーが出まくって、何をやっても消えてくれず参った。このエラーはつまり、DLLは読めたけどその中にAddというファンクションが見つからない、と言っているのである。なんで5時間もできなかったか、実はそれほどはっきりしないんだが、以下の通りである。
- 「EntryPointNotFoundException Unity DLL」とかで検索して多くの英語エントリーを見て、そこに書かれた通りにやってみるのだが、みな、少しずつ違う。焦って中途半端にコピペしたり、自分で変更したりしてるうちに不整合が起こった(らしい)
- DLLをUnityにドラグアンドドロップするのだが、既にあるDLLをまずDeleteして、そこに新しくビルドしたDLLをドロップするのだけど、いつからか古いDLLが消えなくなり、DLLを新しくしているつもりが、更新されておらず、ずっと旧いDLLのままチェックして、どうしても動かない、ってのをだいぶ長時間気が付かなかった。
- このような場合は、Unityをいったん落として、Windowsのエクスプローラで、手動で削除とコピー(つまりDLL入れ替え)をして、それからUnityを起動し直す。
- こういうハマり方をした場合は、まず強制的に数時間休憩を入れ、別のことをすること。これ鉄則なんだけど、今回、ついつい熱くなり5時間が無駄。
以上です~