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オブジェクトを用意して
スクリプトをアタッチ!
プレイしてみます。

出ました出ました(= ̄▽ ̄=)V
では、エクセルでCSVファイルを作成して、
ファイルを見つけられるかやってみます。

プロジェクトフォルダ直下にTest.CSVを用意してプレイ!

完璧です (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のパスも変数に置き換えます。
ファイルが有ればロードしてカレンダーに反映するようにしました。
それではプレイです。

ファイルが無いエラーは無事消えたのですが、
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秒のウエイトを掛けたのですが、
ウエイト中でもボタン操作ができてしまいます。
なので、操作できないようにパネルを被せてみました。

最前面にパネルを設置して、黒半透明にしてローディングのテキストを追加
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秒間は操作できなくなります。
ホントはロードに連動したパネルを用意したかったのですが、
難しくて出来ませんでした。(ノ_<。)うっうっうっ
応用はできると思うので、
何かの参考まで。
この記事へのコメント