JJBB/Assets/Project/Script/GUI/Login/LoginUILogic.cs

353 lines
11 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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为-1ip是报错
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<GameManager>();
// 特殊第一个SceneLogic不会过Loading
if (!IndependentEffectManager.Instance)
gameGo.AddComponent<IndependentEffectManager>();
}
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
}