ArrowTipsPanel.cs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. using QFramework;
  4. using ChivaXR;
  5. using ChivaXR.Op;
  6. using Google.Protobuf.WellKnownTypes;
  7. namespace QFramework
  8. {
  9. public class ArrowTipsPanelData : UIPanelData
  10. {
  11. }
  12. public partial class ArrowTipsPanel : UIPanel
  13. {
  14. private Transform targetPoint;
  15. private Camera viewCamera;
  16. private OpTrigger_ToolPack opTrigger_ToolPack;
  17. public Camera ViewCamera
  18. {
  19. get
  20. {
  21. if (viewCamera == null)
  22. {
  23. viewCamera = RoamCameraController.Instance.GetComponent<Camera>();
  24. }
  25. return viewCamera;
  26. }
  27. }
  28. protected override void ProcessMsg(int eventId, QMsg msg)
  29. {
  30. throw new System.NotImplementedException();
  31. }
  32. private Canvas m_Canvas;
  33. private CanvasScaler m_CanvasScaler;
  34. protected override void OnInit(IUIData uiData = null)
  35. {
  36. mData = uiData as ArrowTipsPanelData ?? new ArrowTipsPanelData();
  37. TipsIcon.gameObject.SetActive(false);
  38. OutViewIcon.gameObject.SetActive(false);
  39. // please add init code here
  40. if (viewCamera == null)
  41. {
  42. Debug.Log("请使用RoamCameraController控制脚本");
  43. }
  44. m_Canvas = UIRoot.Instance.GetComponent<Canvas>();
  45. m_CanvasScaler = m_Canvas.GetComponent<CanvasScaler>();
  46. ProcessManagement.Instance.preprocessFnishedEvent += PreProcessFinished;
  47. ProcessManagement.Instance.processFinishEvent += FinishedProcess;
  48. }
  49. public void LateUpdate()
  50. {
  51. if (targetPoint == null || opTrigger_ToolPack == null) return;
  52. if(opTrigger_ToolPack.OperationStatus!=OperationDataStatus.Listening)
  53. {
  54. opTrigger_ToolPack = null;
  55. Clear();
  56. return;
  57. }
  58. if (!OperateSetting.Instance.ToolPackUILogic.GetHint() || !opTrigger_ToolPack.IsGetRightTool())
  59. {
  60. TipsIcon.gameObject.SetActive(false);
  61. OutViewIcon.gameObject.SetActive(false);
  62. return;
  63. }
  64. Vector3 viewPos = ViewCamera.WorldToScreenPoint(targetPoint.position);
  65. TipsIcon.rectTransform.anchoredPosition = new Vector3(GetFixed(viewPos.x), GetFixed(viewPos.y));
  66. ArrowController();
  67. float distance = Vector3.Distance(targetPoint.position, ViewCamera.transform.position);
  68. DistanceInfo.text = distance.ToString("0.00") + "m";
  69. if (distance < 1)
  70. {
  71. TipsIcon.gameObject.SetActive(false);
  72. }
  73. else if (!OutViewIcon.gameObject.activeSelf)
  74. {
  75. TipsIcon.gameObject.SetActive(true);
  76. }
  77. }
  78. public void PreProcessFinished(ProcessElement processElement)
  79. {
  80. if (processElement.GetComponent<PB_OpData>() != null)
  81. {
  82. PB_OpData pbOpData = processElement.GetComponent<PB_OpData>();
  83. if (OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName) == null)
  84. {
  85. return;
  86. }
  87. opTrigger_ToolPack =
  88. OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName).gameObject.GetComponent<OpTrigger_ToolPack>();
  89. }
  90. else
  91. {
  92. PB_OpDataGroup pbOpData = processElement.GetComponent<PB_OpDataGroup>();
  93. opTrigger_ToolPack =
  94. OperationManager.Instance.GetOpData(pbOpData.opDataInfos[0].operationDataName).gameObject.GetComponent<OpTrigger_ToolPack>();
  95. }
  96. if (opTrigger_ToolPack != null)
  97. {
  98. if (opTrigger_ToolPack.targetObjs.Count > 0)
  99. {
  100. InitTarget(opTrigger_ToolPack.targetObjs[0].transform);
  101. }
  102. }
  103. else
  104. {
  105. Clear();
  106. }
  107. }
  108. public void FinishedProcess()
  109. {
  110. Clear();
  111. }
  112. //Screen坐标值适配Canvas画布
  113. public float GetFixed(float value)
  114. {
  115. if (m_CanvasScaler.matchWidthOrHeight == 0)
  116. //匹配宽度时仅按照宽度计算
  117. return value * m_CanvasScaler.referenceResolution.x / Screen.width;
  118. else
  119. //匹配高度时仅按照高度计算
  120. return value * m_CanvasScaler.referenceResolution.y / Screen.height;
  121. }
  122. public void InitTarget(Transform target)
  123. {
  124. targetPoint = target;
  125. if (targetPoint.Find("HintPoint") != null)
  126. {
  127. targetPoint = targetPoint.Find("HintPoint");
  128. };
  129. Debug.Log(targetPoint.name);
  130. }
  131. public void Clear()
  132. {
  133. targetPoint = null;
  134. TipsIcon.gameObject.SetActive(false);
  135. OutViewIcon.gameObject.SetActive(false);
  136. //Hide();
  137. }
  138. protected override void OnOpen(IUIData uiData = null)
  139. {
  140. }
  141. protected override void OnShow()
  142. {
  143. }
  144. protected override void OnHide()
  145. {
  146. }
  147. protected override void OnClose()
  148. {
  149. }
  150. private float targetAngle;
  151. public void ArrowController()
  152. {
  153. if (targetPoint == null) return;
  154. //物体转化为摄像机屏幕坐标
  155. Vector3 screenPointInV3 = ViewCamera.WorldToScreenPoint(targetPoint.position);
  156. Vector2 screenPoint = new Vector2(screenPointInV3.x, screenPointInV3.y);
  157. float r = 350;
  158. float R = 500;
  159. Vector3 center = Vector3.zero;
  160. float hudu = (targetAngle / 180) * Mathf.PI;
  161. float xx = center.x + r * Mathf.Cos(hudu);
  162. float yy = center.y + R * Mathf.Sin(hudu);
  163. Vector3 pos = new Vector3(-yy, xx, 0);
  164. if (screenPointInV3.z <= 0) //物体在摄像机后方
  165. {
  166. Vector3 screenCenterPos = new Vector3(ViewCamera.pixelWidth / 2, ViewCamera.pixelHeight / 2, 0);
  167. float angle = 90;
  168. if (Vector3.Cross(Vector3.up, (screenPointInV3 - screenCenterPos)).z < 0)
  169. {
  170. angle = -angle;
  171. }
  172. targetAngle = -angle;
  173. TipsIcon.gameObject.SetActive(false);
  174. if (!OutViewIcon.gameObject.activeSelf)
  175. {
  176. OutViewIcon.gameObject.SetActive(true);
  177. }
  178. OutViewIcon.rectTransform.anchoredPosition = pos;
  179. DirRoot.rotation = Quaternion.Euler(0, 0, targetAngle);
  180. }
  181. else if (!ViewCamera.pixelRect.Contains(screenPoint)) //摄像机正面且不在画面中
  182. {
  183. Vector3 screenCenterPos = new Vector3(ViewCamera.pixelWidth / 2, ViewCamera.pixelHeight / 2, 0);
  184. float angle = Vector3.Angle(Vector3.up, (screenPointInV3 - screenCenterPos));
  185. if (Vector3.Cross(Vector3.up, (screenPointInV3 - screenCenterPos)).z > 0)
  186. {
  187. angle = -angle;
  188. }
  189. targetAngle = -angle;
  190. if (!OutViewIcon.gameObject.activeSelf)
  191. {
  192. OutViewIcon.gameObject.SetActive(true);
  193. OutViewIcon.rectTransform.anchoredPosition = pos;
  194. DirRoot.rotation = Quaternion.Euler(0, 0, targetAngle);
  195. }
  196. //不同侧不做插值移动
  197. if (OutViewIcon.rectTransform.anchoredPosition.x * pos.x < 0 || OutViewIcon.rectTransform.anchoredPosition.y * pos.y < 0)
  198. {
  199. OutViewIcon.rectTransform.anchoredPosition = pos;
  200. DirRoot.rotation = Quaternion.Euler(0, 0, targetAngle);
  201. }
  202. OutViewIcon.rectTransform.anchoredPosition = Vector3.Lerp(OutViewIcon.rectTransform.anchoredPosition, pos, 0.2f);
  203. }
  204. else
  205. {
  206. OutViewIcon.gameObject.SetActive(false);
  207. TipsIcon.gameObject.SetActive(true);
  208. }
  209. DirRoot.rotation = Quaternion.Lerp(DirRoot.rotation, Quaternion.Euler(0, 0, targetAngle), 0.2f);
  210. }
  211. }
  212. }