From 2fa304ada32e6d8a9444136e29d3fb5cefa77538 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期五, 23 五月 2025 18:31:59 +0800
Subject: [PATCH] 18 子 2D卡牌客户端搭建 / 2D卡牌客户端搭建 界面补全

---
 Main/System/ClientVersion/VersionUpdateWin.cs           |   59 ++
 Main/System/Login/GameNotice.cs.meta                    |   11 
 Main/System/Login/ServerListWin.cs.meta                 |   11 
 Main/System/NetLink.meta                                |    8 
 Main/System/Login/LoginWin.cs                           |  351 +++++++++++++++
 Main/System/Login/ServerListWin.cs                      |  109 ++++
 Main/UI/UIBase.cs                                       |   11 
 Main/System/ClientVersion/RequestSecretWin.cs.meta      |    0 
 Main/System/Login/GameAgeWarnWin.cs                     |   61 ++
 Main/Login/ServerListCenter.cs                          |   13 
 Main/Main.cs                                            |    7 
 Main/Manager/LoginManager.cs                            |  295 ++++++++++++
 Main/System/Login/GameNotice.cs                         |   62 ++
 Main/System/Login/ServerGroupToggle.cs.meta             |   11 
 Main/System/ClientVersion/VersionUpdateWin.cs.meta      |   11 
 Main/System/NetLink/NetLinkWin.cs                       |   90 ++++
 Main/Core/NetworkPackage/DataToCtl/DisconnectState.cs   |    2 
 Main/System/Login/GameAgeWarnWin.cs.meta                |   11 
 Main/Core/NetworkPackage/GameNetSystem.cs               |    4 
 Main/Component/UI/Decorate/Tweens/UIAlphaTween.cs       |    5 
 Main/System/ClientVersion/RequestSecretWin.cs           |    0 
 Main/System/NetLink/NetLinkWin.cs.meta                  |   11 
 Main/System/Login/LoginWin.cs.meta                      |    0 
 Main/System/Login.meta                                  |    8 
 /dev/null                                               |   61 --
 Main/Core/GameEngine/Launch/LaunchInHot.cs              |    9 
 Main/Core/NetworkPackage/DataToCtl/NeverConnectState.cs |    2 
 Main/Core/NetworkPackage/DataToCtl/ConnectedState.cs    |    2 
 Main/System/Login/ServerGroupToggle.cs                  |   49 ++
 29 files changed, 1,175 insertions(+), 99 deletions(-)

diff --git a/Main/Component/UI/Decorate/Tweens/UIAlphaTween.cs b/Main/Component/UI/Decorate/Tweens/UIAlphaTween.cs
index db9c4f4..f272464 100644
--- a/Main/Component/UI/Decorate/Tweens/UIAlphaTween.cs
+++ b/Main/Component/UI/Decorate/Tweens/UIAlphaTween.cs
@@ -7,8 +7,6 @@
 using UnityEngine.UI;
 using System;
 
-namespace vnxbqy.UI
-{
     
     [RequireComponent(typeof(CanvasGroup))]
     public class UIAlphaTween : MonoBehaviour
@@ -226,8 +224,5 @@
         }
 
     }
-
-}
-
 
 
diff --git a/Main/Core/GameEngine/Launch/LaunchInHot.cs b/Main/Core/GameEngine/Launch/LaunchInHot.cs
index 0cd969d..fd56571 100644
--- a/Main/Core/GameEngine/Launch/LaunchInHot.cs
+++ b/Main/Core/GameEngine/Launch/LaunchInHot.cs
@@ -5,7 +5,7 @@
 using System.Collections.Generic;
 using System.IO;
 
-public class LaunchInHot : MonoBehaviour
+public class LaunchInHot : SingletonMonobehaviour<LaunchInHot>
 {
     static int step = 0;
     public static LaunchStage m_CurrentStage = LaunchStage.None;
@@ -17,6 +17,9 @@
     bool launchComplete = false;
     float surplusProgress = 0f;
     float surplusTime = 0f;
+
+    public Action OnApplicationOut = null;
+
 
     void Start()
     {
@@ -190,6 +193,10 @@
     }
 
 
+    private void OnApplicationQuit()
+    {
+        OnApplicationOut?.Invoke();
+    }
 
 
 }
diff --git a/Main/Core/NetworkPackage/DataToCtl/ConnectedState.cs b/Main/Core/NetworkPackage/DataToCtl/ConnectedState.cs
index d9d5664..3ed4d83 100644
--- a/Main/Core/NetworkPackage/DataToCtl/ConnectedState.cs
+++ b/Main/Core/NetworkPackage/DataToCtl/ConnectedState.cs
@@ -27,7 +27,7 @@
         base.OnEnter();
 
         m_NetWorkReachability = Application.internetReachability;
-        // NetLinkWin.Hide();
+        NetLinkWin.Hide();
     }
 
     protected override void Update()
diff --git a/Main/Core/NetworkPackage/DataToCtl/DisconnectState.cs b/Main/Core/NetworkPackage/DataToCtl/DisconnectState.cs
index 61ece3d..43d62f2 100644
--- a/Main/Core/NetworkPackage/DataToCtl/DisconnectState.cs
+++ b/Main/Core/NetworkPackage/DataToCtl/DisconnectState.cs
@@ -9,7 +9,7 @@
     {
         base.OnEnter();
 
-        // NetLinkWin.Hide();
+        NetLinkWin.Hide();
     }
 
     protected override void Update()
diff --git a/Main/Core/NetworkPackage/DataToCtl/NeverConnectState.cs b/Main/Core/NetworkPackage/DataToCtl/NeverConnectState.cs
index cc52d8d..2237bbe 100644
--- a/Main/Core/NetworkPackage/DataToCtl/NeverConnectState.cs
+++ b/Main/Core/NetworkPackage/DataToCtl/NeverConnectState.cs
@@ -8,7 +8,7 @@
     public override void OnEnter()
     {
         base.OnEnter();
-        // NetLinkWin.Hide();
+        NetLinkWin.Hide();
     }
 
     protected override void Update()
