using UnityEngine; using System.IO; using System; public class PlayerTracker : MonoBehaviour { [Header("Tracking Settings")] [Tooltip("Przeciągnij tutaj Main Camera ze swojego gracza VR")] public Transform vrCamera; [Tooltip("Jak często zapisywać dane? (0.2 = 5 razy na sekundę)")] public float recordInterval = 0.2f; private string trackingFilePath; private float timer; void Start() { // Sprawdzamy, czy Menedżer jest aktywny i prosimy go o ścieżkę if (ExperimentManager.Instance != null) { string folderPath = ExperimentManager.Instance.GetCurrentFolderPath(); if (!string.IsNullOrEmpty(folderPath)) { // Tworzymy nazwę pliku z datą i godziną string phaseName = new DirectoryInfo(folderPath).Name; string fileName = $"{phaseName}_Tracking_{DateTime.Now:yyyyMMdd_HHmmss}.csv"; trackingFilePath = Path.Combine(folderPath, fileName); // Tworzymy plik i nagłówki kolumn File.WriteAllText(trackingFilePath, "Timestamp;PosX;PosY;PosZ;RotX;RotY;RotZ\n"); Debug.Log($"[PlayerTracker] Zaczynam śledzenie! Zapis do: {fileName}"); } } } void Update() { // Jeśli nie mamy pliku albo kamery, nic nie robimy if (string.IsNullOrEmpty(trackingFilePath) || vrCamera == null) return; // Odliczamy czas timer += Time.deltaTime; if (timer >= recordInterval) { timer = 0f; LogPosition(); } } private void LogPosition() { string timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); Vector3 pos = vrCamera.position; Vector3 rot = vrCamera.eulerAngles; // Rotacja w stopniach (0-360) // Używamy InvariantCulture, by zawsze wymusić kropkę jako separator dziesiętny zamiast przecinka string line = string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0};{1:F3};{2:F3};{3:F3};{4:F3};{5:F3};{6:F3}\n", timestamp, pos.x, pos.y, pos.z, rot.x, rot.y, rot.z); File.AppendAllText(trackingFilePath, line); } }