Posted at

UnityとWindowsアプリケーションの連動

More than 3 years have passed since last update.

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アプリケーションが立ちあがってしまいます。


Program.cs

public static void Launch()

{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form1 form = new Form1();
form.Show();
}

あと、Programクラスをpublicにしておくのを忘れないようにして下さい。

ここまで出来たらビルドして、dllファイルを作ります。


Unityに組み込む

作った dllファイルを Assets/Plugins フォルダに入れます。

ボタンを押したらWindowsアプリケーションが起動するようにしてみます。

適当なGameObjectを配置し、適当なスクリプトを割り当て、以下のような関数を用意します。


Sample.cs

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回目は出ないので、何か終了処理が漏れているのでは、と思うのですが…。

何か情報がありましたらお知らせ下さると助かります。