CalibrationMarkerBehavior.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using Assets.StreetLight.Scripts;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Collections.Specialized;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Net;
  9. using TMPro;
  10. using Unity.VisualScripting;
  11. using UnityEngine;
  12. using UnityEngine.Timeline;
  13. public class CalibrationMarkerBehavior : MonoBehaviour
  14. {
  15. Vector3[] frustumCorners;
  16. List<Vector3> targetPositions;
  17. PersonManager PersonManager => personManagerLazy.Value;
  18. Lazy<PersonManager> personManagerLazy;
  19. public event EventHandler PathFinished;
  20. private void Awake()
  21. {
  22. personManagerLazy = new Lazy<PersonManager>(FindObjectOfType<PersonManager>);
  23. }
  24. // Start is called before the first frame update
  25. void Start()
  26. {
  27. var camera = Camera.main;
  28. frustumCorners = new Vector3[4];
  29. camera.CalculateFrustumCorners(camera.rect, camera.transform.position.y, camera.stereoActiveEye, frustumCorners);
  30. targetPositions = new List<Vector3>()
  31. {
  32. new Vector3(frustumCorners[0].x, 0, frustumCorners[0].y),
  33. new Vector3(frustumCorners[1].x, 0, frustumCorners[1].y),
  34. new Vector3(frustumCorners[2].x, 0, frustumCorners[2].y),
  35. new Vector3(frustumCorners[3].x, 0, frustumCorners[3].y),
  36. };
  37. int count = 1;
  38. const int increment = 2;
  39. while (count < 4)
  40. {
  41. targetPositions.Add(new Vector3(frustumCorners[0].x + count * increment, 0, frustumCorners[0].y + (count - 1) * increment));
  42. targetPositions.Add(new Vector3(frustumCorners[1].x + count * increment, 0, frustumCorners[1].y - count * increment));
  43. targetPositions.Add(new Vector3(frustumCorners[2].x - count * increment, 0, frustumCorners[2].y - count * increment));
  44. targetPositions.Add(new Vector3(frustumCorners[3].x - count * increment, 0, frustumCorners[3].y + count * increment));
  45. count += 1;
  46. }
  47. currentTarget = GameObject.Find("CalibrationMarker").transform.position;
  48. targetPositions.Add(currentTarget);
  49. enabled = false;
  50. PersonManager.DetectionReady += PersonManager_DetectionReady;
  51. }
  52. private void PersonManager_DetectionReady(object sender, EventArgs e)
  53. {
  54. enabled = true;
  55. }
  56. int targetIndex = -1;
  57. Vector3 currentTarget = Vector3.zero;
  58. Vector3 normalizedTranslationVector = Vector3.zero;
  59. // Update is called once per frame
  60. void Update()
  61. {
  62. var marker = GameObject.Find("CalibrationMarker");
  63. const float speed = 0.5f;
  64. if (Vector3.Distance(marker.transform.position, currentTarget) >= 0.05f)
  65. {
  66. marker.transform.position += Vector3.ClampMagnitude(speed * Time.deltaTime * normalizedTranslationVector, (currentTarget - marker.transform.position).magnitude);
  67. }
  68. else if (targetIndex < targetPositions.Count - 1)
  69. {
  70. targetIndex++;
  71. currentTarget = targetPositions[targetIndex];
  72. normalizedTranslationVector = (currentTarget - marker.transform.position).normalized;
  73. }
  74. else
  75. {
  76. PathFinished?.Invoke(this, EventArgs.Empty);
  77. }
  78. UnityEngine.Color color = UnityEngine.Color.Lerp(UnityEngine.Color.green, UnityEngine.Color.red, Time.deltaTime / 0.2f);
  79. Debug.Log(string.Format("<color=#{0:X2}{1:X2}{2:X2}>{3}</color>", (byte)(color.r * 255f), (byte)(color.g * 255f), (byte)(color.b * 255f), $"deltaTime: {Time.deltaTime}"));
  80. }
  81. }