unityzgy/Assets/Scripts/ZFramwork/ScensFrmework/SceneState.cs
ayuan9957 bf12e02276 feat: 多语言本地化系统 - 支持中/英/法/俄实时切换
- LocalizationManager: 新增翻译表(SetFormatted/SetDuration/LocalizeOperateMsg)
- LoginPanel: InputField placeholder本地化、字体颜色保持
- HistoryPanel: 用时数据本地化、placeholder本地化
- RecordDetailPanel: 操作详情消息本地化(LanguageChanged重建)
- AppraiseWindowBase: 评价等级本地化、操作消息重建
- EditorAppraiser: 所有评估消息改用InjectOperateMsgLocalized
- StudentOperateRecorder: 新增InjectOperateMsgLocalized方法
- LocalizationLanguageTestBar: 单例模式、ScreenSpaceOverlay筛选
- 字体切换时保留颜色和verticalOverflow
2026-07-16 10:05:59 +08:00

142 lines
4.2 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
namespace XFramework
{
/// <summary>
/// 场景状态
/// </summary>
public abstract class SceneState
{
protected UIManager panelManager;
/// <summary>
/// 场景名称
/// </summary>
protected string sceneName = "";
/// <summary>
/// 场景id
/// </summary>
protected int sceneIndex = -1;
/// <summary>
/// 是否异步加载
/// </summary>
protected bool async = false;
/// <summary>
/// 是否显示加载界面
/// </summary>
protected bool loadPanel = false;
/// <summary>
/// 继承了Mono的场景管理类
/// </summary>
protected GameMain Game { get => GameMain.Instance; }
///// <summary>
///// 加载界面名称
///// </summary>
//protected string LoadPanelName { get => Game.loadPanelName; }
public SceneState()
{
}
/// <summary>
/// 准备加载新场景时
/// </summary>
public virtual void OnEnter()
{
if (!async)
LoadScene();
else
LoadSceneAsync();
}
/// <summary>
/// 场景准备退出时
/// </summary>
public virtual void OnExit()
{
panelManager.PopAll();
}
/// <summary>
/// 加载场景完毕后执行的方法
/// </summary>
/// <param name="scene"></param>
/// <param name="mode"></param>
protected virtual void SceneLoaded(Scene scene, LoadSceneMode mode)
{
panelManager = new UIManager();
Game.UIManager = panelManager;
SceneManager.sceneLoaded -= SceneLoaded;
Resources.UnloadUnusedAssets();//新场景加载完成时释放旧场景资源
Debug.Log($"{sceneName}场景加载完毕!");
}
/// <summary>
/// 同步加载场景
/// </summary>
protected virtual void LoadScene()
{
if (sceneIndex < 0)
SceneManager.LoadScene(sceneName);
else
SceneManager.LoadScene(sceneIndex);
SceneManager.sceneLoaded += SceneLoaded;
}
/// <summary>
/// 异步加载场景 考虑大场景互相跳转时内存高分情况 待优化
/// </summary>
protected virtual void LoadSceneAsync()
{
Game.StartCoroutine(AsyncLoad());
SceneManager.sceneLoaded += SceneLoaded;
}
/// <summary>
/// 异步加载场景的实现
/// </summary>
/// <returns></returns>
protected virtual IEnumerator AsyncLoad()
{
AsyncOperation operation;
if (loadPanel)//需要显示加载面板时延迟0.5S等待面板加载完成后开始异步加载场景 避免卡顿
{
panelManager = new UIManager();
Game.UIManager = panelManager;
panelManager.Push(new SceneLoadingPanel());
yield return new WaitForSeconds(0.5f);
}
if (sceneIndex < 0)
operation = SceneManager.LoadSceneAsync(sceneName);
else
operation = SceneManager.LoadSceneAsync(sceneIndex);
if (loadPanel)
{
operation.allowSceneActivation = false;
float progressValue = 0;
while (!operation.isDone)
{
if (operation.progress < 0.9f)
progressValue = operation.progress;
else
progressValue = 1.0f;
panelManager.ChangePanel(progressValue);
if (progressValue >= 0.9f)
{
panelManager.ChangePanel(1);
operation.allowSceneActivation = true;
}
yield return null;
}
}
}
}
}