From 9101f212bcd4764f00a1efa7178ec61ba8182da1 Mon Sep 17 00:00:00 2001 From: Joe Spiro Date: Tue, 20 Dec 2022 18:14:50 -0500 Subject: [PATCH] Changes made as part of "Instrument Your Game with Remote Config" --- Assets/Hamster/Scripts/MainGame.cs | 49 +++++++++++++++++-- .../Scripts/MapObjects/AccelerationTile.cs | 4 +- .../Hamster/Scripts/States/BaseLevelSelect.cs | 2 +- Assets/Hamster/Scripts/States/MainMenu.cs | 7 ++- 4 files changed, 54 insertions(+), 8 deletions(-) diff --git a/Assets/Hamster/Scripts/MainGame.cs b/Assets/Hamster/Scripts/MainGame.cs index 0c65cde..365dd67 100644 --- a/Assets/Hamster/Scripts/MainGame.cs +++ b/Assets/Hamster/Scripts/MainGame.cs @@ -18,6 +18,7 @@ using System.Collections.Generic; using System.Threading.Tasks; using Firebase.Extensions; +using Firebase.RemoteConfig; namespace Hamster { @@ -178,7 +179,7 @@ private void InitializeFirebaseAndStartGame() if (dependencyStatus == Firebase.DependencyStatus.Available) { // Create and hold a reference to your FirebaseApp, app = Firebase.FirebaseApp.DefaultInstance; - InitializeCommonDataAndStartGame(); + SetRemoteConfigDefaults(); } else { UnityEngine.Debug.LogError( $"Could not resolve all Firebase dependencies: {dependencyStatus}\n" + @@ -191,21 +192,61 @@ private void InitializeFirebaseAndStartGame() // before starting the game. private void SetRemoteConfigDefaults() { - throw new System.NotImplementedException(); + var defaults = new System.Collections.Generic.Dictionary < string, object > (); + defaults.Add( + Hamster.MapObjects.AccelerationTile.AccelerationTileForceKey, + Hamster.MapObjects.AccelerationTile.AccelerationTileForceDefault); + defaults.Add( + Hamster.States.MainMenu.SubtitleOverrideKey, + Hamster.States.MainMenu.SubtitleOverrideDefault); + var remoteConfig = FirebaseRemoteConfig.DefaultInstance; + remoteConfig.SetDefaultsAsync(defaults).ContinueWithOnMainThread( + previousTask => + { + FetchRemoteConfig(InitializeCommonDataAndStartGame); + } + ); } // (Re)fetches Remote Config values and pass down the onFetchAndActivateSuccessful callback. // Called during the initialization flow but can also be called indepedently. public void FetchRemoteConfig(System.Action onFetchAndActivateSuccessful) { - throw new System.NotImplementedException(); + if(app==null) + { + Debug.LogError($"Do not use Firebase until it is properly initialized by calling {nameof(InitializeFirebaseAndStartGame)}."); + return; + } + + Debug.Log("Fetching data..."); + var remoteConfig = FirebaseRemoteConfig.DefaultInstance; + remoteConfig.FetchAsync(System.TimeSpan.Zero).ContinueWithOnMainThread( + previousTask=> + { + if (!previousTask.IsCompleted) + { + Debug.LogError($"{nameof(remoteConfig.FetchAsync)} incomplete: Status '{previousTask.Status}'"); + return; + } + ActivateRetrievedRemoteConfigValues(onFetchAndActivateSuccessful); + }); } // The final method in the initialization flow that will activate fetched values // and on Success will call onFetchAndActivateSuccessful. private void ActivateRetrievedRemoteConfigValues(System.Action onFetchAndActivateSuccessful) { - throw new System.NotImplementedException(); + var remoteConfig = FirebaseRemoteConfig.DefaultInstance; + var info = remoteConfig.Info; + if(info.LastFetchStatus == LastFetchStatus.Success) + { + remoteConfig.ActivateAsync().ContinueWithOnMainThread( + previousTask => + { + Debug.Log($"Remote data loaded and ready (last fetch time {info.FetchTime})."); + onFetchAndActivateSuccessful(); + }); + } } } } diff --git a/Assets/Hamster/Scripts/MapObjects/AccelerationTile.cs b/Assets/Hamster/Scripts/MapObjects/AccelerationTile.cs index 11658ab..b5ea3b0 100644 --- a/Assets/Hamster/Scripts/MapObjects/AccelerationTile.cs +++ b/Assets/Hamster/Scripts/MapObjects/AccelerationTile.cs @@ -13,6 +13,7 @@ // limitations under the License. using UnityEngine; +using Firebase.RemoteConfig; namespace Hamster.MapObjects { @@ -32,7 +33,8 @@ public class AccelerationTile : MapObject { public float Acceleration { get; private set; } private void Start() { - Acceleration = AccelerationTileForceDefault; + var remoteConfig = FirebaseRemoteConfig.DefaultInstance; + Acceleration = (float)remoteConfig.GetValue(AccelerationTileForceKey).DoubleValue; } public void FixedUpdate() { diff --git a/Assets/Hamster/Scripts/States/BaseLevelSelect.cs b/Assets/Hamster/Scripts/States/BaseLevelSelect.cs index 4f1596f..a81dd70 100644 --- a/Assets/Hamster/Scripts/States/BaseLevelSelect.cs +++ b/Assets/Hamster/Scripts/States/BaseLevelSelect.cs @@ -117,7 +117,7 @@ class BaseLevelSelect : BaseState { } public override void Resume(StateExitValue results) { - ShowUI(); + CommonData.mainGame.FetchRemoteConfig(ShowUI); } public override void Suspend() { diff --git a/Assets/Hamster/Scripts/States/MainMenu.cs b/Assets/Hamster/Scripts/States/MainMenu.cs index 19602cc..6d86ad8 100644 --- a/Assets/Hamster/Scripts/States/MainMenu.cs +++ b/Assets/Hamster/Scripts/States/MainMenu.cs @@ -14,6 +14,7 @@ using UnityEngine; using System.Collections.Generic; +using Firebase.RemoteConfig; namespace Hamster.States { class MainMenu : BaseState { @@ -53,7 +54,7 @@ class MainMenu : BaseState { public override void Resume(StateExitValue results) { CommonData.mainGame.SelectAndPlayMusic(CommonData.prefabs.menuMusic, true); - InitializeUI(); + CommonData.mainGame.FetchRemoteConfig(InitializeUI); } private void InitializeUI() { @@ -61,7 +62,9 @@ class MainMenu : BaseState { menuComponent = SpawnUI(StringConstants.PrefabMainMenu); } - var subtitleOverride = JsonUtility.FromJson(SubtitleOverrideDefault); + var remoteConfig = FirebaseRemoteConfig.DefaultInstance; + var subtitleOverride = JsonUtility.FromJson( + remoteConfig.GetValue(SubtitleOverrideKey).StringValue); // Only sets values if all fields of the override are non-default. if(subtitleOverride != null &&subtitleOverride.IsValidOverride()) {