记住密码管理器

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);
            }
        }
    
}
相关推荐
17岁的勇气11 小时前
Unity Shader unity文档学习笔记(二十一):几种草体的实现方式(透明度剔除,GPU Instaning, 曲面细分+几何着色器实现)
笔记·学习·unity
EQ-雪梨蛋花汤11 小时前
【Unity&AS】Unity & Android Studio 联合开发快速入门:环境配置、AAR 集成与双向调用教程
unity·游戏引擎·android studio
Glunn13 小时前
UI弹出动画
ui·unity
淡海水14 小时前
【URP】Unity Shader Tags
unity·游戏引擎·渲染·shader·tag·urp
小清兔1 天前
c#基础知识
开发语言·数据库·学习·unity·c#·游戏引擎·.net
霜绛1 天前
Unity笔记(七)——四元数、延迟函数、协同程序
笔记·学习·unity·游戏引擎
★YUI★1 天前
学习游戏制作记录(保存装备物品技能树和删除存档文件)8.26
学习·游戏·unity·c#
淡海水1 天前
【URP】[平面阴影]原理与实现
平面·unity·urp·阴影