[Header("Export Settings")]
[Tooltip("In frames")] public int window_length;
[Tooltip("In frames")] public int window_overlap;
private string label_path;
private int window_step; // how many frames we move forward to get to next window
private int window_start_index; // the current index to start the window from
private int window_id; // current window index
private int frame_counter;
public UnityEvent OnFinished;
public Stopwatch masterStopwatch;
private async void Start()
masterStopwatch = new Stopwatch();
full_name = $"{filename}_{DateTime.Today:yyyy-MM-dd}_W{window_length}_O{window_overlap}";
public async Task WriteDataAsync()
masterStopwatch.Restart();
path = Path.Combine(Application.streamingAssetsPath, full_name + ".csv");
label_path = Path.Combine(Application.streamingAssetsPath, full_name + "_labels.csv");
var (data,labels) = await BuildFileContent(mocapDataContainer.mocapData);
await WriteToFileAsync(path, data);
await WriteToFileAsync(label_path, labels);
Debug.Log($">>> DURATION OF RUN: {masterStopwatch.Elapsed.TotalSeconds} seconds");
private async Task<(string, string)> BuildFileContent(MocapData_Lite mocap)
Debug.Log(new string('-', 80));
Debug.Log("Writing Data as Text -------");
Debug.Log(new string('-', 80));
var sw = new Stopwatch();
var headers = mocap.data_header; // Headers: ONLY ONE OCCURENCE
var data = mocap.data; // Data: PER FRAME OCCURENCE
var sequenceLengths = mocap.framesPerSequence;
// 0 -- CREATE MAIN STRINGBUILDERs ---------
var data_string = new StringBuilder(); // for data
var label_string = new StringBuilder(); // for data labels
var header_string = new StringBuilder();
// 1 -- WRITE HEADERS ---------------------
header_string.Append("Sequence_ID,");
for (var i = 0; i < headers.Length; i++)
header_string.Append(headers[i] + "_Xpos,");
header_string.Append(headers[i] + "_Ypos,");
header_string.Append(headers[i] + "_Zpos,");
header_string.Append(headers[i] + "_Xrot,");
header_string.Append(headers[i] + "_Yrot,");
header_string.Append(headers[i] + "_Zrot,");
header_string.Append(headers[i] + "_Xdir,");
header_string.Append(headers[i] + "_Ydir,");
header_string.Append(headers[i] + "_Zdir,");
data_string.AppendLine(header_string.ToString());
label_string.AppendLine("Sequence_ID,Labels");
var step = window_length - window_overlap;
Debug.Log($"The step is {step} frames");
await Task.Run(async () =>
for (var j = 0; j < mocap.sequenceCount; j++)
var seq_length = sequenceLengths[j];
Debug.Log($">>> SEQUENCE {j} - {seq_length} FRAMES");
while (window_index < seq_length - window_length)
// Grabbing values by full window length
for (i = window_index; i < window_index + window_length; i++)
var index = window_start_index + i;
data_string.AppendLine($"{window_id},{d}");
label_string.AppendLine($"{window_id},{clipList.labels[d.label_id]}");
Debug.Log($"-------- {i} | WID: {window_id} | WI: {window_index}");
window_start_index += seq_length;
Debug.Log($">>> finished writing string data after {sw.Elapsed.TotalSeconds} -----");
return (data_string.ToString(), label_string.ToString());
private async Task WriteToFileAsync(string filePath, string content)
Debug.Log($">>> Saving {frame_counter} frames to: {path}");
await using var streamWriter = new StreamWriter(filePath, false);
await streamWriter.WriteAsync(content);