質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

6236閲覧

unityでOpenFileDialogがビルド後にのみエラーが発生する。

javascripter

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/10/05 01:18

編集2020/10/05 02:07

前提・実現したいこと

unityで、ファイルを指定するためにOpenFileDialogを用いることにしました。
https://qiita.com/otochan/items/0f20fad94467bb2c2572
上のサイトを参考に、dllファイルをアセットにインポートしましたが、サイトに記されたパスになく、今回は、
C:\Program Files\Unity\Hub\Editor\2019.4.9f1\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api
内にあったSystem.Windows.Forms.dllをインポートしました。

発生している問題・エラーメッセージ

エディタ内のゲーム画面ではうまくダイアログが出て期待通りの動作をしてくれるのですが、
ビルド後では以下のようにエラーが出てしまいます。
また、エディタ内のゲーム動作時にも、該当のプログラムを作動させると「could not register the window class,Win32 error0」と2回出てきますがその後は普通に動作します。

NullReferenceException: Object reference not set to an instance of an object at System.Windows.Forms.CommonDialog.ShowDialog () [0x00000] in <361626b7593f474ba856a43d392652dc>:0 at (wrapper remoting-invoke-with-check) System.Windows.Forms.CommonDialog.ShowDialog() at load.loadfunc () [0x0007b] in C:\Users\mimim\Desktop\unity\MyFirstGame\Assets\script\load.cs:75 at UnityEngine.Events.InvokableCall.Invoke () [0x00010] in <0126a3eddada4a3fab5737479c0e7d2b>:0 at UnityEngine.Events.UnityEvent.Invoke () [0x00022] in <0126a3eddada4a3fab5737479c0e7d2b>:0 at UnityEngine.UI.Button.Press () [0x00027] in C:\Program Files\Unity\Hub\Editor\2019.4.9f1\Editor\Data\Resources\PackageManager\BuiltInPackages\com.unity.ugui\Runtime\UI\Core\Button.cs:68 at UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) [0x00010] in C:\Program Files\Unity\Hub\Editor\2019.4.9f1\Editor\Data\Resources\PackageManager\BuiltInPackages\com.unity.ugui\Runtime\UI\Core\Button.cs:110 at UnityEngine.EventSystems.ExecuteEvents.Execute (UnityEngine.EventSystems.IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) [0x00001] in C:\Program Files\Unity\Hub\Editor\2019.4.9f1\Editor\Data\Resources\PackageManager\BuiltInPackages\com.unity.ugui\Runtime\EventSystem\ExecuteEvents.cs:50 at UnityEngine.EventSystems.ExecuteEvents.Execute[T] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.ExecuteEvents+EventFunction`1[T1] functor) [0x0006c] in C:\Program Files\Unity\Hub\Editor\2019.4.9f1\Editor\Data\Resources\PackageManager\BuiltInPackages\com.unity.ugui\Runtime\EventSystem\ExecuteEvents.cs:261 UnityEngine.DebugLogHandler:Internal_LogException(Exception, Object) UnityEngine.DebugLogHandler:LogException(Exception, Object) UnityEngine.Logger:LogException(Exception, Object) UnityEngine.Debug:LogException(Exception) UnityEngine.EventSystems.ExecuteEvents:Execute(GameObject, BaseEventData, EventFunction`1) (at C:\Program Files\Unity\Hub\Editor\2019.4.9f1\Editor\Data\Resources\PackageManager\BuiltInPackages\com.unity.ugui\Runtime\EventSystem\ExecuteEvents.cs:265) UnityEngine.EventSystems.StandaloneInputModule:ReleaseMouse(PointerEventData, GameObject) (at C:\Program Files\Unity\Hub\Editor\2019.4.9f1\Editor\Data\Resources\PackageManager\BuiltInPackages\com.unity.ugui\Runtime\EventSystem\InputModules\StandaloneInputModule.cs:195) UnityEngine.EventSystems.StandaloneInputModule:ProcessMousePress(MouseButtonEventData) (at C:\Program Files\Unity\Hub\Editor\2019.4.9f1\Editor\Data\Resources\PackageManager\BuiltInPackages\com.unity.ugui\Runtime\EventSystem\InputModules\StandaloneInputModule.cs:644) UnityEngine.EventSystems.StandaloneInputModule:ProcessMouseEvent(Int32) (at C:\Program Files\Unity\Hub\Editor\2019.4.9f1\Editor\Data\Resources\PackageManager\BuiltInPackages\com.unity.ugui\Runtime\EventSystem\InputModules\StandaloneInputModule.cs:552) UnityEngine.EventSystems.StandaloneInputModule:ProcessMouseEvent() (at C:\Program Files\Unity\Hub\Editor\2019.4.9f1\Editor\Data\Resources\PackageManager\BuiltInPackages\com.unity.ugui\Runtime\EventSystem\InputModules\StandaloneInputModule.cs:532) UnityEngine.EventSystems.StandaloneInputModule:Process() (at C:\Program Files\Unity\Hub\Editor\2019.4.9f1\Editor\Data\Resources\PackageManager\BuiltInPackages\com.unity.ugui\Runtime\EventSystem\InputModules\StandaloneInputModule.cs:289) UnityEngine.EventSystems.EventSystem:Update() (at C:\Program Files\Unity\Hub\Editor\2019.4.9f1\Editor\Data\Resources\PackageManager\BuiltInPackages\com.unity.ugui\Runtime\EventSystem\EventSystem.cs:377)

