長らく更新ができなくて申し訳ないです(_ _(--;(_ _(--; pekopeko
PCの故障から始まり、いろいろとありまして
ようやくプロジェクトを復旧する事ができました。
いろいろの部分が、なかなかの物で
6月後半から右腕にシビレと痛みが走りまして
1月半ほど悩まされる事になるとは… … …
どうやらPCとスマホの使い過ぎでストレートネックとやらになったようです。
酷い場合は、首ヘルニアになるそうで、
ヘルニアまで行くと手術が必要になるんだとか (*○*;)
幸いヘルニアではなくて薬治療で事無きを得ました(-。-;)y-゜゜゜
ストレートネック恐るべし!
なめてると痛い目に会います(T-T) グスッ
閑話休題、長々とどうでもいい事を書きました。
そろそろ本題に戻りまっす。
以前、CSVデータの保存まで記事にしたので、
今回はCSVデータの読み込みを作っていきます。
参考にさせて頂いたのが、
こんぶさんの
Unity で CSV ファイルを読み込む方法
有益な情報ありがとうございます。m(_ _)m
CSV保存でお世話になった
ロジカルシンキンぐんっ! さんの
[Unity] データを保存する(外部ファイルCSV)
併せて読み込みスクリプトを作成します。
こんぶさんのCSVをセパレートするコードを流用させてもらって作成してみました。
読み込みコードはSaveManagerに追加しています。
SaveManager
List<string[]> sepaCSV = new List<string[]>(); // CSVの中身を入れるリスト;
StreamReader sr = new StreamReader(@"program.csv", Encoding.GetEncoding("Shift_JIS"));
//ファイル読み込み
for(int i = 0; i < 37; i++)
{
DayTx[i] = sr.ReadLine();
//DayTx[]の中身をカンマ毎に切り分ける
sepaCSV.Add(DayTx[i].Split(','));
}
sr.Close();
まずテキストを切り分ける為のList変数
List<string[]> sepaCSV = new List<string[]>(); を宣言しておきます。
宣言はSaveManagerクラス直下で行います。
続いて、
StreamReaderでファイルを開きます。
CSVデータは行単位で読み込まれるので
保存用変数DayTx[]に読み込みます。
DayTx[]には テキスト,テキスト,テキスト の形で保存されているので、
カンマ毎にテキストを切り分ける必要があります。
sepaCSV.Add(DayTx[i].Split(','));で切り分けして
追加したList変数sepaCSVにキャッシュします。
読み込みが終われば、カレンダー上にテキストを反映させたいのですが、
反映させるには、テキストコンポーネントを取得する必要があります。
今のままでは、カレンダーテキストのGetComponentが、
InputFoamManagerとSaveManagerで発生するので、
重複しないようにスクリプトを修正していきます。
InputFoamManager
public GameObject[] CalendarText; //カレンダー上のテキストを取得
public void CalendarRef()
{
DayText = CARDText + "\n" + ChText + "\n" + TimeText;
CalendarText[FrameNo].GetComponent<Text>() .text= DayText;
//改行部分をカンマに変更してSaveManagerに渡す
string saveTx = CARDText + "," + ChText + "," + TimeText;
SaveManager.GetComponent<SaveManager>().OverWrite(FrameNo, saveTx);
//反映後入力フォームを閉じる
ImageFome.SetActive(false);
}
ここのCalendarText[FrameNo].GetComponent<Text>() .text= DayText;
読み込み時にComponentを取得するので、このままではGetComponentが重複します。
なので削除します。
カレンダーへのテキスト反映は、SaveManager内で行うので
併せて、public GameObject[] CalendarText; の変数宣言も削除します。
修正したのがこちら
public void CalendarRef()
{
//CSVデータ用とカレンダー表示用の二つのテキスト
DayText = CARDText + "\n" + ChText + "\n" + TimeText;
string saveTx = CARDText + "," + ChText + "," + TimeText;
//二つのテキストデータをSaveManagerに渡す
SaveManager.GetComponent<SaveManager>().OverWrite(FrameNo, DayText, aveTx);
//反映後入力フォームを閉じる
ImageFome.SetActive(false);
}
GetComponentを削除して、OverWriteの引数にDayTextを追加しました。
続いてSaveManagerを修正していきます。
SaveManager
public GameObject[] CalendarText; //カレンダー上のテキストを取得
private Text[] textComponent=new Text[37]; //テキストコンポーネントのキャッシュ変数
// Use this for initialization
void Start()
{
GetTextComponent();
}
//更新したテキストを上書きする
public void OverWrite(int No, string CalendarTx,string Tx)
{
textComponent[No].text = CalendarTx;
DayTx[No] = Tx;
}
//カレンダーのテキストコンポーネントをキャッシュする
void GetTextComponent()
{
for (int i = 0; i < 37; i++)
{
textComponent[i] = CalendarText[i].GetComponent<Text>();
}
}
変数を二つ追加、
CalendarTextオブジェクトの取得用変数、そのComponentをキャッシュする変数です。
ComponentのキャッシュはGetTextComponentメソッドで行い。
メソッドはStartから呼び出します。
OverWriteメッソドは、string CalendarTx を追加
GetTextComponentメソッドでキャッシュしたコンポーネントにCalendarTxを割り当てます。
Unityエディターに戻って、追加したCalendarText変数にカレンダー上の
テキストオブジェクトをアタッチします。
これでカレンダーに反映できるようになりました。
続いてCSVデータを読み込んで、
カレンダーに反映できるようにしていきます。
SaveManager
// Use this for initialization
void Start()
{
GetTextComponent();
StartCoroutine("CSVLode");
}
IEnumerator CSVLode()
{
StreamReader sr = new StreamReader(@"program.csv", 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);
}
万が一StreamReaderが遅れた場合、テキストの反映にバグが出るので
コルーチンで0.5秒ウェイトを掛けました。
これで遅れた場合、効果があるのか分かりませんが
保険みたいなものでっす (;^o^) \(ToT )あんたほんとにそれでいいの
テキストコンポーネント取得が終わってから
StartCoroutineで呼び出します。
CSVの読み込みが終われば
テキストの反映処理です。
//読み込んだテキストをカレンダーに反映する
void StartCalendarRef()
{
for(int i = 0; i < 37; i++)
{
textComponent[i].text = sepaCSV[i][0] + "\n" + sepaCSV[i][1] + "\n" + sepaCSV[i][2];
}
}
セパレートしたテキストは、sepaCSV[ ][ ]の形で保存されています。
1行目のテキストを3分割した場合、
sepaCSV[0][0]、sepaCSV[0][1]、sepaCSV[0][2]に保存されています。
なのでループで行を指定して、0~2番までを指定すれば
行の全部のテキストを呼び出す事が可能になります。
このメソッドはStartCoroutineの次に呼び出せばテキストが反映されます。
完成版
SaveManager
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Text;
using System.IO;
using UnityEngine.UI;
public class SaveManager : MonoBehaviour
{
private string[] DayTx = new string[37]; //日ごとのテキストを格納する変数
public GameObject[] CalendarText; //カレンダー上のテキストを取得
private Text[] textComponent=new Text[37]; //テキストコンポーネントのキャッシュ変数
List<string[]> sepaCSV = new List<string[]>(); // CSVの中身を入れるリスト;
// Use this for initialization
void Start()
{
GetTextComponent();
StartCoroutine("CSVLode");
StartCalendarRef();
}
//保存処理
public void SaveCSV()
{
StreamWriter sw = new StreamWriter(@"program.csv", false, Encoding.GetEncoding("Shift_JIS"));
// データ出力
for (int i = 0; i < 37; i++)
{
sw.WriteLine(DayTx[i]);
}
// StreamWriterを閉じる
sw.Close();
}
//更新したテキストを上書きする
public void OverWrite(int No, string CalendarTx,string Tx)
{
textComponent[No].text = CalendarTx;
DayTx[No] = Tx;
}
//カレンダーのテキストコンポーネントをキャッシュする
void GetTextComponent()
{
for (int i = 0; i < 37; i++)
{
textComponent[i] = CalendarText[i].GetComponent<Text>();
}
}
//CSVファイルの読み込み
IEnumerator CSVLode()
{
StreamReader sr = new StreamReader(@"program.csv", 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);
}
//読み込んだテキストをカレンダーに反映する
void StartCalendarRef()
{
for(int i = 0; i < 37; i++)
{
textComponent[i].text = sepaCSV[i][0] + "\n" + sepaCSV[i][1] + "\n" + sepaCSV[i][2];
}
}
}
この記事へのコメント