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