using System; using UnityEngine; using UnityEngine.UIElements; public class UIManager : MonoBehaviour { /// /// singleton pattern: define instance field for accessing the singleton elsewhere /// public static UIManager Instance; /// /// enum for available menus in the game, for use with ShowMenu() /// public enum DisplayState { UnassociatedState, Nothing, PlayView, LeaderboardView, AccountView } /// /// the current display state of the game /// [SerializeField] private DisplayState state = DisplayState.UnassociatedState; /// /// the visual element object for game ui /// public VisualElement UI; /// /// enforces singleton behaviour; sets doesn't destroy on load and checks for multiple instances /// private void Awake() { // check if instance hasn't been set yet if (Instance == null) { Debug.Log("awake as singleton instance, setting self as the forever-alive instance"); Instance = this; DontDestroyOnLoad(gameObject); } // check if instance is already set and it's not this instance else if (Instance != null && Instance != this) { Debug.Log("awake as non-singleton instance, destroying self"); Destroy(gameObject); } } private void OnEnable() { UI = GetComponent().rootVisualElement; SetDisplayState(DisplayState.Nothing); } /// /// function to show a menu based on the enum passed, /// and any other necessary actions /// /// the game menu to show public void SetDisplayState(DisplayState newDisplayState) { var currentDisplayState = state; // if the new state is the same as the current state, do nothing if (currentDisplayState == newDisplayState) { Debug.Log($"staying at {currentDisplayState} (illogical transition)"); return; } Debug.Log($"switching from {currentDisplayState} to {newDisplayState}"); var gameView = UI.Q("GameView"); var leaderboardView = UI.Q("LeaderboardView"); var accountView = UI.Q("AccountView"); switch (newDisplayState) { case DisplayState.Nothing: gameView.style.display = DisplayStyle.None; leaderboardView.style.display = DisplayStyle.None; accountView.style.display = DisplayStyle.None; break; case DisplayState.PlayView: gameView.style.display = DisplayStyle.Flex; leaderboardView.style.display = DisplayStyle.None; accountView.style.display = DisplayStyle.None; break; case DisplayState.LeaderboardView: gameView.style.display = DisplayStyle.None; leaderboardView.style.display = DisplayStyle.Flex; accountView.style.display = DisplayStyle.None; break; case DisplayState.AccountView: gameView.style.display = DisplayStyle.None; leaderboardView.style.display = DisplayStyle.None; accountView.style.display = DisplayStyle.Flex; break; case DisplayState.UnassociatedState: default: throw new ArgumentOutOfRangeException(nameof(newDisplayState), newDisplayState, null); } } }