【Unity】データファイルの存在確認

2019/7/29一部修正
2019/7/31ロード中の処理を新しく追記しました。(追記2参照)



前回ロードするファイルが存在しない!とエラーが出たので、
ロードする前にファイルの存在を確認できるようにしてみます。

まずは、Google先生にお伺いを立てて…

System.IO.File.Existsなるものを見付けました。


早速、新規プロジェクトを作成して実験でっす。(^.^) オホホホ


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour
{
private string FilePath = @"Test.csv";

// Start is called before the first frame update
void Start()
{
if (System.IO.File.Exists(FilePath) == false)
{
Debug.Log("ファイルなんか無いよ!");
}
else
{
Debug.Log("ファイル見っけ!");
}
}
}



適当にキャンパスを設置してGameManagerオブジェクトを用意して
スクリプトをアタッチ!

プレイしてみます。
File.Exists①.jpg
出ました出ました(= ̄▽ ̄=)V

では、エクセルでCSVファイルを作成して、
ファイルを見つけられるかやってみます。
File.Exists②.jpg
プロジェクトフォルダ直下にTest.CSVを用意してプレイ!
File.Exists③.jpg
完璧です (V)O¥O(V) フォフォフォ

前回のカレンダーprojectに早速移植してみます。

private string FilePath = @"program.csv"; //CSVファイルのpath


// Use this for initialization
void Start()
{
GetTextComponent();

if (System.IO.File.Exists(FilePath))
{
StartCoroutine("CSVLode");
StartCalendarRef();
}
}


StreamWriter sw = new StreamWriter(FilePath, false, Encoding.GetEncoding("Shift_JIS"));

StreamReader sr = new StreamReader(FilePath, Encoding.GetEncoding("Shift_JIS"));


ファイルのパスを変数で設定したので、
StreamWriterとStreamReaderのパスも変数に置き換えます。

ファイルが有ればロードしてカレンダーに反映するようにしました。


それではプレイです。
File.Exists④.jpg
ファイルが無いエラーは無事消えたのですが、
StartCalendarRefメソッドのエラーが残っております。

これはロードしたテキストが空白の場合に起こるエラーですね。

CSVデータは、その行にテキストが無いと空白ではなく無と保存されます。

文書を書く仕様なので仕方がないのですが…
めんどうでっす。

なので、空白や無を識別する必要があります。

StartCalendarRefメソッドを修正します。

//読み込んだテキストをカレンダーに反映する
void StartCalendarRef()
{
for(int i = 0; i < 37; i++)
{
if (DayTx[i] == null || DayTx[i] == "")
{
continue;
}
else
{
textComponent[i].text = sepaCSV[i][0] + "\n" + sepaCSV[i][1] + "\n" + sepaCSV[i][2];
}
}
}


行ごとのテキストはDayTxに保存されているので、
DayTxのデータが無か空白の場合、ループを飛ばしてみました。

プレイするとエラーが消えたので問題ないでしょう。

最後に実際の操作動画を少々、
ファイルの無い状態から立ち上げて、適当に入力
一度プレイを止めて、再プレイでCSVデータが反映されるまでです。


無事保存から次回読み込みまで完成しました。

しかし、対戦カードの×が文字化けしてる (~ヘ~;)ウーン
環境依存の文字はダメですね~

vsとかに書き換えようかな~



追記1
前記事でStartCalendarRefメソッドのエラーについて記載していなかったので、
前記事のエラー内容を修正しました。

それに伴い今記事も流れが繋がるように、一部修正しました。


追記2
コルーチンで、CSVの読み込み処理に0.5秒のウエイトを掛けたのですが、
ウエイト中でもボタン操作ができてしまいます。
なので、操作できないようにパネルを被せてみました。
File.Exists⑤.jpg
最前面にパネルを設置して、黒半透明にしてローディングのテキストを追加

public GameObject Panel; //CSV読み込み時のパネル取得

// Use this for initialization
void Start()
{
GetTextComponent();


if (System.IO.File.Exists(FilePath))
{
Panel.SetActive(true);       ←パネルを呼び出す
StartCoroutine("CSVLode");
StartCalendarRef();
}
}

//CSVファイルの読み込み
IEnumerator CSVLode()
{
StreamReader sr = new StreamReader(FilePath, Encoding.GetEncoding("Shift_JIS"));
//ファイル読み込み
for(int i = 0; i < 37; i++)
{
DayTx[i] = sr.ReadLine();
//DayTx[]の中身をカンマ毎に切り分ける
sepaCSV.Add(DayTx[i].Split(','));
}
sr.Close();

yield return new WaitForSeconds(0.5f);


Panel.SetActive(false);         ←パネルを1秒後に消す
yield return new WaitForSeconds(1);
}


if (System.IO.File.Exists(FilePath))の一つ目でパネルを呼び出します。
ファイルの読み込み時のみパネルを出す為です。

コルーチンの最後でパネルを消します。ウエイトは1秒
これで1秒間は操作できなくなります。

ホントはロードに連動したパネルを用意したかったのですが、
難しくて出来ませんでした。(ノ_<。)うっうっうっ

応用はできると思うので、
何かの参考まで。

この記事へのコメント