Files
Aether-Engine/Assets/Scripts/Input/RowingDataRecorder.cs
2026-02-20 17:53:43 +01:00

92 lines
2.9 KiB
C#

using System.Collections.Generic;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
public class RowingDataRecorder : MonoBehaviour
{
[Header("Recording Setup")]
public bool isRecording = false;
public string saveFileName = "Zone2_Session";
private RowingSessionData _currentSession;
private float _recordingStartTime;
private void Start()
{
if (PerformanceMonitorManager.Instance != null)
{
// We listen to the same events the InputManager uses
PerformanceMonitorManager.Instance.OnStatsUpdated += RecordStats;
PerformanceMonitorManager.Instance.OnForceCurveUpdated += RecordForceCurve;
}
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.R)) ToggleRecording();
}
private void ToggleRecording()
{
isRecording = !isRecording;
if (isRecording)
{
_currentSession = ScriptableObject.CreateInstance<RowingSessionData>();
_currentSession.sessionName = saveFileName;
_recordingStartTime = Time.time;
Debug.Log($"[Recorder] Started recording: {saveFileName}");
}
else
{
SaveSessionAsset();
}
}
private void RecordStats(PerformanceMonitorManager.RowingStats stats)
{
if (!isRecording) return;
RowingFrame frame = new RowingFrame
{
timestamp = Time.time - _recordingStartTime,
watts = stats.Watts,
spm = stats.SPM,
heartRate = stats.HeartRate,
forceCurve = new List<float>() // Empty for normal stat updates
};
_currentSession.frames.Add(frame);
}
private void RecordForceCurve(List<float> curve)
{
if (!isRecording || curve == null || curve.Count == 0) return;
// We create a specific frame just for the force curve completion
RowingFrame frame = new RowingFrame
{
timestamp = Time.time - _recordingStartTime,
watts = PerformanceMonitorManager.Instance.Stats.Watts,
spm = PerformanceMonitorManager.Instance.Stats.SPM,
heartRate = PerformanceMonitorManager.Instance.Stats.HeartRate,
forceCurve = new List<float>(curve) // Clone the list!
};
_currentSession.frames.Add(frame);
}
private void SaveSessionAsset()
{
#if UNITY_EDITOR
if (_currentSession == null || _currentSession.frames.Count == 0) return;
// Create the Asset in your Project folder
string path = $"Assets/{saveFileName}.asset";
AssetDatabase.CreateAsset(_currentSession, AssetDatabase.GenerateUniqueAssetPath(path));
AssetDatabase.SaveAssets();
Debug.Log($"[Recorder] Session saved to {path} with {_currentSession.frames.Count} frames.");
_currentSession = null;
#endif
}
}