114 lines
3.4 KiB
C#
114 lines
3.4 KiB
C#
// (c) Meta Platforms, Inc. and affiliates. Confidential and proprietary.
|
|
|
|
using System.Text.RegularExpressions;
|
|
using UnityEngine;
|
|
using UnityEngine.SceneManagement;
|
|
using UnityEngine.UI;
|
|
using TMPro;
|
|
|
|
public class UiSceneMenu : MonoBehaviour
|
|
{
|
|
[Header("Settings")]
|
|
[SerializeField] private VerticalLayoutGroup m_layoutGroup = null;
|
|
|
|
[SerializeField] private TextMeshProUGUI m_labelPf = null;
|
|
|
|
private static Vector2 s_lastThumbstickL;
|
|
private static Vector2 s_lastThumbstickR;
|
|
|
|
private Scene m_activeScene;
|
|
|
|
private void Awake()
|
|
{
|
|
m_activeScene = SceneManager.GetActiveScene();
|
|
|
|
// Build labels
|
|
for (int i = 0; i < SceneManager.sceneCountInBuildSettings; ++i)
|
|
{
|
|
string scenePath = SceneUtility.GetScenePathByBuildIndex(i);
|
|
CreateLabel(i, scenePath);
|
|
}
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
int sceneCount = SceneManager.sceneCountInBuildSettings;
|
|
if (InputPrevScene())
|
|
{
|
|
ChangeScene((m_activeScene.buildIndex - 1 + sceneCount) % sceneCount);
|
|
}
|
|
else if (InputNextScene())
|
|
{
|
|
ChangeScene((m_activeScene.buildIndex + 1) % sceneCount);
|
|
}
|
|
|
|
s_lastThumbstickL = OVRInput.Get(OVRInput.Axis2D.PrimaryThumbstick, OVRInput.Controller.LTouch);
|
|
s_lastThumbstickR = OVRInput.Get(OVRInput.Axis2D.PrimaryThumbstick, OVRInput.Controller.RTouch);
|
|
}
|
|
|
|
private bool InputPrevScene()
|
|
{
|
|
return KeyboardPrevScene() || ThumbstickPrevScene(OVRInput.Controller.LTouch) ||
|
|
ThumbstickPrevScene(OVRInput.Controller.RTouch);
|
|
}
|
|
|
|
private bool InputNextScene()
|
|
{
|
|
return KeyboardNextScene() || ThumbstickNextScene(OVRInput.Controller.LTouch) ||
|
|
ThumbstickNextScene(OVRInput.Controller.RTouch);
|
|
}
|
|
|
|
private bool KeyboardPrevScene()
|
|
{
|
|
return Input.GetKeyDown(KeyCode.UpArrow);
|
|
}
|
|
|
|
private bool KeyboardNextScene()
|
|
{
|
|
return Input.GetKeyDown(KeyCode.DownArrow);
|
|
}
|
|
|
|
private bool ThumbstickPrevScene(OVRInput.Controller controller)
|
|
{
|
|
return (OVRInput.Get(OVRInput.Axis2D.PrimaryThumbstick, controller).y >= 0.9f) &&
|
|
(GetLastThumbstickValue(controller).y < 0.9f);
|
|
}
|
|
|
|
private bool ThumbstickNextScene(OVRInput.Controller controller)
|
|
{
|
|
return (OVRInput.Get(OVRInput.Axis2D.PrimaryThumbstick, controller).y <= -0.9f) &&
|
|
(GetLastThumbstickValue(controller).y > -0.9f);
|
|
}
|
|
|
|
private Vector2 GetLastThumbstickValue(OVRInput.Controller controller)
|
|
{
|
|
return controller == OVRInput.Controller.LTouch ? s_lastThumbstickL : s_lastThumbstickR;
|
|
}
|
|
|
|
private void ChangeScene(int nextScene)
|
|
{
|
|
SceneManager.LoadScene(nextScene);
|
|
}
|
|
|
|
private void CreateLabel(int sceneIndex, string scenePath)
|
|
{
|
|
// Get the scene name
|
|
string sceneName = System.IO.Path.GetFileNameWithoutExtension(scenePath);
|
|
|
|
// Add spaces after capital letters
|
|
sceneName = Regex.Replace(sceneName, "[A-Z]", " $0").Trim();
|
|
|
|
// Call attention to the active scene
|
|
bool isActiveScene = m_activeScene.buildIndex == sceneIndex;
|
|
if (isActiveScene)
|
|
{
|
|
sceneName = $"Open: {sceneName}";
|
|
}
|
|
|
|
// Create and set the label
|
|
TextMeshProUGUI label = GameObject.Instantiate(m_labelPf);
|
|
label.SetText($"{sceneIndex + 1}. {sceneName}");
|
|
label.transform.SetParent(m_layoutGroup.transform, false);
|
|
}
|
|
}
|