hexiaojie 1 долоо хоног өмнө
parent
commit
bad0c47495
28 өөрчлөгдсөн 1044 нэмэгдсэн , 28 устгасан
  1. 3 0
      GameClient/Assets/Game/HotUpdate/AccountData.meta
  2. 27 0
      GameClient/Assets/Game/HotUpdate/AccountData/AccountData.cs
  3. 3 0
      GameClient/Assets/Game/HotUpdate/AccountData/AccountData.cs.meta
  4. 219 0
      GameClient/Assets/Game/HotUpdate/AccountData/AccountManager.cs
  5. 3 0
      GameClient/Assets/Game/HotUpdate/AccountData/AccountManager.cs.meta
  6. 70 0
      GameClient/Assets/Game/HotUpdate/AccountData/AesEncryption.cs
  7. 3 0
      GameClient/Assets/Game/HotUpdate/AccountData/AesEncryption.cs.meta
  8. 15 11
      GameClient/Assets/Game/HotUpdate/ETCodes/Hotfix/App/Login/LoginHelper.cs
  9. 89 0
      GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_BangDingPhoneUI.cs
  10. 11 0
      GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_BangDingPhoneUI.cs.meta
  11. 74 0
      GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_ButAccountItem.cs
  12. 11 0
      GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_ButAccountItem.cs.meta
  13. 74 0
      GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_ButAccountItem2.cs
  14. 11 0
      GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_ButAccountItem2.cs.meta
  15. 80 0
      GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_ComAccountInputBox.cs
  16. 11 0
      GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_ComAccountInputBox.cs.meta
  17. 7 6
      GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_LoginInputUI.cs
  18. 12 3
      GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_RegisterUIBackup.cs
  19. 92 0
      GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_ZhaoHuiAccountUI.cs
  20. 11 0
      GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_ZhaoHuiAccountUI.cs.meta
  21. 89 0
      GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_ZhaoHuiPasswordUI.cs
  22. 11 0
      GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_ZhaoHuiPasswordUI.cs.meta
  23. 1 1
      GameClient/Assets/Game/HotUpdate/GameConfig.cs
  24. 114 7
      GameClient/Assets/Game/HotUpdate/Views/Login/LoginInputView.cs
  25. BIN
      GameClient/Assets/ResIn/UI/Login/Login_atlas0!a.png
  26. BIN
      GameClient/Assets/ResIn/UI/Login/Login_atlas0.png
  27. BIN
      GameClient/Assets/ResIn/UI/Login/Login_fui.bytes
  28. 3 0
      GameClient/GameClient.sln.DotSettings.user

+ 3 - 0
GameClient/Assets/Game/HotUpdate/AccountData.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 3ee4f97ed21a4e22b6db88b8fc602fba
+timeCreated: 1760253919

+ 27 - 0
GameClient/Assets/Game/HotUpdate/AccountData/AccountData.cs

@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+
+namespace GFGGame
+{
+    [System.Serializable]
+    public class AccountData
+    {
+        public string username;
+        public string encryptedPassword; // 存储的是加密后的字符串
+        public string timestamp; // 用于记录时间,决定“最近”顺序
+
+        public AccountData(string user, string encryptedPwd)
+        {
+            username = user;
+            encryptedPassword = encryptedPwd;
+            timestamp = DateTime.UtcNow.ToString("yyyyMMddHHmmss"); // 使用UTC时间避免时区问题
+        }
+    }
+
+    // 可序列化的账号列表包装器,用于JSON处理
+    [System.Serializable]
+    public class AccountDataList
+    {
+        public List<AccountData> accounts = new List<AccountData>();
+    }
+}

+ 3 - 0
GameClient/Assets/Game/HotUpdate/AccountData/AccountData.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 85309bf41e554148acc90779f3114d8d
+timeCreated: 1760251742

+ 219 - 0
GameClient/Assets/Game/HotUpdate/AccountData/AccountManager.cs

