diff --git a/Assets/YooAsset/Runtime/AssetSystem/AssetSystem.cs b/Assets/YooAsset/Runtime/AssetSystem/AssetSystem.cs index defe8ba..bbbdfff 100644 --- a/Assets/YooAsset/Runtime/AssetSystem/AssetSystem.cs +++ b/Assets/YooAsset/Runtime/AssetSystem/AssetSystem.cs @@ -147,7 +147,7 @@ namespace YooAsset /// /// 加载场景 /// - public SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode, int priority) + public SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode, bool allowSceneActivation ,int priority) { if (assetInfo.IsInvalid) { @@ -168,9 +168,9 @@ namespace YooAsset ProviderBase provider; { if (_simulationOnEditor) - provider = new DatabaseSceneProvider(this, providerGUID, assetInfo, sceneMode, priority); + provider = new DatabaseSceneProvider(this, providerGUID, assetInfo, sceneMode,allowSceneActivation, priority); else - provider = new BundledSceneProvider(this, providerGUID, assetInfo, sceneMode, priority); + provider = new BundledSceneProvider(this, providerGUID, assetInfo, sceneMode,allowSceneActivation, 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 b170a08..051a6dc 100644 --- a/Assets/YooAsset/Runtime/AssetSystem/Handles/SceneOperationHandle.cs +++ b/Assets/YooAsset/Runtime/AssetSystem/Handles/SceneOperationHandle.cs @@ -6,9 +6,10 @@ 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() { @@ -58,9 +59,23 @@ namespace YooAsset if (IsValidWithWarning == false) return false; - if (SceneObject.IsValid() && SceneObject.isLoaded) + if (SceneObject.IsValid()) { - return SceneManager.SetActiveScene(SceneObject); + 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; } else { diff --git a/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledSceneProvider.cs b/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledSceneProvider.cs index 85ce68b..ce0acce 100644 --- a/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledSceneProvider.cs +++ b/Assets/YooAsset/Runtime/AssetSystem/Provider/BundledSceneProvider.cs @@ -11,13 +11,15 @@ namespace YooAsset public readonly LoadSceneMode SceneMode; private readonly string _sceneName; private readonly int _priority; - private AsyncOperation _asyncOp; + private readonly bool _allowSceneActivation; + public AsyncOperation AsyncOp { private set; get; } - public BundledSceneProvider(AssetSystemImpl impl, string providerGUID, AssetInfo assetInfo, LoadSceneMode sceneMode, int priority) : base(impl, providerGUID, assetInfo) + public BundledSceneProvider(AssetSystemImpl impl, string providerGUID, AssetInfo assetInfo, LoadSceneMode sceneMode, bool allowSceneActivation, int priority) : base(impl, providerGUID, assetInfo) { SceneMode = sceneMode; _sceneName = Path.GetFileNameWithoutExtension(assetInfo.AssetPath); _priority = priority; + _allowSceneActivation = allowSceneActivation; } public override void Update() { @@ -62,11 +64,11 @@ namespace YooAsset if (Status == EStatus.Loading) { // 注意:如果场景不存在则返回NULL - _asyncOp = SceneManager.LoadSceneAsync(MainAssetInfo.AssetPath, SceneMode); - if (_asyncOp != null) + AsyncOp = SceneManager.LoadSceneAsync(MainAssetInfo.AssetPath, SceneMode); + if (AsyncOp != null) { - _asyncOp.allowSceneActivation = true; - _asyncOp.priority = _priority; + AsyncOp.allowSceneActivation = _allowSceneActivation; + AsyncOp.priority = _priority; SceneObject = SceneManager.GetSceneAt(SceneManager.sceneCount - 1); Status = EStatus.Checking; } @@ -82,8 +84,8 @@ namespace YooAsset // 3. 检测加载结果 if (Status == EStatus.Checking) { - Progress = _asyncOp.progress; - if (_asyncOp.isDone) + Progress = AsyncOp.progress; + if (AsyncOp.isDone) { Status = SceneObject.IsValid() ? EStatus.Succeed : EStatus.Failed; if (Status == EStatus.Failed) diff --git a/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseSceneProvider.cs b/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseSceneProvider.cs index 23e2cab..3a5cb69 100644 --- a/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseSceneProvider.cs +++ b/Assets/YooAsset/Runtime/AssetSystem/Provider/DatabaseSceneProvider.cs @@ -7,12 +7,14 @@ namespace YooAsset { public readonly LoadSceneMode SceneMode; private readonly int _priority; - private AsyncOperation _asyncOp; + private readonly bool _allowSceneActivation; + public AsyncOperation AsyncOp { private set; get; } - public DatabaseSceneProvider(AssetSystemImpl impl, string providerGUID, AssetInfo assetInfo, LoadSceneMode sceneMode, int priority) : base(impl, providerGUID, assetInfo) + public DatabaseSceneProvider(AssetSystemImpl impl, string providerGUID, AssetInfo assetInfo, LoadSceneMode sceneMode, bool allowSceneActivation, int priority) : base(impl, providerGUID, assetInfo) { SceneMode = sceneMode; _priority = priority; + _allowSceneActivation = allowSceneActivation; } public override void Update() { @@ -52,11 +54,11 @@ namespace YooAsset { LoadSceneParameters loadSceneParameters = new LoadSceneParameters(); loadSceneParameters.loadSceneMode = SceneMode; - _asyncOp = UnityEditor.SceneManagement.EditorSceneManager.LoadSceneAsyncInPlayMode(MainAssetInfo.AssetPath, loadSceneParameters); - if (_asyncOp != null) + AsyncOp = UnityEditor.SceneManagement.EditorSceneManager.LoadSceneAsyncInPlayMode(MainAssetInfo.AssetPath, loadSceneParameters); + if (AsyncOp != null) { - _asyncOp.allowSceneActivation = true; - _asyncOp.priority = _priority; + AsyncOp.allowSceneActivation = _allowSceneActivation; + AsyncOp.priority = _priority; SceneObject = SceneManager.GetSceneAt(SceneManager.sceneCount - 1); Status = EStatus.Checking; } @@ -72,8 +74,8 @@ namespace YooAsset // 3. 检测加载结果 if (Status == EStatus.Checking) { - Progress = _asyncOp.progress; - if (_asyncOp.isDone) + Progress = AsyncOp.progress; + if (AsyncOp.isDone) { Status = SceneObject.IsValid() ? EStatus.Succeed : EStatus.Failed; if (Status == EStatus.Failed) diff --git a/Assets/YooAsset/Runtime/PackageSystem/ResourcePackage.cs b/Assets/YooAsset/Runtime/PackageSystem/ResourcePackage.cs index ebc843f..d83ae9e 100644 --- a/Assets/YooAsset/Runtime/PackageSystem/ResourcePackage.cs +++ b/Assets/YooAsset/Runtime/PackageSystem/ResourcePackage.cs @@ -455,12 +455,13 @@ namespace YooAsset /// /// 场景的定位地址 /// 场景加载模式 + /// 场景加载后自动激活 /// 优先级 - public SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, int priority = 100) + public SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool allowSceneActivation = true, int priority = 100) { DebugCheckInitialize(); AssetInfo assetInfo = ConvertLocationToAssetInfo(location, null); - var handle = _assetSystemImpl.LoadSceneAsync(assetInfo, sceneMode, priority); + var handle = _assetSystemImpl.LoadSceneAsync(assetInfo, sceneMode,allowSceneActivation, priority); return handle; } @@ -469,11 +470,12 @@ namespace YooAsset /// /// 场景的资源信息 /// 场景加载模式 + /// 场景加载后自动激活 /// 优先级 - public SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, int priority = 100) + public SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, bool allowSceneActivation = true, int priority = 100) { DebugCheckInitialize(); - var handle = _assetSystemImpl.LoadSceneAsync(assetInfo, sceneMode, priority); + var handle = _assetSystemImpl.LoadSceneAsync(assetInfo, sceneMode,allowSceneActivation, priority); return handle; } #endregion diff --git a/Assets/YooAsset/Runtime/YooAssetsExtension.cs b/Assets/YooAsset/Runtime/YooAssetsExtension.cs index 3cb0941..5215050 100644 --- a/Assets/YooAsset/Runtime/YooAssetsExtension.cs +++ b/Assets/YooAsset/Runtime/YooAssetsExtension.cs @@ -128,11 +128,12 @@ namespace YooAsset /// /// 场景的定位地址 /// 场景加载模式 + /// 场景加载后自动激活 /// 优先级 - public static SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, int priority = 100) + public static SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single,bool allowSceneActivation = true, int priority = 100) { DebugCheckDefaultPackageValid(); - return _defaultPackage.LoadSceneAsync(location, sceneMode, priority); + return _defaultPackage.LoadSceneAsync(location, sceneMode, allowSceneActivation, priority); } /// @@ -140,11 +141,12 @@ namespace YooAsset /// /// 场景的资源信息 /// 场景加载模式 + /// 场景加载后自动激活 /// 优先级 - public static SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, int priority = 100) + public static SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, bool allowSceneActivation = true, int priority = 100) { DebugCheckDefaultPackageValid(); - return _defaultPackage.LoadSceneAsync(assetInfo, sceneMode, priority); + return _defaultPackage.LoadSceneAsync(assetInfo, sceneMode, allowSceneActivation, priority); } #endregion