ProcessState_VRCameraReset.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using ChivaXR;
  5. using ChivaXR.Op;
  6. using ChivaXR.VR;
  7. using EPOOutline;
  8. using UnityEngine;
  9. public class ProcessState_VRCameraReset : MonoBehaviour, IProcessState
  10. {
  11. public Transform mainCamera;
  12. [Header("自身位置")]
  13. public Transform localPoint;
  14. [Header("观察目标")]
  15. public Transform target;
  16. private Outlinable outLinable;
  17. private OpTrigger_PlaySoundElement opTriggerPlaySoundElement;
  18. public bool resetCameraPos = true;
  19. private void Start()
  20. {
  21. PB_OpData pbOpData = this.gameObject.GetComponent<PB_OpData>();
  22. OpTrigger_PlaySoundElement opTriggerPlaySoundElement =
  23. OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName) as OpTrigger_PlaySoundElement;
  24. if (opTriggerPlaySoundElement != null)
  25. {
  26. opTriggerPlaySoundElement.OperationStatusChanged += OnOperationStatusChanged;
  27. }
  28. }
  29. public void EnterState(bool enterCurrent)
  30. {
  31. if (resetCameraPos) { InitVRCameraPos(localPoint); }
  32. if (target == null) return;
  33. if (enterCurrent)
  34. {
  35. target.gameObject.SetActive(true);
  36. outLinable = target.GetComponent<Outlinable>() == null
  37. ? target.gameObject.AddComponent<Outlinable>()
  38. : target.GetComponent<Outlinable>();
  39. OutLineManager.Instance.ResetOutLinableByType(outLinable, OutLineType.hint);
  40. outLinable.enabled = true;
  41. }else
  42. {
  43. if (outLinable != null)
  44. {
  45. outLinable.enabled = false;
  46. }
  47. }
  48. }
  49. public void ExitState()
  50. {
  51. if (target == null) return;
  52. if (outLinable)
  53. {
  54. outLinable.enabled = false;
  55. }
  56. target.gameObject.SetActive(false);
  57. }
  58. public void HalfQuit()
  59. {
  60. }
  61. public void OnOperationStatusChanged(object sender, OperationEventArgs e)
  62. {
  63. if (e.opData.OperationStatus == OperationDataStatus.InActive)
  64. {
  65. if (outLinable)
  66. {
  67. outLinable.enabled = true;
  68. }
  69. }
  70. }
  71. public void InitVRCameraPos(Transform initPoint)
  72. {
  73. RoamCameraController tmpContrl = mainCamera.GetComponent<RoamCameraController>();
  74. OperationStepDataInfo tmpInfo = DAL.Instance.Get<StepListProxy>().GetOperationStepDataInfoById(ProcessManagement.Instance.currentStepID);
  75. if (tmpInfo != null)
  76. {
  77. if (string.IsNullOrEmpty(tmpInfo.position))
  78. {
  79. if (initPoint == null) return;
  80. RoamCameraController.Instance.SetCameraState(initPoint.position, initPoint.eulerAngles);
  81. }
  82. else
  83. {
  84. RoamCameraController.Instance.SetCameraState(LUtilitys.ParseVector3(tmpInfo.position), LUtilitys.ParseVector3(tmpInfo.rotation));
  85. }
  86. }
  87. else
  88. {
  89. if (initPoint == null) return;
  90. RoamCameraController.Instance.SetCameraState(initPoint.position, initPoint.eulerAngles);
  91. }
  92. }
  93. [ContextMenu("根据PB生产目标及观察位置")]
  94. public void ConfigTarget()
  95. {
  96. PB_OpData pbOpData = this.gameObject.GetComponent<PB_OpData>();
  97. //OpTrigger_ToolPack opTrigger_ToolPack =
  98. //OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName) as OpTrigger_ToolPack;
  99. OpTrigger_ToolPack opTrigger_ToolPack =
  100. OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName).gameObject.GetComponent<OpTrigger_ToolPack>();
  101. if (opTrigger_ToolPack != null)
  102. {
  103. if (opTrigger_ToolPack.targetObjs.Count > 0)
  104. {
  105. target = opTrigger_ToolPack.targetObjs[0].transform;
  106. if (localPoint == null)
  107. localPoint = new GameObject("CameraPoint").transform;
  108. localPoint.transform.parent = this.transform;
  109. //localPoint.transform.position = opTrigger_ToolPack.targetObjs[0].transform.Find("HintPoint").position;
  110. //localPoint.LookAt(target, Vector3.up);
  111. Transform targetPoint = opTrigger_ToolPack.targetObjs[0].transform.GetComponentInChildren<MeshRenderer>().transform;
  112. Bounds bound = GetBounds(targetPoint);
  113. localPoint.transform.position = targetPoint.position +
  114. (targetPoint.position - new Vector3(0, targetPoint.position.y - 0.3f, 0)).normalized
  115. * (bound.size.magnitude < 0.8f ? 0.8f : bound.size.magnitude);
  116. Debug.Log(bound.center + "--" + bound.extents);
  117. localPoint.LookAt(targetPoint.position, Vector3.up);
  118. }
  119. }
  120. else
  121. {
  122. //DestroyImmediate(this.GetComponent<ProcessState_VRCameraReset>());
  123. }
  124. }
  125. /// <summary>
  126. /// 获取Transform及其子级的包围盒(MeshRenderer),若MeshRenderer包围盒长度为0,则获取BoxCollider包围盒
  127. /// </summary>
  128. /// <param name="transform"></param>
  129. /// <returns></returns>
  130. private static Bounds GetBounds(Transform transform)
  131. {
  132. Quaternion oldRotation = Quaternion.identity;
  133. bool boundsInitialized = false;
  134. //Bounds bounds = new Bounds(transform.position, Vector3.zero);
  135. Bounds bounds = new Bounds();
  136. Renderer[] renderers = transform.GetComponentsInChildren<Renderer>();
  137. foreach (Renderer renderer in renderers)
  138. {
  139. if (!boundsInitialized)
  140. {
  141. bounds = new Bounds(renderer.transform.position, Vector3.zero);
  142. boundsInitialized = true;
  143. }
  144. bounds.Encapsulate(renderer.bounds);
  145. }
  146. if (bounds.size.magnitude == 0)
  147. {
  148. BoxCollider[] colliders = transform.GetComponentsInChildren<BoxCollider>();
  149. foreach (BoxCollider collider in colliders)
  150. {
  151. if (!boundsInitialized)
  152. {
  153. bounds = new Bounds(collider.transform.position, Vector3.zero);
  154. boundsInitialized = true;
  155. }
  156. bounds.Encapsulate(collider.bounds);
  157. }
  158. }
  159. return bounds;
  160. }
  161. }