Unite2015の「MEVIUS FINAL FANTASYにおけるUnity開発事例」の講演を見て、UnityとWindowsアプリケーションとの連動がチラッと紹介されていたので、試しに作ってみました。
用意するもの
- Visual Studio(ExpressでOKです、今回は2013を使いました)
- Unity(今回は4.6.4p1を使いました)
手順は一番簡単に出来る方法を紹介しています。
そのため色々無駄な部分もあるかと思いますが、ご了承ください。
DLLを作る
VisualStudioで「新しいプロジェクト」→「Visual C#」→「Windows フォームアプリケーション」を選択します。
Windowsフォームアプリケーションのひな型が作られます。
プロジェクトを選択し、プロパティを開きます。
以下の設定を行って下さい。
- 対象のフレームワークを「.NET Framework 3.5」にする
- 出力の種類を「クラスライブラリ」にする
次に、「プロジェクト」→「参照の追加」で、UnityEngine.dll と UnityEditor.dll の参照を追加します。
それぞれのDLLの場所は以下のページをご覧下さい。
Managed Plugins
http://docs.unity3d.com/ja/current/Manual/UsingDLL.html
最後に、Program.cs を開き、Main関数を削除し、こんな感じの関数を作ります。
(Main関数は起動時のプログラムエントリなので、削除しておかないとUnity起動と一緒にWindowsアプリケーションが立ちあがってしまいます。
public static void Launch()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form1 form = new Form1();
form.Show();
}
あと、Programクラスをpublicにしておくのを忘れないようにして下さい。
ここまで出来たらビルドして、dllファイルを作ります。
Unityに組み込む
作った dllファイルを Assets/Plugins フォルダに入れます。
ボタンを押したらWindowsアプリケーションが起動するようにしてみます。
適当なGameObjectを配置し、適当なスクリプトを割り当て、以下のような関数を用意します。
void OnGUI() {
if (GUI.Button(new Rect(10, 10, 200, 30), "起動")) {
Program.Launch();
}
}
using (自作DLLのネームスペース)
を忘れないようにして下さい。
起動する
作ったスクリプトを動かしてみます。
画面に「起動」ボタンが現れるので押してみると、DLLで作ったWindowsフォームアプリケーションが起動します。
何に使えるの?
Windowsアプリケーション側でUnityEngine及びUnityEditorへの参照を追加しているので、Unityの機能が使えます。例えば、AssetBundleへのアクセスがWindowsアプリケーション側で出来ます。
これを使えば、例えば「WindowsアプリケーションでAssetBundleへのパラメータ入力を行う」といったことも可能です。
前述の「MOBIUS FINAL FANTASY」では、このようにしてWindowsアプリでタイムラインを調整し、AssetBundleに書き戻しているものと思われます。
トラブル例
作成中に起きたトラブルとその解消方法です。
DLL側で、UnityEditor.dll 参照するとビルドが通らない
対象のフレームワークが「.NET Framework 3.5」より低い(例えば2.0)と起こるようです。
Unity側で Unhandled Exception: System.TypeLoadException というエラーが出る
DLL側でFormのメンバフィールドを持つと発生しました。
Unity側の設定で、「PlayerSettings」→「Api compatibility Level」を「.NET2.0」にして下さい。(Subsetの付かない方です)
Windowsアプリケーションが表示されるとUnityが固まる
Windowsアプリケーションのフォームをモーダルで表示すると固まります。
Form.Show()
を使い、モードレスで表示すればOKです。
Macで使えない
そもそも起動しているのがWindowsアプリケーションなので…MonoDevelopで開発すればMacバージョンも出来るかもしれません。
Windowsアプリケーション表示時に Could not register the window class, win32 error 0 というエラーが出る
原因不明です、Unity起動して1回目は出ないので、何か終了処理が漏れているのでは、と思うのですが…。
何か情報がありましたらお知らせ下さると助かります。