CameraSurround.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Diagnostics.Eventing.Reader;
  4. using System.Linq;
  5. using UnityEngine;
  6. public class CameraSurround : MonoBehaviour
  7. {
  8. public static CameraSurround instance;
  9. /// <summary>
  10. /// 旋转点
  11. /// </summary>
  12. private Vector3 m_RotationPoint;
  13. public Transform Pos;
  14. public Transform Distance_Pos;
  15. private void Awake()
  16. {
  17. instance = this;
  18. }
  19. private void Update()
  20. {
  21. CameraCtrlRotate();
  22. CameraCtrlMove();
  23. CameraCtrlMouseScrllMove();
  24. }
  25. /// <summary>
  26. /// 相机聚焦定位
  27. /// </summary>
  28. /// <param name="reset"></param>
  29. public void SetCameraPosition(Transform target, bool reset = false, bool useMark = true, bool isSetTrans = false)
  30. {
  31. Bounds tmpBounds;
  32. if (useMark)
  33. {
  34. tmpBounds = GetBoundsByPartMark(target);
  35. }
  36. else
  37. {
  38. tmpBounds = GetBounds(target);
  39. }
  40. //物体最大长度
  41. float a = tmpBounds.size.magnitude;
  42. if (tmpBounds.size != Vector3.zero)
  43. {
  44. if (reset)
  45. {
  46. if (tmpBounds.size.x > tmpBounds.size.z)
  47. {
  48. transform.position = tmpBounds.center + ((tmpBounds.center + new Vector3(0.2f, 0, 1)) - tmpBounds.center).normalized * a / 2 * 1.9f;
  49. }
  50. else
  51. {
  52. transform.position = tmpBounds.center +
  53. ((tmpBounds.center + new Vector3(1, 0.2f, 0)) - tmpBounds.center).normalized
  54. * a / 2 * 1.9f;
  55. }
  56. }
  57. else
  58. {
  59. transform.position = tmpBounds.center + (transform.position - tmpBounds.center).normalized * a / 2 * 1.9f;
  60. }
  61. }
  62. if (isSetTrans&& Pos!=null&&Distance_Pos!=null)
  63. {
  64. m_RotationPoint = Pos.position;
  65. /// transform.position = tmpBounds.center + (transform.position - tmpBounds.center).normalized * a / 5 * 1.9f;
  66. transform.position = Distance_Pos.position ;
  67. }
  68. else
  69. {
  70. m_RotationPoint = tmpBounds.center;
  71. }
  72. transform.LookAt(m_RotationPoint);
  73. }
  74. public void CameraCtrlMove()
  75. {
  76. if (Input.GetAxis("Mouse ScrollWheel") > 0)
  77. {
  78. transform.Translate(Vector3.forward * 1f);
  79. }
  80. if (Input.GetAxis("Mouse ScrollWheel") < 0)
  81. {
  82. transform.Translate(Vector3.forward * -1f);
  83. }
  84. }
  85. Vector3 PreMouseMPos;
  86. public void CameraCtrlMouseScrllMove()
  87. {
  88. if (Input.GetMouseButton(2))
  89. {
  90. if (PreMouseMPos.x <= 0)
  91. {
  92. PreMouseMPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0.0f);
  93. }
  94. else
  95. {
  96. Vector3 CurMouseMPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0.0f);
  97. Vector3 offset = CurMouseMPos - PreMouseMPos;
  98. offset = -offset * 0.01f;//0.1这个数字的大小可以调节速度
  99. transform.Translate(offset);
  100. PreMouseMPos = CurMouseMPos;
  101. }
  102. }
  103. else
  104. {
  105. PreMouseMPos = new Vector3(0.0f, 0.0f, 0.0f);
  106. }
  107. }
  108. private void CameraCtrlRotate()
  109. {
  110. var mouse_X = Input.GetAxis("Mouse X");
  111. var mouse_Y = Input.GetAxis("Mouse Y");
  112. if (Input.GetKey(KeyCode.Mouse1))
  113. {
  114. if (m_RotationPoint.x.ToString() != "NaN" && m_RotationPoint.y.ToString() != "NaN" && m_RotationPoint.z.ToString() != "NaN")
  115. {
  116. transform.RotateAround(m_RotationPoint, Vector3.up, mouse_X * 5);
  117. transform.RotateAround(m_RotationPoint, transform.right, mouse_Y * -5);
  118. }
  119. else
  120. {
  121. SetCameraPosition(DeviceController.instance.transform, true);
  122. }
  123. }
  124. }
  125. /// <summary>
  126. /// 获取Transform及其子级的包围盒(MeshRenderer),若MeshRenderer包围盒长度为0,则获取BoxCollider包围盒
  127. /// </summary>
  128. /// <param name="transform"></param>
  129. /// <returns></returns>
  130. private static Bounds GetBoundsByPartMark(Transform target)
  131. {
  132. PartMark[] tmpPartMarks = target.GetComponentsInChildren<PartMark>(true);
  133. List<MeshRenderer> tmpMeshRenders = new List<MeshRenderer>();
  134. foreach (var item in tmpPartMarks)
  135. {
  136. tmpMeshRenders.AddRange(item.GetMeshRender(item.transform));
  137. }
  138. Bounds bounds = new Bounds(GetModelGroupBoundesConent(tmpMeshRenders.ToArray()), Vector3.zero);
  139. foreach (Renderer renderer in tmpMeshRenders)
  140. {
  141. bounds.Encapsulate(renderer.bounds);
  142. }
  143. return bounds;
  144. }
  145. private static Bounds GetBounds(Transform target)
  146. {
  147. MeshRenderer[] meshRenderers = target.GetComponentsInChildren<MeshRenderer>().ToArray();
  148. Bounds bounds = new Bounds(GetModelGroupBoundesConent(target.GetComponentsInChildren<MeshRenderer>().ToArray()), Vector3.zero);
  149. foreach (Renderer renderer in meshRenderers)
  150. {
  151. bounds.Encapsulate(renderer.bounds);
  152. }
  153. return bounds;
  154. }
  155. /// <summary>
  156. /// 获取所以模型组的Boundes中心点
  157. /// </summary>
  158. private static Vector3 GetModelGroupBoundesConent(Renderer[] renderers)
  159. {
  160. Vector3 conent = Vector3.zero;
  161. for (int i = 0; i < renderers.Length; i++) conent += renderers[i].bounds.center;
  162. //获取到中心点
  163. conent /= renderers.Length;
  164. return conent;
  165. }
  166. }