MagGuidanceView.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using AppUI.Bluetooth;
  5. using AppUI.Manager.View;
  6. using SmartBowSDK;
  7. using UnityEngine;
  8. using UnityEngine.UI;
  9. using BLEAimhandler = AppUI.Bluetooth.AimHandler;
  10. namespace AppUI.View.NineAxis
  11. {
  12. /// <summary>九轴地磁校准引导(AppUI);调用方式对齐 DemoStarter.StartMagCalibration。</summary>
  13. public class MagGuidanceView : MonoBehaviour
  14. {
  15. const float ModuleInitWaitSeconds = 12f;
  16. const float MagProgressGuideSeconds = 20f;
  17. const float MagCalibrateTimeoutSeconds = 120f;
  18. [SerializeField] Button btnMagCalibrate;
  19. [SerializeField] GameObject prefab_MagInterferenceTipView;
  20. [SerializeField] List<GameObject> layouts;
  21. TextAutoLanguage2 _textAutoLanguage2;
  22. BLEAimhandler _aim;
  23. SmartBowDeviceHub _hub;
  24. bool _startResetMag;
  25. bool _calibrateMagDoing;
  26. bool _sensorsReady;
  27. float _calibrateMagStartTime;
  28. [NonSerialized] public int flag_MagCalibarateOperateAndFinish = -1;
  29. public Action action_MagCalibarateOperateAndFinish;
  30. public Func<bool> action_OnClickMagCalibrateInterceptor;
  31. void Start()
  32. {
  33. SmartBowDeviceHub.EnsureReady();
  34. _hub = SmartBowDeviceHub.ins;
  35. _aim = _hub?.Aim;
  36. btnMagCalibrate.onClick.AddListener(OnClickResetMag);
  37. _textAutoLanguage2 = btnMagCalibrate.transform.Find("Text").GetComponent<TextAutoLanguage2>();
  38. RefreshButtonLabel();
  39. ShowDeviceLayout(_aim != null && _aim.GetActivePlayerDeviceType() == (int)AimDeviceType.ARTEMIS ? 1 : 0);
  40. StartCoroutine(WaitForSensorsReady());
  41. }
  42. IEnumerator WaitForSensorsReady()
  43. {
  44. float elapsed = 0f;
  45. while (elapsed < ModuleInitWaitSeconds)
  46. {
  47. if (_hub != null && _hub.EnsureNineAxisSensorsStarted())
  48. {
  49. _sensorsReady = true;
  50. yield break;
  51. }
  52. elapsed += Time.unscaledDeltaTime;
  53. yield return null;
  54. }
  55. Debug.LogWarning("[MagGuidanceView] 等待模块初始化/九轴传感开启超时。");
  56. }
  57. void RefreshButtonLabel()
  58. {
  59. if (_textAutoLanguage2 == null || _aim == null)
  60. return;
  61. _textAutoLanguage2.SetTextKey(_aim.IsSdkMagCompleted()
  62. ? "Mag_Reinitialize"
  63. : "Mag_Initialization");
  64. }
  65. void ShowDeviceLayout(int index)
  66. {
  67. for (int i = 0; i < layouts.Count; i++)
  68. layouts[i].SetActive(index == i);
  69. }
  70. void Update()
  71. {
  72. if (_aim == null)
  73. return;
  74. if (!_sensorsReady && _hub != null)
  75. _sensorsReady = _hub.EnsureNineAxisSensorsStarted();
  76. if (!_startResetMag)
  77. return;
  78. UpdateMagProgress();
  79. }
  80. void OnClickResetMag()
  81. {
  82. if (action_OnClickMagCalibrateInterceptor != null
  83. && action_OnClickMagCalibrateInterceptor.Invoke())
  84. return;
  85. if (!IsDeviceConnected())
  86. {
  87. PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("device-calibrate_n-connect"));
  88. return;
  89. }
  90. if (!_sensorsReady && (_hub == null || !_hub.EnsureNineAxisSensorsStarted()))
  91. {
  92. PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("device-calibrate_n-connect"));
  93. return;
  94. }
  95. if (_calibrateMagDoing)
  96. {
  97. _calibrateMagDoing = false;
  98. _startResetMag = false;
  99. _textAutoLanguage2.SetTextKey("Mag_Initialization");
  100. return;
  101. }
  102. if (_aim != null && !_aim.IsSdkGyrCompleted())
  103. {
  104. PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("Gyro_Initialization"));
  105. return;
  106. }
  107. // DemoStarter:每次点击 StartMagCalibration 重置并开始地磁校准
  108. _calibrateMagStartTime = Time.realtimeSinceStartup;
  109. if (_aim == null || !_aim.TryStartMagCalibration())
  110. {
  111. PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("device-calibrate_n-connect"));
  112. return;
  113. }
  114. _calibrateMagDoing = true;
  115. _startResetMag = true;
  116. flag_MagCalibarateOperateAndFinish = 0;
  117. }
  118. bool IsDeviceConnected()
  119. {
  120. if (_hub == null)
  121. return false;
  122. return _hub.IsConnected(_hub.GetActivePlayer());
  123. }
  124. void CancelResetMag()
  125. {
  126. _calibrateMagDoing = false;
  127. }
  128. void ShowMagInterferenceTip()
  129. {
  130. if (prefab_MagInterferenceTipView == null)
  131. return;
  132. GameObject tip = Instantiate(prefab_MagInterferenceTipView);
  133. JCUnityLib.CanvasUtils.PlusSortOrder(gameObject, tip, 1);
  134. }
  135. void UpdateMagProgress()
  136. {
  137. if (_aim.IsSdkMagCompleted())
  138. {
  139. _textAutoLanguage2.SetTextKey("Mag_Success");
  140. if (_calibrateMagDoing)
  141. CancelResetMag();
  142. if (flag_MagCalibarateOperateAndFinish != 0)
  143. {
  144. _startResetMag = false;
  145. return;
  146. }
  147. flag_MagCalibarateOperateAndFinish = 1;
  148. action_MagCalibarateOperateAndFinish?.Invoke();
  149. _startResetMag = false;
  150. ReturnToDeviceView();
  151. return;
  152. }
  153. if (!_calibrateMagDoing)
  154. {
  155. _textAutoLanguage2.SetTextKey("Mag_Initialization");
  156. _startResetMag = false;
  157. return;
  158. }
  159. float doingTime = Time.realtimeSinceStartup - _calibrateMagStartTime;
  160. if (doingTime >= MagCalibrateTimeoutSeconds)
  161. {
  162. _textAutoLanguage2.SetTextKey("Mag_Fail");
  163. CancelResetMag();
  164. ShowMagInterferenceTip();
  165. PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("tip_mag-calibrate_please-leave-interfere"));
  166. _startResetMag = false;
  167. return;
  168. }
  169. int progress = Mathf.Min(
  170. 99,
  171. Mathf.FloorToInt(doingTime / MagProgressGuideSeconds * 100f));
  172. _textAutoLanguage2.textFormatArgs = new object[] { progress };
  173. _textAutoLanguage2.SetTextKey("Mag_Initializing2");
  174. }
  175. void ReturnToDeviceView()
  176. {
  177. ViewManager.HideView(UIViewType.MagGuidanceView);
  178. ViewManager.ShowView(UIViewType.DeviceView);
  179. }
  180. public void OnClick_Back()
  181. {
  182. AudioMgr.ins.PlayBtn();
  183. ViewManager.HideView(UIViewType.MagGuidanceView);
  184. }
  185. }
  186. }