记住密码管理器
Unity记住密码管理器
- 使用方法
- 记住密码关闭器
- 使用方法
使用方法
使用简单 把代码存到缓存信息里
记住密码关闭器
using UnityEngine;
using System;
using System.Security.Cryptography;
using System.Text;/// <summary>/// 密码管理工具类/// 提供密码的保存、加载、加密、解密等功能/// 可以独立使用,不依赖特定的UI组件/// </summary>public static class PasswordManager{// PlayerPrefs键名private const string USERNAME_KEY = "RokidAR_SavedUsername";private const string PASSWORD_KEY = "RokidAR_SavedPassword";private const string REMEMBER_KEY = "RokidAR_RememberPassword";/// <summary>/// 保存登录信息/// </summary>/// <param name="username">用户名</param>/// <param name="password">密码</param>/// <param name="rememberPassword">是否记住密码</param>/// <returns>是否保存成功</returns>public static bool SaveLoginInfo(string username, string password, bool rememberPassword){try{if (rememberPassword){// 保存用户名PlayerPrefs.SetString(USERNAME_KEY, username);// 加密并保存密码string encryptedPassword = EncryptPassword(password);PlayerPrefs.SetString(PASSWORD_KEY, encryptedPassword);// 保存记住密码设置PlayerPrefs.SetInt(REMEMBER_KEY, 1);}else{// 如果不记住密码,清除保存的信息ClearSavedLoginInfo();return true;}// 保存到磁盘PlayerPrefs.Save();Debug.Log("[PasswordManager] 登录信息已保存");return true;}catch (Exception e){Debug.LogError($"[PasswordManager] 保存登录信息失败: {e.Message}");return false;}}/// <summary>/// 加载保存的登录信息/// </summary>/// <param name="username">输出:保存的用户名</param>/// <param name="password">输出:保存的密码</param>/// <param name="rememberPassword">输出:是否启用了记住密码</param>/// <returns>是否有保存的登录信息</returns>public static bool LoadSavedLoginInfo(out string username, out string password, out bool rememberPassword){username = "";password = "";rememberPassword = false;try{// 检查是否启用了记住密码rememberPassword = PlayerPrefs.GetInt(REMEMBER_KEY, 0) == 1;if (rememberPassword){// 加载保存的用户名username = PlayerPrefs.GetString(USERNAME_KEY, "");// 加载保存的密码(解密)string savedPassword = PlayerPrefs.GetString(PASSWORD_KEY, "");if (!string.IsNullOrEmpty(savedPassword)){password = DecryptPassword(savedPassword);}bool hasValidData = !string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password);if (hasValidData){Debug.Log("[PasswordManager] 已加载保存的登录信息");}return hasValidData;}}catch (Exception e){Debug.LogError($"[PasswordManager] 加载保存的登录信息失败: {e.Message}");}return false;}/// <summary>/// 清除保存的登录信息/// </summary>/// <returns>是否清除成功</returns>public static bool ClearSavedLoginInfo(){try{PlayerPrefs.DeleteKey(USERNAME_KEY);PlayerPrefs.DeleteKey(PASSWORD_KEY);PlayerPrefs.SetInt(REMEMBER_KEY, 0);PlayerPrefs.Save();Debug.Log("[PasswordManager] 已清除保存的登录信息");return true;}catch (Exception e){Debug.LogError($"[PasswordManager] 清除登录信息失败: {e.Message}");return false;}}/// <summary>/// 检查是否有保存的登录信息/// </summary>/// <returns>是否有保存的登录信息</returns>public static bool HasSavedLoginInfo(){try{bool rememberPassword = PlayerPrefs.GetInt(REMEMBER_KEY, 0) == 1;if (!rememberPassword) return false;string username = PlayerPrefs.GetString(USERNAME_KEY, "");string password = PlayerPrefs.GetString(PASSWORD_KEY, "");return !string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password);}catch (Exception e){Debug.LogError($"[PasswordManager] 检查保存的登录信息失败: {e.Message}");return false;}}/// <summary>/// 获取记住密码设置状态/// </summary>/// <returns>是否启用了记住密码</returns>public static bool GetRememberPasswordSetting(){try{return PlayerPrefs.GetInt(REMEMBER_KEY, 0) == 1;}catch (Exception e){Debug.LogError($"[PasswordManager] 获取记住密码设置失败: {e.Message}");return false;}}/// <summary>/// 设置记住密码选项/// </summary>/// <param name="rememberPassword">是否记住密码</param>/// <returns>是否设置成功</returns>public static bool SetRememberPasswordSetting(bool rememberPassword){try{PlayerPrefs.SetInt(REMEMBER_KEY, rememberPassword ? 1 : 0);PlayerPrefs.Save();Debug.Log($"[PasswordManager] 记住密码设置已保存: {rememberPassword}");return true;}catch (Exception e){Debug.LogError($"[PasswordManager] 设置记住密码失败: {e.Message}");return false;}}/// <summary>/// 加密密码/// </summary>/// <param name="password">原始密码</param>/// <returns>加密后的密码</returns>public static string EncryptPassword(string password){try{if (string.IsNullOrEmpty(password))return "";// 使用简单的Base64编码(实际项目中建议使用更强的加密)byte[] bytes = Encoding.UTF8.GetBytes(password);return Convert.ToBase64String(bytes);}catch (Exception e){Debug.LogError($"[PasswordManager] 密码加密失败: {e.Message}");return password;}}/// <summary>/// 解密密码/// </summary>/// <param name="encryptedPassword">加密后的密码</param>/// <returns>原始密码</returns>public static string DecryptPassword(string encryptedPassword){try{if (string.IsNullOrEmpty(encryptedPassword))return "";// 使用简单的Base64解码byte[] bytes = Convert.FromBase64String(encryptedPassword);return Encoding.UTF8.GetString(bytes);}catch (Exception e){Debug.LogError($"[PasswordManager] 密码解密失败: {e.Message}");return "";}}/// <summary>/// 验证保存的登录信息是否有效/// </summary>/// <returns>登录信息是否有效</returns>public static bool ValidateSavedLoginInfo(){try{if (!HasSavedLoginInfo())return false;string username, password;bool rememberPassword;bool hasData = LoadSavedLoginInfo(out username, out password, out rememberPassword);if (!hasData || !rememberPassword)return false;// 验证用户名和密码不为空return !string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password);}catch (Exception e){Debug.LogError($"[PasswordManager] 验证保存的登录信息失败: {e.Message}");return false;}}/// <summary>/// 获取保存的用户名(不验证密码)/// </summary>/// <returns>保存的用户名,如果没有则返回空字符串</returns>public static string GetSavedUsername(){try{if (GetRememberPasswordSetting()){return PlayerPrefs.GetString(USERNAME_KEY, "");}return "";}catch (Exception e){Debug.LogError($"[PasswordManager] 获取保存的用户名失败: {e.Message}");return "";}}/// <summary>/// 重置所有密码相关的设置/// </summary>/// <returns>是否重置成功</returns>public static bool ResetAllPasswordSettings(){try{PlayerPrefs.DeleteKey(USERNAME_KEY);PlayerPrefs.DeleteKey(PASSWORD_KEY);PlayerPrefs.DeleteKey(REMEMBER_KEY);PlayerPrefs.Save();Debug.Log("[PasswordManager] 所有密码设置已重置");return true;}catch (Exception e){Debug.LogError($"[PasswordManager] 重置密码设置失败: {e.Message}");return false;}}}
使用方法
using UnityEngine;
using UnityEngine.UI;
using TMPro;/// <summary>/// PasswordManager 使用示例/// 展示如何在其他脚本中使用密码管理功能/// </summary>public class PasswordManagerExample : MonoBehaviour{[Header("UI组件")][SerializeField] private TMP_InputField usernameInputField;[SerializeField] private TMP_InputField passwordInputField;[SerializeField] private Toggle rememberPasswordToggle;[SerializeField] private Button loginButton;[SerializeField] private Button clearButton;[SerializeField] private TextMeshProUGUI statusText;private void Start(){SetupUI();LoadSavedLoginInfo();}private void SetupUI(){// 设置按钮事件if (loginButton != null)loginButton.onClick.AddListener(OnLoginButtonClicked);if (clearButton != null)clearButton.onClick.AddListener(OnClearButtonClicked);// 设置Toggle事件if (rememberPasswordToggle != null)rememberPasswordToggle.onValueChanged.AddListener(OnRememberPasswordChanged);}/// <summary>/// 加载保存的登录信息/// </summary>private void LoadSavedLoginInfo(){string username, password;bool rememberPassword;// 使用PasswordManager加载保存的登录信息if (PasswordManager.LoadSavedLoginInfo(out username, out password, out rememberPassword)){// 有保存的登录信息,填充到输入框if (usernameInputField != null)usernameInputField.text = username;if (passwordInputField != null)passwordInputField.text = password;if (rememberPasswordToggle != null)rememberPasswordToggle.isOn = rememberPassword;UpdateStatus("已加载保存的登录信息", Color.green);}else{// 没有保存的登录信息UpdateStatus("请输入登录信息", Color.black);}}/// <summary>/// 登录按钮点击/// </summary>private void OnLoginButtonClicked(){string username = usernameInputField?.text?.Trim();string password = passwordInputField?.text?.Trim();bool rememberPassword = rememberPasswordToggle?.isOn ?? false;// 验证输入if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password)){UpdateStatus("请输入用户名和密码", Color.red);return;}// 模拟登录过程UpdateStatus("正在登录...", Color.blue);// 这里应该是实际的登录逻辑// 登录成功后保存信息if (PasswordManager.SaveLoginInfo(username, password, rememberPassword)){UpdateStatus("登录信息已保存", Color.green);}else{UpdateStatus("保存登录信息失败", Color.red);}}/// <summary>/// 清除按钮点击/// </summary>private void OnClearButtonClicked(){if (PasswordManager.ClearSavedLoginInfo()){// 清除输入框if (usernameInputField != null)usernameInputField.text = "";if (passwordInputField != null)passwordInputField.text = "";if (rememberPasswordToggle != null)rememberPasswordToggle.isOn = false;UpdateStatus("已清除保存的登录信息", Color.blue);}else{UpdateStatus("清除登录信息失败", Color.red);}}/// <summary>/// 记住密码Toggle状态改变/// </summary>private void OnRememberPasswordChanged(bool isOn){// 使用PasswordManager保存设置if (PasswordManager.SetRememberPasswordSetting(isOn)){UpdateStatus($"记住密码设置已保存: {isOn}", Color.green);}else{UpdateStatus("保存设置失败", Color.red);}}/// <summary>/// 更新状态文本/// </summary>private void UpdateStatus(string message, Color color){if (statusText != null){statusText.text = message;statusText.color = color;}Debug.Log($"[PasswordManagerExample] {message}");}/// <summary>/// 检查保存的登录信息状态/// </summary>[ContextMenu("检查保存的登录信息")]public void CheckSavedLoginInfo(){Debug.Log("=== 保存的登录信息状态 ===");Debug.Log($"是否有保存的登录信息: {PasswordManager.HasSavedLoginInfo()}");Debug.Log($"记住密码设置: {PasswordManager.GetRememberPasswordSetting()}");Debug.Log($"登录信息是否有效: {PasswordManager.ValidateSavedLoginInfo()}");string username = PasswordManager.GetSavedUsername();Debug.Log($"保存的用户名: {(string.IsNullOrEmpty(username) ? "无" : username)}");}/// <summary>/// 重置所有密码设置/// </summary>[ContextMenu("重置所有密码设置")]public void ResetAllPasswordSettings(){if (PasswordManager.ResetAllPasswordSettings()){UpdateStatus("所有密码设置已重置", Color.blue);}else{UpdateStatus("重置密码设置失败", Color.red);}}}