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);
}
}
}