CameraFollowerLangChao.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace SC.XR.Unity
  5. {
  6. public class CameraFollowerLangChao : FollowerBase
  7. {
  8. [Header("Following Settings")]
  9. public bool InstantFollowing;//是否无延迟跟随
  10. public bool LinearFollowing;//是否线性移动
  11. public Vector2 menu_size;//面板的长宽,默认面板的position在中心。
  12. private Transform _slamHead;
  13. Vector2 initViewPoint;//相机画面的中点,坐标为(0.5f,0.5f)
  14. Vector3 viewPoint = Vector3.zero;// 面板坐标相对于相机画面的坐标。
  15. Vector3 viewPoint_right = Vector3.zero;// 面板的上下左右端相对于相机画面的坐标。
  16. Vector3 viewPoint_left = Vector3.zero;
  17. Vector3 viewPoint_top = Vector3.zero;
  18. Vector3 viewPoint_bot = Vector3.zero;
  19. bool isFollower = false;
  20. Vector3 originPos = Vector3.zero;
  21. Vector3 desPos = Vector3.zero;
  22. float journeyLength = 0f;
  23. void Start()
  24. {
  25. _slamHead = Camera.main.transform;
  26. initViewPoint = Camera.main.WorldToViewportPoint(_slamHead.position + (_slamHead.forward * WindowDistance));
  27. InstantFollow();
  28. }
  29. //Nonlinear Following by default
  30. protected override void Follow()
  31. {
  32. if (Camera.main == null)
  33. {
  34. return;
  35. }
  36. Vector3 v3 = CalculateWindowPosition(Camera.main.transform);
  37. transform.position = Vector3.Lerp(transform.position,new Vector3(v3.x, Camera.main.transform.position.y, v3.z) , WindowFollowSpeed * Time.deltaTime);
  38. transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler( new Vector3(0, CalculateWindowRotation(Camera.main.transform).eulerAngles.y, 0)), WindowFollowSpeed * Time.deltaTime);
  39. }
  40. //Following camera without latency
  41. protected void InstantFollow()
  42. {
  43. Vector3 v3 = CalculateWindowPosition(Camera.main.transform);
  44. transform.position = new Vector3(v3.x, Camera.main.transform.position.y, v3.z);
  45. transform.eulerAngles =new Vector3(0, CalculateWindowRotation(Camera.main.transform).eulerAngles.y,0);
  46. }
  47. //For Linear Following, turn down the WindowFollowSpeed to around 0.5 at distance = 1 for best experience
  48. protected void LinearFollow()
  49. {
  50. originPos = transform.position;
  51. desPos = CalculateWindowPosition(Camera.main.transform);
  52. journeyLength = Vector3.Distance(originPos, desPos);
  53. transform.position = Vector3.Lerp(originPos, new Vector3(desPos.x, Camera.main.transform.position.y, desPos.z), (Time.fixedDeltaTime) / journeyLength * WindowFollowSpeed);
  54. transform.position = new Vector3(transform.position.x, Camera.main.transform.position.y, transform.position.z);
  55. transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(new Vector3(0, CalculateWindowRotation(Camera.main.transform).eulerAngles.y, 0)), (Time.fixedDeltaTime) / journeyLength * WindowFollowSpeed);
  56. }
  57. protected override void LateUpdate()
  58. {
  59. if ((StopFollower == false)&& !InstantFollowing)
  60. {
  61. if (IsFollower() && !LinearFollowing)
  62. {
  63. Follow();
  64. }
  65. else if (IsFollower() && LinearFollowing)
  66. {
  67. LinearFollow();
  68. }
  69. }
  70. else if ((StopFollower == false) && InstantFollowing)
  71. {
  72. InstantFollow();
  73. }
  74. }
  75. protected bool IsFollower()
  76. {
  77. if (Camera.main == null || Camera.main == null)
  78. {
  79. return false;
  80. }
  81. viewPoint = Camera.main.WorldToViewportPoint(transform.position);// 面板在相机画面上的坐标
  82. viewPoint_right = Camera.main.WorldToViewportPoint(transform.TransformPoint(new Vector3(menu_size.x/2, 0, 0)));// 面板边界在相机画面上的坐标
  83. viewPoint_left = Camera.main.WorldToViewportPoint(transform.TransformPoint(new Vector3(-menu_size.x/2, 0, 0)));
  84. viewPoint_top = Camera.main.WorldToViewportPoint(transform.TransformPoint(new Vector3(0, menu_size.y/2, 0)));
  85. viewPoint_bot = Camera.main.WorldToViewportPoint(transform.TransformPoint(new Vector3(0, -menu_size.y/2, 0)));
  86. if (viewPoint_right.x > 1 || viewPoint_left.x < 0 || viewPoint_bot.y < 0 || viewPoint_top.y > 1)//边界判断
  87. {
  88. isFollower = true;
  89. }
  90. else if (Mathf.Abs(viewPoint.x - initViewPoint.x) < 0.05f && Mathf.Abs(viewPoint.y - initViewPoint.y) < 0.05f)//停止跟随的边界判断
  91. {
  92. isFollower = false;
  93. }
  94. return isFollower;
  95. }
  96. }
  97. }