using UnityEngine; using UnityEngine.UI; using Google; using PlayFab; using PlayFab.ClientModels; using System; using System.Collections.Generic; using System.Threading.Tasks; public class GoogleSignInManager : MonoBehaviour { private GoogleSignInConfiguration configuration; public Bootstrapper bootstrapper; public Button googleSignInButton; public Button guestLoginButton; void Awake() { configuration = new GoogleSignInConfiguration { WebClientId = "1044061384825-kervrjq8gcopk6ijs69qnm4jqeh7rj7r.apps.googleusercontent.com", RequestEmail = true, RequestAuthCode = true }; GoogleSignIn.Configuration = configuration; Application.quitting += SyncPlayerPrefsToPlayFabOnQuit; } void Start() { googleSignInButton.onClick.RemoveAllListeners(); googleSignInButton.onClick.AddListener(SignInWithGoogle); guestLoginButton.onClick.RemoveAllListeners(); guestLoginButton.onClick.AddListener(GuestLogin); if (PlayerPrefs.HasKey("PlayFabID") && !PlayerPrefs.HasKey("GuestMode")) { Debug.Log("User previously signed in with Google. Attempting silent login..."); googleSignInButton.gameObject.SetActive(false); guestLoginButton.gameObject.SetActive(false); SignInSilently(); } else if (PlayerPrefs.HasKey("GuestMode")) { Debug.Log("Guest mode previously selected. Letting user choose again."); googleSignInButton.gameObject.SetActive(true); guestLoginButton.gameObject.SetActive(true); } else { Debug.Log("No login info found. Showing login options."); googleSignInButton.gameObject.SetActive(true); guestLoginButton.gameObject.SetActive(true); } } public void GuestLogin() { Debug.Log("Starting game in Guest Mode..."); SafePlayerPrefs.SetInt("GuestMode", 1); PlayerPrefs.Save(); googleSignInButton.gameObject.SetActive(false); guestLoginButton.gameObject.SetActive(false); bootstrapper.StartGame(); } public void SignInWithGoogle() { PlayerPrefs.DeleteKey("GuestMode"); PlayerPrefs.DeleteAll(); PlayerPrefs.Save(); googleSignInButton.interactable = false; guestLoginButton.interactable = false; GoogleSignIn.DefaultInstance.SignIn().ContinueWith(OnGoogleSignIn); } private void OnGoogleSignIn(Task task) { if (task.IsFaulted || task.IsCanceled) { Debug.LogError("Google Sign-In failed: " + task.Exception); googleSignInButton.gameObject.SetActive(true); googleSignInButton.interactable = true; guestLoginButton.gameObject.SetActive(true); guestLoginButton.interactable = true; return; } GoogleSignInUser user = task.Result; string authCode = user.AuthCode; SafePlayerPrefs.SetString("GoogleAuthCode", authCode); PlayerPrefs.Save(); LoginToPlayFab(authCode); } private void SignInSilently() { Debug.Log("Attempting Google Silent Sign-In..."); GoogleSignIn.DefaultInstance.SignInSilently().ContinueWith(task => { if (task.IsFaulted || task.IsCanceled) { Debug.LogWarning("Silent Sign-In failed. Showing login buttons."); googleSignInButton.gameObject.SetActive(true); googleSignInButton.interactable = true; guestLoginButton.gameObject.SetActive(true); guestLoginButton.interactable = true; return; } GoogleSignInUser user = task.Result; string authCode = user.AuthCode; SafePlayerPrefs.SetString("GoogleAuthCode", authCode); PlayerPrefs.Save(); LoginToPlayFab(authCode); }); } private void LoginToPlayFab(string authCode) { PlayFabSettings.staticSettings.TitleId = "1819C6"; var request = new LoginWithGoogleAccountRequest { TitleId = "1819C6", ServerAuthCode = authCode, CreateAccount = true }; PlayFabClientAPI.LoginWithGoogleAccount(request, OnPlayFabLoginSuccess, OnPlayFabLoginFailure); } private void OnPlayFabLoginSuccess(LoginResult result) { Debug.Log("✅ PlayFab Login Success! PlayFab ID: " + result.PlayFabId); SafePlayerPrefs.SetString("PlayFabID", result.PlayFabId); PlayerPrefs.Save(); LoadPlayerPrefsFromPlayFab(() => { googleSignInButton.gameObject.SetActive(false); guestLoginButton.gameObject.SetActive(false); bootstrapper.StartGame(); }); } private void OnPlayFabLoginFailure(PlayFabError error) { Debug.LogError("❌ PlayFab Login Failed: " + error.GenerateErrorReport()); googleSignInButton.gameObject.SetActive(true); googleSignInButton.interactable = true; guestLoginButton.gameObject.SetActive(true); guestLoginButton.interactable = true; } private void LoadPlayerPrefsFromPlayFab(Action onComplete) { PlayFabClientAPI.GetUserData(new GetUserDataRequest(), result => { if (result.Data != null) { foreach (var entry in result.Data) { string key = entry.Key; string rawValue = entry.Value.Value; if (rawValue.StartsWith("int:") && int.TryParse(rawValue.Substring(4), out int i)) SafePlayerPrefs.SetInt(key, i); else if (rawValue.StartsWith("float:") && float.TryParse(rawValue.Substring(6), out float f)) SafePlayerPrefs.SetFloat(key, f); else if (rawValue.StartsWith("string:")) SafePlayerPrefs.SetString(key, rawValue.Substring(7)); else SafePlayerPrefs.SetString(key, rawValue); PlayerPrefsKeys.RegisterKey(key); } PlayerPrefs.Save(); } onComplete?.Invoke(); }, error => { Debug.LogError("❌ Failed to load SafePlayerPrefs from PlayFab: " + error.GenerateErrorReport()); onComplete?.Invoke(); }); } private void SyncPlayerPrefsToPlayFabOnQuit() { if (PlayerPrefs.HasKey("GuestMode")) return; Dictionary allPrefs = new Dictionary(); foreach (var key in PlayerPrefsKeys.GetAllKeys()) { allPrefs[key] = PlayerPrefs.GetString(key); } var request = new UpdateUserDataRequest { Data = allPrefs }; PlayFabClientAPI.UpdateUserData(request, result => Debug.Log("✅ Synced SafePlayerPrefs to PlayFab on quit."), error => Debug.LogError("❌ Failed to sync SafePlayerPrefs: " + error.GenerateErrorReport())); } public void SignOut() { PlayerPrefs.DeleteKey("GoogleAuthCode"); PlayerPrefs.DeleteKey("PlayFabID"); PlayerPrefs.DeleteKey("GuestMode"); PlayerPrefs.Save(); GoogleSignIn.DefaultInstance.SignOut(); Debug.Log("User signed out."); } }