@@ -0,0 +1,219 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+
+namespace GFGGame
+{
+    public sealed class AccountManager
+    {
+        private const string SAVE_KEY = "RecentAccountsData";
+        private const int MAX_ACCOUNT_COUNT = 20;
+        private List<AccountData> _cachedAccounts = new List<AccountData>();
+
+        // 单例实例
+        private static readonly Lazy<AccountManager> _instance = new Lazy<AccountManager>(() => new AccountManager());
+        public static AccountManager Instance => _instance.Value;
+
+        // 私有构造函数,防止外部实例化
+        private AccountManager()
+        {
+            LoadAccounts();
+        }
+
+        /// <summary>
+        /// 登录成功时调用此方法
+        /// </summary>
+        /// <param name="username">用户名</param>
+        /// <param name="plainPassword">明文密码</param>
+        public void SaveAccount(string username, string plainPassword)
+        {
+            // 1. 加密密码
+            string encryptedPwd = null;
+            if (plainPassword != null)
+            {
+                encryptedPwd = AesEncryption.Encrypt(plainPassword);
+            }
+
+            // 2. 检查列表中是否已有该账号
+            AccountData existingAccount = _cachedAccounts.FirstOrDefault(a => a.username == username);
+            if (existingAccount != null)
+            {
+                // 如果存在,更新密码和时间戳,并移到列表最前面(表示最新)
+                existingAccount.encryptedPassword = encryptedPwd;
+                existingAccount.timestamp = DateTime.UtcNow.ToString("yyyyMMddHHmmss");
+                _cachedAccounts.Remove(existingAccount);
+                _cachedAccounts.Insert(0, existingAccount);
+            }
+            else
+            {
+                // 如果不存在,创建新账号数据并添加到最前面
+                AccountData newAccount = new AccountData(username, encryptedPwd);
+                _cachedAccounts.Insert(0, newAccount);
+            }
+
+            // 3. 如果超出最大数量,移除最旧的一个(列表最后一个)
+            if (_cachedAccounts.Count > MAX_ACCOUNT_COUNT)
+            {
+                _cachedAccounts.RemoveAt(_cachedAccounts.Count - 1);
+            }
+
+            // 4. 立即保存
+            SaveAccounts();
+        }
+
+        /// <summary>
+        /// 获取存储的所有账号信息(密码已解密)
+        /// </summary>
+        public List<AccountPasswordModel> GetAccounts()
+        {
+            List<AccountPasswordModel> result = new List<AccountPasswordModel>();
+            foreach (var acc in _cachedAccounts)
+            {
+                string decryptedPwd = null;
+                if (acc.encryptedPassword != null)
+                {
+                    decryptedPwd = AesEncryption.Decrypt(acc.encryptedPassword);
+                }
+
+                AccountPasswordModel accountPasswordModel = new AccountPasswordModel()
+                {
+                    Account = acc.username,
+                    Password = decryptedPwd
+                };
+                result.Add(accountPasswordModel);
+            }
+
+            return result;
+        }
+
+        /// <summary>
+        /// 删除指定的账号缓存
+        /// </summary>
+        /// <param name="username">要删除的用户名</param>
+        /// <returns>是否成功删除</returns>
+        public bool DeleteAccount(string username)
+        {
+            // 查找要删除的账号
+            AccountData accountToDelete = _cachedAccounts.FirstOrDefault(a => a.username == username);
+
+            if (accountToDelete != null)
+            {
+                // 从缓存列表中移除
+                _cachedAccounts.Remove(accountToDelete);
+
+                // 立即保存
+                SaveAccounts();
+
+                Debug.Log($"已成功删除账号: {username}");
+                return true;
+            }
+            else
+            {
+                Debug.LogWarning($"未找到账号: {username},删除失败");
+                return false;
+            }
+        }
+
+        /// <summary>
+        /// 批量删除多个账号缓存
+        /// </summary>
+        /// <param name="usernames">要删除的用户名列表</param>
+        /// <returns>成功删除的数量</returns>
+        public int DeleteAccounts(List<string> usernames)
+        {
+            int deletedCount = 0;
+
+            foreach (string username in usernames)
+            {
+                if (DeleteAccount(username))
+                {
+                    deletedCount++;
+                }
+            }
+
+            Debug.Log($"成功删除了 {deletedCount} 个账号");
+            return deletedCount;
+        }
+
+        /// <summary>
+        /// 清除所有账号记录
+        /// </summary>
+        public void ClearAllAccounts()
+        {
+            _cachedAccounts.Clear();
+            PlayerPrefs.DeleteKey(SAVE_KEY);
+            PlayerPrefs.Save();
+            Debug.Log("已清除所有账号记录");
+        }
+
+        /// <summary>
+        /// 检查指定账号是否存在
+        /// </summary>
+        public bool HasAccount(string username)
+        {
+            return _cachedAccounts.Any(a => a.username == username);
+        }
+
+        /// <summary>
+        /// 获取缓存的账号数量
+        /// </summary>
+        public int GetAccountCount()
+        {
+            return _cachedAccounts.Count;
+        }
+
+        // 内部方法:从PlayerPrefs加载账号列表
+        private void LoadAccounts()
+        {
+            _cachedAccounts.Clear();
+            string encryptedJson = PlayerPrefs.GetString(SAVE_KEY, null);
+
+            if (!string.IsNullOrEmpty(encryptedJson))
+            {
+                string decryptedJson = AesEncryption.Decrypt(encryptedJson);
+                if (!string.IsNullOrEmpty(decryptedJson))
+                {
+                    try
+                    {
+                        // 反序列化JSON字符串到对象
+                        AccountDataList loadedData = JsonUtility.FromJson<AccountDataList>(decryptedJson);
+                        if (loadedData != null && loadedData.accounts != null)
+                        {
+                            // 按时间戳降序排序,最新的在最前面
+                            _cachedAccounts = loadedData.accounts
+                                .OrderByDescending(a => a.timestamp)
+                                .ToList();
+                        }
+                    }
+                    catch (Exception e)
+                    {
+                        Debug.LogError("Failed to parse account data: " + e.Message);
+                    }
+                }
+            }
+        }
+
+        // 内部方法:保存账号列表到PlayerPrefs
+        private void SaveAccounts()
+        {
+            // 包装列表
+            AccountDataList dataToSave = new AccountDataList();
+            dataToSave.accounts = _cachedAccounts;
+
+            // 序列化为JSON
+            string json = JsonUtility.ToJson(dataToSave);
+            // 加密JSON字符串
+            string encryptedJson = AesEncryption.Encrypt(json);
+            // 保存到PlayerPrefs
+            PlayerPrefs.SetString(SAVE_KEY, encryptedJson);
+            PlayerPrefs.Save(); // 确保立即写入磁盘
+        }
+    }
+
+    public class AccountPasswordModel
+    {
+        public string Account { get; set; }
+        public string Password { get; set; }
+    }
+}

+ 3 - 0
GameClient/Assets/Game/HotUpdate/AccountData/AccountManager.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: f59ec2b6c1a04b3f987b18314da634ef
+timeCreated: 1760253941

+ 70 - 0
GameClient/Assets/Game/HotUpdate/AccountData/AesEncryption.cs

@@ -0,0 +1,70 @@
+using System;
+using System.IO;
+using System.Security.Cryptography;
+using System.Text;
+
+namespace GFGGame
+{
+    public static class AesEncryption
+    {
+        // !!!重要警告!!!
+        // 硬编码在客户端的密钥并不安全,容易被反编译获取。
+        // 这只能防止简单的窥探,无法抵御专业黑客。
+        // 对于极度敏感的信息,请考虑其他方案(如服务端令牌验证)。
+        private static readonly string Key = "45418100000000000000000000000000"; // 必须恰好是32字节
+        private static readonly string IV = "1234567890123456"; // 必须恰好是16字节
+
+        public static string Encrypt(string plainText)
+        {
+            using (Aes aesAlg = Aes.Create())
+            {
+                aesAlg.Key = Encoding.UTF8.GetBytes(Key);
+                aesAlg.IV = Encoding.UTF8.GetBytes(IV);
+
+                ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
+                using (MemoryStream msEncrypt = new MemoryStream())
+                {
+                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
+                    {
+                        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
+                        {
+                            swEncrypt.Write(plainText);
+                        }
+                    }
+
+                    return Convert.ToBase64String(msEncrypt.ToArray());
+                }
+            }
+        }
+
+        public static string Decrypt(string cipherText)
+        {
+            try
+            {
+                byte[] buffer = Convert.FromBase64String(cipherText);
+                using (Aes aesAlg = Aes.Create())
+                {
+                    aesAlg.Key = Encoding.UTF8.GetBytes(Key);
+                    aesAlg.IV = Encoding.UTF8.GetBytes(IV);
+
+                    ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
+                    using (MemoryStream msDecrypt = new MemoryStream(buffer))
+                    {
+                        using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
+                        {
+                            using (StreamReader srDecrypt = new StreamReader(csDecrypt))
+                            {
+                                return srDecrypt.ReadToEnd();
+                            }
+                        }
+                    }
+                }
+            }
+            catch
+            {
+                // 解密失败(可能数据被篡改或密钥错误)
+                return null;
+            }
+        }
+    }
+}

