UnityでDLLを使う


今までも何度かやった経験はあるのだが、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時間が無駄。

以上です~