fix(ui): 主界面加载前黑屏遮罩,就绪后再淡出

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-02 16:38:06 +08:00
co-authored by Cursor
parent fa3954bbbb
commit 80d32a73d8
3 changed files with 65 additions and 12 deletions
@@ -1,4 +1,5 @@
using AibisDream.Kit;
using System.Collections;
using AibisDream.Kit;
using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.Localization.Settings;
@@ -137,5 +138,23 @@ namespace AibisDream.Framework
{
await LocalizationSettings.InitializationOperation.Task;
}
/// <summary>
/// 等待本地化系统初始化完成(含 SettingLoader 触发的语言切换)。
/// </summary>
public static IEnumerator WaitUntilReady()
{
yield return LocalizationSettings.InitializationOperation;
yield return null;
}
/// <summary>
/// 等待 LocalizeStringEvent 等 UI 组件刷新文案。
/// </summary>
public static IEnumerator WaitForUIRefresh()
{
yield return null;
Canvas.ForceUpdateCanvases();
}
}
}
+41 -5
View File
@@ -22,6 +22,8 @@ namespace AibisDream
#endregion
private const float MainMenuFadeDuration = 0.5f;
private BindProperty<TalkSceneSO> _currentTalkSceneSo;
public override void OnSingletonInit()
{
@@ -36,9 +38,28 @@ namespace AibisDream
// 场景So事件注册
_currentTalkSceneSo = new BindProperty<TalkSceneSO>();
ActionKit.Sequence()
.Callback(() => EnumEventSystem.Global.Send(GameLoopEnum.AppStart))
.Start(this);
StartCoroutine(AppBootstrapCoroutine());
}
/// <summary>
/// 启动主界面:先黑屏,待本地化与 UI 就绪后再淡出,避免玩家看到初始化过程。
/// </summary>
private IEnumerator AppBootstrapCoroutine()
{
var playTool = UIManager.Instance.GetPanel<PlayToolPanel>();
UIManager.Instance.ShowPanel<PlayToolPanel>();
playTool?.ApplyFadeScreenCovered(true);
yield return LocalizationKit.WaitUntilReady();
EnumEventSystem.Global.Send(GameLoopEnum.AppStart);
yield return LocalizationKit.WaitForUIRefresh();
if (playTool != null)
{
yield return playTool.FadeOutAsync(MainMenuFadeDuration);
}
}
private void LoadAllSceneSos()
@@ -202,7 +223,12 @@ namespace AibisDream
private IEnumerator RestartCoroutine()
{
UIManager.Instance.GetPanel<PlayToolPanel>().FadeInSync(0.1f);
var playTool = UIManager.Instance.GetPanel<PlayToolPanel>();
UIManager.Instance.ShowPanel<PlayToolPanel>();
if (playTool != null)
{
yield return playTool.FadeInAsync(MainMenuFadeDuration);
}
// 清理所有系统注册
if (FixSystemCenter.SystemDic != null)
@@ -210,10 +236,15 @@ namespace AibisDream
FixSystemCenter.SystemDic.Clear();
}
playTool?.ClearPresentationEffects();
// 执行场景卸载等功能
CameraKit.Instance.ResetCamera();
yield return SceneLoader.Instance.UnloadSceneAsync();
DialogController.Instance.StopDialog();
yield return LocalizationKit.WaitUntilReady();
EnumEventSystem.Global.Send(GameLoopEnum.GameQuit);
// 音频继续
AudioManager.Instance.UnPauseAll();
@@ -222,7 +253,12 @@ namespace AibisDream
// 关闭结束面板
UIManager.Instance.HidePanel<EndPanel>();
yield return UIManager.Instance.GetPanel<PlayToolPanel>().FadeOutAsync();
yield return LocalizationKit.WaitForUIRefresh();
if (playTool != null)
{
yield return playTool.FadeOutAsync(MainMenuFadeDuration);
}
}
#endregion
+4 -6
View File
@@ -42,7 +42,6 @@ namespace AibisDream.UI
private void Awake()
{
InitRefs();
EnumEventSystem.Global.Register(GameLoopEnum.GameQuit, HideAll);
}
private void InitRefs()
@@ -240,14 +239,13 @@ namespace AibisDream.UI
_signBoard.CloseSignBoard();
}
private void HideAll()
/// <summary>
/// 清理演出层内容,但不影响黑屏遮罩(用于返回主界面时在遮罩下重置状态)。
/// </summary>
public void ClearPresentationEffects()
{
_timeFlowsVersion++;
_fadeImage.DOKill();
_fadeImage.color = Color.clear;
_fadeImage.gameObject.SetActive(false);
_fullScreenImage.FadeOut(0.1f);
_showObjImage.FadeOut(0.1f);
_showObjPanel.SetActive(false);