Files
Virtual-Tutor/Unity/Assets/Scripts/PositionTracker.cs
2025-10-12 14:14:02 +02:00

147 lines
3.9 KiB
C#

using UnityEngine;
using System.IO;
using System.Text;
using System;
public class PositionTracker : MonoBehaviour
{
[Header("Objects to Track")]
[Tooltip("First object to track position")]
public Transform object1;
[Tooltip("Second object to track position")]
public Transform object2;
[Header("Tracking Settings")]
[Tooltip("How often to record positions (in seconds)")]
public float recordInterval = 0.1f;
[Tooltip("Custom filename (without extension). Leave empty for auto-generated name")]
public string customFileName = "";
[Tooltip("Start tracking automatically on scene load")]
public bool autoStart = true;
private string filePath;
private float timer;
private bool isTracking;
private StreamWriter writer;
private int frameCount;
private void Start()
{
if (autoStart)
{
StartTracking();
}
}
public void StartTracking()
{
if (object1 == null || object2 == null)
{
Debug.LogError("PositionTracker: Both objects must be assigned in the inspector!");
return;
}
// Generate filename with timestamp
string timestamp = DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss");
string fileName = string.IsNullOrEmpty(customFileName)
? $"PositionData_{timestamp}.csv"
: $"{customFileName}_{timestamp}.csv";
filePath = Path.Combine(Application.persistentDataPath, fileName);
try
{
// Create and open the file
writer = new StreamWriter(filePath, false, Encoding.UTF8);
// Write CSV header
writer.WriteLine("Timestamp,Frame,Object1_Name,Object1_X,Object1_Y,Object1_Z,Object2_Name,Object2_X,Object2_Y,Object2_Z");
isTracking = true;
frameCount = 0;
timer = 0f;
Debug.Log($"PositionTracker: Started tracking. Data will be saved to: {filePath}");
}
catch (Exception e)
{
Debug.LogError($"PositionTracker: Failed to create CSV file. Error: {e.Message}");
}
}
public void StopTracking()
{
if (isTracking && writer != null)
{
writer.Close();
isTracking = false;
Debug.Log($"PositionTracker: Stopped tracking. Data saved to: {filePath}");
}
}
private void Update()
{
if (!isTracking || writer == null)
return;
timer += Time.deltaTime;
if (timer >= recordInterval)
{
RecordPositions();
timer = 0f;
}
// Press 'T' to toggle tracking, 'S' to stop and save
if (Input.GetKeyDown(KeyCode.T))
{
if (isTracking)
StopTracking();
else
StartTracking();
}
}
private void RecordPositions()
{
if (object1 == null || object2 == null)
return;
frameCount++;
Vector3 pos1 = object1.position;
Vector3 pos2 = object2.position;
string timestamp = DateTime.Now.ToString("HH:mm:ss.fff");
// Write data row
string dataRow = $"{timestamp},{frameCount}," +
$"{object1.name},{pos1.x:F4},{pos1.y:F4},{pos1.z:F4}," +
$"{object2.name},{pos2.x:F4},{pos2.y:F4},{pos2.z:F4}";
writer.WriteLine(dataRow);
writer.Flush(); // Ensure data is written immediately
}
private void OnDestroy()
{
StopTracking();
}
private void OnApplicationQuit()
{
StopTracking();
}
// Helper method to open the folder containing the CSV file
[ContextMenu("Open Data Folder")]
public void OpenDataFolder()
{
Application.OpenURL(Application.persistentDataPath);
}
}