using System; using System.Collections; using System.Collections.Generic; using AppUI.Bluetooth; using AppUI.Manager.View; using SmartBowSDK; using UnityEngine; using UnityEngine.UI; using BLEAimhandler = AppUI.Bluetooth.AimHandler; namespace AppUI.View.NineAxis { /// 九轴地磁校准引导(AppUI);调用方式对齐 DemoStarter.StartMagCalibration。 public class MagGuidanceView : MonoBehaviour { const float ModuleInitWaitSeconds = 12f; const float MagProgressGuideSeconds = 20f; const float MagCalibrateTimeoutSeconds = 120f; [SerializeField] Button btnMagCalibrate; [SerializeField] GameObject prefab_MagInterferenceTipView; [SerializeField] List layouts; TextAutoLanguage2 _textAutoLanguage2; BLEAimhandler _aim; SmartBowDeviceHub _hub; bool _startResetMag; bool _calibrateMagDoing; bool _sensorsReady; float _calibrateMagStartTime; [NonSerialized] public int flag_MagCalibarateOperateAndFinish = -1; public Action action_MagCalibarateOperateAndFinish; public Func action_OnClickMagCalibrateInterceptor; void Start() { SmartBowDeviceHub.EnsureReady(); _hub = SmartBowDeviceHub.ins; _aim = _hub?.Aim; btnMagCalibrate.onClick.AddListener(OnClickResetMag); _textAutoLanguage2 = btnMagCalibrate.transform.Find("Text").GetComponent(); RefreshButtonLabel(); ShowDeviceLayout(_aim != null && _aim.GetActivePlayerDeviceType() == (int)AimDeviceType.ARTEMIS ? 1 : 0); StartCoroutine(WaitForSensorsReady()); } IEnumerator WaitForSensorsReady() { float elapsed = 0f; while (elapsed < ModuleInitWaitSeconds) { if (_hub != null && _hub.EnsureNineAxisSensorsStarted()) { _sensorsReady = true; yield break; } elapsed += Time.unscaledDeltaTime; yield return null; } Debug.LogWarning("[MagGuidanceView] 等待模块初始化/九轴传感开启超时。"); } void RefreshButtonLabel() { if (_textAutoLanguage2 == null || _aim == null) return; _textAutoLanguage2.SetTextKey(_aim.IsSdkMagCompleted() ? "Mag_Reinitialize" : "Mag_Initialization"); } void ShowDeviceLayout(int index) { for (int i = 0; i < layouts.Count; i++) layouts[i].SetActive(index == i); } void Update() { if (_aim == null) return; if (!_sensorsReady && _hub != null) _sensorsReady = _hub.EnsureNineAxisSensorsStarted(); if (!_startResetMag) return; UpdateMagProgress(); } void OnClickResetMag() { if (action_OnClickMagCalibrateInterceptor != null && action_OnClickMagCalibrateInterceptor.Invoke()) return; if (!IsDeviceConnected()) { PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("device-calibrate_n-connect")); return; } if (!_sensorsReady && (_hub == null || !_hub.EnsureNineAxisSensorsStarted())) { PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("device-calibrate_n-connect")); return; } if (_calibrateMagDoing) { _calibrateMagDoing = false; _startResetMag = false; _textAutoLanguage2.SetTextKey("Mag_Initialization"); return; } if (_aim != null && !_aim.IsSdkGyrCompleted()) { PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("Gyro_Initialization")); return; } // DemoStarter:每次点击 StartMagCalibration 重置并开始地磁校准 _calibrateMagStartTime = Time.realtimeSinceStartup; if (_aim == null || !_aim.TryStartMagCalibration()) { PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("device-calibrate_n-connect")); return; } _calibrateMagDoing = true; _startResetMag = true; flag_MagCalibarateOperateAndFinish = 0; } bool IsDeviceConnected() { if (_hub == null) return false; return _hub.IsConnected(_hub.GetActivePlayer()); } void CancelResetMag() { _calibrateMagDoing = false; } void ShowMagInterferenceTip() { if (prefab_MagInterferenceTipView == null) return; GameObject tip = Instantiate(prefab_MagInterferenceTipView); JCUnityLib.CanvasUtils.PlusSortOrder(gameObject, tip, 1); } void UpdateMagProgress() { if (_aim.IsSdkMagCompleted()) { _textAutoLanguage2.SetTextKey("Mag_Success"); if (_calibrateMagDoing) CancelResetMag(); if (flag_MagCalibarateOperateAndFinish != 0) { _startResetMag = false; return; } flag_MagCalibarateOperateAndFinish = 1; action_MagCalibarateOperateAndFinish?.Invoke(); _startResetMag = false; ReturnToDeviceView(); return; } if (!_calibrateMagDoing) { _textAutoLanguage2.SetTextKey("Mag_Initialization"); _startResetMag = false; return; } float doingTime = Time.realtimeSinceStartup - _calibrateMagStartTime; if (doingTime >= MagCalibrateTimeoutSeconds) { _textAutoLanguage2.SetTextKey("Mag_Fail"); CancelResetMag(); ShowMagInterferenceTip(); PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("tip_mag-calibrate_please-leave-interfere")); _startResetMag = false; return; } int progress = Mathf.Min( 99, Mathf.FloorToInt(doingTime / MagProgressGuideSeconds * 100f)); _textAutoLanguage2.textFormatArgs = new object[] { progress }; _textAutoLanguage2.SetTextKey("Mag_Initializing2"); } void ReturnToDeviceView() { ViewManager.HideView(UIViewType.MagGuidanceView); ViewManager.ShowView(UIViewType.DeviceView); } public void OnClick_Back() { AudioMgr.ins.PlayBtn(); ViewManager.HideView(UIViewType.MagGuidanceView); } } }