using System; using System.Collections; using AssetManagement; using AssetUpdate; using Games.Events; using Games.GlobeDefine; using Module.Log; using UnityEngine; using UnityEngine.SceneManagement; // 暂时保持这个Ui执行全部登录阶段操作的流程 public class LoginUILogic : MonoBehaviour { private static LoginUILogic _instance; // 初始启动不试图执行更新检查 private static bool _firstLaunch = true; private void Awake() { if (_instance) Destroy(_instance.gameObject); _instance = this; // 暂时没有地方初始化LoginData,直接用这个最早激活的玩意搞 LoginData.Init(); // GuiTextDebug.debug("LoginUILogic awake"); AssetUpdateDownloaderTick.CreateInstance(); print("Init AssetUpdateDownloaderTick"); if (!LoadAssetBundle.Instance) LoadAssetBundle.CreateInstance(); if (!FirstSceneBg.instance) FirstSceneBg.CreateInstance(); AssetUpdateManager.CreateEventSystem(); DontDestroyOnLoad(gameObject); } public void Start() { Debug.Log("初始化 游戏"); EventDispatcher.Instance.Add(EventId.SdkPhpLogin, OnPhpLoginComplete); // 在开始执行画质Init,防止多余的Shader变体被加载 QualityDetector.InitQuality(); QualitySettings.shadowCascades = 2; QualitySettings.shadowDistance = 32f; QualitySettings.shadowResolution = ShadowResolution.High; QualitySettings.shadowmaskMode = ShadowmaskMode.Shadowmask; QualitySettings.shadowProjection = ShadowProjection.CloseFit; if (FirstSceneBg.instance) { FirstSceneBg.instance.SetTip("初始化游戏..."); FirstSceneBg.instance.ShowGameVersion(); } LoginData.onSdkEvent += OnSdkCallBack; LoginData.onServerList += OnServerList; if (_firstLaunch || AssetUpdateManager.useResources) StartLoadResource(); else StartCoroutine(CheckVersionAction()); } private void Update() { LoadResourceUpdate(); } private void OnDestroy() { _instance = null; if (!SdkControl.appQuit) { LoginData.onSdkEvent -= OnSdkCallBack; LoginData.onServerList -= OnServerList; EventDispatcher.Instance.Remove(EventId.SdkPhpLogin, OnPhpLoginComplete); } } private IEnumerator CheckVersionAction() { var action = new HttpsGetAction(10f); action.Start(); while (!action.UpdateTimeout()) yield return null; var jsonAssetInfo = AssetUpdateManager.HandleHttpGetAction(action); if (jsonAssetInfo == null) OnJsonError(); else if (!jsonAssetInfo.apkVersion.Equals(AssetUpdateManager.apkVersion, StringComparison.Ordinal)) AssetUpdateManager.OpenApkUri(jsonAssetInfo.apkUri); else if (jsonAssetInfo.assetVersion != AssetUpdateManager.assetVersion) LiteConfirmWin.Open("游戏资源更新", "游戏资源需要更新!\n请重新启动游戏开始更新!", new LiteConfirmButtonData("确定", OnRestartConfirm)); else StartLoadResource(); } private void OnJsonError() { StartCoroutine(CheckVersionAction()); } private static void OnRestartConfirm() { SdkControl.instance.CloseGame(); } public static LoginUILogic Instance() { return _instance; } private void OnSdkCallBack(SdkEventData data) { switch (data.type) { case SdkEventType.LoginSdk: { // SdkItem处理登录失败的情况 if (data.success) { SdkControl.instance.GetServerList(); } else { var segments = data.args.Split(','); var message = segments.Length > 1 ? segments[1] : "登录失败"; MessageBoxLogic.OpenOKBox("登录失败", message, () => SdkControl.instance.LoginSdk(false)); } } break; } } public void ConnectToServer(LoginData.ServerListData serverData) { SdkControl.instance.LoginPhp(serverData); } private void OnPhpLoginComplete(object args) { var loginData = args as SdkPhpLoginResult; if (loginData != null) { if (loginData.success) ServerChooseController.Instance().ConnectWithIp(loginData.ip, loginData.port); // Hack:登录失败时,port为-1,ip是报错 else MessageBoxLogic.OpenOKBox(loginData.ip, loginData.ip); } else { MessageBoxLogic.OpenOKBox("无法登录服务器", "请在网络状态良好时再次尝试!"); } } private void OnServerList(string error) { if (string.IsNullOrEmpty(error)) TryToInitGame(); else MessageBoxLogic.OpenOKBox(error, error, () => SdkControl.instance.GetServerList()); } private void InitUI() { GameManager.gameManager.SoundManager.PlaySceneMusic(); LoadAssetBundle.Instance.LoadUI(UIInfo.UiRoot.path, UIInfo.UiRoot.name, OnUiRootLoaded, new Hashtable()); } private void OnUiRootLoaded(string path, GameObject prefab, Hashtable hash) { if (!prefab) { LogModule.ErrorLog("Failed to load UiRoot! This is not recoverable!"); return; } Instantiate(prefab); EnterServerChoose(); LoadAssetBundle.Instance.StartBackGround(); } public void ReturnToServerChoose() { NetWorkLogic.GetMe().DisconnectServer(); LoginData.serverListData.Clear(); LoginData.accountData = null; SdkControl.instance.GetServerList(); } public void LoginSuccess() { if (LoginData.loginRoleList.Count > 0) EnterChooseRole(); else EnterCreateRole(); } public void EnterServerChoose() { ShowUiBg(false); GuiTextDebug.debug("EnterServerChoose"); UIManager.ShowUI(UIInfo.ServerChoose); } public void RetSelectRoleFail(GC_SELECTROLE_RET.SELECTROLE_RESULT result) { // 选择角色失败,点击确定返回登录界面 MessageBoxLogic.OpenOKBox(1291, 1000, EnterServerChoose); } public void EnterAccount() { // 未使用Sdk,或者Sdk不提供角色信息的情况 if (LoginData.accountData != null) NetManager.SendUserLogin(LoginData.Ret_Login, false); else MessageInputLogic.ShowMessageInput(PlayerPreferenceData.LastAccount, "账号", InputAccountResult); } public void InputAccountResult(string account) { if (!string.IsNullOrEmpty(account)) { var accountData = new LoginData.AccountData(); accountData.SetTestData(account); LoginData.accountData = accountData; NetManager.SendUserLogin(LoginData.Ret_Login, false); } } public void EnterChooseRole() //角色选择 { HideUiBg(); UIManager.ShowUI(UIInfo.RoleChoose); } public void EnterCreateRole() { HideUiBg(); UIManager.ShowUI(UIInfo.RoleCreate); } private static void ShowUiBg(bool withTip) { var bg = FirstSceneBg.instance; if (bg) { bg.gameObject.SetActive(true); bg.ShowTip(withTip); } } private static void HideUiBg() { if (FirstSceneBg.instance) FirstSceneBg.instance.gameObject.SetActive(false); } public static void RequestRandomName(int maleOrFemale) { var packet = (CG_REQ_RANDOMNAME)PacketDistributed.CreatePacket(MessageID.PACKET_CG_REQ_RANDOMNAME); packet.SetSex(maleOrFemale); packet.SendPacket(); } #region LoadResourceUpdate private void StartLoadResource() { _firstLaunch = false; SdkControl.instance.LoginSdk(true); _LoadStage = LoadStage.InitLua; } private enum LoadStage { None, InitLua, Ready, ReadyWait, FinalStep, Complete } private LoadStage _LoadStage = LoadStage.None; private SceneHandle _loadSceneHandle; private void TryToInitGame() { if (_LoadStage == LoadStage.Complete && LoginData.serverListData != null) { //设置当前场景 if (!GameManager.gameManager) { var gameGo = new GameObject("GameManager"); gameGo.AddComponent(); // 特殊:第一个SceneLogic不会过Loading if (!IndependentEffectManager.Instance) gameGo.AddComponent(); } GameManager.gameManager.InitGame(); GameManager.gameManager.UnloadUnusedAssets(true); // 初始化UI InitUI(); } } private void LoadResourceUpdate() { if (_LoadStage == LoadStage.None || _LoadStage == LoadStage.Complete) return; if (_LoadStage == LoadStage.InitLua) { if (FirstSceneBg.instance) FirstSceneBg.instance.SetTip("加载游戏脚本中..."); _LoadStage = LoadStage.Ready; try { LuaMain.InitLusScripts(); LuaMessageManager.Instance.InitMessageManager(); //TableManagerLua.Instance.LoadTableLua(); } catch (Exception e) { GuiTextDebug.debug("LoadLua error:" + e); LogModule.DebugLog("LoadLua error:" + e); } } else if (_LoadStage == LoadStage.Ready) { if (FirstSceneBg.instance) FirstSceneBg.instance.SetTip(UpdateTips.GetTipByID(26)); if (LoadAssetBundle.Instance.LoadMainScene(GlobeVar.sceneRole, LoadSceneMode.Single, out _loadSceneHandle)) _LoadStage = LoadStage.ReadyWait; } else if (_LoadStage == LoadStage.ReadyWait) { if (_loadSceneHandle == null || _loadSceneHandle.state != SceneHandle.SceneState.notLoad) _LoadStage = LoadStage.FinalStep; } else if (_LoadStage == LoadStage.FinalStep) { _LoadStage = LoadStage.Complete; TryToInitGame(); } } #endregion }