From f5f983f2204cc5d6b15c923b7940dc20db17b0e2 Mon Sep 17 00:00:00 2001 From: ALEXTANG <574809918@qq.com> Date: Mon, 23 Oct 2023 17:01:06 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E8=B5=84=E6=BA=90=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E5=8A=A0=E8=BD=BD=E5=9C=BA=E6=99=AF=EF=BC=8C=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E5=9C=BA=E6=99=AF=E7=BB=9F=E4=B8=80=E8=B5=B0=E5=9C=BA?= =?UTF-8?q?=E6=99=AF=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E3=80=82=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=9C=BA=E6=99=AF=E5=8A=A0=E8=BD=BD=E8=BF=9B=E5=BA=A6?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 移除资源模块加载场景,加载场景统一走场景管理模块。增加场景加载进度回调。 --- .../ResourceModule/IResourceManager.cs | 33 ---------- .../Modules/ResourceModule/ResourceManager.cs | 49 --------------- .../Modules/ResourceModule/ResourceModule.cs | 43 ------------- .../Modules/SceneModule/ISceneModule.cs | 10 +++- .../Modules/SceneModule/SceneModule.cs | 14 +++-- .../Modules/SceneModule/SceneModuleImp.cs | 60 ++++++++++++++++--- 6 files changed, 68 insertions(+), 141 deletions(-) diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/IResourceManager.cs b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/IResourceManager.cs index d72b0dd9..7ca0723b 100644 --- a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/IResourceManager.cs +++ b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/IResourceManager.cs @@ -248,27 +248,6 @@ namespace TEngine /// 资源对象集合。 UniTask> LoadAssetsByTagAsync(string assetTag) where T : UnityEngine.Object; - /// - /// 异步加载场景。 - /// - /// 场景的定位地址。 - /// 场景加载模式。 - /// 加载完毕时是否主动挂起。 - /// 优先级。 - /// 异步加载场景句柄。 - SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false, int priority = 100); - - /// - /// 异步加载场景. - /// - /// 场景的资源信息。 - /// 场景加载模式。 - /// 加载完毕时是否主动挂起。 - /// 优先级。 - /// 异步加载场景句柄。 - SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false, - int priority = 100); - /// /// 异步加载资源。 /// @@ -325,17 +304,5 @@ namespace TEngine /// 资源实例类型。 /// 原生文件资源实例。 UniTask LoadAllSubAssetAsync(string location, CancellationToken cancellationToken = default) where T : Object; - - /// - /// 异步加载场景。 - /// - /// 场景的定位地址。 - /// 取消操作Token。 - /// 场景加载模式。 - /// 加载完毕时是否主动激活。 - /// 优先级。 - /// 场景资源实例。 - UniTask LoadSceneAsyncByUniTask(string location, CancellationToken cancellationToken = default, LoadSceneMode sceneMode = LoadSceneMode.Single, - bool activateOnLoad = true, int priority = 100); } } \ No newline at end of file diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceManager.cs b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceManager.cs index dc7132f5..548a4dc3 100644 --- a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceManager.cs +++ b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceManager.cs @@ -726,35 +726,6 @@ namespace TEngine return assetObjects; } - /// - /// 异步加载场景。 - /// - /// 场景的定位地址。 - /// 场景加载模式。 - /// 加载完毕时是否主动挂起。 - /// 加载优先级。 - /// 异步加载场景句柄。 - public SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false, - int priority = 100) - { - return YooAssets.LoadSceneAsync(location, sceneMode, suspendLoad, priority); - } - - /// - /// 异步加载场景。 - /// - /// 场景的资源信息。 - /// 场景加载模式。 - /// 加载完毕时是否主动挂起。 - /// 加载优先级。 - /// 异步加载场景句柄。 - public SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false, - int priority = 100) - { - return YooAssets.LoadSceneAsync(assetInfo, sceneMode, suspendLoad, priority); - } - - /// /// 异步加载资源实例。 /// @@ -910,26 +881,6 @@ namespace TEngine return cancelOrFailed ? null : handle.GetSubAssetObjects(); } - - /// - /// 异步加载场景。 - /// - /// 场景的定位地址。 - /// 取消操作Token。 - /// 场景加载模式。 - /// 加载完毕时是否主动激活。 - /// 加载优先级。 - /// 场景资源实例。 - public async UniTask LoadSceneAsyncByUniTask(string location, CancellationToken cancellationToken = default, - LoadSceneMode sceneMode = LoadSceneMode.Single, - bool activateOnLoad = true, int priority = 100) - { - SceneOperationHandle handle = YooAssets.LoadSceneAsync(location, sceneMode, activateOnLoad, priority); - - bool cancelOrFailed = await handle.ToUniTask().AttachExternalCancellation(cancellationToken).SuppressCancellationThrow(); - - return cancelOrFailed ? default : handle.SceneObject; - } } /// diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceModule.cs b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceModule.cs index 1e729861..ebaf84d6 100644 --- a/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceModule.cs +++ b/UnityProject/Assets/TEngine/Runtime/Modules/ResourceModule/ResourceModule.cs @@ -584,34 +584,6 @@ namespace TEngine return await m_ResourceManager.LoadAssetsByTagAsync(assetTag); } - /// - /// 异步加载场景。 - /// - /// 场景的定位地址 - /// 场景加载模式 - /// 加载完毕时是否主动挂起 - /// 优先级 - /// 异步加载场景句柄。 - public SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false, - int priority = 100) - { - return m_ResourceManager.LoadSceneAsync(location, sceneMode, suspendLoad, priority); - } - - /// - /// 异步加载场景 - /// - /// 场景的资源信息 - /// 场景加载模式 - /// 加载完毕时是否主动挂起 - /// 优先级 - /// 异步加载场景句柄。 - public SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false, - int priority = 100) - { - return m_ResourceManager.LoadSceneAsync(assetInfo, sceneMode, suspendLoad, priority); - } - /// /// 异步加载资源。 /// @@ -686,20 +658,5 @@ namespace TEngine { return await m_ResourceManager.LoadAllSubAssetAsync(location, cancellationToken); } - - /// - /// 异步加载场景。 - /// - /// 场景的定位地址。 - /// 取消操作Token。 - /// 场景加载模式。 - /// 加载完毕时是否主动激活。 - /// 优先级。 - /// 场景资源实例。 - public async UniTask LoadSceneAsyncByUniTask(string location, CancellationToken cancellationToken = default, - LoadSceneMode sceneMode = LoadSceneMode.Single, bool activateOnLoad = true, int priority = 100) - { - return await m_ResourceManager.LoadSceneAsyncByUniTask(location, cancellationToken, sceneMode, activateOnLoad, priority); - } } } \ No newline at end of file diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/ISceneModule.cs b/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/ISceneModule.cs index bbad129e..ef94bb23 100644 --- a/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/ISceneModule.cs +++ b/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/ISceneModule.cs @@ -20,8 +20,14 @@ namespace TEngine /// 优先级 /// 加载回调。 /// 加载主场景是否回收垃圾。 - public void LoadScene(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false, int priority = 100, - Action callBack = null, bool gcCollect = true); + /// 加载进度回调。 + public SceneOperationHandle LoadScene(string location, + LoadSceneMode sceneMode = LoadSceneMode.Single, + bool suspendLoad = false, + int priority = 100, + Action callBack = null, + bool gcCollect = true, + Action progressCallBack = null); /// /// 激活场景(当同时存在多个场景时用于切换激活场景)。 diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/SceneModule.cs b/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/SceneModule.cs index 11329d48..8b2d9f6a 100644 --- a/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/SceneModule.cs +++ b/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/SceneModule.cs @@ -42,10 +42,11 @@ namespace TEngine /// 优先级 /// 加载回调。 /// 加载主场景是否回收垃圾。 - public void LoadScene(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false, int priority = 100, - Action callBack = null, bool gcCollect = true) + /// 加载进度回调。 + public SceneOperationHandle LoadScene(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false, int priority = 100, + Action callBack = null, bool gcCollect = true, Action progressCallBack = null) { - _sceneModule.LoadScene(location, sceneMode, suspendLoad, priority, callBack, gcCollect); + return _sceneModule.LoadScene(location, sceneMode, suspendLoad, priority, callBack, gcCollect, progressCallBack); } /// @@ -56,10 +57,11 @@ namespace TEngine /// 优先级 /// 加载回调。 /// 加载主场景是否回收垃圾。 - public void LoadSubScene(string location, bool suspendLoad = false, int priority = 100, - Action callBack = null, bool gcCollect = true) + /// 加载进度回调。 + public SceneOperationHandle LoadSubScene(string location, bool suspendLoad = false, int priority = 100, + Action callBack = null, bool gcCollect = true, Action progressCallBack = null) { - _sceneModule.LoadScene(location, LoadSceneMode.Additive, suspendLoad, priority, callBack, gcCollect); + return _sceneModule.LoadScene(location, LoadSceneMode.Additive, suspendLoad, priority, callBack, gcCollect, progressCallBack); } /// diff --git a/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/SceneModuleImp.cs b/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/SceneModuleImp.cs index 8be05993..2cff1a76 100644 --- a/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/SceneModuleImp.cs +++ b/UnityProject/Assets/TEngine/Runtime/Modules/SceneModule/SceneModuleImp.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Cysharp.Threading.Tasks; using UnityEngine.SceneManagement; using YooAsset; @@ -8,7 +9,7 @@ namespace TEngine /// /// 场景管理器。 /// - internal class SceneModuleImp : ModuleImp,ISceneModule + internal class SceneModuleImp : ModuleImp, ISceneModule { private string _currentMainSceneName = string.Empty; @@ -40,40 +41,83 @@ namespace TEngine /// /// 加载场景。 /// - /// 场景的定位地址 + /// 场景的定位地址R /// 场景加载模式 /// 加载完毕时是否主动挂起 /// 优先级 /// 加载回调。 /// 加载主场景是否回收垃圾。 - public void LoadScene(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false, int priority = 100, Action callBack = null,bool gcCollect = true) + /// 加载进度回调。 + public SceneOperationHandle LoadScene(string location, + LoadSceneMode sceneMode = LoadSceneMode.Single, + bool suspendLoad = false, + int priority = 100, + Action callBack = null, + bool gcCollect = true, + Action progressCallBack = null) { if (sceneMode == LoadSceneMode.Additive) { - if (_subScenes.ContainsKey(location)) + if (_subScenes.TryGetValue(location, out SceneOperationHandle subScene)) { Log.Warning($"Could not load subScene while already loaded. Scene: {location}"); - return; + return subScene; } - var subScene = GameModule.Resource.LoadSceneAsync(location, sceneMode, suspendLoad, priority); + subScene = YooAssets.LoadSceneAsync(location, sceneMode, suspendLoad, priority); if (callBack != null) { subScene.Completed += callBack; } + + if (progressCallBack != null) + { + InvokeProgress(subScene, progressCallBack).Forget(); + } _subScenes.Add(location, subScene); + + return subScene; } - else if(sceneMode == LoadSceneMode.Single) + else { + if (_currentMainScene is { IsDone: false }) + { + Log.Warning($"Could not load MainScene while loading. CurrentMainScene: {_currentMainSceneName}."); + return null; + } + _currentMainSceneName = location; - _currentMainScene = GameModule.Resource.LoadSceneAsync(location, sceneMode, suspendLoad, priority); + _currentMainScene = YooAssets.LoadSceneAsync(location, sceneMode, suspendLoad, priority); if (callBack != null) { _currentMainScene.Completed += callBack; } + + if (progressCallBack != null) + { + InvokeProgress(_currentMainScene, progressCallBack).Forget(); + } + GameModule.Resource.ForceUnloadUnusedAssets(gcCollect); + + return _currentMainScene; + } + } + + private async UniTaskVoid InvokeProgress(SceneOperationHandle sceneOperationHandle,Action progress) + { + if (sceneOperationHandle == null) + { + return; + } + + while (!sceneOperationHandle.IsDone) + { + await UniTask.Yield(); + + progress?.Invoke(sceneOperationHandle.Progress); } }