Windows向けのツールをUnityで開発
普段からUnityを使っているので、UnityでWindows向けのツールも作ろうと考えた。
そのツールは特定のcsvファイルを選択し、加工するものであった。
この動作には、「ファイル選択」が含まれるので、「ファイルを開く」といったボタンが必要になる。
ファイル選択ボタンを用意する方法
初心者が気をつけなければいけないのは、UnityEditor関係のやつ。
EditorUtilityは、あくまでUnityエディタ上で動くものであって、
exeにしたら当然動かない。(やり方次第ではコンパイルエラーになる)
https://docs.unity3d.com/ja/current/ScriptReference/EditorUtility.html
つまり今回の目的では使えないということだ。
OpenFileDialogを使う
Windowsツール用には、OpenFileDialogが使えることを確認した。
https://msdn.microsoft.com/ja-jp/library/system.windows.forms.openfiledialog(v=vs.110).aspx
コードを書く
まずコードを書く。
まず「ファイルを開く」ボタンを用意する。
次に使うファイル名を表示する「InputField」も用意しておくといいだろう。
そして、以下のScriptを貼り付ける。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; //Input Field用に使う
using System.Windows.Forms; //OpenFileDialog用に使う
public class OpenFileButton : MonoBehaviour {
public InputField input_field_path_;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
public void OpenExistFile()
{
OpenFileDialog open_file_dialog = new OpenFileDialog();
//InputFieldの初期値を代入しておく(こうするとダイアログがその場所から開く)
open_file_dialog.FileName = input_field_path_.text;
//csvファイルを開くことを指定する
open_file_dialog.Filter = "csvファイル|*.csv";
//ファイルが実在しない場合は警告を出す(true)、警告を出さない(false)
open_file_dialog.CheckFileExists = false;
//ダイアログを開く
open_file_dialog.ShowDialog();
//取得したファイル名をInputFieldに代入する
input_field_path_.text = open_file_dialog.FileName;
}
}
上の説明じゃよく分からんという初心者は、以下のコードを改変して使おう。(さすがにそんな人いないと思うけど)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Windows.Forms; //OpenFileDialog用に使う
public class OpenFileButton : MonoBehaviour {
public void OpenExistFile()
{
OpenFileDialog open_file_dialog = new OpenFileDialog();
//ダイアログを開く
open_file_dialog.ShowDialog();
//取得したファイル名をstringに代入する
string file_name = open_file_dialog.FileName;
}
}
DLLを用意する
このままではSystem.Windows.Formsなんてない といってエラーを受けるのでDLLを用意する。
System.Windows.Forms.dll
DLLは以下の場所にある。
C:\Program Files\Unity\Editor\Data\Mono\lib\mono\2.0
これをAsset/Pluginsフォルダ(plug-inだっけ?)にコピーする
移動ではない。コピーする。
注意すべきは、絶対に上記の場所から持ってくること。
C:\Windowsあたりから持ってきたら、動かない。
ボタンを押すと
NullReferenceException : Object reference not set to an instance of an object System.Windows.Forms.FileDialog.RunDialogVista
みたいなメッセージを受ける。
こうならないように、必ず上記アドレスのものを使うこと。(読み飛ばしてる奴によくある話だよ!)
Data folder not found
このままコンパイルすると以下のメッセージを受ける。
"dll is not allowed to be included or could not be found"
そして実際にexeを実行すると、以下のメッセージを受ける
There should be 'ProjectName_Data' folder next to the executable
これはApi Compatibility Levelを変更すると解消できる。
Unityの上側メニューからFile -> Build Settings
Build SettingsメニューからPlayer Settings を押す
Inspectorビューに表示されている[Setting for PC , Mac & Linux Standalone]のタブから
Other Settings -> Optimization -> Api Compatibility Levelの項目を
.NET 2.0 Sub -> .NET 2.0に変更する
これで全てうまくいく。
おわりに
ここに書いてある問題は全て自分の体験に基づいています。
(つまり英語の文献読んで、めんどくさいから読み飛ばしたら、dll間違えたということですね。HAHAHA)