|
|
- // SDK Setup Switcher|Prefabs|0010
- namespace VRTK
- {
- using UnityEngine;
- using UnityEngine.EventSystems;
- using UnityEngine.UI;
- using System;
- using System.Collections.Generic;
- using System.Linq;
-
- /// <summary>
- /// Provides a GUI overlay to allow switching the loaded VRTK_SDKSetup of the the current VRTK_SDKManager.
- /// </summary>
- /// <remarks>
- /// **Prefab Usage:**
- /// * Place the `VRTK/Prefabs/SDKSetupSwitcher/SDKSetupSwitcher` prefab into the scene hierarchy.
- /// </remarks>
- public class VRTK_SDKSetupSwitcher : MonoBehaviour
- {
- [Header("Fallback Objects")]
-
- [SerializeField]
- protected Camera fallbackCamera;
- [SerializeField]
- protected EventSystem eventSystem;
-
- [Header("Object References")]
-
- [SerializeField]
- protected Text currentText;
- [SerializeField]
- protected RectTransform statusPanel;
- [SerializeField]
- protected RectTransform selectionPanel;
-
- [SerializeField]
- protected Button switchButton;
- [SerializeField]
- protected Button cancelButton;
- [SerializeField]
- protected Button chooseButton;
- [SerializeField]
- protected bool playareaSync = true;
-
- protected enum ViewingState
- {
- Status,
- Selection
- }
-
- protected readonly List<GameObject> chooseButtonGameObjects = new List<GameObject>();
- protected Transform currentPlayarea;
-
- protected virtual void Awake()
- {
- fallbackCamera.gameObject.SetActive(false);
- eventSystem.gameObject.SetActive(false);
- chooseButton.gameObject.SetActive(false);
- }
-
- protected virtual void OnEnable()
- {
- VRTK_SDKManager.SubscribeLoadedSetupChanged(OnLoadedSetupChanged);
-
- switchButton.onClick.AddListener(OnSwitchButtonClick);
- cancelButton.onClick.AddListener(OnCancelButtonClick);
-
- Show(ViewingState.Status);
- }
-
- protected virtual void OnDisable()
- {
- VRTK_SDKManager.UnsubscribeLoadedSetupChanged(OnLoadedSetupChanged);
-
- switchButton.onClick.RemoveListener(OnSwitchButtonClick);
- cancelButton.onClick.RemoveListener(OnCancelButtonClick);
-
- Show(ViewingState.Status);
- }
-
- protected virtual void OnLoadedSetupChanged(VRTK_SDKManager sender, VRTK_SDKManager.LoadedSetupChangeEventArgs e)
- {
- Show(ViewingState.Status);
- if (playareaSync && currentPlayarea != null)
- {
- Transform newPlayarea = VRTK_DeviceFinder.PlayAreaTransform();
- newPlayarea.transform.position = currentPlayarea.transform.position;
- newPlayarea.transform.rotation = currentPlayarea.transform.rotation;
- VRTK_SharedMethods.SetGlobalScale(newPlayarea, currentPlayarea.transform.lossyScale);
- }
- currentPlayarea = VRTK_DeviceFinder.PlayAreaTransform();
- }
-
- protected virtual void OnSwitchButtonClick()
- {
- Show(ViewingState.Selection);
- }
-
- protected virtual void OnCancelButtonClick()
- {
- Show(ViewingState.Status);
- }
-
- protected virtual void Show(ViewingState viewingState)
- {
- switch (viewingState)
- {
- case ViewingState.Status:
- RemoveCreatedChooseButtons();
- UpdateCurrentText();
- selectionPanel.gameObject.SetActive(false);
- statusPanel.gameObject.SetActive(true);
-
- break;
- case ViewingState.Selection:
- AddSelectionButtons();
- selectionPanel.gameObject.SetActive(true);
- statusPanel.gameObject.SetActive(false);
-
- break;
- default:
- VRTK_Logger.Fatal(new ArgumentOutOfRangeException("viewingState", viewingState, null));
- return;
- }
-
- bool isAnyOtherCameraUsed = VRTK_SDKManager.GetAllSDKSetups().Any(setup => setup != null && setup.gameObject.activeSelf)
- || VRTK_DeviceFinder.HeadsetCamera() != null;
- fallbackCamera.gameObject.SetActive(!isAnyOtherCameraUsed);
- eventSystem.gameObject.SetActive(EventSystem.current == null || EventSystem.current == eventSystem);
- }
-
- protected virtual void UpdateCurrentText()
- {
- VRTK_SDKSetup loadedSetup = VRTK_SDKManager.GetLoadedSDKSetup();
- currentText.text = (loadedSetup == null ? "None" : loadedSetup.name);
- }
-
- protected virtual void AddSelectionButtons()
- {
- if (VRTK_SDKManager.GetLoadedSDKSetup() != null)
- {
- GameObject chooseNoneButton = Instantiate(chooseButton.gameObject, chooseButton.transform.parent);
- chooseNoneButton.GetComponentInChildren<Text>().text = "None";
- chooseNoneButton.name = "ChooseNoneButton";
- chooseNoneButton.SetActive(true);
-
- chooseNoneButton.GetComponent<Button>().onClick.AddListener(
- () => VRTK_SDKManager.AttemptUnloadSDKSetup(true)
- );
-
- chooseButtonGameObjects.Add(chooseNoneButton);
- }
-
- VRTK_SDKSetup[] setups = VRTK_SDKManager.GetAllSDKSetups();
- for (int index = 0; index < setups.Length; index++)
- {
- VRTK_SDKSetup setup = setups[index];
- if (setup == null || setup == VRTK_SDKManager.GetLoadedSDKSetup())
- {
- continue;
- }
-
- GameObject chooseButtonCopy = Instantiate(chooseButton.gameObject, chooseButton.transform.parent);
- chooseButtonCopy.GetComponentInChildren<Text>().text = setup.name;
- chooseButtonCopy.name = string.Format("Choose{0}Button", setup.name);
- chooseButtonCopy.SetActive(true);
-
- int indexCopy = index;
- Button button = chooseButtonCopy.GetComponent<Button>();
- button.onClick.AddListener(
- () => VRTK_SDKManager.AttemptTryLoadSDKSetup(indexCopy, true, setups)
- );
-
- ColorBlock buttonColors = button.colors;
- buttonColors.colorMultiplier = setup.isValid ? 1.0f : 0.8f;
- button.colors = buttonColors;
-
- chooseButtonGameObjects.Add(chooseButtonCopy);
- }
- }
-
- protected virtual void RemoveCreatedChooseButtons()
- {
- chooseButtonGameObjects.ForEach(Destroy);
- chooseButtonGameObjects.Clear();
- }
- }
- }
|