Unity内で取得したデータをcsvに書き出す方法

# 1. はじめに
Unityのゲーム内で取得したデータをcsvに書き出す方法についての記事を書きます。

具体的には、2つのGameObjectの操作記録をcsvに時系列順で書き出すスクリプトを作成します。



# 2. 準備
# 2.1. 用意するGameObject
用意するGameObjectは3つです。

+ F … 赤色のGameObject
+ J … 水色のGameObject
+ SaveCsv … EmptyGameObject

<img width="517" alt="aaaaa.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555056/8b6cd0f0-7ef4-27b5-3575-58bef1680200.png">


# 2.2. 用意するスクリプト
用意するはスクリプトも3つです。

+ SampleFScript … F用のスクリプト
+ SampleJScript … J用のスクリプト
+ SampleSaveCsvScript … SaveCsv用のスクリプト

<img width="146" alt="j.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555056/766e5649-0988-34ff-f30c-c9837e8f62fc.png">



# 3. スクリプトに記述
## 3.1. SampleSaveCsvScripのコードの解説
まずは、csvに保存するためのコードをSampleSaveCsvScripに記述します。

### 3.1.1. void Start()
引用元サイト①で詳しく解説されています。
ざっくりとした説明をすると、新しくcsvファイルを作成して、{}の中の要素分csvに追記をするコードです。

### 3.1.2. public void SaveData(string txt1, string txt2, string txt3)
「s1」で記述したヘッダーの数分「string txt」を用意してください。
「public」をつけることで他のスクリプトでも「SaveData(～)」が使用できるようになります。
その他については、上記と同じです。


### 3.1.2. void Update()
Enterキーが押されたらcsvへの書き込みを終了するコードを記述しています。


```cs:SampleSaveCsvScrip
using System.IO;
using System.Text;

public class SampleSaveCsvScript : MonoBehaviour
{
    private StreamWriter sw;

    void Start()
    {
        sw = new StreamWriter(@"SaveData.csv", true, Encoding.GetEncoding("Shift_JIS"));
        string[] s1 = { "F", "J", "time" };
        string s2 = string.Join(",", s1);
        sw.WriteLine(s2);
    }

    public void SaveData(string txt1, string txt2, string txt3)
    {
        string[] s1 = { txt1, txt2, txt3 };
        string s2 = string.Join(",", s1);
        sw.WriteLine(s2);
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Return))
        {
            sw.Close();
        }

    }
}

```


## 3.2. SampleFScriptのコードの解説
SampleFScriptには、Fキーを検出するコードを記述します。

### 3.2.1. void Start()
引用元サイト②で詳しく解説されています。
ざっくりとした説明をすると、他のスクリプトを参照するコードを記述しています。

### 3.2.2. void Update()
Fキーが押されたら、csvに「F」と「いつ押されたか」という情報が書き加えられます。


```cs:SampleFScrip
using UnityEngine;
using System.IO;

public class SampleFScript : MonoBehaviour
{
    private float time;
    private StreamWriter sw;

    GameObject SaveCsv;
    SampleSaveCsvScript SampleSaveCsvScript;

    void Start()
    {
        SaveCsv = GameObject.Find("SaveCsv");
        SampleSaveCsvScript = SaveCsv.GetComponent<SampleSaveCsvScript>();
    }

    void Update()
    {
        time += Time.deltaTime;

        if (Input.GetKeyDown(KeyCode.F))
        {
            SampleSaveCsvScript.SaveData("F", " ", time.ToString());
        }
    }
}


```


## 3.3. SampleJScriptのコードの解説
SampleJScriptには、Jキーを検出するコードを記述します。

### 3.3.1. void Start()
上記と同じです。

### 3.2.2. void Update()
Jキーが押されたら、csvに「J」と「いつ押されたか」という情報が書き加えられます。


```cs:SampleJScrip
using UnityEngine;
using System.IO;

public class SampleFScript : MonoBehaviour
{
    private float time;
    private StreamWriter sw;

    GameObject SaveCsv;
    SampleSaveCsvScript SampleSaveCsvScript;

    void Start()
    {
        SaveCsv = GameObject.Find("SaveCsv");
        SampleSaveCsvScript = SaveCsv.GetComponent<SampleSaveCsvScript>();
    }

    void Update()
    {
        time += Time.deltaTime;

        if (Input.GetKeyDown(KeyCode.J))
        {
            SampleSaveCsvScript.SaveData(" ", "J", time.ToString());
        }
    }
}


```


# 4. 確認
実際にゲームを動かして確認をしてみます(ここは省略)。

すると、下記のようなcsvが出てきます。
<img width="218" alt="asd.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555056/c1a0eca2-eff2-6798-5b38-d0551fd3bf33.png">
「F」や「J」そして「いつ押されたか」という情報がきちんと書き出されていることが確認できると思います。



# 5. 最後に
Unityのゲーム内で取得したデータをcsvに書き出す方法について書いてみましたが、いかかだったでしょうか。
分かりづらい点や間違っている点があれば、ご指摘いただけると幸いです。



# 参考URL

① Unity 2D] データを保存する(外部ファイルCSV)
https://high-programmer.com/2017/12/10/unity-savedata-otherfile/

② [Unity]他のオブジェクトについているスクリプトの変数を参照したり関数を実行したりする。
https://qiita.com/tsukasa_wear_parker/items/09d4bcc5af3556b9bb3a