Unity Udexreal开发插件包
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

258 lines
9.5 KiB

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<BleManager>();
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>().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<Image>().color;
for (int i = 0; i < 2; ++i)
{
HandsIcons[i] = Hands[i].transform.GetChild(0).GetComponent<Image>();
DeviceNames[i] = Hands[i].transform.GetChild(1).GetComponent<Text>();
HandSignals[i] = Hands[i].transform.GetChild(2).GetComponent<Image>();
HandsBattery[i] = Hands[i].transform.GetChild(3).GetComponent<Image>();
SeparateLine[i] = Hands[i].transform.GetChild(4).GetComponent<Image>();
}
ConfirmChoose.OnSelect.AddListener(() =>
{
bleManager.LeftSpecificConnect = ChoosePanel.GetComponent<ChooseBle>().LeftChoice;
bleManager.RightSpecificConnect = ChoosePanel.GetComponent<ChooseBle>().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<GridLayoutGroup>();
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>().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>().text = device;
Indexs[1]++;
}
}
}
else if(OriginPanel != null)
{
ChoosePanel.SetActive(false);
if (PanelIndex == 1)
{
Panels[1].SetActive(true);
}
}
if(!string.IsNullOrEmpty(ChoosePanel.GetComponent<ChooseBle>().LeftChoice) && !string.IsNullOrEmpty(ChoosePanel.GetComponent<ChooseBle>().RightChoice))
{
ConfirmChoose.transform.parent.gameObject.SetActive(true);
}
if (bleManager.LeftConnectState)
{
Hands[0].GetComponent<Image>().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<Image>().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<Image>().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<Image>().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<EFBFBD><EFBFBD>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;
}
}
}
}