+ 3 - 0
GameClient/Assets/Game/HotUpdate/AccountData/AesEncryption.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: fe3b0326cee544169590c724b384b766
+timeCreated: 1760254036

+ 15 - 11
GameClient/Assets/Game/HotUpdate/ETCodes/Hotfix/App/Login/LoginHelper.cs

@@ -19,7 +19,7 @@ namespace ET
                     Account = account,
                     Version = GameConst.SERVER_VERSION,
                     PlatformId = LauncherConfig.platformId,
-                    ChannelId = LauncherConfig.ChannelId,
+                    ChannelId = 22,
                     CancelDelete = cancelDelete,
                     Token = QDDouYouManager.Instance.token
                 });
@@ -37,7 +37,7 @@ namespace ET
                 return (a2CLoginAccount.Error, a2CLoginAccount.DeleteTime);
             }
 
-            OnLoginSuccess(zoneScene, a2CLoginAccount, accountSession, account);
+            OnLoginSuccess(zoneScene, a2CLoginAccount, accountSession, account, null);
 
             return (ErrorCode.ERR_Success, 0);
         }
@@ -47,15 +47,16 @@ namespace ET
         {
             A2C_LoginAccount a2CLoginAccount = null;
             Session accountSession = null;
+            var passwordMD5 = password;
+            //密码禁止明文传输
+            if (!isMD5)
+            {
+                passwordMD5 = MD5Helper.stringMD5(password);
+            }
+
             try
             {
                 accountSession = zoneScene.GetComponent<NetKcpComponent>().Create(NetworkHelper.ToIPEndPoint(address));
-                var passwordMD5 = password;
-                //密码禁止明文传输
-                if (!isMD5)
-                {
-                    passwordMD5 = MD5Helper.stringMD5(password);
-                }
 
                 a2CLoginAccount = (A2C_LoginAccount)await accountSession.Call(new C2A_LoginAccount()
                 {
@@ -80,13 +81,13 @@ namespace ET
                 return (a2CLoginAccount.Error, a2CLoginAccount.DeleteTime);
             }
 
-            OnLoginSuccess(zoneScene, a2CLoginAccount, accountSession, account);
+            OnLoginSuccess(zoneScene, a2CLoginAccount, accountSession, account, passwordMD5);
 
             return (ErrorCode.ERR_Success, 0);
         }
 
         public static void OnLoginSuccess(Scene zoneScene, A2C_LoginAccount a2CLoginAccount, Session accountSession,
-            string account)
+            string account, string passwordMD5)
         {
             zoneScene.GetComponent<SessionComponent>().AccountSession = accountSession;
             accountSession.AddComponent<PingComponent>();
@@ -97,9 +98,12 @@ namespace ET
             accountInfoComponent.AccountId = a2CLoginAccount.AccountId;
             accountInfoComponent.Account = account;
             accountInfoComponent.Age = a2CLoginAccount.Age;
+            if (account != null)
+            {
+                AccountManager.Instance.SaveAccount(account, passwordMD5);
+            }
         }
 
-
         public static async ETTask<int> Register(Scene zoneScene, string address, string account, string password,
             string name, string identityNum, string code)
         {

+ 89 - 0
GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_BangDingPhoneUI.cs

@@ -0,0 +1,89 @@
+/** This is an automatically generated class by FairyGUI. Please do not modify it. **/
+
+using FairyGUI;
+
+namespace UI.Login
+{
+    public partial class UI_BangDingPhoneUI
+    {
+        public GComponent target;
+        public GComponent m_bg;
+        public GButton m_btnback;
+        public GButton m_btnSendCode;
+        public GTextInput m_txtPhone;
+        public GTextInput m_txtCode;
+        public GTextField m_txtAccountShow;
+        public GButton m_btnSubmit;
+        public const string URL = "ui://myoktu7pk5ej6a";
+        public const string PACKAGE_NAME = "Login";
+        public const string RES_NAME = "BangDingPhoneUI";
+        private static UI_BangDingPhoneUI _proxy;
+
+        public static UI_BangDingPhoneUI Create(GObject gObject = null)
+        {
+            var ui = new UI_BangDingPhoneUI();
+            if(gObject == null)
+            	ui.target =  (GComponent)UIPackage.CreateObject(PACKAGE_NAME, RES_NAME);
+            else
+            	ui.target =  (GComponent)gObject;
+            ui.Init(ui.target);
+            return ui;
+        }
+
+        public static UI_BangDingPhoneUI Proxy(GObject gObject = null)
+        {
+            if(_proxy == null)
+            {
+                _proxy = new UI_BangDingPhoneUI();
+            }
+            var ui = _proxy;
+            if(gObject == null)
+            	ui.target =  (GComponent)UIPackage.CreateObject(PACKAGE_NAME, RES_NAME);
+            else
+            	ui.target =  (GComponent)gObject;
+            ui.Init(ui.target);
+            return ui;
+        }
+
+        public static void ProxyEnd()
+        {
+            if (_proxy != null)
+            {
+                _proxy.Dispose();
+            }
+        }
+
+        public static void ClearProxy()
+        {
+            ProxyEnd();
+            _proxy = null;
+        }
+
+        private void Init(GComponent comp)
+        {
+            m_bg = (GComponent)comp.GetChild("bg");
+            m_btnback = (GButton)comp.GetChild("btnback");
+            m_btnSendCode = (GButton)comp.GetChild("btnSendCode");
+            m_txtPhone = (GTextInput)comp.GetChild("txtPhone");
+            m_txtCode = (GTextInput)comp.GetChild("txtCode");
+            m_txtAccountShow = (GTextField)comp.GetChild("txtAccountShow");
+            m_btnSubmit = (GButton)comp.GetChild("btnSubmit");
+        }
+        public void Dispose(bool disposeTarget = false)
+        {
+            m_bg = null;
+            m_btnback = null;
+            m_btnSendCode = null;
+            m_txtPhone = null;
+            m_txtCode = null;
+            m_txtAccountShow = null;
+            m_btnSubmit = null;
+            if(disposeTarget && target != null)
+            {
+                target.RemoveFromParent();
+                target.Dispose();
+            }
+            target = null;
+        }
+    }
+}

+ 11 - 0
GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_BangDingPhoneUI.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d30893a593fa75542b5948acca1e1dd1
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 74 - 0
GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_ButAccountItem.cs

@@ -0,0 +1,74 @@
+/** This is an automatically generated class by FairyGUI. Please do not modify it. **/
+
+using FairyGUI;
+
+namespace UI.Login
+{
+    public partial class UI_ButAccountItem
+    {
+        public GButton target;
+        public GTextField m_txtAccountItem;
+        public GButton m_btnDel;
+        public const string URL = "ui://myoktu7pk5ej64";
+        public const string PACKAGE_NAME = "Login";
+        public const string RES_NAME = "ButAccountItem";
+        private static UI_ButAccountItem _proxy;
+
+        public static UI_ButAccountItem Create(GObject gObject = null)
+        {
+            var ui = new UI_ButAccountItem();
+            if(gObject == null)
+            	ui.target =  (GButton)UIPackage.CreateObject(PACKAGE_NAME, RES_NAME);
+            else
+            	ui.target =  (GButton)gObject;
+            ui.Init(ui.target);
+            return ui;
+        }
+
+        public static UI_ButAccountItem Proxy(GObject gObject = null)
+        {
+            if(_proxy == null)
+            {
+                _proxy = new UI_ButAccountItem();
+            }
+            var ui = _proxy;
+            if(gObject == null)
+            	ui.target =  (GButton)UIPackage.CreateObject(PACKAGE_NAME, RES_NAME);
+            else
+            	ui.target =  (GButton)gObject;
+            ui.Init(ui.target);
+            return ui;
+        }
+
+        public static void ProxyEnd()
+        {
+            if (_proxy != null)
+            {
+                _proxy.Dispose();
+            }
+        }
+
+        public static void ClearProxy()
+        {
+            ProxyEnd();
+            _proxy = null;
+        }
+
+        private void Init(GComponent comp)
+        {
+            m_txtAccountItem = (GTextField)comp.GetChild("txtAccountItem");
+            m_btnDel = (GButton)comp.GetChild("btnDel");
+        }
+        public void Dispose(bool disposeTarget = false)
+        {
+            m_txtAccountItem = null;
+            m_btnDel = null;
+            if(disposeTarget && target != null)
+            {
+                target.RemoveFromParent();
+                target.Dispose();
+            }
+            target = null;
+        }
+    }
+}

+ 11 - 0
GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_ButAccountItem.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 4a849767c55971348837917e5d857a58
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 74 - 0
GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_ButAccountItem2.cs

@@ -0,0 +1,74 @@
+/** This is an automatically generated class by FairyGUI. Please do not modify it. **/
+
+using FairyGUI;
+
+namespace UI.Login
+{
+    public partial class UI_ButAccountItem2
+    {
+        public GButton target;
+        public GTextField m_txtAccountItem;
+        public GButton m_btnPaswordUp;
+        public const string URL = "ui://myoktu7pk5ej68";
+        public const string PACKAGE_NAME = "Login";
+        public const string RES_NAME = "ButAccountItem2";
+        private static UI_ButAccountItem2 _proxy;
+
+        public static UI_ButAccountItem2 Create(GObject gObject = null)
+        {
+            var ui = new UI_ButAccountItem2();
+            if(gObject == null)
+            	ui.target =  (GButton)UIPackage.CreateObject(PACKAGE_NAME, RES_NAME);
+            else
+            	ui.target =  (GButton)gObject;
+            ui.Init(ui.target);
+            return ui;
+        }
+
+        public static UI_ButAccountItem2 Proxy(GObject gObject = null)
+        {
+            if(_proxy == null)
+            {
+                _proxy = new UI_ButAccountItem2();
+            }
+            var ui = _proxy;
+            if(gObject == null)
+            	ui.target =  (GButton)UIPackage.CreateObject(PACKAGE_NAME, RES_NAME);
+            else
+            	ui.target =  (GButton)gObject;
+            ui.Init(ui.target);
+            return ui;
+        }
+
+        public static void ProxyEnd()
+        {
+            if (_proxy != null)
+            {
+                _proxy.Dispose();
+            }
+        }
+
+        public static void ClearProxy()
+        {
+            ProxyEnd();
+            _proxy = null;
+        }
+
+        private void Init(GComponent comp)
+        {
+            m_txtAccountItem = (GTextField)comp.GetChild("txtAccountItem");
+            m_btnPaswordUp = (GButton)comp.GetChild("btnPaswordUp");
+        }
+        public void Dispose(bool disposeTarget = false)
+        {
+            m_txtAccountItem = null;
+            m_btnPaswordUp = null;
+            if(disposeTarget && target != null)
+            {
+                target.RemoveFromParent();
+                target.Dispose();
+            }
+            target = null;
+        }
+    }
+}

+ 11 - 0
GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_ButAccountItem2.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 18bf4725a6f581a45aaeb533005c97a8
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 80 - 0
GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_ComAccountInputBox.cs

@@ -0,0 +1,80 @@
+/** This is an automatically generated class by FairyGUI. Please do not modify it. **/
+
+using FairyGUI;
+
+namespace UI.Login
+{
+    public partial class UI_ComAccountInputBox
+    {
+        public GComponent target;
+        public Controller m_c1;
+        public GList m_list;
+        public GButton m_selBtin;
+        public GTextInput m_txtAccount;
+        public const string URL = "ui://myoktu7pk5ej5x";
+        public const string PACKAGE_NAME = "Login";
+        public const string RES_NAME = "ComAccountInputBox";
+        private static UI_ComAccountInputBox _proxy;
+
+        public static UI_ComAccountInputBox Create(GObject gObject = null)
+        {
+            var ui = new UI_ComAccountInputBox();
+            if(gObject == null)
+            	ui.target =  (GComponent)UIPackage.CreateObject(PACKAGE_NAME, RES_NAME);
+            else
+            	ui.target =  (GComponent)gObject;
+            ui.Init(ui.target);
+            return ui;
+        }
+
+        public static UI_ComAccountInputBox Proxy(GObject gObject = null)
+        {
+            if(_proxy == null)
+            {
+                _proxy = new UI_ComAccountInputBox();
+            }
+            var ui = _proxy;
+            if(gObject == null)
+            	ui.target =  (GComponent)UIPackage.CreateObject(PACKAGE_NAME, RES_NAME);
+            else
+            	ui.target =  (GComponent)gObject;
+            ui.Init(ui.target);
+            return ui;
+        }
+
+        public static void ProxyEnd()
+        {
+            if (_proxy != null)
+            {
+                _proxy.Dispose();
+            }
+        }
+
+        public static void ClearProxy()
+        {
+            ProxyEnd();
+            _proxy = null;
+        }
+
+        private void Init(GComponent comp)
+        {
+            m_c1 = comp.GetController("c1");
+            m_list = (GList)comp.GetChild("list");
+            m_selBtin = (GButton)comp.GetChild("selBtin");
+            m_txtAccount = (GTextInput)comp.GetChild("txtAccount");
+        }
+        public void Dispose(bool disposeTarget = false)
+        {
+            m_c1 = null;
+            m_list = null;
+            m_selBtin = null;
+            m_txtAccount = null;
+            if(disposeTarget && target != null)
+            {
+                target.RemoveFromParent();
+                target.Dispose();
+            }
+            target = null;
+        }
+    }
+}

+ 11 - 0
GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_ComAccountInputBox.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 291f430b6aaebde4b8328d577dc05525
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 7 - 6
GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_LoginInputUI.cs

@@ -8,12 +8,12 @@ namespace UI.Login
     {
         public GComponent target;
         public GComponent m_bg;
-        public GButton m_btnRegister;
-        public GTextInput m_inputAccount;
         public GTextInput m_inputPassword;
         public GButton m_btnCancel;
         public GButton m_btnSure;
         public GComboBox m_boxChooseCanal;
+        public UI_ComAccountInputBox m_comAccount;
+        public GButton m_btnRegister;
         public const string URL = "ui://myoktu7pq08xc";
         public const string PACKAGE_NAME = "Login";
         public const string RES_NAME = "LoginInputUI";
@@ -62,22 +62,23 @@ namespace UI.Login
         private void Init(GComponent comp)
         {
             m_bg = (GComponent)comp.GetChild("bg");
-            m_btnRegister = (GButton)comp.GetChild("btnRegister");
-            m_inputAccount = (GTextInput)comp.GetChild("inputAccount");
             m_inputPassword = (GTextInput)comp.GetChild("inputPassword");
             m_btnCancel = (GButton)comp.GetChild("btnCancel");
             m_btnSure = (GButton)comp.GetChild("btnSure");
             m_boxChooseCanal = (GComboBox)comp.GetChild("boxChooseCanal");
+            m_comAccount = (UI_ComAccountInputBox)UI_ComAccountInputBox.Create(comp.GetChild("comAccount"));
+            m_btnRegister = (GButton)comp.GetChild("btnRegister");
         }
         public void Dispose(bool disposeTarget = false)
         {
             m_bg = null;
-            m_btnRegister = null;
-            m_inputAccount = null;
             m_inputPassword = null;
             m_btnCancel = null;
             m_btnSure = null;
             m_boxChooseCanal = null;
+            m_comAccount.Dispose();
+            m_comAccount = null;
+            m_btnRegister = null;
             if(disposeTarget && target != null)
             {
                 target.RemoveFromParent();

+ 12 - 3
GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_RegisterUIBackup.cs

@@ -10,7 +10,6 @@ namespace UI.Login
         public GComponent m_bg;
         public GButton m_btnSubmit;
         public GButton m_btnAgree;
-        public GRichTextField m_richTextAgree;
         public GButton m_btnSendCode;
         public GTextInput m_inputPhone;
         public GTextInput m_inputCode;
@@ -18,6 +17,10 @@ namespace UI.Login
         public GTextInput m_inputPassword2;
         public GTextInput m_inputIDNumber;
         public GTextInput m_inputName;
+        public GRichTextField m_richTextAgree;
+        public GLoader m_loaEventa;
+        public GLoader m_loaEventb;
+        public GLoader m_loaEventc;
         public const string URL = "ui://myoktu7pu67n12";
         public const string PACKAGE_NAME = "Login";
         public const string RES_NAME = "RegisterUIBackup";
@@ -68,7 +71,6 @@ namespace UI.Login
             m_bg = (GComponent)comp.GetChild("bg");
             m_btnSubmit = (GButton)comp.GetChild("btnSubmit");
             m_btnAgree = (GButton)comp.GetChild("btnAgree");
-            m_richTextAgree = (GRichTextField)comp.GetChild("richTextAgree");
             m_btnSendCode = (GButton)comp.GetChild("btnSendCode");
             m_inputPhone = (GTextInput)comp.GetChild("inputPhone");
             m_inputCode = (GTextInput)comp.GetChild("inputCode");
@@ -76,13 +78,16 @@ namespace UI.Login
             m_inputPassword2 = (GTextInput)comp.GetChild("inputPassword2");
             m_inputIDNumber = (GTextInput)comp.GetChild("inputIDNumber");
             m_inputName = (GTextInput)comp.GetChild("inputName");
+            m_richTextAgree = (GRichTextField)comp.GetChild("richTextAgree");
+            m_loaEventa = (GLoader)comp.GetChild("loaEventa");
+            m_loaEventb = (GLoader)comp.GetChild("loaEventb");
+            m_loaEventc = (GLoader)comp.GetChild("loaEventc");
         }
         public void Dispose(bool disposeTarget = false)
         {
             m_bg = null;
             m_btnSubmit = null;
             m_btnAgree = null;
-            m_richTextAgree = null;
             m_btnSendCode = null;
             m_inputPhone = null;
             m_inputCode = null;
@@ -90,6 +95,10 @@ namespace UI.Login
             m_inputPassword2 = null;
             m_inputIDNumber = null;
             m_inputName = null;
+            m_richTextAgree = null;
+            m_loaEventa = null;
+            m_loaEventb = null;
+            m_loaEventc = null;
             if(disposeTarget && target != null)
             {
                 target.RemoveFromParent();

+ 92 - 0
GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_ZhaoHuiAccountUI.cs

@@ -0,0 +1,92 @@
+/** This is an automatically generated class by FairyGUI. Please do not modify it. **/
+
+using FairyGUI;
+
+namespace UI.Login
+{
+    public partial class UI_ZhaoHuiAccountUI
+    {
+        public GComponent target;
+        public Controller m_c1;
+        public GComponent m_bg;
+        public GButton m_btnback;
+        public GButton m_btnSendCode;
+        public GTextInput m_txtPhone;
+        public GTextInput m_txtCode;
+        public GButton m_btnSubmit;
+        public GList m_comAccountList;
+        public const string URL = "ui://myoktu7pk5ej67";
+        public const string PACKAGE_NAME = "Login";
+        public const string RES_NAME = "ZhaoHuiAccountUI";
+        private static UI_ZhaoHuiAccountUI _proxy;
+
+        public static UI_ZhaoHuiAccountUI Create(GObject gObject = null)
+        {
+            var ui = new UI_ZhaoHuiAccountUI();
+            if(gObject == null)
+            	ui.target =  (GComponent)UIPackage.CreateObject(PACKAGE_NAME, RES_NAME);
+            else
+            	ui.target =  (GComponent)gObject;
+            ui.Init(ui.target);
+            return ui;
+        }
+
+        public static UI_ZhaoHuiAccountUI Proxy(GObject gObject = null)
+        {
+            if(_proxy == null)
+            {
+                _proxy = new UI_ZhaoHuiAccountUI();
+            }
+            var ui = _proxy;
+            if(gObject == null)
+            	ui.target =  (GComponent)UIPackage.CreateObject(PACKAGE_NAME, RES_NAME);
+            else
+            	ui.target =  (GComponent)gObject;
+            ui.Init(ui.target);
+            return ui;
+        }
+
+        public static void ProxyEnd()
+        {
+            if (_proxy != null)
+            {
+                _proxy.Dispose();
+            }
+        }
+
+        public static void ClearProxy()
+        {
+            ProxyEnd();
+            _proxy = null;
+        }
+
+        private void Init(GComponent comp)
+        {
+            m_c1 = comp.GetController("c1");
+            m_bg = (GComponent)comp.GetChild("bg");
+            m_btnback = (GButton)comp.GetChild("btnback");
+            m_btnSendCode = (GButton)comp.GetChild("btnSendCode");
+            m_txtPhone = (GTextInput)comp.GetChild("txtPhone");
+            m_txtCode = (GTextInput)comp.GetChild("txtCode");
+            m_btnSubmit = (GButton)comp.GetChild("btnSubmit");
+            m_comAccountList = (GList)comp.GetChild("comAccountList");
+        }
+        public void Dispose(bool disposeTarget = false)
+        {
+            m_c1 = null;
+            m_bg = null;
+            m_btnback = null;
+            m_btnSendCode = null;
+            m_txtPhone = null;
+            m_txtCode = null;
+            m_btnSubmit = null;
+            m_comAccountList = null;
+            if(disposeTarget && target != null)
+            {
+                target.RemoveFromParent();
+                target.Dispose();
+            }
+            target = null;
+        }
+    }
+}

+ 11 - 0
GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_ZhaoHuiAccountUI.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 251d692924a621347ade86d3361f421a
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 89 - 0
GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_ZhaoHuiPasswordUI.cs

@@ -0,0 +1,89 @@
+/** This is an automatically generated class by FairyGUI. Please do not modify it. **/
+
+using FairyGUI;
+
+namespace UI.Login
+{
+    public partial class UI_ZhaoHuiPasswordUI
+    {
+        public GComponent target;
+        public Controller m_c1;
+        public GComponent m_bg;
+        public GButton m_btnback;
+        public GTextInput m_txtPasword;
+        public GTextField m_txtAccountShow;
+        public GTextInput m_txtPaswrod2;
+        public GButton m_btnSubmit;
+        public const string URL = "ui://myoktu7pk5ej69";
+        public const string PACKAGE_NAME = "Login";
+        public const string RES_NAME = "ZhaoHuiPasswordUI";
+        private static UI_ZhaoHuiPasswordUI _proxy;
+
+        public static UI_ZhaoHuiPasswordUI Create(GObject gObject = null)
+        {
+            var ui = new UI_ZhaoHuiPasswordUI();
+            if(gObject == null)
+            	ui.target =  (GComponent)UIPackage.CreateObject(PACKAGE_NAME, RES_NAME);
+            else
+            	ui.target =  (GComponent)gObject;
+            ui.Init(ui.target);
+            return ui;
+        }
+
+        public static UI_ZhaoHuiPasswordUI Proxy(GObject gObject = null)
+        {
+            if(_proxy == null)
+            {
+                _proxy = new UI_ZhaoHuiPasswordUI();
+            }
+            var ui = _proxy;
+            if(gObject == null)
+            	ui.target =  (GComponent)UIPackage.CreateObject(PACKAGE_NAME, RES_NAME);
+            else
+            	ui.target =  (GComponent)gObject;
+            ui.Init(ui.target);
+            return ui;
+        }
+
+        public static void ProxyEnd()
+        {
+            if (_proxy != null)
+            {
+                _proxy.Dispose();
+            }
+        }
+
+        public static void ClearProxy()
+        {
+            ProxyEnd();
+            _proxy = null;
+        }
+
+        private void Init(GComponent comp)
+        {
+            m_c1 = comp.GetController("c1");
+            m_bg = (GComponent)comp.GetChild("bg");
+            m_btnback = (GButton)comp.GetChild("btnback");
+            m_txtPasword = (GTextInput)comp.GetChild("txtPasword");
+            m_txtAccountShow = (GTextField)comp.GetChild("txtAccountShow");
+            m_txtPaswrod2 = (GTextInput)comp.GetChild("txtPaswrod2");
+            m_btnSubmit = (GButton)comp.GetChild("btnSubmit");
+        }
+        public void Dispose(bool disposeTarget = false)
+        {
+            m_c1 = null;
+            m_bg = null;
+            m_btnback = null;
+            m_txtPasword = null;
+            m_txtAccountShow = null;
+            m_txtPaswrod2 = null;
+            m_btnSubmit = null;
+            if(disposeTarget && target != null)
+            {
+                target.RemoveFromParent();
+                target.Dispose();
+            }
+            target = null;
+        }
+    }
+}

+ 11 - 0
GameClient/Assets/Game/HotUpdate/FairyGUI/GenCode/Login/UI_ZhaoHuiPasswordUI.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d43413dee1050d4429e1015e84f93122
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1 - 1
GameClient/Assets/Game/HotUpdate/GameConfig.cs

@@ -33,7 +33,7 @@ namespace GFGGame
             LoginAddress = result.loginApiUrl;
             //LoginAddress = "43.139.184.240:10003";
             //LoginAddress = "192.168.1.7:10005";//测试地址
-            //LoginAddress = "192.168.1.191:10005";//测试地址
+           LoginAddress = "192.168.1.191:10005";//测试地址
             showGM = int.Parse(result.showGM);
             if(!string.IsNullOrEmpty(result.openTime))
             {

+ 114 - 7
GameClient/Assets/Game/HotUpdate/Views/Login/LoginInputView.cs

@@ -11,6 +11,8 @@ namespace GFGGame
     {
         private UI_LoginInputUI _ui;
 
+        private List<AccountPasswordModel> _accountPasswordList;
+
         public override void Dispose()
         {
             if (_ui != null)
@@ -18,6 +20,7 @@ namespace GFGGame
                 _ui.Dispose();
                 _ui = null;
             }
+
             base.Dispose();
         }
 
@@ -34,7 +37,10 @@ namespace GFGGame
             _ui.m_btnCancel.onClick.Add(OnClickBtnCancel);
             _ui.m_btnRegister.onClick.Add(OnClickBtnRegister);
 
-            _ui.m_inputAccount.restrict = "[0-9A-Za-z_]";
+            _ui.m_comAccount.m_selBtin.onClick.Add(OnClickOpenAccountListBtn);
+            _ui.m_comAccount.m_txtAccount.restrict = "[0-9A-Za-z_]";
+            _ui.m_comAccount.m_list.itemRenderer = RenderListItem;
+
             if (LauncherConfig.netType == LauncherConfig.EnumNetType.LOCAL)
             {
                 _ui.m_inputPassword.promptText = "[color=#B8A492]当前支持免密登录[/color]";
@@ -46,11 +52,25 @@ namespace GFGGame
         protected override void OnShown()
         {
             base.OnShown();
-            string account = PlayerPrefs.GetString(GameConst.ACCOUNT_LAST_LOGIN_KEY);
+            _accountPasswordList = AccountManager.Instance.GetAccounts();
+            string account = null;
+            string password = null;
+            if (_accountPasswordList != null && _accountPasswordList.Count > 0)
+            {
+                account = _accountPasswordList[0].Account;
+                password = _accountPasswordList[0].Password;
+            }
+
             if (account != null)
             {
-                _ui.m_inputAccount.text = account;
+                _ui.m_comAccount.m_txtAccount.text = account;
             }
+
+            if (password != null)
+            {
+                _ui.m_inputPassword.text = password;
+            }
+
             UpdateChannelBox(false);
         }
 
@@ -74,13 +94,14 @@ namespace GFGGame
 
         private void OnClickBtnSure()
         {
-            var account = _ui.m_inputAccount.text;
+            var account = _ui.m_comAccount.m_txtAccount.text;
             var password = _ui.m_inputPassword.text;
             if (string.IsNullOrEmpty(account))
             {
                 PromptController.Instance.ShowFloatTextPrompt("请输入账号");
                 return;
             }
+
             if (!string.IsNullOrEmpty(password))
             {
                 LoginController.Login(account, password).Coroutine();
@@ -105,10 +126,94 @@ namespace GFGGame
             ViewManager.Show<RegisterView>();
         }
 
+        private void OnClickOpenAccountListBtn()
+        {
+            if (_accountPasswordList.Count == 0)
+            {
+                _ui.m_comAccount.m_list.selectedIndex = 0;
+                return;
+            }
+
+            if (_ui.m_comAccount.m_c1.selectedIndex == 0)
+            {
+                //显示账号缓存列表
+                OnShowAccountList();
+            }
+            else
+            {
+                //隐藏账号缓存列表
+                OnHideAccountList();
+            }
+        }
+
+        //显示账号缓存列表
+        private void OnShowAccountList()
+        {
+            _accountPasswordList = AccountManager.Instance.GetAccounts();
+            _ui.m_comAccount.m_list.numItems = _accountPasswordList.Count;
+            _ui.m_comAccount.m_c1.selectedIndex = 1;
+        }
+
+        //隐藏账号缓存列表
+        private void OnHideAccountList()
+        {
+            _ui.m_comAccount.m_c1.selectedIndex = 0;
+        }
+
+        //绑定数据到账号缓存列表
+        private void RenderListItem(int index, GObject obj)
+        {
+            AccountPasswordModel accountPassword = _accountPasswordList[index];
+            UI_ButAccountItem item = UI_ButAccountItem.Proxy(obj);
+            item.m_txtAccountItem.text = accountPassword.Account;
+            item.target.data = accountPassword;
+            item.target.onClick.Add(OnClickSelAccount);
+
+            item.m_btnDel.data = accountPassword.Account;
+            item.m_btnDel.onClick.Add(OnClickDelAccountCache);
+
+            UI_ButAccountItem.ProxyEnd();
+        }
+
+        //从账号缓存列表中选择账号
+        private void OnClickSelAccount(EventContext context)
+        {
+            GObject obj = context.sender as GObject;
+            AccountPasswordModel accountPassword = obj.data as AccountPasswordModel;
+            _ui.m_comAccount.m_txtAccount.text = accountPassword?.Account;
+            _ui.m_inputPassword.text = accountPassword?.Password;
+            OnHideAccountList();
+        }
+
+        //删除账号缓存列表
+        private void OnClickDelAccountCache(EventContext context)
+        {
+            GObject obj = context.sender as GObject;
+            string account = obj.data.ToString();
+            AccountManager.Instance.DeleteAccount(account);
+            _accountPasswordList = AccountManager.Instance.GetAccounts();
+            _ui.m_comAccount.m_list.numItems = _accountPasswordList.Count;
+            if (_accountPasswordList.Count == 0)
+            {
+                _ui.m_comAccount.m_list.selectedIndex = 0;
+            }
+
+            if (_accountPasswordList.Count == 0)
+            {
+                _ui.m_comAccount.m_txtAccount.text = null;
+                _ui.m_inputPassword.text = null;
+            }
+            else
+            {
+                _ui.m_comAccount.m_txtAccount.text = _accountPasswordList[0].Account;
+                _ui.m_inputPassword.text = _accountPasswordList[0].Password;
+            }
+        }
+
         private void OnLoginFail(EventContext context)
         {
             string account = (string)context.data;
-            _ui.m_inputAccount.text = account;
+            _ui.m_comAccount.m_txtAccount.text = account;
         }
 
         private void InitChanelBox()
@@ -131,11 +236,13 @@ namespace GFGGame
 
                 if (fieldInfo != null && Attribute.IsDefined(fieldInfo, typeof(DescriptionAttribute)))
                 {
-                    DescriptionAttribute attribute = (DescriptionAttribute)Attribute.GetCustomAttribute(fieldInfo, typeof(DescriptionAttribute));
+                    DescriptionAttribute attribute =
+                        (DescriptionAttribute)Attribute.GetCustomAttribute(fieldInfo, typeof(DescriptionAttribute));
                     items.Add(attribute.Description);
                     numbers.Add(Convert.ToInt32(value).ToString());
                 }
             }
+
             _ui.m_boxChooseCanal.items = items.ToArray();
             _ui.m_boxChooseCanal.values = numbers.ToArray();
             _ui.m_boxChooseCanal.value = LauncherConfig.ChannelId + "";
@@ -163,8 +270,8 @@ namespace GFGGame
             {
                 GameConfig.LoginAddress = "http://10.108.64.127:10005";
             }
+
             ET.Log.Debug($"===选择的渠道=== {_ui.m_boxChooseCanal.value} {GameConfig.LoginAddress}");
         }
-
     }
 }

BIN
GameClient/Assets/ResIn/UI/Login/Login_atlas0!a.png


BIN
GameClient/Assets/ResIn/UI/Login/Login_atlas0.png


BIN
GameClient/Assets/ResIn/UI/Login/Login_fui.bytes


+ 3 - 0
GameClient/GameClient.sln.DotSettings.user

@@ -1,10 +1,13 @@
 <wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AApplication_002Ecs_002Fl_003AC_0021_003FUsers_003Fss510_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F683a2b31bf9142429c44f02c75dbc6c913ce00_003Ff7_003F323a5d44_003FApplication_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
+	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AComponent_002Ecs_002Fl_003AC_0021_003FUsers_003Fss510_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F683a2b31bf9142429c44f02c75dbc6c913ce00_003F37_003F759af757_003FComponent_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AEditorUtility_002Ecs_002Fl_003AC_0021_003FUsers_003Fss510_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F8d4895b259be41298a685a0c9b42357576b400_003F3f_003Fa805acc1_003FEditorUtility_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AGameObject_002Ecs_002Fl_003AC_0021_003FUsers_003Fss510_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F683a2b31bf9142429c44f02c75dbc6c913ce00_003F88_003F39e0e101_003FGameObject_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AHttpClient_002Ecs_002Fl_003AC_0021_003FUsers_003Fss510_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F16bc693bb84a493b8a40c4959d21832130b48_003Fba_003F0dd76ac2_003FHttpClient_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AHttpResponseMessage_002Ecs_002Fl_003AC_0021_003FUsers_003Fss510_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F16bc693bb84a493b8a40c4959d21832130b48_003F6b_003F654ccab2_003FHttpResponseMessage_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AImageConversion_002Ecs_002Fl_003AC_0021_003FUsers_003Fss510_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Ffc3bccd651174076af6dca433cbde7ab3c00_003Fa6_003F867ada62_003FImageConversion_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
+	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AList_00601_002Ecs_002Fl_003AC_0021_003FUsers_003Fss510_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F3789ee403a53437cbb6b5d9ab6311f51573620_003Fa3_003F60d291b6_003FList_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AOptionAttribute_002Ecs_002Fl_003AC_0021_003FUsers_003Fss510_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F16134578226e4e409ecbdd10473cf8f235000_003F4e_003Fb8b5740c_003FOptionAttribute_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
+	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASymmetricAlgorithm_002Ecs_002Fl_003AC_0021_003FUsers_003Fss510_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F695d1cc93cca45069c528c15c9fdd7493e2800_003F8d_003F7f9cecef_003FSymmetricAlgorithm_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AVideoPlayer_002Ecs_002Fl_003AC_0021_003FUsers_003Fss510_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F94e504f98c124706b9757130a7f0ffc87c00_003Fd5_003F4fd0f80f_003FVideoPlayer_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
 	</wpf:ResourceDictionary>