2022.4.22 7日目 昨日まで体調不良で死んでいました。再開します。
やること
今回は、C#でcsvを作成したり、読み込んだりしていきます。
セーブデータを作ってみようかな??ということでcsvを使ってみたいと思います。
環境
Windows
VisualStudio 2019
Unity 2019.4.28f1
CSVの作成
csvが無ければ、csvを作成する ということをしていきます。
設計的には次の通り。
1、保存用csvがあるかどうかを確認する
2、無ければ作成する
短いですが、こんなイメージで作成し始めました。
作成したクラスは以下の通りです。
using System;
using System.IO;
using System.Text;
using UnityEngine;
//データの初期化
//保存用のcsvが無ければ作成
public class InitializeData: MonoBehaviour {
[SerializeField] public int missionNum;
[SerializeField] public GameObject Player;
Entity_Sheet1 MasterData;
// Start is called before the first frame update
void Start() {
//保存用のExcelを検索
if( !isExistsSaveFile() ) {
makeSaveData();
}
}
private void makeSaveData() {
MasterData = Resources.Load( "MissionMasterData" ) as Entity_Sheet1;
try {
// ファイルを開く//false:毎回上書きでcsvファイルを作成//エンコーディング
StreamWriter file = new StreamWriter( @"C:\StudyUnity\Test\Assets\SaveData\testSaveData.csv", false, Encoding.UTF8 );
for( int i = 0; i < missionNum; i++ ) {
file.WriteLine( MasterData.sheets[ 0 ].list[ i ].ID.ToString() + "," + "false" );
}
file.Close();
} catch( Exception e ) {
Console.WriteLine( e.Message ); // 例外検出時にエラーメッセージを表示
}
}
private bool isExistsSaveFile() {
bool isExist = File.Exists( @"C:\StudyUnity\Test\Assets\SaveData\testSaveData.csv" );
return isExist;
}
}
以下コードの説明です。
using System.IO;
using System.Text;
上記の2行を追加します。
void Start() {
//保存用のExcelを検索
if( !isExistsSaveFile() ) {
makeSaveData();
}
}
上記のstart関数で、csvファイルがあるかどうかの確認をする関数へ飛びます。なければ作成する関数へ行きます。
private bool isExistsSaveFile() {
bool isExist = File.Exists( @"C:\StudyUnity\Test\Assets\SaveData\testSaveData.csv" );
return isExist;
}
上記の関数で、csvファイルがあるかどうかを確認しています。(これは結構応用できるかも…!)
以下の関数の説明です。(csvの作成に必要な箇所のみ説明します)
private void makeSaveData() {
MasterData = Resources.Load( "MissionMasterData" ) as Entity_Sheet1;
try {
// ファイルを開く//false:毎回上書きでcsvファイルを作成//エンコーディング
StreamWriter file = new StreamWriter( @"C:\StudyUnity\Test\Assets\SaveData\testSaveData.csv", false, Encoding.UTF8 );
for( int i = 0; i < missionNum; i++ ) {
file.WriteLine( MasterData.sheets[ 0 ].list[ i ].ID.ToString() + "," + "false" );
}
file.Close();
} catch( Exception e ) {
Console.WriteLine( e.Message ); // 例外検出時にエラーメッセージを表示
}
}
StreamWriter file = new StreamWriter( @"C:\StudyUnity\Test\Assets\SaveData\testSaveData.csv", false);
上記で、書き込みたいフォルダを開くことができます。
for( int i = 0; i < missionNum; i++ ) {
file.WriteLine( MasterData.sheets[ 0 ].list[ i ].ID.ToString() + "," + "false" );
}
上記のfor文で、一行ずつカンマ区切りでcsvに情報を書き込んでいきます。
(一行ずつカンマ区切りで、が結構大事…!)
file.Close();
上記のコードで、開いたファイルを閉じます。
(閉じないと、ずっと開いたままになってしまいます。なんで閉じなきゃいけないかは、今の私にはわかりません)
catch( Exception e ) {
Console.WriteLine( e.Message ); // 例外検出時にエラーメッセージを表示
}
例外処理を記述しておきます。
この流れで、csvの作成はできました!
CSVへの書き込み
次に、作成したcsvに書き込みをします。(重複しますが分けてみました)
try {
StreamWriter file = new StreamWriter( @"C:\StudyUnity\Test\Assets\SaveData\testSaveData.csv", false, Encoding.UTF8 );
for( int i = 0; i < missionNum; i++ ) {
//一行ずつ書き込み
file.WriteLine( MasterData.sheets[ 0 ].list[ i ].ID + "," + missionClearFlag[ i ].ToString() );
}
file.Close();
} catch( Exception e ) {
Console.WriteLine( e.Message );
}
}
StreamWriter file = new StreamWriter( @"C:\StudyUnity\Test\Assets\SaveData\testSaveData.csv", false, Encoding.UTF8 );
作成時と同じように、csvフォルダを開きます。今回は書き込みなので、「SteamWriter」を宣言します。
for( int i = 0; i < missionNum; i++ ) {
//一行ずつ書き込み
file.WriteLine( MasterData.sheets[ 0 ].list[ i ].ID + "," + missionClearFlag[ i ].ToString() );
}
WriteLine で、一行ずつカンマ区切りで書き込みます。
file.Close();
ファイルを閉じておきます。
catch( Exception e ) {
Console.WriteLine( e.Message );
}
例外処理を書いておきます。
これで書き込みができました!
CSVの読み込み
csvの読み込みをしていきます。これがなかなか私は理解できなかった…
try {
StreamReader sr = new StreamReader( @"C:\StudyUnity\Test\Assets\SaveData\testSaveData.csv" );
string lineInfo = null;
//1行ずつ読み込んで、情報がなくなるまで読み込む
while( ( lineInfo = sr.ReadLine() ) != null ) {
string line = sr.ReadLine();
string[ ] values = line.Split( ',' );
List<string> lists = new List<string>();
lists.AddRange( values );
if( ( lists[ count + 1 ] ) == null ) {
} else {
//セーブデータからflagを取得
missionClearFlag[ count ] = Convert.ToBoolean( lists[ count + 1 ] );
}
}
//ファイルを閉じる
sr.Close();
} catch ( Exception e ) {
Console.WriteLine( e.Message );
}
StreamReader sr = new StreamReader( @"C:\StudyUnity\Test\Assets\SaveData\testSaveData.csv" );
書き込み等と同じように、今度はSteamReaderを使用して、読み込みたいcsvフォルダを開きます。
string lineInfo = null;
//1行ずつ読み込んで、情報がなくなるまで読み込む
while( ( lineInfo = sr.ReadLine() ) != null ) {
string line = sr.ReadLine();
string[ ] values = line.Split( ',' );
List<string> lists = new List<string>();
lists.AddRange( values );
if( ( lists[ count + 1 ] ) == null ) {
} else {
//セーブデータからflagを取得
missionClearFlag[ count ] = Convert.ToBoolean( lists[ count + 1 ] );
}
}
while文で、情報がない行にたどり着くまで繰り返していきます。
string line = sr.ReadLine();
↑この文で一行ずつ読み込み、
string[ ] values = line.Split( ',' );
↑この文で、リストに入れる、line で読み込んだ値をカンマ区切りにして、
List<string> lists = new List<string>();
↑この文で格納するリストを作成し、
lists.AddRange( values );
↑この文で、リストにカンマ区切りの値を入れます!
これで読み込みは終わりです。