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

  • 22
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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回目は出ないので、何か終了処理が漏れているのでは、と思うのですが…。
何か情報がありましたらお知らせ下さると助かります。