該当のソースコード

関係ない部分が多いかと思いますが、ダイアログ関係は一部分です。

C#

1using System.Collections; 2using System.Collections.Generic; 3using System.Security.Cryptography; 4using UnityEngine; 5using UnityEngine.UI; 6using UnityEngine.UIElements; 7using System.IO; 8using System.Text; 9using System.Windows.Forms; 10 11 12public class load : MonoBehaviour 13{ 14 GameObject Message; 15 16 [Header("メッセージを加えるオブジェクト")] 17 public GameObject list; 18 19 [Header("addを与えるオブジェクト")] 20 public GameObject addobj; 21 22 add Add; 23 24 [Header("saveオブジェクト")] 25 public GameObject saveobj; 26 27 [Header("test")] 28 public GameObject test; 29 Text testtext; 30 31 save Save; 32 33 public List<string> message; 34 public List<int> ID; 35 public List<string> time; 36 public List<float> pos_x; 37 public List<float> pos_y; 38 public List<float> pos_z; 39 public List<float> rot_x; 40 public List<float> rot_y; 41 public List<float> rot_z; 42 public List<float> rot_w; 43 44 45 // Start is called before the first frame update 46 void Start() 47 { 48 Add = addobj.GetComponent<add>(); 49 Save = saveobj.GetComponent<save>(); 50 51 testtext = test.GetComponent<Text>(); 52 53 Message = (GameObject)Resources.Load("message"); 54 } 55 56 public void loadfunc() 57 { 58     //ここからダイアログ出現 59 testtext.text = "セーブされてない内容の確認"; 60 if (Save.saved==1) 61 { 62 DialogResult dr = MessageBox.Show("セーブされていないデータは削除されます。よろしいですか?", "確認", MessageBoxButtons.YesNo); 63 64 if (dr != System.Windows.Forms.DialogResult.Yes) 65 { 66 return; 67 } 68 } 69 70 testtext.text = "確認終わりダイアログ出現"; 71 72 OpenFileDialog ofd = new OpenFileDialog(); 73 ofd.Title = "csvファイルを選択してください"; 74 ofd.Filter = "csvファイル(.csv)|*.csv"; 75 76 if (ofd.ShowDialog()== DialogResult.Cancel) 77 { 78 return; 79 } 80 81 testtext.text = "処理終了"; 82 83 Add.remove(); 84 85 int cunt = 0; 86 87 ID = new List<int>(); 88 message = new List<string>(); 89 time = new List<string>(); 90 pos_x = new List<float>(); 91 pos_y = new List<float>(); 92 pos_z = new List<float>(); 93 rot_x = new List<float>(); 94 rot_y = new List<float>(); 95 rot_z = new List<float>(); 96 rot_w = new List<float>(); 97 98 99 StreamReader sr = new StreamReader(ofd.FileName, Encoding.GetEncoding("Shift_JIS")); 100 { 101 // 末尾まで繰り返す 102 while (!sr.EndOfStream) 103 { 104 // CSVファイルの一行を読み込む 105 string line = sr.ReadLine(); 106 // 読み込んだ一行をカンマ毎に分けて配列に格納する 107 string[] values = line.Split(','); 108 109 // 配列からリストに格納する 110 ID.Add(int.Parse(values[0])); 111 message.Add(values[1]); 112 time.Add(values[2]); 113 pos_x.Add(float.Parse(values[3])); 114 pos_y.Add(float.Parse(values[4])); 115 pos_z.Add(float.Parse(values[5])); 116 rot_x.Add(float.Parse(values[6])); 117 rot_y.Add(float.Parse(values[7])); 118 rot_z.Add(float.Parse(values[8])); 119 rot_w.Add(float.Parse(values[9])); 120 121 cunt++; 122 } 123 124 for (int a = 0; a < cunt; a++) 125 { 126 loadmessage(ID[a], message[a], time[a]); 127 Vector3 pos = new Vector3(pos_x[a],pos_y[a], pos_z[a]); 128 Quaternion rot = new Quaternion(rot_x[a], rot_y[a], rot_z[a], rot_w[a]); 129 Add.Collision(pos,rot,ID[a]); 130 } 131 132 Add.cun =cunt; 133 134 } 135 136 } 137 138 void loadmessage(int bangou, string adobaisu, string zikan) 139 { 140 141 GameObject obj = Instantiate(Message); 142 obj.name = "message" + bangou; 143 obj.transform.parent = list.transform; 144 145 GameObject messagetext = obj.transform.Find("messagetext").gameObject; 146 Text text1 = messagetext.GetComponentInChildren<Text>(); 147 text1.text = adobaisu; 148 149 GameObject time = obj.transform.Find("time").gameObject; 150 Text text2 = time.GetComponentInChildren<Text>(); 151 text2.text = zikan; 152 } 153} 154

試したこと

ビルド設定のapi互換レベルを.NET standerd 2.0や4.xにしたりしてみたが改善せず
unityのバージョンを変えて実行してみたが、結果は同じだった。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ファイルダイアログをいいかんじに表示するOSSの Unity Standalone File Browser の System.Windows.Forms.dll を利用すれば正常に動作しました。(Unity2019.4.10f.1 Editor/Windows Sandalone)

1. Assets>StandaloneFileBrowser>Plugins>System.Windows.Forms.dll をDownloadして、このdllを自分のプロジェクトのPluginsフォルダに配置する。

  1. C:\Program Files\Unity\Hub\Editor\2019.x\Editor\Data\MonoBleedingEdge\lib\mono\unityjit\System.Windows.Forms.dll を自分のプロジェクトのPluginsフォルダに配置する。※1

  2. Project Settings>Player>Api Compatibility Level*>.NET 4.xに設定する。

※1 C:\Program Files\Unity\Hub\Editor\2019.x\Editor\Data\MonoBleedingEdge\lib\mono\gac\System.Windows.Forms\xxx\System.Windows.Forms.dll でも動作した。

投稿2020/10/06 17:51

編集2020/10/06 18:25
u824

総合スコア112

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

javascripter

2020/10/06 19:15

ご提示の方法でダイアログを表示させてパスを収得することができました。ありがとうございます。 重ね重ねで申し訳ないのですが、この方法でビルドした後ファイル選択後パスは取れるのですが、 StreamReader sr = new StreamReader(ofd.FileName, Encoding.GetEncoding("Shift_JIS")); の部分で NotSupportedException: Encoding 932 data could not be found. Make sure you have correct international codeset assembly installed and enabled. とエラーが出てしまいました。 コードセットアセンブリがインストールされ、有効になっていることを確認してくださいとのことでしたが、どのように確認すればよいのでしょうか。調べてはいるのですが、いまいちよくわかりません
javascripter

2020/10/06 20:24

自己解決しました。 「System.Windows.Forms.dll」のインポート先ファイル内の、 「I18N.CJK.dll」「I18N.dll」の2つも一緒にPluginsフォルダに入れることで、エンコードが可能になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問