読者です 読者をやめる 読者になる 読者になる

自習室

こもります

Unity + Visual Studio で、Managed Plugin をデバッグする (Windows)

はじめに

前回、OpenCV を 必要な分だけ Native Plugin の DLL としてまとめて利用する方法について書きました。

C++のライブラリを使ってC++のコードを書いて、Native Plugin として利用できるのは良いのですが、Unity Editor での実行中に、C++側のデバッグができるんかい?という疑問がわきました。

今回はそのあたりを調べてみました。ついでにManaged Pluginのデバッグの仕方についても調べたのですが、分量の関係で Managed/Nativeで2回に分けることにしました。

環境

今回もがっつり Windows + Unity Pro 限定な内容になっておりますがご容赦ください。

題材

今回の記事は、Live Training "WRITING PLUGINS" の作例に対してデバッグできるよう改変を加えています。プロジェクトの作り方、コードの書き方、ビルドの仕方はこちらを参考。

GitHubにあげました

記事はmanaged/nativeで2回に分けましたが、プロジェクトは一つにまとめてあります。

まずは Managed Plugin から

UnityVSでできるんじゃないか?と天啓を受けて調べてみたら、確かにありました。

Managed(C#) Plugin は 上記事に書いてあるとおりでできますが、目立ったところだけこちらにメモっておきます。ちなみに、最後のデバッグの開始部分は、上のリンクと少し異なることをしています。上のリンクの仕方でもできますが、本記事のやり方の方が少し楽なので紹介いたします。

Target Framework: .NET Framework 3.5

Unity の Mono が .NET で言うところの 3.5 相当らしいので、そうしておきます。これをやらなくてもDLLのビルドはできるのですが、プロセスにアタッチしようとした際にエラーが出て止まります。

厳密には Unity 3.5 .net SubsetBase Class Libraries を選ぶのが正しい ようです。.NET と Mono は微妙に異なる部分もあるようですし。

PROJECT > PROPERTIES > Application > Target frameworks:

f:id:AMANE:20141215213807j:plain

出力先を Assets/Plugins にする

いつも通りの $(SolutionDir)\(Configuration)\ な場所に出力したdllらをあとから Assets/Plugins にコピーすればいいかと思ったら、VSプロジェクトでのファイル構造などデバッグに必要な情報が、DLLファイルと一緒に書き出される .pdb ファイルに含まれているようで、ビルド→出力 の時点で、利用する場所に書き出される必要があるようです。

PROJECT > PROPERTIES > Build > (下の方)Output > Output path

f:id:AMANE:20141215214510j:plain

ブレイクポイントを使ったデバッグ

あらかじめ Solutionの Properties から、現在選択しているプロジェクトが実行されるようにしておくのがおすすめです。

f:id:AMANE:20141215214829j:plain

Unity Editorも起動した状態で、VSの方で今回デバッグしたいManaged Plugin のプロジェクトを選択し DEBUG > Attach Unity Debugger を実行すると、下のようなウィンドウが開きます。もしここが空欄だった場合は、一度 Unity の方で Play しておくと、出るかもしれません。

f:id:AMANE:20141215215355j:plain

これで該当の Unity の Project 名を選択すると、Unityに対してVSのデバッガがアタッチされ、待機状態になります。この状態でブレイクポイントを張って、Unity Editor に戻って Play します。確かに DLL 化された部分のコードでブレイクできています。

f:id:AMANE:20141215215826j:plain

つづきます

と、Managed な Plugin のデバッグ法について整理してみましたが、実際にManaged Plugin を作るシーンが余り思いつかないので、今回は助走です。

本命の Native Plugin のデバッグは次回の記事で扱います。