diff --git a/ColourMeOKGame/Assets/Scripts/AccountUI.cs b/ColourMeOKGame/Assets/Scripts/AccountUI.cs index 7e28a50..bf8cb65 100644 --- a/ColourMeOKGame/Assets/Scripts/AccountUI.cs +++ b/ColourMeOKGame/Assets/Scripts/AccountUI.cs @@ -78,6 +78,11 @@ public class AccountUI : MonoBehaviour /// private Button _usernameUpdateButton; + private void Awake() + { + GameManager.Instance.Backend.RegisterOnSignInCallback(OnSignInCallback); + } + public void Start() { if (state == State.UnassociatedState) throw new Exception("unreachable state"); @@ -118,11 +123,6 @@ public void OnEnable() TransitionStateTo(State.NotSignedIn); } - private void Awake() - { - GameManager.Instance.Backend.RegisterOnSignInCallback(OnSignInCallback); - } - private void OnSignInCallback(FirebaseUser user) { Debug.Log("sign in account ui callback"); @@ -134,15 +134,6 @@ private void OnSignInCallback(FirebaseUser user) _header.text = $"Signed in as {username}"; } - /// - /// populate the fields with the given username and email, used by GameManager after local player data is loaded - /// - public void PopulateFields(string username, string email) - { - _usernameField.value = username; - _emailField.value = email; - } - private void TransitionStateTo(State newState, bool keepAccompanyingText = false) { // if we're transitioning to the same state, do nothing diff --git a/ColourMeOKGame/Assets/Scripts/GameManager.cs b/ColourMeOKGame/Assets/Scripts/GameManager.cs index c58f431..56be8e9 100644 --- a/ColourMeOKGame/Assets/Scripts/GameManager.cs +++ b/ColourMeOKGame/Assets/Scripts/GameManager.cs @@ -1,4 +1,5 @@ using UnityEngine; +using UnityEngine.UIElements; /// /// singleton for a single source of truth game state and flow management @@ -10,6 +11,11 @@ public class GameManager : MonoBehaviour /// public static GameManager Instance; + /// + /// ui manager object for handling ui state and flow + /// + public UIManager ui; + /// /// the local player data object for storing player data /// @@ -20,11 +26,6 @@ public class GameManager : MonoBehaviour /// public Backend Backend; - /// - /// ui manager object for handling ui state and flow - /// - public UIManager ui; - /// /// enforces singleton behaviour; sets doesn't destroy on load and checks for multiple instances /// @@ -43,7 +44,17 @@ private void Awake() Debug.Log("awake as non-singleton instance, destroying self"); Destroy(gameObject); } + } + private void Start() + { + // load the local player data and refresh the ui + _localPlayerData = new LocalPlayerData(); + _localPlayerData.LoadFromTheWorld(); + PopulateFields(); + + // register a callback to refresh the ui when the player signs in + Backend.RegisterOnSignInCallback(_ => { _localPlayerData.LoadFromTheWorld(); }); } /// @@ -56,21 +67,22 @@ private void OnEnable() ui = UIManager.Instance; } - private void Start() + /// + /// called when the application is quitting, saves the local player data + /// + private void OnApplicationQuit() { - // load the local player data and refresh the ui - _localPlayerData = new LocalPlayerData(); - _localPlayerData.LoadFromTheWorld(); - - // register a callback to refresh the ui when the player signs in - Backend.RegisterOnSignInCallback(_ => { _localPlayerData.LoadFromTheWorld(); }); + Debug.Log("running deferred cleanup/save functions"); + Backend.Cleanup(); + _localPlayerData.SaveToTheWorld(); } /// - /// called when the game object is disabled + /// populate the fields with the given username and email, used by GameManager after local player data is loaded /// - private void OnDestroy() + public void PopulateFields() { - Backend.Cleanup(); + ui.UI.Q("UsernameField").value = _localPlayerData.LastKnownUsername; + ui.UI.Q("EmailField").value = _localPlayerData.LastKnownEmail; } } \ No newline at end of file diff --git a/ColourMeOKGame/Assets/Scripts/LocalPlayerData.cs b/ColourMeOKGame/Assets/Scripts/LocalPlayerData.cs index 7d44cca..f0ca908 100644 --- a/ColourMeOKGame/Assets/Scripts/LocalPlayerData.cs +++ b/ColourMeOKGame/Assets/Scripts/LocalPlayerData.cs @@ -90,7 +90,8 @@ public void LoadFromTheWorld() RecentOnlineScores.Enqueue(onlineScore); } - Debug.Log("loaded online scores from backend"); + Debug.Log( + $"loaded lpdata from the world ({LastKnownUsername} <{LastKnownEmail}> with RLS.Count={RecentLocalScores.Count}), ROS.Count={RecentOnlineScores.Count}"); }); } @@ -114,8 +115,7 @@ public void SaveToTheWorld() idx++; } - Debug.Log("saved lpdata to playerprefs"); - // online scores are already saved in the backend + Debug.Log("saved lpdata to playerprefs"); // online scores are already saved in the backend } /// @@ -128,7 +128,6 @@ public void RegisterLocalScore(Score score) RecentLocalScores.Enqueue(score); } - public struct Score { /// diff --git a/ColourMeOKGame/Assets/Scripts/UIManager.cs b/ColourMeOKGame/Assets/Scripts/UIManager.cs index a2e4d2b..3296492 100644 --- a/ColourMeOKGame/Assets/Scripts/UIManager.cs +++ b/ColourMeOKGame/Assets/Scripts/UIManager.cs @@ -4,11 +4,6 @@ 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() /// @@ -20,12 +15,17 @@ public enum DisplayState LeaderboardView, AccountView } - + + /// + /// singleton pattern: define instance field for accessing the singleton elsewhere + /// + public static UIManager Instance; + /// /// the current display state of the game /// [SerializeField] private DisplayState state = DisplayState.UnassociatedState; - + /// /// the visual element object for game ui /// @@ -56,7 +56,7 @@ private void OnEnable() UI = GetComponent().rootVisualElement; SetDisplayState(DisplayState.Nothing); } - + /// /// function to show a menu based on the enum passed, /// and any other necessary actions diff --git a/ColourMeOKGame/Assets/UI/GameUI.uxml b/ColourMeOKGame/Assets/UI/GameUI.uxml index 7245dbc..2ca73b7 100644 --- a/ColourMeOKGame/Assets/UI/GameUI.uxml +++ b/ColourMeOKGame/Assets/UI/GameUI.uxml @@ -1,92 +1,166 @@ - -