using UnityEngine; using UnityEngine.UI; using UDE_HAND_INTERACTION; using Unity.XR.CoreUtils; public class UIManager : MonoBehaviour { public static readonly string CurrentSDKVersion = "1.5"; public XROrigin XR_Origin; public GameObject[] Panels; public GameObject ChoosePanel; public GameObject JoyRangeCalibPanel; public FingerPressController ConfirmChoose; public FingerPressController FinRangeCalib; private GameObject OriginPanel; private int PanelIndex = 0; private BleManager bleManager; public FingerPressController[] ContinueBtns; public FingerPressController ExitBtn; public FingerPressController[] BackBtns; public FingerPressController[] HeightSwitch; public GameObject SkipCalibration; public GameObject[] Hands; public Sprite[] HandsIconsSet; public Sprite[] HandsSignalSet; public Sprite[] HandsBatterySet; private Image[] HandsIcons = new Image[2]; private Text[] DeviceNames = new Text[2]; private Image[] HandSignals = new Image[2]; private Image[] HandsBattery = new Image[2]; private Image[] SeparateLine = new Image[2]; public Color ConnectColor; public Color DisconnectColor; private Color DefaultColor; public Image[] LoadBar; public Text[] Msg; private bool EnterCalibrationPanel = false; private float TimeCnt = 3; private void Awake() { bleManager = GetComponent(); if (bleManager.handDrivers[0].UsingAndroidService || bleManager.handDrivers[1].UsingAndroidService) { Panels = new GameObject[1] { Panels[0] }; bleManager.UsingAndroidService = true; } } void Start() { Panels[PanelIndex].SetActive(true); Panels[0].transform.Find("Version").GetComponent().text = CurrentSDKVersion; ExitBtn.OnSelect.AddListener(() => { Application.Quit(); }); foreach (var btn in ContinueBtns) { btn.OnSelect.AddListener(() => { if(Panels.Length > 1) { Panels[PanelIndex++].SetActive(false); Panels[PanelIndex].SetActive(true); EnterCalibrationPanel = true; TimeCnt = 3; if(PanelIndex == 3) { bleManager.Calibration(0); } } else { transform.GetChild(0).gameObject.SetActive(false); } }); } foreach (var btn in BackBtns) { btn.OnSelect.AddListener(() => { if(ChoosePanel.activeInHierarchy && PanelIndex == 1) { ChoosePanel.SetActive(false); } Panels[PanelIndex--].SetActive(false); Panels[PanelIndex].SetActive(true); }); } DefaultColor = Hands[0].GetComponent().color; for (int i = 0; i < 2; ++i) { HandsIcons[i] = Hands[i].transform.GetChild(0).GetComponent(); DeviceNames[i] = Hands[i].transform.GetChild(1).GetComponent(); HandSignals[i] = Hands[i].transform.GetChild(2).GetComponent(); HandsBattery[i] = Hands[i].transform.GetChild(3).GetComponent(); SeparateLine[i] = Hands[i].transform.GetChild(4).GetComponent(); } ConfirmChoose.OnSelect.AddListener(() => { bleManager.LeftSpecificConnect = ChoosePanel.GetComponent().LeftChoice; bleManager.RightSpecificConnect = ChoosePanel.GetComponent().RightChoice; OriginPanel.SetActive(true); ChoosePanel.SetActive(false); }); if(HeightSwitch.Length > 0) { HeightSwitch[0].OnSelect.AddListener(() => { transform.root.position = new Vector3(0, 1.2f, 0.5f); XR_Origin.transform.Find("Camera Offset").position = new Vector3(0, 1.2f, 0); XR_Origin.transform.Find("WorldOffset").position = new Vector3(0, 1.2f, 0); }); HeightSwitch[1].OnSelect.AddListener(() => { transform.root.position = new Vector3(0, 1.6f, 0.5f); XR_Origin.transform.Find("Camera Offset").position = new Vector3(0, 1.6f, 0); XR_Origin.transform.Find("WorldOffset").position = new Vector3(0, 1.6f, 0); }); } FinRangeCalib.OnSelect.AddListener(() => { bleManager.JoyRangeCalibration(false); transform.GetChild(0).gameObject.SetActive(false); }); } void Update() { if(bleManager.NeedChooseConnect && string.IsNullOrEmpty(bleManager.LeftSpecificConnect) && string.IsNullOrEmpty(bleManager.RightSpecificConnect)) { OriginPanel = Panels[1]; if (PanelIndex == 1) { Panels[1].SetActive(false); ChoosePanel.SetActive(true); } var Layouts = ChoosePanel.transform.GetComponentsInChildren(); int[] Indexs = new int[2] { 0, 0 }; foreach (var device in bleManager.DevicesList) { if (device[^1] == 'L') { var SpecificDevice = Layouts[0].transform.GetChild(Indexs[0]).gameObject; SpecificDevice.SetActive(true); SpecificDevice.transform.GetChild(0).Find("DeviceName").GetComponent().text = device; Indexs[0]++; } else if(device[^1] == 'R') { var SpecificDevice = Layouts[1].transform.GetChild(Indexs[1]).gameObject; SpecificDevice.SetActive(true); SpecificDevice.transform.GetChild(0).Find("DeviceName").GetComponent().text = device; Indexs[1]++; } } } else if(OriginPanel != null) { ChoosePanel.SetActive(false); if (PanelIndex == 1) { Panels[1].SetActive(true); } } if(!string.IsNullOrEmpty(ChoosePanel.GetComponent().LeftChoice) && !string.IsNullOrEmpty(ChoosePanel.GetComponent().RightChoice)) { ConfirmChoose.transform.parent.gameObject.SetActive(true); } if (bleManager.LeftConnectState) { Hands[0].GetComponent().color = Color.white; HandsIcons[0].sprite = HandsIconsSet[1]; DeviceNames[0].color = Color.white; DeviceNames[0].text = bleManager.LeftDeviceName; HandSignals[0].sprite = HandsSignalSet[1]; HandsBattery[0].sprite = HandsBatterySet[1]; SeparateLine[0].color = ConnectColor; } else { Hands[0].GetComponent().color = DefaultColor; HandsIcons[0].sprite = HandsIconsSet[0]; DeviceNames[0].color = DisconnectColor; DeviceNames[0].text = "..."; HandSignals[0].sprite = HandsSignalSet[0]; HandsBattery[0].sprite = HandsBatterySet[0]; SeparateLine[0].color = DisconnectColor; } if(bleManager.RightConnectState) { Hands[1].GetComponent().color = Color.white; HandsIcons[1].sprite = HandsIconsSet[3]; DeviceNames[1].color = Color.white; DeviceNames[1].text = bleManager.RightDeviceName; HandSignals[1].sprite = HandsSignalSet[1]; HandsBattery[1].sprite = HandsBatterySet[1]; SeparateLine[1].color = ConnectColor; } else { Hands[1].GetComponent().color = DefaultColor; HandsIcons[1].sprite = HandsIconsSet[2]; DeviceNames[1].color = DisconnectColor; DeviceNames[1].text = "..."; HandSignals[1].sprite = HandsSignalSet[0]; HandsBattery[1].sprite = HandsBatterySet[0]; SeparateLine[1].color = DisconnectColor; } ContinueBtns[1].transform.parent.gameObject.SetActive(bleManager.LeftConnectState && bleManager.RightConnectState); SkipCalibration?.SetActive(PlayerPrefs.GetInt(bleManager.LeftDeviceName) == 1 && PlayerPrefs.GetInt(bleManager.RightDeviceName) == 1); if (PanelIndex > 2 && EnterCalibrationPanel) { TimeCnt -= Time.deltaTime; if(TimeCnt >= 0) { LoadBar[PanelIndex - 3].fillAmount = 1 - (TimeCnt / 3); Msg[PanelIndex - 3].text = "Preparation phase " + (int)(TimeCnt + 1) + "s"; } else if(TimeCnt > -1) { LoadBar[PanelIndex - 3].fillAmount = -TimeCnt; Msg[PanelIndex - 3].text = "Calibrating٬Hold your pose"; } else { LoadBar[PanelIndex - 3].fillAmount = 1; bleManager.Calibration(PanelIndex - 2); if (PanelIndex == 5) { EnterCalibrationPanel = false; Panels[PanelIndex].SetActive(false); JoyRangeCalibPanel.SetActive(true); bleManager.JoyRangeCalibration(true); return; } Panels[PanelIndex++].SetActive(false); Panels[PanelIndex].SetActive(true); TimeCnt = 3; } } } }