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

353 lines
11 KiB
C#
Raw Normal View History

2024-08-23 15:49:34 +08:00
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");
2024-08-23 15:49:34 +08:00
if (!LoadAssetBundle.Instance)
LoadAssetBundle.CreateInstance();
if (!FirstSceneBg.instance)
FirstSceneBg.CreateInstance();
AssetUpdateManager.CreateEventSystem();
DontDestroyOnLoad(gameObject);
}
public void Start()
{
Debug.Log("初始化 游戏");
2024-08-23 15:49:34 +08:00
EventDispatcher.Instance.Add(EventId.SdkPhpLogin, OnPhpLoginComplete);
// 在开始执行画质Init防止多余的Shader变体被加载
QualityDetector.InitQuality();
QualitySettings.shadowCascades = 2;
QualitySettings.shadowDistance = 32f;
2024-08-23 15:49:34 +08:00
QualitySettings.shadowResolution = ShadowResolution.High;
QualitySettings.shadowmaskMode = ShadowmaskMode.Shadowmask;
2024-08-23 15:49:34 +08:00
QualitySettings.shadowProjection = ShadowProjection.CloseFit;
if (FirstSceneBg.instance)
{
FirstSceneBg.instance.SetTip("初始化游戏...");
FirstSceneBg.instance.ShowGameVersion();
}
LoginData.onSdkEvent += OnSdkCallBack;
2024-08-23 15:49:34 +08:00
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;
2024-08-23 15:49:34 +08:00
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));
2024-08-23 15:49:34 +08:00
else
StartLoadResource();
}
private void OnJsonError()
{
StartCoroutine(CheckVersionAction());
}
2024-08-23 15:49:34 +08:00
private static void OnRestartConfirm()
{
SdkControl.instance.CloseGame();
}
2024-08-23 15:49:34 +08:00
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] : "登录失败";
2024-08-23 15:49:34 +08:00
MessageBoxLogic.OpenOKBox("登录失败", message,
() => SdkControl.instance.LoginSdk(false));
2024-08-23 15:49:34 +08:00
}
}
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());
2024-08-23 15:49:34 +08:00
}
private void InitUI()
{
GameManager.gameManager.SoundManager.PlaySceneMusic();
LoadAssetBundle.Instance.LoadUI(UIInfo.UiRoot.path, UIInfo.UiRoot.name,
OnUiRootLoaded, new Hashtable());
2024-08-23 15:49:34 +08:00
}
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);
2024-08-23 15:49:34 +08:00
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;
2024-08-23 15:49:34 +08:00
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
}