From 43c40e4bbeb545de29c1105bc18b0f9f3a96e8de Mon Sep 17 00:00:00 2001 From: hevinci Date: Tue, 27 Jun 2023 17:33:04 +0800 Subject: [PATCH] update runtime code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增了场景加载参数suspendLoad --- .../Runtime/AssetSystem/AssetSystem.cs | 6 +-- .../Handles/SceneOperationHandle.cs | 53 ++++++++++++------- .../Provider/BundledSceneProvider.cs | 32 +++++++---- .../Provider/DatabaseSceneProvider.cs | 32 +++++++---- .../Runtime/PackageSystem/ResourcePackage.cs | 14 ++--- Assets/YooAsset/Runtime/YooAssetsExtension.cs | 12 ++--- 6 files changed, 95 insertions(+), 54 deletions(-) diff --git a/Assets/YooAsset/Runtime/AssetSystem/AssetSystem.cs b/Assets/YooAsset/Runtime/AssetSystem/AssetSystem.cs index 0fac84d..b293b0e 100644 --- a/Assets/YooAsset/Runtime/AssetSystem/AssetSystem.cs +++ b/Assets/YooAsset/Runtime/AssetSystem/AssetSystem.cs @@ -169,7 +169,7 @@ namespace YooAsset /// /// 加载场景 /// - public SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode, bool allowSceneActivation ,int priority) + public SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode, bool suspendLoad, int priority) { if (assetInfo.IsInvalid) { @@ -190,9 +190,9 @@ namespace YooAsset ProviderBase provider; { if (_simulationOnEditor) - provider = new DatabaseSceneProvider(this, providerGUID, assetInfo, sceneMode,allowSceneActivation, priority); + provider = new DatabaseSceneProvider(this, providerGUID, assetInfo, sceneMode, suspendLoad, priority); else - provider = new BundledSceneProvider(this, providerGUID, assetInfo, sceneMode,allowSceneActivation, priority); + provider = new BundledSceneProvider(this, providerGUID, assetInfo, sceneMode, suspendLoad, priority); provider.InitSpawnDebugInfo(); _providerList.Add(provider); _providerDic.Add(providerGUID, provider); diff --git a/Assets/YooAsset/Runtime/AssetSystem/Handles/SceneOperationHandle.cs b/Assets/YooAsset/Runtime/AssetSystem/Handles/SceneOperationHandle.cs index 051a6dc..b0f14eb 100644 --- a/Assets/YooAsset/Runtime/AssetSystem/Handles/SceneOperationHandle.cs +++ b/Assets/YooAsset/Runtime/AssetSystem/Handles/SceneOperationHandle.cs @@ -6,10 +6,9 @@ namespace YooAsset { private System.Action _callback; internal string PackageName { set; get; } - private ProviderBase _providerBase; + internal SceneOperationHandle(ProviderBase provider) : base(provider) { - _providerBase = provider; } internal override void InvokeCallback() { @@ -59,23 +58,9 @@ namespace YooAsset if (IsValidWithWarning == false) return false; - if (SceneObject.IsValid()) + if (SceneObject.IsValid() && SceneObject.isLoaded) { - var isChangeState = false; -#if UNITY_EDITOR - if (_providerBase is DatabaseSceneProvider dsp) - { - dsp.AsyncOp.allowSceneActivation = true; - isChangeState = true; - } -#endif - if (_providerBase is BundledSceneProvider bsp) - { - bsp.AsyncOp.allowSceneActivation = true; - isChangeState = true; - } - - return isChangeState; + return SceneManager.SetActiveScene(SceneObject); } else { @@ -84,6 +69,38 @@ namespace YooAsset } } + /// + /// 解除场景加载挂起操作 + /// + public bool UnSuspend() + { + if (IsValidWithWarning == false) + return false; + + if (SceneObject.IsValid()) + { + if (Provider is DatabaseSceneProvider) + { + var temp = Provider as DatabaseSceneProvider; + return temp.UnSuspendLoad(); + } + else if (Provider is BundledSceneProvider) + { + var temp = Provider as BundledSceneProvider; + return temp.UnSuspendLoad(); + } + else + { + throw new System.NotImplementedException(); + } + } + else + { + YooLogger.Warning($"Scene is invalid : {SceneObject.name}"); + return false; + } + } + /// /// 是否为主场景 /// diff --git a/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledSceneProvider.cs b/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledSceneProvider.cs index ce0acce..81140df 100644 --- a/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledSceneProvider.cs +++ b/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledSceneProvider.cs @@ -10,16 +10,16 @@ namespace YooAsset { public readonly LoadSceneMode SceneMode; private readonly string _sceneName; + private readonly bool _suspendLoad; private readonly int _priority; - private readonly bool _allowSceneActivation; - public AsyncOperation AsyncOp { private set; get; } + private AsyncOperation _asyncOperation; - public BundledSceneProvider(AssetSystemImpl impl, string providerGUID, AssetInfo assetInfo, LoadSceneMode sceneMode, bool allowSceneActivation, int priority) : base(impl, providerGUID, assetInfo) + public BundledSceneProvider(AssetSystemImpl impl, string providerGUID, AssetInfo assetInfo, LoadSceneMode sceneMode, bool suspendLoad, int priority) : base(impl, providerGUID, assetInfo) { SceneMode = sceneMode; _sceneName = Path.GetFileNameWithoutExtension(assetInfo.AssetPath); + _suspendLoad = suspendLoad; _priority = priority; - _allowSceneActivation = allowSceneActivation; } public override void Update() { @@ -64,11 +64,11 @@ namespace YooAsset if (Status == EStatus.Loading) { // 注意:如果场景不存在则返回NULL - AsyncOp = SceneManager.LoadSceneAsync(MainAssetInfo.AssetPath, SceneMode); - if (AsyncOp != null) + _asyncOperation = SceneManager.LoadSceneAsync(MainAssetInfo.AssetPath, SceneMode); + if (_asyncOperation != null) { - AsyncOp.allowSceneActivation = _allowSceneActivation; - AsyncOp.priority = _priority; + _asyncOperation.allowSceneActivation = !_suspendLoad; + _asyncOperation.priority = _priority; SceneObject = SceneManager.GetSceneAt(SceneManager.sceneCount - 1); Status = EStatus.Checking; } @@ -84,8 +84,8 @@ namespace YooAsset // 3. 检测加载结果 if (Status == EStatus.Checking) { - Progress = AsyncOp.progress; - if (AsyncOp.isDone) + Progress = _asyncOperation.progress; + if (_asyncOperation.isDone) { Status = SceneObject.IsValid() ? EStatus.Succeed : EStatus.Failed; if (Status == EStatus.Failed) @@ -97,5 +97,17 @@ namespace YooAsset } } } + + /// + /// 解除场景加载挂起操作 + /// + public bool UnSuspendLoad() + { + if (_asyncOperation == null) + return false; + + _asyncOperation.allowSceneActivation = true; + return true; + } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseSceneProvider.cs b/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseSceneProvider.cs index 3a5cb69..90d22b6 100644 --- a/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseSceneProvider.cs +++ b/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseSceneProvider.cs @@ -6,15 +6,15 @@ namespace YooAsset internal sealed class DatabaseSceneProvider : ProviderBase { public readonly LoadSceneMode SceneMode; + private readonly bool _suspendLoad; private readonly int _priority; - private readonly bool _allowSceneActivation; - public AsyncOperation AsyncOp { private set; get; } + private AsyncOperation _asyncOperation; - public DatabaseSceneProvider(AssetSystemImpl impl, string providerGUID, AssetInfo assetInfo, LoadSceneMode sceneMode, bool allowSceneActivation, int priority) : base(impl, providerGUID, assetInfo) + public DatabaseSceneProvider(AssetSystemImpl impl, string providerGUID, AssetInfo assetInfo, LoadSceneMode sceneMode, bool suspendLoad, int priority) : base(impl, providerGUID, assetInfo) { SceneMode = sceneMode; + _suspendLoad = suspendLoad; _priority = priority; - _allowSceneActivation = allowSceneActivation; } public override void Update() { @@ -54,11 +54,11 @@ namespace YooAsset { LoadSceneParameters loadSceneParameters = new LoadSceneParameters(); loadSceneParameters.loadSceneMode = SceneMode; - AsyncOp = UnityEditor.SceneManagement.EditorSceneManager.LoadSceneAsyncInPlayMode(MainAssetInfo.AssetPath, loadSceneParameters); - if (AsyncOp != null) + _asyncOperation = UnityEditor.SceneManagement.EditorSceneManager.LoadSceneAsyncInPlayMode(MainAssetInfo.AssetPath, loadSceneParameters); + if (_asyncOperation != null) { - AsyncOp.allowSceneActivation = _allowSceneActivation; - AsyncOp.priority = _priority; + _asyncOperation.allowSceneActivation = !_suspendLoad; + _asyncOperation.priority = _priority; SceneObject = SceneManager.GetSceneAt(SceneManager.sceneCount - 1); Status = EStatus.Checking; } @@ -74,8 +74,8 @@ namespace YooAsset // 3. 检测加载结果 if (Status == EStatus.Checking) { - Progress = AsyncOp.progress; - if (AsyncOp.isDone) + Progress = _asyncOperation.progress; + if (_asyncOperation.isDone) { Status = SceneObject.IsValid() ? EStatus.Succeed : EStatus.Failed; if (Status == EStatus.Failed) @@ -88,5 +88,17 @@ namespace YooAsset } #endif } + + /// + /// 解除场景加载挂起操作 + /// + public bool UnSuspendLoad() + { + if (_asyncOperation == null) + return false; + + _asyncOperation.allowSceneActivation = true; + return true; + } } } \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/PackageSystem/ResourcePackage.cs b/Assets/YooAsset/Runtime/PackageSystem/ResourcePackage.cs index 61cae21..cc7c1f2 100644 --- a/Assets/YooAsset/Runtime/PackageSystem/ResourcePackage.cs +++ b/Assets/YooAsset/Runtime/PackageSystem/ResourcePackage.cs @@ -455,13 +455,13 @@ namespace YooAsset /// /// 场景的定位地址 /// 场景加载模式 - /// 场景加载后自动激活 + /// 场景加载到90%自动挂起 /// 优先级 - public SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool allowSceneActivation = true, int priority = 100) + public SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false, int priority = 100) { DebugCheckInitialize(); AssetInfo assetInfo = ConvertLocationToAssetInfo(location, null); - var handle = _assetSystemImpl.LoadSceneAsync(assetInfo, sceneMode,allowSceneActivation, priority); + var handle = _assetSystemImpl.LoadSceneAsync(assetInfo, sceneMode, suspendLoad, priority); return handle; } @@ -470,12 +470,12 @@ namespace YooAsset /// /// 场景的资源信息 /// 场景加载模式 - /// 场景加载后自动激活 + /// 场景加载到90%自动挂起 /// 优先级 - public SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, bool allowSceneActivation = true, int priority = 100) + public SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false, int priority = 100) { DebugCheckInitialize(); - var handle = _assetSystemImpl.LoadSceneAsync(assetInfo, sceneMode,allowSceneActivation, priority); + var handle = _assetSystemImpl.LoadSceneAsync(assetInfo, sceneMode, suspendLoad, priority); return handle; } #endregion @@ -727,7 +727,7 @@ namespace YooAsset AssetInfo assetInfo = ConvertLocationToAssetInfo(location, type); return LoadAllAssetsInternal(assetInfo, false); } - + private AllAssetsOperationHandle LoadAllAssetsInternal(AssetInfo assetInfo, bool waitForAsyncComplete) { diff --git a/Assets/YooAsset/Runtime/YooAssetsExtension.cs b/Assets/YooAsset/Runtime/YooAssetsExtension.cs index 3900a9e..bf46a6d 100644 --- a/Assets/YooAsset/Runtime/YooAssetsExtension.cs +++ b/Assets/YooAsset/Runtime/YooAssetsExtension.cs @@ -128,12 +128,12 @@ namespace YooAsset /// /// 场景的定位地址 /// 场景加载模式 - /// 场景加载后自动激活 + /// 场景加载到90%自动挂起 /// 优先级 - public static SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single,bool allowSceneActivation = true, int priority = 100) + public static SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false, int priority = 100) { DebugCheckDefaultPackageValid(); - return _defaultPackage.LoadSceneAsync(location, sceneMode, allowSceneActivation, priority); + return _defaultPackage.LoadSceneAsync(location, sceneMode, suspendLoad, priority); } /// @@ -141,12 +141,12 @@ namespace YooAsset /// /// 场景的资源信息 /// 场景加载模式 - /// 场景加载后自动激活 + /// 场景加载到90%自动挂起 /// 优先级 - public static SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, bool allowSceneActivation = true, int priority = 100) + public static SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, bool suspendLoad = false, int priority = 100) { DebugCheckDefaultPackageValid(); - return _defaultPackage.LoadSceneAsync(assetInfo, sceneMode, allowSceneActivation, priority); + return _defaultPackage.LoadSceneAsync(assetInfo, sceneMode, suspendLoad, priority); } #endregion