- LocalizationManager: 新增翻译表(SetFormatted/SetDuration/LocalizeOperateMsg) - LoginPanel: InputField placeholder本地化、字体颜色保持 - HistoryPanel: 用时数据本地化、placeholder本地化 - RecordDetailPanel: 操作详情消息本地化(LanguageChanged重建) - AppraiseWindowBase: 评价等级本地化、操作消息重建 - EditorAppraiser: 所有评估消息改用InjectOperateMsgLocalized - StudentOperateRecorder: 新增InjectOperateMsgLocalized方法 - LocalizationLanguageTestBar: 单例模式、ScreenSpaceOverlay筛选 - 字体切换时保留颜色和verticalOverflow
142 lines
4.2 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|