diff --git a/Main/Core/NetworkPackage/GameNetSystem.cs b/Main/Core/NetworkPackage/GameNetSystem.cs
index f67a17b..92a27d7 100644
--- a/Main/Core/NetworkPackage/GameNetSystem.cs
+++ b/Main/Core/NetworkPackage/GameNetSystem.cs
@@ -342,6 +342,8 @@
         finally
         {
             netState = NetState.NerverConnect;
+            // TODO YYL
+
             // CrossServerLogin.Instance.busy = false;
             // //ArenaManager.isArenaClient = false;
             // var loginModel = ModelCenter.Instance.GetModel<LoginModel>();
@@ -366,7 +368,7 @@
             // //    GameObject.Destroy(obj.transform.GetChild(i).gameObject);
             // //}
             // //SceneManager.LoadScene("Empty");
-            // NetLinkWin.Hide();
+            NetLinkWin.Hide();
             // DTC0403_tagPlayerLoginLoadOK.neverLoginOk = true;
         }
     }
diff --git a/Main/Login/ServerListCenter.cs b/Main/Login/ServerListCenter.cs
index ff403fc..72b5cd0 100644
--- a/Main/Login/ServerListCenter.cs
+++ b/Main/Login/ServerListCenter.cs
@@ -220,18 +220,13 @@
 
         if (VersionConfig.Get().versionAuthority == VersionAuthority.InterTest)
         {
-            var localSaveAccountName = LocalSave.GetString(LoginManager.Instance.USER_ACCOUNT);
+            var localSaveAccountName = LocalSave.GetString(LoginManager.USER_ACCOUNT);
             RequestServerListPlayer(localSaveAccountName);
         }
     }
 
     public void RequestServerCommonList()
     {
-        if (VersionUtility.Instance.InIosAuditTime())
-        {
-            return;
-        }
-
         HttpRequest.Instance.RequestHttpGet(SERVERLIST_URL_COMMON, HttpRequest.defaultHttpContentType, 1, OnGetServerList);
     }
 
