ゲーム化!tomo_manaのブログ

ゲーム化!tomo-manaのブログ

Unityでゲームを作る方法について紹介しています

Unity/C# CSV形式のデータを生成・保存する

CSV形式のデータを生成・保存するプログラム。

ChatGPT-4で出力したコードに、少し改変を加えたものです。

コード

WriteToCSV .cs

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

// ChatGPT-4 2023/4/9
[System.Serializable]
public class WriteToCSV : MonoBehaviour
{
    private List<int[]> dataList = new List<int[]>(); // スコアデータを格納するリスト
    private string filePath = "Assets/Score.csv"; // CSVファイルのパス
    private int[] currentData; // 現在編集中のデータ
    
    private int lineNow = 0;

    // スコアデータを追加する
    public void AddScoreData()
    {
        dataList.Add(currentData);
        currentData = new int[currentData.Length]; // 新しい配列を生成して、currentDataを初期化する
    }

    // CSVファイルにデータを書き込む
    public void WriteDataToCSV()
    {
        // CSVファイルに書き込む
        StreamWriter writer = new StreamWriter(filePath, true); // trueを指定することで追記モードで開く
        
        for (int i = lineNow; i < dataList.Count; i++ )
        {
            string line = string.Join(",", dataList[i]); // 配列をカンマで区切った文字列に変換する
            writer.WriteLine(line);
            lineNow++;
        }
        writer.Flush();
        writer.Close();
    }

    // 配列を指定の長さで初期化する
    public void InitializeData(int length)
    {
        currentData = new int[length];
    }

    // 指定のインデックスにデータを設定する
    public void SetDataAt(int index, int data)
    {
        currentData[index] = data;
    }
}

任意のゲームオブジェクトにコンポーネントとしてアタッチします。

使い方

InitializeData() で1行ごとの要素数を指定します。
SetDataAt() で値を設定し、AddScoreData() で改行します。
●ファイルに書き出すときは WriteDataToCSV() を呼びます。

// MonoBehaviour のため GetComponent などで取得
WriteToCSV csv = GetComponent<WriteToCSV>();

// 行数の初期化
csv.InitializeData(3); // 3つの要素からなる配列を初期化する

// 1行目
csv.SetDataAt(0, 100); // 0番目の要素に100を設定する
csv.SetDataAt(1,   1); // 1番目の要素に1を設定する
csv.SetDataAt(2,  10); // 2番目の要素に10を設定する
csv.AddScoreData();    // 1行目を確定する

// 2行目
csv.SetDataAt(0, 200);
csv.SetDataAt(1, 2);
csv.SetDataAt(2, 20);
csv.AddScoreData();

csv.WriteDataToCSV(); // スコアデータをCSVに書き込む

※補足
素数は行ごとに変えられます。
AddScoreData() で次行の要素数が決まるので、AddScoreData() の前にInitializeData() で要素数を再定義します。(すでに書き込み中の行の要素数は変更できないので注意)