CalibrationRecorderBehavior.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Concurrent;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Threading.Tasks;
  8. using UnityEngine;
  9. public class CalibrationRecorderBehavior : MonoBehaviour
  10. {
  11. PersonManager PersonManager => personManagerLazy.Value;
  12. Lazy<PersonManager> personManagerLazy;
  13. private void Awake()
  14. {
  15. personManagerLazy = new Lazy<PersonManager>(FindObjectOfType<PersonManager>);
  16. }
  17. BlockingCollection<Action> taskQueue;
  18. string fileName = @$"C:\Users\nick.steyer\Desktop\{DateTime.Now:yyyy-dd-M_HH-mm-ss}.csv";
  19. void Start()
  20. {
  21. taskQueue = new BlockingCollection<Action>();
  22. if (!File.Exists(fileName))
  23. {
  24. File.WriteAllLines(fileName, new string[] { "WorldX,WorldY,WorldZ,UnityX,UnityY,UnityZ" });
  25. }
  26. }
  27. // Update is called once per frame
  28. void Update()
  29. {
  30. var persons = PersonManager.Persons;
  31. if (PersonManager.Persons.Count == 1)
  32. {
  33. var person = PersonManager.Persons.Single();
  34. var marker = GameObject.Find("CalibrationMarker");
  35. var personPosition = person.WorldPosition;
  36. var markerPosition = marker.transform.position;
  37. taskQueue.Add(() => File.AppendAllLines(fileName, new string[] { FormattableString.Invariant($"{personPosition.x},{personPosition.y},{personPosition.z},{markerPosition.x},{markerPosition.y},{markerPosition.z}") }));
  38. Task.Run(() => taskQueue.Take().Invoke());
  39. }
  40. }
  41. }