记住密码管理器

Unity记住密码管理器

使用方法

使用简单 把代码存到缓存信息里

记住密码关闭器

csharp 复制代码
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;
            }
        }
    
}

使用方法

csharp 复制代码
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);
            }
        }
    
}
相关推荐
天人合一peng2 小时前
unity 生成标记根据背景色标记变色
unity·游戏引擎
天人合一peng5 小时前
unity 生成标记根据背景色变色为明显的颜色
unity·游戏引擎
魔士于安6 小时前
Unity 超市总动员 超市收银台 超市货架 超市购物手推车 超市常见商品
游戏·unity·游戏引擎·贴图·模型
CandyU26 小时前
Unity —— 数据持久化
unity·游戏引擎
zh路西法6 小时前
【Unity实现Oneshot胶卷显形】游戏窗口化与Win32API的使用
游戏·unity·游戏引擎
凡情11 小时前
android隐私合规检测
android·unity
小贺儿开发11 小时前
Unity3D 本地 Stable Diffusion 文生图效果演示
人工智能·unity·stable diffusion·文生图·ai绘画·本地化
mxwin1 天前
Unity Shader 半透明物体为什么不能写入深度缓冲?
unity·游戏引擎·shader
晚枫歌F1 天前
三层时间轮的实现
网络·unity·游戏引擎
咸鱼永不翻身1 天前
Lua脚本事件检查工具
unity·lua·工具