34
34

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

34
34
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
34

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?