(client) feat:实现热重载

This commit is contained in:
m0_75251201
2025-08-20 17:55:22 +08:00
parent d91210a6ff
commit 3e099137a1
20 changed files with 8636 additions and 480 deletions

View File

@ -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);
}
}
}

View File

@ -64,6 +64,11 @@ namespace Base
ApplyWindowSettings();
}
public void Apply()
{
ApplyAudioSettings();
ApplyWindowSettings();
}
// 应用音频设置
private void ApplyAudioSettings()
{

View File

@ -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>