@@ -240,7 +235,7 @@
         if (_ok)
         {
             ServerListParser.Instance.PushCommonServerListRawData(_result);
-            // NetLinkWin.Hide();
+            NetLinkWin.Hide();
         }
         else
         {
@@ -458,7 +453,7 @@
     //杩欒竟璇锋眰鐢ㄧ殑鏄棫璐﹀彿锛宻dk鐧诲綍鎴愬姛浼氱敤鏂拌处鍙疯姹備竴娆★紝鍐呯綉鐧诲綍闇�瑕佹墜鍔ㄧ偣鍑讳竴娆℃湇鍔″櫒鍒楄〃鍒锋柊
     public void RequestPlayerServerList()
     {
-        if (LoginManager.Instance.IsLogined)
+        if (LoginManager.Instance.isLogined)
         {
             var account = LoginManager.Instance.localSaveAccountName;
             if (string.IsNullOrEmpty(account))
@@ -477,7 +472,7 @@
     //2.鏈嶅姟鍣ㄥ垪琛ㄧ晫闈㈠埛鏂伴�昏緫娌″仛濂斤紝serverGroupSelectEvent鐨勮皟鐢ㄧ洿鎺ュ喅瀹氫簡鐣岄潰鏄剧ず
     public void FiltrateDefaultServerAndServerGroup()
     {
-        if (LoginManager.Instance.IsLogined)
+        if (LoginManager.Instance.isLogined)
         {
             return;
         }
diff --git a/Main/Main.cs b/Main/Main.cs
index c2a1b44..c83d14d 100644
--- a/Main/Main.cs
+++ b/Main/Main.cs
@@ -39,6 +39,8 @@
         // 鍒濆鍖栨父鎴忓満鏅�
         Debug.Log("鍒濆鍖栨父鎴忓満鏅�");
 
+        ReleaseMgrs();
+
         // 鍒濆鍖栨父鎴忕郴缁�
         managers.Add(BattleManager.Instance);
 
@@ -56,6 +58,11 @@
 
     public static void OnSwitchToLoginScene()
     {
+        ReleaseMgrs();
+    }
+
+    private static void ReleaseMgrs()
+    {
         foreach (var manager in managers)
         {
             manager.Release();
diff --git a/Main/Manager/LoginManager.cs b/Main/Manager/LoginManager.cs
index 4edbfcd..5b0286c 100644
--- a/Main/Manager/LoginManager.cs
+++ b/Main/Manager/LoginManager.cs
@@ -1,26 +1,14 @@
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
+using System;
+
 
 public class LoginManager : ManagerBase<LoginManager>
 {
-    public string USER_ACCOUNT;
-
-    public string localSaveAccountName
-    {
-        get
-        {
-            return PlayerPrefs.GetString("localSaveAccountName", "");
-        }
-    }
-
-    public bool IsLogined
-    {
-        get
-        {
-            return false;
-        }
-    }
+    public const uint DwVersionNo = 153518004;
+    public readonly static string USER_ACCOUNT = Application.dataPath + "UserAccount";
+    public readonly static string USER_PASSWORD = Application.dataPath + "UserPassword";
 
     public bool sdkLogined
     {
@@ -28,18 +16,287 @@
         set;
     } = false;
 
+    public bool reconnectBackGround
+    {
+        get;
+        set;
+    } = false;
+
+    public bool onCreateRole
+    {
+        get;
+        set;
+    } = false;
+
+    public bool busy
+    {
+        get;
+        set;
+    } = false;
+
+    int ServerListLoop = 200; //绉掞細鍦ㄧ櫥褰曠晫闈㈣姹傛湇鍔″櫒鍒楄〃鐨勯棿闅�
+    long LastLoopSecond = 0; //涓婁竴娆$殑璇锋眰鏃堕棿 100绾崇鍗曚綅
+
+    public SDKUtils.FP_LoginOk sdkLoginResult;
+    public SDKUtils.FP_CheckIDAuthentication sdkIDCheckIDAuthentication;
+
+    public string localSaveAccountName
+    {
+        get { return LocalSave.GetString(USER_ACCOUNT); }
+        set { LocalSave.SetString(USER_ACCOUNT, value); }
+    }
+
+    public event Action<bool> registerResultEvent;
+    public event Action accountBindOkEvent;
+    public event Action loginErrorEvent; //娓告垙鍚姩鍚庤〃鏍煎姞杞� 妯″潡鍔犺浇澶辫触鐨勬彁绀�
+    public string loginErrorInfo;
+
+    public string ipBuf { get; private set; }
+    public int portBuf { get; private set; }
+    public int gamePortBuf { get; private set; }
+    public string accountBuf { get; private set; }
+    public string passwordBuf { get; private set; }
+
+    public bool isLogined { get; set; }
+
     public override void Init()
     {
+        SDKUtils.Instance.onFreePlatformLoginOk += OnSDKAccountLoginOk;
+        SDKUtils.Instance.onFreePlatformLogoutOk += OnSDKAccountLoginOutOk;
+        SDKUtils.Instance.onFreePlatformBindOk += OnSDKAccountBindOk;
 
+        LaunchInHot.Instance.OnApplicationOut += OnApplicationOut;
     }
 
     public override void Release()
     {
-        
+        SDKUtils.Instance.onFreePlatformLoginOk -= OnSDKAccountLoginOk;
+        SDKUtils.Instance.onFreePlatformLogoutOk -= OnSDKAccountLoginOutOk;
+        SDKUtils.Instance.onFreePlatformBindOk -= OnSDKAccountBindOk;
+
+        LaunchInHot.Instance.OnApplicationOut -= OnApplicationOut;
     }   
 
-    public void AccountLogin(string ip, int port, int gamePort)
+    private void OnSDKAccountLoginOk(SDKUtils.FP_LoginOk _result)
     {
+        sdkLogined = true;
+        sdkLoginResult = _result;
 
+        if (!DebugUtility.Instance.isWhiteListAccount)
+        {
+            DebugUtility.Instance.RequestWhiteListAuthority(sdkLoginResult.account);
+        }
+
+        ServerListCenter.Instance.RequestServerListPlayer(sdkLoginResult.account);
+        SDKUtils.Instance.MakeKeyAndVisible();
+
+        // TODO YYL
+        // OperationLogCollect.Instance.RecordLauchEvent(5);
+
+        // GameNotice.OpenGameNotice();
+    }
+
+    private void OnSDKAccountLoginOutOk()
+    {
+        sdkLogined = false;
+        sdkLoginResult = default(SDKUtils.FP_LoginOk);
+        GameNetSystem.Instance.LoginOut();
+    }
+
+    private void OnSDKAccountBindOk()
+    {
+        sdkLoginResult.phone = 1;
+        if (accountBindOkEvent != null)
+        {
+            accountBindOkEvent();
+        }
+    }
+
+    private void OnGetIDAuthenticationInfo(SDKUtils.FP_CheckIDAuthentication _info)
+    {
+        sdkIDCheckIDAuthentication = _info;
+    }
+
+    public void AccountLogin(string _account, string _ip, int _port, int _gamePort)
+    {
+        Debug.LogFormat("璐﹀彿鐧诲綍, account:{0} ; ip:{1} ; port:{2} ; gamePort:{3}", _account, _ip, _port, _gamePort);
+        isLogined = true;
+        if (Application.internetReachability == NetworkReachability.NotReachable)
+        {
+            //  TODO YYL
+            // ConfirmCancel.ShowPopConfirm(
+            //     Language.Get("Mail101"),
+            //     Language.Get("L1116"),
+            //     () => { }
+            //     );
+            return;
+        }
+
+        if (busy)
+        {
+            return;
+        }
+
+        busy = true;
+
+        try
+        {
+            reconnectBackGround = false;
+            accountBuf = _account;
+            localSaveAccountName = accountBuf;
+            ipBuf = _ip;
+            portBuf = _port;
+            gamePortBuf = _gamePort;
+
+            ConnectGameServer(ipBuf, gamePortBuf);
+
+            GameNetSystem.Instance.OnAccountLogin();
+            NetLinkWin.Show();
+        }
+        catch (Exception ex)
+        {
+            Debug.Log(ex);
+            busy = false;
+        }
+
+    }
+
+    public void AccountLogin(string _ip, int _port, int _gamePort)
+    {
+        if (sdkLogined)
+        {
+            AccountLogin(sdkLoginResult.account, _ip, _port, _gamePort);
+        }
+        else
+        {
+            SDKUtils.Instance.FreePlatformLogin();
+        }
+    }
+
+    public void ReAccountLogin()
+    {
+        if (busy)
+        {
+            return;
+        }
+
+        busy = true;
+        reconnectBackGround = true;
+
+        try
+        {
+            ConnectGameServer(ipBuf, gamePortBuf);
+            NetLinkWin.Show();
+        }
+        catch (Exception ex)
+        {
+            Debug.Log(ex);
+            busy = false;
+        }
+    }
+
+    private void OnAccountLogin(bool _ok, string _result)
+    {
+        if (!_ok)
+        {
+            busy = false;
+            Debug.LogError(_result);
+            NetLinkWin.Hide();
+            return;
+        }
+
+        if (string.IsNullOrEmpty(_result))
+        {
+            busy = false;
+            // TODO YYL
+            // ServerTipDetails.DisplayNormalTip(Language.Get("L1117"));
+            NetLinkWin.Hide();
+            return;
+        }
+
+        var stringSet = _result.Split('|');
+        if (stringSet[0] != "OK")
+        {
+            if (stringSet.Length > 1)
+            {
+                // TODO YYL
+                // ServerTipDetails.DisplayNormalTip(stringSet[1]);
+            }
+
+            busy = false;
+            NetLinkWin.Hide();
+            return;
+        }
+
+        localSaveAccountName = accountBuf;
+        try
+        {
+            ConnectGameServer(ipBuf, gamePortBuf);
+        }
+        catch (Exception ex)
+        {
+            busy = false;
+            Debug.Log(ex);
+        }
+    }
+
+
+    void ConnectGameServer(string _ip, int _port)
+    {
+        GameNetSystem.Instance.BeginConnectGameServer(_ip, _port, OnGameServerConnected);
+    }
+
+    private void OnGameServerConnected(bool ok)
+    {
+        //  TODO YYL
+        // if (ok)
+        // {
+        //     var sendInfo = new C0123_tagCClientPackVersion();
+        //     sendInfo.Version = DwVersionNo;
+        //     GameNetSystem.Instance.SendInfo(sendInfo);
+        // }
+        // else
+        // {
+        //     busy = false;
+        // }
+    }
+
+
+    //  TODO YYL
+    public void AccessLogin(/*H0101_tagServerPrepared _serverInfo*/)
+    {
+        // GameNetSystem.Instance.SendInfo(Get0101SendPackage(_serverInfo)); // 鐧诲綍
+    }
+
+    public void CheckClientVersion()
+    {
+        //  TODO YYL
+        // var sendInfo = new C010D_tagCClientVersion();
+        // sendInfo.Version = "10.1000.1";
+        // GameNetSystem.Instance.SendInfo(sendInfo);
+    }
+
+    private void OnApplicationOut()
+    {
+        //  TODO YYL
+        // var sendInfo = new C0103_tagCPlayerLogOut();
+        // sendInfo.Type = 1;
+        // GameNetSystem.Instance.SendInfo(sendInfo);
+    }
+
+    public void RequestServerListLoop()
+    {
+        long nowTick = DateTime.Now.Ticks;
+        if (LastLoopSecond == 0)
+        {
+            LastLoopSecond = nowTick;
+            return;
+        }
+        if ((nowTick - LastLoopSecond) / 10000000 > ServerListLoop)
+        {
+            Debug.Log("瀹氭椂璇锋眰鏈嶅姟鍣ㄥ垪琛�");
+            ServerListCenter.Instance.RequestServerCommonList();
+            LastLoopSecond = nowTick;
+        }
     }
 }
diff --git a/Main/UI/RequestSecretWin.cs b/Main/System/ClientVersion/RequestSecretWin.cs
similarity index 100%
rename from Main/UI/RequestSecretWin.cs
rename to Main/System/ClientVersion/RequestSecretWin.cs
diff --git a/Main/UI/RequestSecretWin.cs.meta b/Main/System/ClientVersion/RequestSecretWin.cs.meta
similarity index 100%
rename from Main/UI/RequestSecretWin.cs.meta
rename to Main/System/ClientVersion/RequestSecretWin.cs.meta
diff --git a/Main/System/ClientVersion/VersionUpdateWin.cs b/Main/System/ClientVersion/VersionUpdateWin.cs
new file mode 100644
index 0000000..c656a19
--- /dev/null
+++ b/Main/System/ClientVersion/VersionUpdateWin.cs
@@ -0,0 +1,59 @@
+锘縰sing UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine.UI;
+using DG.Tweening;
+using Cysharp.Threading.Tasks;
+
+public class VersionUpdateWin : UIBase
+{
+    // 缁勪欢寮曠敤
+    [SerializeField] Button m_Confirm;
+    [SerializeField] RichText m_Info;
+    // 鐢熷懡鍛ㄦ湡
+    protected override void Awake()
+    {
+        base.Awake();
+        // 鍒濆鍖栫粍浠跺紩鐢�
+    }
+    
+
+    protected override void Start()
+    {
+        base.Start();
+        // 鍒濆鍖栨暟鎹�
+    }
+
+    protected override void InitComponent()
+    {
+        base.InitComponent();
+
+        m_Confirm.AddListener(Confirm);
+    }
+
+    // UI浜嬩欢
+    protected override void OnOpen()
+    {
+        base.OnOpen();
+        // 绐楀彛鎵撳紑鏃剁殑閫昏緫
+        //  TODO YYL
+        m_Info.text = string.Empty;//Language.GetFromLocal(9);
+    }
+
+    protected override void OnClose()
+    {
+        base.OnClose();
+        // 绐楀彛鍏抽棴鏃剁殑閫昏緫
+    }
+
+    public override void Refresh()
+    {
+        base.Refresh();
+        // 鍒锋柊UI鏄剧ず
+    }
+
+    private void Confirm()
+    {
+        SDKUtils.Instance.GoToAppStore(VersionUtility.Instance.versionInfo.downUrl, "com.android.vending");
+    }
+}
diff --git a/Main/System/ClientVersion/VersionUpdateWin.cs.meta b/Main/System/ClientVersion/VersionUpdateWin.cs.meta
new file mode 100644
index 0000000..50d2507
--- /dev/null
+++ b/Main/System/ClientVersion/VersionUpdateWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d284e5da25bb42a48bb3e4dcabe6b8e9
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Login.meta b/Main/System/Login.meta
new file mode 100644
index 0000000..e3a9e32
--- /dev/null
+++ b/Main/System/Login.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ae60482d361940746b454d97ea61be29
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Login/GameAgeWarnWin.cs b/Main/System/Login/GameAgeWarnWin.cs
new file mode 100644
index 0000000..f693f39
--- /dev/null
+++ b/Main/System/Login/GameAgeWarnWin.cs
@@ -0,0 +1,61 @@
+锘縰sing UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine.UI;
+using DG.Tweening;
+using Cysharp.Threading.Tasks;
+
+public class GameAgeWarnWin : UIBase
+{
+    // 缁勪欢寮曠敤
+    [SerializeField] Transform m_Title1;    //鍗忚
+    [SerializeField] Transform m_Info1;
+    [SerializeField] Transform m_Title2;    //闅愮
+    [SerializeField] Transform m_Info2;
+    [SerializeField] Transform m_Title3;    //骞撮緞
+    [SerializeField] Transform m_Info3;
+    [SerializeField] Button m_Close;
+    // 鐢熷懡鍛ㄦ湡
+    protected override void Awake()
+    {
+        base.Awake();
+        // 鍒濆鍖栫粍浠跺紩鐢�
+    }
+
+    protected override void Start()
+    {
+        base.Start();
+        // 鍒濆鍖栨暟鎹�
+    }
+
+    // UI浜嬩欢
+    protected override void OnOpen()
+    {
+        base.OnOpen();
+        // 绐楀彛鎵撳紑鏃剁殑閫昏緫
+
+        // m_Title1.SetActive(functionOrder == 1);
+        // m_Info1.SetActive(functionOrder == 1);
+        // m_Title2.SetActive(functionOrder == 2);
+        // m_Info2.SetActive(functionOrder == 2);
+        // m_Title3.SetActive(functionOrder == 3);
+        // m_Info3.SetActive(functionOrder == 3);
+    }
+
+    protected override void OnClose()
+    {
+        base.OnClose();
+        // 绐楀彛鍏抽棴鏃剁殑閫昏緫
+    }
+
+    public override void Refresh()
+    {
+        base.Refresh();
+        // 鍒锋柊UI鏄剧ず
+    }
+
+    public void SetFunctionOrder(int _functionOrder)
+    {
+
+    }
+}
diff --git a/Main/System/Login/GameAgeWarnWin.cs.meta b/Main/System/Login/GameAgeWarnWin.cs.meta
new file mode 100644
index 0000000..89d5447
--- /dev/null
+++ b/Main/System/Login/GameAgeWarnWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b2799fc2b27083f4e95c535c8c1627d5
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Login/GameNotice.cs b/Main/System/Login/GameNotice.cs
new file mode 100644
index 0000000..1701cf9
--- /dev/null
+++ b/Main/System/Login/GameNotice.cs
@@ -0,0 +1,62 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class GameNotice
+{
+    static bool noticeShowed = false;
+
+    public static void OpenGameNotice()
+    {
+        try
+        {
+            if (VersionUtility.Instance.versionInfo == null || noticeShowed)
+                return;
+            var url = VersionUtility.Instance.versionInfo.GetNoticeURL(VersionConfig.Get().branch);
+            if (!string.IsNullOrEmpty(url))
+            {
+                SDKUtils.Instance.OpenUrl(url);
+                noticeShowed = true;
+            }
+        }
+        catch (System.Exception ex)
+        {
+            noticeShowed = true;
+        }
+    }
+
+    public static bool HasNotice()
+    {
+        try
+        {
+            if (VersionUtility.Instance.versionInfo == null)
+                return false;
+            var url = VersionUtility.Instance.versionInfo.GetNoticeURL(VersionConfig.Get().branch);
+            Debug.LogFormat("鍏憡鍦板潃锛歿0}", url);
+            return !string.IsNullOrEmpty(url);
+        }
+        catch (System.Exception ex)
+        {
+            return false;
+        }
+    }
+
+    public static void OpenGameNoticeForce()
+    {
+        try
+        {
+            if (VersionUtility.Instance.versionInfo == null)
+                return;
+            var url = VersionUtility.Instance.versionInfo.GetNoticeURL(VersionConfig.Get().branch);
+            if (!string.IsNullOrEmpty(url))
+            {
+                SDKUtils.Instance.OpenUrl(url);
+            }
+        }
+        catch (System.Exception ex)
+        {
+            Debug.Log(ex);
+        }
+    }
+
+}
diff --git a/Main/System/Login/GameNotice.cs.meta b/Main/System/Login/GameNotice.cs.meta
new file mode 100644
index 0000000..9fcf32d
--- /dev/null
+++ b/Main/System/Login/GameNotice.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 6d2ea198f3b719542a730e8728d3f137
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Login/LoginWin.cs b/Main/System/Login/LoginWin.cs
new file mode 100644
index 0000000..3874f92
--- /dev/null
+++ b/Main/System/Login/LoginWin.cs
@@ -0,0 +1,351 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Diagnostics.Tracing;
+using UnityEngine;
+using UnityEngine.UI;
+
+public class LoginWin : UIBase, ICanvasRaycastFilter
+{
+    public static bool firstOpenEnd 
+    {
+        get;
+        private set;
+    }
+
+    private string m_ServerIP = "mobile.173on.com";
+    private int m_Port = 9090;
+    private int m_GamePort = 19006;
+
+
+    [SerializeField] Image m_Logo;
+    [SerializeField] UIAlphaTween m_AlphaTween;
+    [SerializeField] RectTransform m_WaitServerList;
+    [SerializeField] RectTransform m_ContainerEnterGame;
+    [SerializeField] RectTransform m_ContainerAccount;
+    [SerializeField] Image m_ServerState;
+    [SerializeField] Text m_ServerStateDescription;
+    [SerializeField] Text m_ServerName;
+    [SerializeField] protected InputField m_Account;
+    [SerializeField] Button m_EnterGame;
+    [SerializeField] Button m_QQLogin;
+    [SerializeField] Button m_WXLogin;
+    [SerializeField] Button m_ServerSelect;
+    [SerializeField] Button m_SwitchAccount;
+    [SerializeField] Button m_Notice;
+    [SerializeField] Button m_UserHelp;
+    [SerializeField] Button m_CleanCache;
+    [SerializeField] Toggle checkRead;
+    [SerializeField] Button serverRead;
+    [SerializeField] Button hideRead;
+    [SerializeField] Button ageWarn;
+    [SerializeField] Text verInfo;
+
+    protected override void InitComponent()
+    {
+        base.InitComponent();
+        Debug.Log("鍒濆鍖栫櫥褰曠獥鍙�");
+
+#if UNITY_EDITOR
+        m_Account.onEndEdit.AddListener(x => { EnterGame(); });
+#endif
+        m_EnterGame.SetListener(EnterGame);
+        m_QQLogin.SetListener(QQLogin);
+        m_WXLogin.SetListener(WXLogin);
+        m_ServerSelect.SetListener(OpenServerListWin);
+        m_SwitchAccount.SetListener(SwitchAccount);
+        m_Notice.SetListener(VeiwNotice);
+        if (m_UserHelp)
+        {
+            m_UserHelp.SetListener(OpenUserHelp);
+        }
+
+        m_CleanCache.SetListener(ResourcesPath.Instance.CleanCache);
+
+        serverRead.SetListener(() => {
+            GameAgeWarnWin win = UIManager.Instance.OpenWindow<GameAgeWarnWin>();
+            win.SetFunctionOrder(1);
+            // WindowCenter.Instance.OpenFromLocal<GameAgeWarnWin>(1);
+        });
+
+        hideRead.SetListener(() => {
+            GameAgeWarnWin win = UIManager.Instance.OpenWindow<GameAgeWarnWin>();
+            win.SetFunctionOrder(2);
+        });
+        ageWarn.SetListener(() => {
+            GameAgeWarnWin win = UIManager.Instance.OpenWindow<GameAgeWarnWin>();
+            win.SetFunctionOrder(3);
+        });
+    }
+
+    public override void HandleOpen()
+    {
+        base.HandleOpen();
+        Debug.Log("鎵撳紑鐧诲綍绐楀彛");
+
+
+        ServerListCenter.Instance.serverSelectEvent += OnServerChange;
+        ServerListCenter.Instance.onServerListRefreshEvent += OnServerListRefresh;
+
+        ServerListCenter.Instance.RequestPlayerServerList();
+        LoginManager.Instance.isLogined = false;
+        ServerListCenter.Instance.FiltrateDefaultServerAndServerGroup();
+        m_AlphaTween.SetStartState();
+
+        Refresh();
+
+        m_AlphaTween.Play(() => { 
+            firstOpenEnd = true;
+            InGameDownLoad.Instance.downLoadGo = false;
+            DownloadMgr.MaxDownLoadTask = InGameDownLoad.Instance.GetMaxTask();
+        });
+    }
+
+    public override void HandleClose()
+    {
+        base.HandleClose();
+        Debug.Log("鍏抽棴鐧诲綍绐楀彛");
+        ServerListCenter.Instance.serverSelectEvent -= OnServerChange;
+        ServerListCenter.Instance.onServerListRefreshEvent -= OnServerListRefresh;
+
+        SDKUtils.Instance.onFreePlatformLoginOk -= OnLoginOk;
+        SDKUtils.Instance.SendShowFloatWin();
+    }
+
+    public override void Refresh()
+    {
+        base.Refresh();
+        Debug.Log("鍒锋柊鐧诲綍绐楀彛");
+
+
+        //  鐗堟湰淇℃伅
+        string strVersion = StringUtility.Contact("ver ", InitialFunctionConfig.Get("version").Numerical1);
+        verInfo.text = strVersion;
+
+        // var sprite = BuiltInLoader.LoadSprite("TB_DL_Logo");
+        // m_Logo.overrideSprite = sprite;
+        // m_Logo.SetNativeSize();
+        m_Logo.rectTransform.anchoredPosition = VersionConfig.Get().logoPosition;
+        m_Notice.SetActive(GameNotice.HasNotice());
+
+        // var sprite = BuiltInLoader.LoadSprite("TB_DL_Logo");
+
+        // TODO YYL
+        // bool hasNotice = GameNotice.HasNotice();
+
+        //  璐﹀彿鍒囨崲
+        m_SwitchAccount.SetActive(false);
+        //  鐢ㄦ埛甯姪
+        // TODO YYL
+        // var appId = VersionConfig.Get().appId;
+        // var branch = VersionConfig.Get().branch;
+        // m_UserHelp.SetActive(ContactConfig.GetConfig(appId, branch) != null);
+
+        //  鏄惁宸茬粡鑾峰彇鍒版湇鍔″櫒鍒楄〃
+        bool isGetServerList = ServerListCenter.Instance.serverListGot;
+        m_WaitServerList.SetActive(!isGetServerList);
+
+        m_ContainerEnterGame.SetActive(isGetServerList);
+        m_ContainerAccount.SetActive(isGetServerList
+            && (VersionConfig.Get().versionAuthority == VersionAuthority.InterTest || VersionConfig.Get().isBanShu));
+        // loginBtn.SetActive(isGetServerList);
+
+        if (isGetServerList)
+        {
+            ChangeServerInfo(ServerListCenter.Instance.currentServer);
+        }
+
+
+        ChangeUserInfo(LoginManager.Instance.localSaveAccountName);
+
+        m_EnterGame.SetActive(true);
+        m_QQLogin.SetActive(false);
+        m_WXLogin.SetActive(false);
+
+        // 鐢ㄦ埛鍗忚 todo
+        checkRead.isOn = LocalSave.GetBool("tqsecretToggle");
+    }
+
+    private void OnLoginOk(SDKUtils.FP_LoginOk arg0)
+    {
+    }
+
+    private void OnServerChange()
+    {
+        ChangeServerInfo(ServerListCenter.Instance.currentServer);
+    }
+
+    // private void OnLoginBtnClick()
+    // {
+    //     //  TODO 鐧诲綍
+    //     Debug.Log("鐧诲綍" + username.text + " / " + password.text);
+    //     CloseWindow();
+
+    //     StageManager.Instance.ToGameScene();
+    // }
+
+    private void ChangeServerInfo(ServerData _serverData)
+    {
+        // m_ServerName.text = _serverData.name.Replace("@gm", "");
+        m_ServerIP = _serverData.region_domain;
+        m_Port = _serverData.login_port;
+        m_GamePort = _serverData.game_port;
+
+        switch ((ServerState)_serverData.running_status)
+        {
+            case ServerState.Maintain:
+            case ServerState.Predicted:
+                // m_ServerState.SetSprite("XT_FWQ_TB4");
+                // m_ServerStateDescription.text = Language.GetFromLocal(29);
+                break;
+            case ServerState.Normal:
+                // m_ServerState.SetSprite("XT_FWQ_TB2");
+                // m_ServerStateDescription.text = Language.GetFromLocal(28);
+                break;
+            case ServerState.Busy:
+                // m_ServerState.SetSprite("XT_FWQ_TB3");
+                // m_ServerStateDescription.text = Language.GetFromLocal(27);
+                break;
+            case ServerState.Hot:
+                // m_ServerState.SetSprite("XT_FWQ_TB1");
+                // m_ServerStateDescription.text = Language.GetFromLocal(26);
+                break;
+        }
+    }
+
+    private void ChangeUserInfo(string user)
+    {
+        // m_Account.text = user;
+    }
+
+    private void OnServerListRefresh()
+    {
+        // m_WaitServerList.SetActive(!ServerListCenter.Instance.serverListGot);
+        // m_ContainerEnterGame.SetActive(ServerListCenter.Instance.serverListGot);
+        // m_ContainerAccount.SetActive(ServerListCenter.Instance.serverListGot
+        //     && (VersionConfig.Get().versionAuthority == VersionAuthority.InterTest || VersionConfig.Get().isBanShu));
+    }
+
+    protected virtual void EnterGame()
+    {
+        if (!checkRead.isOn)
+        {
+            //  TODO YYL
+            // ConfirmCancel.ShowPopConfirm(Language.Get("agreementTitle"), Language.Get("agreementInfo"));
+            LocalSave.SetBool("tqsecretToggle", false); //鏂逛究娴嬭瘯
+            return;
+        }
+
+        LocalSave.SetBool("tqsecretToggle", true);
+
+        SDKUtils.Instance.SendHideFloatWin();
+
+        Login();
+
+        //鍒拌繖閲屼竴瀹氭槸涓嬭浇琛ㄧ粨鏉�
+        InGameDownLoad.Instance.SetDownloadMark();
+    }
+
+    protected void LateUpdate()
+    {
+        raycastTarget = true;
+        LoginManager.Instance.RequestServerListLoop();
+    }
+
+
+    protected void QQLogin()
+    {
+        SDKUtils.Instance.TencentLogin("Login");
+    }
+
+    protected void WXLogin()
+    {
+        SDKUtils.Instance.TencentLogin("Loginwx");
+    }
+
+    private void OpenServerListWin()
+    {
+        // TODO YYL
+        UIManager.Instance.OpenWindow<ServerListWin>();
+    }
+
+    private void SwitchAccount()
+    {
+        SDKUtils.Instance.FreePlatformLoginout();
+        LoginManager.Instance.sdkLogined = true;
+    }
+
+    private void VeiwNotice()
+    {
+        GameNotice.OpenGameNoticeForce();
+    }
+
+    private void OpenUserHelp()
+    {
+         // TODO YYL
+        // UIManager.Instance.OpenWindow<UserHelpWin>();
+    }
+
+
+    protected void Login()
+    {
+        var allow = false;
+        if (DebugUtility.Instance.isWhiteListAccount)
+        {
+            allow = true;
+        }
+        else
+        {
+            if (ServerListCenter.Instance.currentServer.running_status == (int)ServerState.Maintain
+                || ServerListCenter.Instance.currentServer.running_status == (int)ServerState.Predicted)
+            {
+                allow = false;
+            }
+            else
+            {
+                allow = true;
+            }
+        }
+
+        if (!allow)
+        {
+            switch ((ServerState)ServerListCenter.Instance.currentServer.running_status)
+            {
+                //  TODO YYL
+                case ServerState.Maintain:
+                    // SysNotifyMgr.Instance.ShowTip("ServerDown");
+                    break;
+                case ServerState.Predicted:
+                    // SysNotifyMgr.Instance.ShowTip("ServerOpen", ServerListCenter.Instance.currentServer.start_date.ToString("yyyy-MM-dd HH:mm"));
+                    break;
+            }
+
+            return;
+        }
+
+        if (GameNetSystem.Instance.netState == GameNetSystem.NetState.NerverConnect)
+        {
+            switch (VersionConfig.Get().versionAuthority)
+            {
+                case VersionAuthority.InterTest:
+                    if (string.IsNullOrEmpty(m_Account.text))
+                    {
+                        // TODO YYL
+                        // ServerTipDetails.DisplayNormalTip(Language.Get("L1095"));
+                        return;
+                    }
+
+                    LoginManager.Instance.AccountLogin(m_Account.text, m_ServerIP, m_Port, m_GamePort);
+                    break;
+                case VersionAuthority.Release:
+                    LoginManager.Instance.AccountLogin(m_ServerIP, m_Port, m_GamePort);
+                    break;
+            }
+
+            //  TODO YYL
+            // OperationLogCollect.Instance.RecordLauchEvent(6);
+            // OperationLogCollect.Instance.RecordEvent(7);
+        }
+
+    }
+}
diff --git a/Main/UI/Login/LoginWin.cs.meta b/Main/System/Login/LoginWin.cs.meta
similarity index 100%
rename from Main/UI/Login/LoginWin.cs.meta
rename to Main/System/Login/LoginWin.cs.meta
diff --git a/Main/System/Login/ServerGroupToggle.cs b/Main/System/Login/ServerGroupToggle.cs
new file mode 100644
index 0000000..16b4477
--- /dev/null
+++ b/Main/System/Login/ServerGroupToggle.cs
@@ -0,0 +1,49 @@
+锘�//--------------------------------------------------------
+//    [Author]:           绗簩涓栫晫
+//    [  Date ]:           Wednesday, January 10, 2018
+//--------------------------------------------------------
+using UnityEngine;
+using System.Collections;
+using UnityEngine.UI;
+
+
+public class ServerGroupToggle : ScrollItem
+{
+    [SerializeField] Toggle m_Toggle;
+    public Toggle toggle { get { return m_Toggle; } }
+    [SerializeField] Text m_Title;
+    [SerializeField] FontColorSizeConfig m_FontColor;
+
+    int startIndex = 0;
+    int count = 0;
+
+    string groupName;
+
+    public override void Display(object _data)
+    {
+        base.Display(_data);
+
+        groupName = (string)_data;
+        m_Title.text = groupName;
+
+        m_Toggle.isOn = groupName == ServerListCenter.Instance.currentServerGroup;
+        m_Title.color = m_FontColor.GetColorSize(m_Toggle.isOn ? "Selected" : "Normal").color;
+
+        m_Toggle.RemoveAllListeners();
+        m_Toggle.AddListener(OnSelected);
+    }
+
+    public override void Dispose()
+    {
+        base.Dispose();
+    }
+
+    private void OnSelected(bool _value)
+    {
+        m_Title.color = m_FontColor.GetColorSize(_value ? "Selected" : "Normal").color;
+        if (_value)
+        {
+            ServerListCenter.Instance.currentServerGroup = groupName;
+        }
+    }
+}
diff --git a/Main/System/Login/ServerGroupToggle.cs.meta b/Main/System/Login/ServerGroupToggle.cs.meta
new file mode 100644
index 0000000..7b7c54a
--- /dev/null
+++ b/Main/System/Login/ServerGroupToggle.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 192bb0e4edd5b9146a748091369c503f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Login/ServerListWin.cs b/Main/System/Login/ServerListWin.cs
new file mode 100644
index 0000000..5fd6507
--- /dev/null
+++ b/Main/System/Login/ServerListWin.cs
@@ -0,0 +1,109 @@
+锘縰sing UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine.UI;
+using DG.Tweening;
+using Cysharp.Threading.Tasks;
+
+public class ServerListWin : UIBase
+{
+    // 缁勪欢寮曠敤
+    [SerializeField] CyclicScroll m_ServerGroupScroll;
+    [SerializeField] CyclicScroll m_ServerScroll;
+    [SerializeField] Button m_Close;
+
+    // 鐢熷懡鍛ㄦ湡
+    protected override void Awake()
+    {
+        base.Awake();
+        // 鍒濆鍖栫粍浠跺紩鐢�
+    }
+
+    protected override void Start()
+    {
+        base.Start();
+        // 鍒濆鍖栨暟鎹�
+    }
+
+    protected override void InitComponent()
+    {
+        base.InitComponent();
+        m_Close.AddListener(CloseWindow);
+    }
+
+    // UI浜嬩欢
+    protected override void OnOpen()
+    {
+        base.OnOpen();
+        // 绐楀彛鎵撳紑鏃剁殑閫昏緫
+        ServerListCenter.Instance.serverGroupSelectEvent += RefreshServerList;
+        m_ServerGroupScroll.Init(ServerListCenter.Instance.GetAllServerGroup());
+        RefreshServerList();
+    }
+
+    protected override void OnClose()
+    {
+        base.OnClose();
+        // 绐楀彛鍏抽棴鏃剁殑閫昏緫
+        ServerListCenter.Instance.serverGroupSelectEvent -= RefreshServerList;
+    }
+
+    public override void Refresh()
+    {
+        base.Refresh();
+        // 鍒锋柊UI鏄剧ず
+    }
+
+
+    private void RefreshServerList()
+    {
+        ServerGroup serverGroup = null;
+        if (ServerListCenter.Instance.TryGetServerGroup(ServerListCenter.Instance.currentServerGroup, out serverGroup))
+        {
+            if (serverGroup.group_list != null)
+            {
+                var groupDatas = new List<ServerDataCouple>();
+                var serverDataList = new List<ServerData>(serverGroup.group_list);
+
+                for (int i = serverDataList.Count - 1; i >= 0; i--)
+                {
+                    if (VersionConfig.Get().isBanShu)
+                    {
+                        if (serverDataList[i].region_flag != 8000)
+                        {
+                            serverDataList.RemoveAt(i);
+                        }
+                    }
+                    else
+                    {
+                        if (serverDataList[i].region_flag == 8000)
+                        {
+                            serverDataList.RemoveAt(i);
+                        }
+                    }
+                }
+
+                serverDataList.Sort(ServerData.Compare);
+                var max = serverDataList.Count;
+                for (int i = 0; i < max; i++, i++)
+                {
+                    if (i + 1 < max)
+                    {
+                        groupDatas.Add(new ServerDataCouple(serverDataList[i], serverDataList[i + 1]));
+                    }
+                    else
+                    {
+                        groupDatas.Add(new ServerDataCouple(serverDataList[i]));
+                    }
+                }
+
+                m_ServerScroll.Init(groupDatas);
+            }
+            else
+            {
+                m_ServerScroll.Init<ServerDataCouple>(null);
+            }
+
+        }
+    }
+}
diff --git a/Main/System/Login/ServerListWin.cs.meta b/Main/System/Login/ServerListWin.cs.meta
new file mode 100644
index 0000000..d7d9b71
--- /dev/null
+++ b/Main/System/Login/ServerListWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c6340fed6a9d02445b05bc07bc6644aa
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/NetLink.meta b/Main/System/NetLink.meta
new file mode 100644
index 0000000..e3d99c3
--- /dev/null
+++ b/Main/System/NetLink.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 96479f08f2fa4f640bb411315f5ce16b
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/NetLink/NetLinkWin.cs b/Main/System/NetLink/NetLinkWin.cs
new file mode 100644
index 0000000..9d795e9
--- /dev/null
+++ b/Main/System/NetLink/NetLinkWin.cs
@@ -0,0 +1,90 @@
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine.UI;
+using DG.Tweening;
+using Cysharp.Threading.Tasks;
+
+public class NetLinkWin : UIBase
+{
+    // 缁勪欢寮曠敤
+    [SerializeField] Transform backGround;
+    [SerializeField] Transform circle;
+
+    static float linkOverTime = 0f;
+    float timer = 0f;
+    bool actived = false;
+    // 鐢熷懡鍛ㄦ湡
+    protected override void Awake()
+    {
+        base.Awake();
+        // 鍒濆鍖栫粍浠跺紩鐢�
+    }
+    
+
+    protected override void Start()
+    {
+        base.Start();
+        // 鍒濆鍖栨暟鎹�
+    }
+
+    protected override void InitComponent()
+    {
+        base.InitComponent();
+    }
+
+    // UI浜嬩欢
+    protected override void OnOpen()
+    {
+        base.OnOpen();
+        // 绐楀彛鎵撳紑鏃剁殑閫昏緫
+        timer = 0f;
+        if (linkOverTime > 0.001f)
+        {
+            actived = false;
+            backGround.SetActive(false);
+            circle.SetActive(false);
+        }
+        else
+        {
+            actived = true;
+            backGround.SetActive(true);
+            circle.SetActive(true);
+        }
+    }
+
+    protected override void OnClose()
+    {
+        base.OnClose();
+        // 绐楀彛鍏抽棴鏃剁殑閫昏緫
+    }
+
+    public override void Refresh()
+    {
+        base.Refresh();
+        // 鍒锋柊UI鏄剧ず
+    }
+
+    protected void LateUpdate()
+    {
+        timer += Time.deltaTime;
+
+        if (!actived && timer > linkOverTime)
+        {
+            backGround.SetActive(true);
+            circle.SetActive(true);
+        }
+    }
+
+    public static void Show(float _delay = 0f)
+    {
+        linkOverTime = _delay;
+
+        UIManager.Instance.OpenWindow<NetLinkWin>();
+    }
+
+    public static void Hide()
+    {
+        UIManager.Instance.CloseWindow<NetLinkWin>();
+    }
+}
diff --git a/Main/System/NetLink/NetLinkWin.cs.meta b/Main/System/NetLink/NetLinkWin.cs.meta
new file mode 100644
index 0000000..b95387f
--- /dev/null
+++ b/Main/System/NetLink/NetLinkWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: dd817f590609dcd458019e2ef2d4f992
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/UI/Login/LoginWin.cs b/Main/UI/Login/LoginWin.cs
deleted file mode 100644
index 62796b5..0000000
--- a/Main/UI/Login/LoginWin.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.Diagnostics.Tracing;
-using UnityEngine;
-using UnityEngine.UI;
-
-public class LoginWin : UIBase
-{
-    private InputField username;
-    private InputField password;
-    private Button loginBtn;
-    private Button registerBtn;
-
-    protected override void InitComponent()
-    {
-        base.InitComponent();
-        Debug.Log("鍒濆鍖栫櫥褰曠獥鍙�");
-        username = transform.Find("InputUserName").GetComponent<InputField>();
-        password = transform.Find("InputPassword").GetComponent<InputField>();
-        loginBtn = transform.Find("Buttons/ButtonLogin").GetComponent<Button>();
-        registerBtn = transform.Find("Buttons/ButtonRegister").GetComponent<Button>();
-
-        loginBtn.onClick.AddListener(OnLoginBtnClick);
-        registerBtn.onClick.AddListener(OnRegisterBtnClick);
-    }
-
-    public override void HandleOpen()
-    {
-        base.HandleOpen();
-        Debug.Log("鎵撳紑鐧诲綍绐楀彛");
-        Refresh();
-    }
-
-    public override void HandleClose()
-    {
-        base.HandleClose();
-        Debug.Log("鍏抽棴鐧诲綍绐楀彛");
-    }
-
-    public override void Refresh()
-    {
-        base.Refresh();
-        Debug.Log("鍒锋柊鐧诲綍绐楀彛");
-    }
-
-    private void OnRegisterBtnClick()
-    {
-        //  TODO 娉ㄥ唽
-        Debug.Log("娉ㄥ唽");
-    }
-
-    private void OnLoginBtnClick()
-    {
-        //  TODO 鐧诲綍
-        Debug.Log("鐧诲綍" + username.text + " / " + password.text);
-        UIManager.Instance.CloseWindow(this);
-
-        StageManager.Instance.ToGameScene();
-    }
-}
diff --git a/Main/UI/UIBase.cs b/Main/UI/UIBase.cs
index 52b4fc7..79f73fd 100644
--- a/Main/UI/UIBase.cs
+++ b/Main/UI/UIBase.cs
@@ -391,6 +391,17 @@
     }
     #endregion
 
+    public bool raycastTarget
+    {
+        get;
+        set;
+    } = true;
+
+    public bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera)
+    {
+        return raycastTarget;
+    }
+
     #region 鍔ㄧ敾鏂规硶
 
     // 鍋滄褰撳墠姝e湪鎾斁鐨勫姩鐢�

--
Gitblit v1.8.0