在 Unity 中将游戏内数据导出为 csv

Ege*_*Ege 0 c# csv export unity-game-engine

我想将我的计数器数据和时间导出为 csv 文件,然后我将用它们制作一个 2D 图表。如何将这些记录并写入 csv 文件?

der*_*ugo 7

你的问题很广泛,但今天我有心情^^

据我了解,您实际上是在问以下问题:

如何将计数器值与时间值一起存储?

我会使用正确的类型,List例如

[Serializable]
public class KeyFrame
{
    public int Value;
    public float Time;

    public KeyFrame(){}

    public KeyFrame (int value, float time)
    {
        Value = value;
        Time = time;
    }
}

private List<KeyFrame> keyFrames = new List<KeyFrame>(10000);
Run Code Online (Sandbox Code Playgroud)

然后,每次值更改时,我都会将计数器设置为属性 ,它会跟踪列表中的新条目

private int _counter;
public int Counter
{
    get => _counter;
    set
    {
        _counter = value;
        keyFrames.Add(new KeyFrame (value, Time.time));
    }
}
Run Code Online (Sandbox Code Playgroud)

现在每次你这样做时

Counter++;
Run Code Online (Sandbox Code Playgroud)

一个新条目与当前条目Time.time

自应用程序启动以来的时间(以秒为单位)。

已添加到列表中,因此您还应该使用以下命令对其进行初始化0

private void Start ()
{
    Counter = 0;
}
Run Code Online (Sandbox Code Playgroud)

如何从给定的一组 2D 坐标创建 CSV 内容?

public string ToCSV()
{
    var sb = new StringBuilder("Time,Value");
    foreach(var frame in keyFrames)
    {
        sb.Append('\n').Append(frame.Time.ToString()).Append(',').Append(frame.Value.ToString());
    }

    return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

这会创建一个字符串,例如

Time,Value
0,0
2.288847,1
4.2887477,2
...
Run Code Online (Sandbox Code Playgroud)

如何写入文件?

Application.persistentDataPath通常您还应该在编辑器中写入Application.streamingAssetsPath

例如,您可以使用 aStreamWriter 或简单地使用File.WriteAllText

#if UNITY_EDITOR
using UnityEditor;
#endif

...

public void SaveToFile ()
{
    // Use the CSV generation from before
    var content = ToCSV();

    // The target file path e.g.
#if UNITY_EDITOR
    var folder = Application.streamingAssetsPath;

    if(! Directory.Exists(folder) Directory.CreateDirectory(folder);
#else
    var folder = Application.persistentDataPath;
#endif

    var filePath = Path.Combine(folder, "export.csv");

    using(var writer = new StreamWriter(filePath, false))
    {
        writer.Write(content);
    }

    // Or just
    //File.WriteAllText(content);

    Debug.Log($"CSV file written to \"{filePath}\"");

#if UNITY_EDITOR
    AssetDatabase.Refresh();
#endif
}
Run Code Online (Sandbox Code Playgroud)