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

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

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

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity

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

Q&A

解決済

1回答

2799閲覧

書き出したテキストがその場で反映・更新されない

Koopa

総合スコア28

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity

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

1グッド

0クリップ

投稿2018/12/03 14:54

編集2018/12/04 04:56

File.StreamWriter(filePass)で書き込みをしたんですが、
どうも__Unity__画面から一旦離れないと書き込んだ内容が更新されないようで困ってます。
一旦離れるというと、Playモードのまま、特に__VisualStudio__に限らず
ちょっと他のウインドウをクリックした程度で更新されます。
アタッチしたコード

そのコードですが、MainCameraにつけてあります。ただ、コードが原因かは暗黒です。

C#

1class Error : MonoBehavior{ 2 public int index = -1; 3 public GameObject wordBox;//ButtonPrefabを入れてあることにします。 4 static internal List<string> words = new List<string>(); 5 Transform content; 6 Text inputText; 7 8 9 Void Start() { 10 inputText 11 = GameObject.Find("InputField").transform.GetChild(1).GetComponent<Text>(); 12 content = GameObject.Find("ScrollView").transform; 13 ScreenUpdate(); 14 } 15 16 public void AddButton() { 17 dl.Add(inputText.text); 18 print("保存しました。"); 19 inputText.text = ""; 20 DataUpdate(); 21 ScreenUpdate(); 22 } 23 24 public void DeleteButton() { 25 if(index == -1) 26 print("!!削除するアイテムを指定してください!!"); 27 else { 28 dl.RemoveAt(index); 29 print("削除しました。"); 30 } 31 DataUpDate(); 32 ScreenUpdate(); 33 } 34 35//////////ここが例のファイル書き出し地点です////////// 36 static internal void DataUpdate() { 37 StreamWriter sw = new StreamWriter(Application.dataPath + @"/Resources/Data.txt"); 38 sw.Write(string.Join("ゎ", words.ToArray())); 39 sw.Flush(); 40 sw.Close(); 41 } 42 43 void ScreenUpdate() { 44 dl.Clear(); 45 string[] dl = Resources.Load("Data.txt").Split('ゎ');//not 'わ' 46        //→ゎなんて使うこと無いでしょってことで区切り記号にしました。改行は結構使うので 47 GameObject button; 48 while(button = GameObject.Find("ButtonPrefab(Clone)")) { Destroy(button);} 49 for(int i = 0, l = dl.Length; i < l; i++) { 50 button = Instantiate(wordBox,content); 51 button.GetComponent<RectTransform>().anchoredPosition 52 = new Vector2(0,-100*i); 53 words.Add(button.transform.GetChild(0).GetComponent<Text>().text = dl[i]); 54 } 55 } 56}

こっちがButtonPrefabのスクリプトです

C#

1class Error : MonoBehavior{ 2 3 internal int index; 4 5 public void SelectWord() { 6 GameObject.Find("MainCamera").GetComponent<Error>().index = index; 7 } 8 9}

そしてこれを
ButtonPrefabが押されたらSelectWord()を、
追加ボタンが押されたらAddButton()を、
削除ボタンが押されたらDeleteButton()
呼ぶように組んだのですが、追加しても削除してもボタンの内容が変化してないです。
試したこと

まずは、__Visual Studio__のオプションからいじってみました。
環境→ドキュメントの項目

保存されていない変更がない限り、変更されたファイルを再読み込みする。

にチェック入れました。
これにチェックが入ってないと__Visual Studio__開かないと更新されないことがわかりました。
だからと言って入ってても__Unity__画面のまま更新されることはなかったのですが

念のためコードも見直してみました。

C#

1 FileInfo fi; 2 fi = new FileInfo(Application.dataPath + @"/Resources/Data.txt"); 3 StreamWriter sw = fi.AppendText(); 4 sw.AutoFlush = true; 5 sw.Write(string.Join("ゎ", words.ToArray()),false);

ここにある奴の組み合わせを変えたりなどしてやってみましたが、
FileInfo.AppendText()使うと追記されるようになって何やっても上書きできなくなりました。
しかもテキストが更新した訳でもなかったので、今回特に関係ありませんでした。
AutoFlush=trueは単にFlush(),Close()を自動で行ってくれるだけっぽかったです。
これも、一旦Unityを離れるまでテキストが更新されることはありませんでした。

まるで原因が分かりません。
何をすれば__Unity__上で変更を検出してくれるんでしょうか。

ikamichi_game👍を押しています

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

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

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

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

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

tamoto

2018/12/04 00:18

「書き込んだ内容が更新されないようで」というのはどのようにして確認したのでしょうか?ファイルを表示して確認しているとしたら、内容は更新されているけれど画面の再読込が行われていないだけということはないですか?
Koopa

2018/12/04 04:30 編集

すみませんこっちには書き忘れてました。元のコードにはしっかり書いてあります。
guest

回答1

0

ベストアンサー

「書き込まれたかどうか」の確認をUnity上で行っていませんか?
プロジェクトフォルダの中身がUnityに反映される(=インポートされる)には一旦離れる必要があります。
エクスプローラーやFinderなどから書き出されたファイルを直接開けば即時反映が確認出来るのではないかと思います。

投稿2018/12/04 01:45

sakura_hana

総合スコア11427

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

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

Koopa

2018/12/04 05:38 編集

やっぱり、一旦離れないと駄目ですか。 エクスプローラーやFinderから直接開くというのは、つまり手動ということでしょうか? それとも直接開くための何らかの関数を使用するということでしょうか。
sakura_hana

2018/12/04 05:41

ファイル書き込み時にエディタスクリプトのAssetDatabase.ImportAssetを呼び出せば即時読み込みしてくれるかもしれません。(未検証) >エクスプローラーやFinderから直接開く=手動? そうなりますね。 とりあえず「即時書き込みが出来ていない」のか、「ファイル自体には即時書き込み出来ているが、Unity上で表示するには一度Unityから離れなければいけない」のかを区別する為にこのような方法を提案したまでです。 書き出し先/読み込み元をResourcesではない場所にすれば即時表示も可能です。 Resources.Loadを使うには「Unityのプロジェクト内にファイルをインポートする」という処理が必要で、その処理が「Unityエディタがアクティブになる時(他ウィンドウをクリックして戻るとか)」に行われます。 なのでResources以外の場所にファイルを置き、WWWやFile.IO等で読み込めば、Unityプロジェクトへのファイルインポートが不要になるので即時表示も可能になります。以下一例。 https://qiita.com/WassyPG/items/5e4d3df219bba2a14f81
Koopa

2018/12/04 06:21 編集

あ、確認ってそっちの意味でしたか。すみませんでした^^; 改めて確認させていただいたところ、後者つまり即時書き込みは出来ていたことが分かりました。 それよりアドバイスを参考に直していったところ、即時反映が実現できました! 自分の場合、Resources.Load("fileName")をFile.ReadAllText(dataPath)に変更したとたん 何事もなかったかのように解決した次第です。 ただ、AssetDatabase.ImportAsset(dataPath)の方を使うと見かけないwarningが起きました。 これについてはまた何かの機会に検証させていただきます。 丁寧な回答感謝しております。ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問