using UnityEngine; using UnityEngine.SceneManagement; public class LoginManager : MonoBehaviour { public static LoginManager Instance { get; private set; } [Header("场景配置")] public string menuSceneName = "MenuScene"; public string loginSceneName = "LoginScene"; [Header("用户数据")] public UserData currentUser; public bool isLoggedIn { get; private set; } private NetworkManager networkManager; private const string PLAYER_PREFS_TOKEN = "auth_token"; private const string PLAYER_PREFS_USER_ID = "user_id"; private const string PLAYER_PREFS_USERNAME = "username"; private const string PLAYER_PREFS_EMAIL = "email"; private const string PLAYER_PREFS_STUDY_ABILITY = "study_ability"; private const string PLAYER_PREFS_CURRENT_LEVEL = "current_level"; private const string PLAYER_PREFS_EXPERIENCE = "experience"; private void Awake() { if (Instance == null) { Instance = this; DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); } } private void Start() { networkManager = NetworkManager.Instance; if (networkManager == null) { GameObject networkObj = new GameObject("NetworkManager"); networkManager = networkObj.AddComponent(); } CheckAutoLogin(); } private void CheckAutoLogin() { string savedToken = PlayerPrefs.GetString(PLAYER_PREFS_TOKEN, ""); if (!string.IsNullOrEmpty(savedToken)) { Debug.Log("检测到保存的token,尝试自动登录..."); networkManager.SetAuthToken(savedToken); int userId = PlayerPrefs.GetInt(PLAYER_PREFS_USER_ID, -1); if (userId != -1) { currentUser = new UserData { userId = userId, username = PlayerPrefs.GetString(PLAYER_PREFS_USERNAME, ""), email = PlayerPrefs.GetString(PLAYER_PREFS_EMAIL, ""), studyAbility = PlayerPrefs.GetInt(PLAYER_PREFS_STUDY_ABILITY, 1), currentLevel = PlayerPrefs.GetInt(PLAYER_PREFS_CURRENT_LEVEL, 1), experience = PlayerPrefs.GetInt(PLAYER_PREFS_EXPERIENCE, 0), token = savedToken }; isLoggedIn = true; Debug.Log($"自动登录成功!用户: {currentUser.username}"); RefreshUserProfileAndEnterGame(); } } } private void RefreshUserProfileAndEnterGame() { if (networkManager == null) { EnterGame(); return; } networkManager.GetUserProfile( response => { if (response != null && response.success && response.data != null) { response.data.token = currentUser != null ? currentUser.token : ""; currentUser = response.data; SaveUserData(currentUser); if (AchievementManager.Instance != null) { AchievementManager.Instance.LoadAchievements(); } } EnterGame(); }, error => { Debug.LogWarning($"自动登录刷新用户资料失败: {error}"); if (error.Contains("401") || error.Contains("Unauthorized")) { ClearUserData(); networkManager.ClearAuthToken(); currentUser = null; isLoggedIn = false; SceneManager.LoadScene(loginSceneName); return; } EnterGame(); } ); } public void Login(string username, string password, System.Action onSuccess, System.Action onError) { LoginRequest loginRequest = new LoginRequest { username = username, password = password }; StartCoroutine(networkManager.PostRequest("/auth/login", loginRequest, response => { if (response.success) { currentUser = response.data; isLoggedIn = true; networkManager.SetAuthToken(currentUser.token); SaveUserData(currentUser); Debug.Log($"登录成功!用户: {currentUser.username}, 学习能力: {currentUser.studyAbility}"); if (AchievementManager.Instance != null) { AchievementManager.Instance.LoadAchievements(); } onSuccess?.Invoke(currentUser); EnterGame(); } else { Debug.LogError($"登录失败: {response.message}"); onError?.Invoke(response.message); } }, error => { Debug.LogError($"登录请求失败: {error}"); onError?.Invoke(error); } )); } public void Register(string username, string password, string email, System.Action onSuccess, System.Action onError) { RegisterRequest registerRequest = new RegisterRequest { username = username, password = password, email = email }; StartCoroutine(networkManager.PostRequest("/auth/register", registerRequest, response => { if (response.success) { Debug.Log($"注册成功!用户: {response.data.username}"); onSuccess?.Invoke(response.data); } else { Debug.LogError($"注册失败: {response.message}"); onError?.Invoke(response.message); } }, error => { Debug.LogError($"注册请求失败: {error}"); onError?.Invoke(error); } )); } public void GuestLogin(System.Action onSuccess, System.Action onError) { Debug.Log("启动游客模式..."); currentUser = new UserData { userId = -1, username = "Guest", email = "guest@local.com", studyAbility = 1, currentLevel = 1, experience = 0, token = "" }; isLoggedIn = true; Debug.Log($"游客模式启动成功!默认学习能力: {currentUser.studyAbility}"); if (AchievementManager.Instance != null) { AchievementManager.Instance.LoadAchievements(); } onSuccess?.Invoke(currentUser); EnterGame(); } public void Logout() { currentUser = null; isLoggedIn = false; networkManager.ClearAuthToken(); ClearUserData(); Debug.Log("已退出登录"); SceneManager.LoadScene(loginSceneName); } public void UpdateUserData(UserData newData) { currentUser = newData; SaveUserData(currentUser); } private void SaveUserData(UserData user) { if (user.userId == -1) { Debug.Log("游客模式,不保存用户数据"); return; } PlayerPrefs.SetString(PLAYER_PREFS_TOKEN, user.token); PlayerPrefs.SetInt(PLAYER_PREFS_USER_ID, user.userId); PlayerPrefs.SetString(PLAYER_PREFS_USERNAME, user.username); PlayerPrefs.SetString(PLAYER_PREFS_EMAIL, user.email ?? ""); PlayerPrefs.SetInt(PLAYER_PREFS_STUDY_ABILITY, Mathf.Max(1, user.studyAbility)); PlayerPrefs.SetInt(PLAYER_PREFS_CURRENT_LEVEL, Mathf.Max(1, user.currentLevel)); PlayerPrefs.SetInt(PLAYER_PREFS_EXPERIENCE, Mathf.Max(0, user.experience)); PlayerPrefs.Save(); Debug.Log("用户数据已保存"); } private void ClearUserData() { PlayerPrefs.DeleteKey(PLAYER_PREFS_TOKEN); PlayerPrefs.DeleteKey(PLAYER_PREFS_USER_ID); PlayerPrefs.DeleteKey(PLAYER_PREFS_USERNAME); PlayerPrefs.DeleteKey(PLAYER_PREFS_EMAIL); PlayerPrefs.DeleteKey(PLAYER_PREFS_STUDY_ABILITY); PlayerPrefs.DeleteKey(PLAYER_PREFS_CURRENT_LEVEL); PlayerPrefs.DeleteKey(PLAYER_PREFS_EXPERIENCE); PlayerPrefs.Save(); Debug.Log("用户数据已清除"); } private void EnterGame() { Debug.Log("进入菜单场景..."); SceneManager.LoadScene(menuSceneName); } public UserData GetCurrentUser() { return currentUser; } public int GetStudyAbility() { return currentUser == null ? 1 : Mathf.Max(1, currentUser.studyAbility); } public void SetStudyAbility(int ability) { if (currentUser != null) { currentUser.studyAbility = ability; SaveUserData(currentUser); } } public void SetProgress(int studyAbility, int currentLevel, int experience) { if (currentUser != null) { currentUser.studyAbility = Mathf.Max(1, studyAbility); currentUser.currentLevel = Mathf.Max(1, currentLevel); currentUser.experience = Mathf.Max(0, experience); SaveUserData(currentUser); } } public bool IsGuest() { return currentUser != null && currentUser.userId == -1; } }