(client) feat:实现热重载
This commit is contained in:
@ -2,6 +2,7 @@ using System.Collections;
|
||||
using Logging;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
|
||||
namespace Base
|
||||
{
|
||||
@ -58,11 +59,19 @@ namespace Base
|
||||
|
||||
private void Start()
|
||||
{
|
||||
if (!Program.Instance.needLoad)
|
||||
return;
|
||||
Base.Setting.Instance.Init();
|
||||
#if !DEBUG
|
||||
duration = Base.Setting.Instance.progressStepDuration;
|
||||
fadeDuration = Base.Setting.Instance.exitAnimationDuration;
|
||||
duration = Base.Setting.Instance.CurrentSettings.progressStepDuration;
|
||||
fadeDuration = Base.Setting.Instance.CurrentSettings.exitAnimationDuration;
|
||||
#endif
|
||||
Load();
|
||||
Program.Instance.needLoad = false;
|
||||
}
|
||||
|
||||
public void Load()
|
||||
{
|
||||
loadingUI.SetActive(true);
|
||||
textColor = describeText.color;
|
||||
StartCoroutine(LoadAllManagers());
|
||||
@ -72,17 +81,35 @@ namespace Base
|
||||
{
|
||||
for (var i = 0; i < _loadingSteps.Length; i++)
|
||||
{
|
||||
// 更新描述文本
|
||||
// 更新描述文本(放在try外部)
|
||||
describeText.text = _loadingSteps[i];
|
||||
|
||||
// 获取当前阶段的目标进度
|
||||
var targetProgress = (float)(i + 1) / _loadingSteps.Length;
|
||||
|
||||
// 平滑过渡到下一个阶段
|
||||
// 平滑过渡到下一个阶段(放在try外部)
|
||||
yield return SmoothTransitionTo(targetProgress);
|
||||
|
||||
// 初始化对应的管理器
|
||||
switch (i)
|
||||
// 初始化对应的管理器(使用单独的方法处理可能抛出的异常)
|
||||
yield return InitializeManagerSafely(i);
|
||||
}
|
||||
|
||||
// 加载完成后的处理
|
||||
describeText.text = "加载完成!";
|
||||
Progress = 1f;
|
||||
|
||||
// 开始渐隐效果
|
||||
yield return FadeOutProgressBar();
|
||||
}
|
||||
|
||||
private IEnumerator InitializeManagerSafely(int stepIndex)
|
||||
{
|
||||
bool initSuccess = false;
|
||||
System.Exception initException = null;
|
||||
|
||||
try
|
||||
{
|
||||
switch (stepIndex)
|
||||
{
|
||||
case 0:
|
||||
UnityLogger.Init();
|
||||
@ -103,16 +130,25 @@ namespace Base
|
||||
Managers.ItemResourceManager.Instance.Init();
|
||||
break;
|
||||
}
|
||||
initSuccess = true;
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
initException = ex;
|
||||
}
|
||||
|
||||
// 加载完成后的处理
|
||||
describeText.text = "加载完成!";
|
||||
Progress = 1f;
|
||||
if (!initSuccess && initException != null)
|
||||
{
|
||||
Debug.LogError($"初始化第 {stepIndex + 1} 个管理器时出错: {initException.Message}\n{initException.StackTrace}");
|
||||
describeText.text = $"{_loadingSteps[stepIndex]} (初始化失败)";
|
||||
|
||||
// 这里可以添加重试逻辑
|
||||
// yield return RetryInitialize(stepIndex);
|
||||
}
|
||||
|
||||
// 开始渐隐效果
|
||||
yield return FadeOutProgressBar();
|
||||
// 确保协程继续执行
|
||||
yield return null;
|
||||
}
|
||||
|
||||
private IEnumerator SmoothTransitionTo(float targetProgress)
|
||||
{
|
||||
var startProgress = _currentProgress;
|
||||
@ -146,5 +182,10 @@ namespace Base
|
||||
Opacity = 0f;
|
||||
loadingUI.SetActive(false);
|
||||
}
|
||||
|
||||
public static void ToScene(string scene)
|
||||
{
|
||||
SceneManager.LoadScene(scene);
|
||||
}
|
||||
}
|
||||
}
|
@ -64,6 +64,11 @@ namespace Base
|
||||
ApplyWindowSettings();
|
||||
}
|
||||
|
||||
public void Apply()
|
||||
{
|
||||
ApplyAudioSettings();
|
||||
ApplyWindowSettings();
|
||||
}
|
||||
// 应用音频设置
|
||||
private void ApplyAudioSettings()
|
||||
{
|
||||
|
@ -121,6 +121,21 @@ namespace Base
|
||||
needUpdate = true;
|
||||
}
|
||||
|
||||
public void Show(string uiName)
|
||||
{
|
||||
foreach (var window in _allWindows)
|
||||
{
|
||||
if (window.name == uiName)
|
||||
{
|
||||
Show(window);
|
||||
return;
|
||||
}
|
||||
}
|
||||
Debug.LogWarning($"未找到窗口{uiName}");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 公开的隐藏窗口方法
|
||||
/// </summary>
|
||||
@ -133,7 +148,25 @@ namespace Base
|
||||
windowToHide.Hide();
|
||||
needUpdate = true;
|
||||
}
|
||||
public void Hide(string uiName)
|
||||
{
|
||||
foreach (var visibleWindow in _visibleWindows)
|
||||
{
|
||||
if (visibleWindow.name == uiName)
|
||||
{
|
||||
Hide(visibleWindow);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void HideAll()
|
||||
{
|
||||
foreach (var visibleWindow in _visibleWindows)
|
||||
{
|
||||
Hide(visibleWindow);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 根据当前所有可见窗口的 needPause 属性来更新游戏时钟的暂停状态
|
||||
/// </summary>
|
||||
|
Reference in New Issue
Block a user