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