mirror of https://github.com/tuyoogame/YooAsset
fix #185
parent
64681db027
commit
460ea091bd
|
@ -37,6 +37,19 @@ namespace YooAsset
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 场景名称
|
||||||
|
/// </summary>
|
||||||
|
public string SceneName
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (IsValidWithWarning == false)
|
||||||
|
return string.Empty;
|
||||||
|
return Provider.SceneName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 场景对象
|
/// 场景对象
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -152,10 +165,8 @@ namespace YooAsset
|
||||||
}
|
}
|
||||||
|
|
||||||
// 卸载子场景
|
// 卸载子场景
|
||||||
Scene sceneObject = SceneObject;
|
|
||||||
Provider.Impl.UnloadSubScene(Provider);
|
|
||||||
{
|
{
|
||||||
var operation = new UnloadSceneOperation(sceneObject);
|
var operation = new UnloadSceneOperation(Provider);
|
||||||
OperationSystem.StartOperation(packageName, operation);
|
OperationSystem.StartOperation(packageName, operation);
|
||||||
return operation;
|
return operation;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,68 +8,81 @@ namespace YooAsset
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public sealed class UnloadSceneOperation : AsyncOperationBase
|
public sealed class UnloadSceneOperation : AsyncOperationBase
|
||||||
{
|
{
|
||||||
private enum EFlag
|
|
||||||
{
|
|
||||||
Normal,
|
|
||||||
Error,
|
|
||||||
}
|
|
||||||
private enum ESteps
|
private enum ESteps
|
||||||
{
|
{
|
||||||
None,
|
None,
|
||||||
UnLoad,
|
CheckError,
|
||||||
|
PrepareDone,
|
||||||
|
UnLoadScene,
|
||||||
Checking,
|
Checking,
|
||||||
Done,
|
Done,
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly EFlag _flag;
|
|
||||||
private ESteps _steps = ESteps.None;
|
private ESteps _steps = ESteps.None;
|
||||||
private Scene _scene;
|
private readonly string _error;
|
||||||
|
private readonly ProviderBase _provider;
|
||||||
private AsyncOperation _asyncOp;
|
private AsyncOperation _asyncOp;
|
||||||
|
|
||||||
internal UnloadSceneOperation(string error)
|
internal UnloadSceneOperation(string error)
|
||||||
{
|
{
|
||||||
_flag = EFlag.Error;
|
_error = error;
|
||||||
Error = error;
|
|
||||||
}
|
}
|
||||||
internal UnloadSceneOperation(Scene scene)
|
internal UnloadSceneOperation(ProviderBase provider)
|
||||||
{
|
{
|
||||||
_flag = EFlag.Normal;
|
_error = null;
|
||||||
_scene = scene;
|
_provider = provider;
|
||||||
}
|
}
|
||||||
internal override void InternalOnStart()
|
internal override void InternalOnStart()
|
||||||
{
|
{
|
||||||
if (_flag == EFlag.Normal)
|
_steps = ESteps.CheckError;
|
||||||
{
|
|
||||||
_steps = ESteps.UnLoad;
|
|
||||||
}
|
|
||||||
else if (_flag == EFlag.Error)
|
|
||||||
{
|
|
||||||
_steps = ESteps.Done;
|
|
||||||
Status = EOperationStatus.Failed;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw new System.NotImplementedException(_flag.ToString());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
internal override void InternalOnUpdate()
|
internal override void InternalOnUpdate()
|
||||||
{
|
{
|
||||||
if (_steps == ESteps.None || _steps == ESteps.Done)
|
if (_steps == ESteps.None || _steps == ESteps.Done)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (_steps == ESteps.UnLoad)
|
if (_steps == ESteps.CheckError)
|
||||||
{
|
{
|
||||||
if (_scene.IsValid() && _scene.isLoaded)
|
if (string.IsNullOrEmpty(_error) == false)
|
||||||
{
|
|
||||||
_asyncOp = SceneManager.UnloadSceneAsync(_scene);
|
|
||||||
_steps = ESteps.Checking;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
Error = "Scene is invalid or is not loaded.";
|
Error = _error;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_steps = ESteps.PrepareDone;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(_steps == ESteps.PrepareDone)
|
||||||
|
{
|
||||||
|
if (_provider.IsDone == false)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (_provider.SceneObject.IsValid() == false)
|
||||||
|
{
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = "Scene is invalid !";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_provider.SceneObject.isLoaded == false)
|
||||||
|
{
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = "Scene is not loaded !";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_steps = ESteps.UnLoadScene;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_steps == ESteps.UnLoadScene)
|
||||||
|
{
|
||||||
|
_asyncOp = SceneManager.UnloadSceneAsync(_provider.SceneObject);
|
||||||
|
_provider.ResourceMgr.UnloadSubScene(_provider.SceneName);
|
||||||
|
_steps = ESteps.Checking;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_steps == ESteps.Checking)
|
if (_steps == ESteps.Checking)
|
||||||
|
|
|
@ -8,7 +8,7 @@ namespace YooAsset
|
||||||
{
|
{
|
||||||
private AssetBundleRequest _cacheRequest;
|
private AssetBundleRequest _cacheRequest;
|
||||||
|
|
||||||
public BundledAllAssetsProvider(ResourceManager impl, string providerGUID, uint providerPriority, AssetInfo assetInfo) : base(impl, providerGUID, providerPriority, assetInfo)
|
public BundledAllAssetsProvider(ResourceManager manager, string providerGUID, uint providerPriority, AssetInfo assetInfo) : base(manager, providerGUID, providerPriority, assetInfo)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
public override void Update()
|
public override void Update()
|
||||||
|
|
|
@ -8,7 +8,7 @@ namespace YooAsset
|
||||||
{
|
{
|
||||||
private AssetBundleRequest _cacheRequest;
|
private AssetBundleRequest _cacheRequest;
|
||||||
|
|
||||||
public BundledAssetProvider(ResourceManager impl, string providerGUID, uint providerPriority, AssetInfo assetInfo) : base(impl, providerGUID, providerPriority, assetInfo)
|
public BundledAssetProvider(ResourceManager manager, string providerGUID, uint providerPriority, AssetInfo assetInfo) : base(manager, providerGUID, providerPriority, assetInfo)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
public override void Update()
|
public override void Update()
|
||||||
|
|
|
@ -3,7 +3,7 @@ namespace YooAsset
|
||||||
{
|
{
|
||||||
internal class BundledRawFileProvider : ProviderBase
|
internal class BundledRawFileProvider : ProviderBase
|
||||||
{
|
{
|
||||||
public BundledRawFileProvider(ResourceManager impl, string providerGUID, uint providerPriority, AssetInfo assetInfo) : base(impl, providerGUID, providerPriority, assetInfo)
|
public BundledRawFileProvider(ResourceManager manager, string providerGUID, uint providerPriority, AssetInfo assetInfo) : base(manager, providerGUID, providerPriority, assetInfo)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
public override void Update()
|
public override void Update()
|
||||||
|
|
|
@ -9,14 +9,13 @@ namespace YooAsset
|
||||||
internal sealed class BundledSceneProvider : ProviderBase
|
internal sealed class BundledSceneProvider : ProviderBase
|
||||||
{
|
{
|
||||||
public readonly LoadSceneMode SceneMode;
|
public readonly LoadSceneMode SceneMode;
|
||||||
private readonly string _sceneName;
|
|
||||||
private readonly bool _suspendLoad;
|
private readonly bool _suspendLoad;
|
||||||
private AsyncOperation _asyncOperation;
|
private AsyncOperation _asyncOperation;
|
||||||
|
|
||||||
public BundledSceneProvider(ResourceManager impl, string providerGUID, uint providerPriority, AssetInfo assetInfo, LoadSceneMode sceneMode, bool suspendLoad) : base(impl, providerGUID, providerPriority, assetInfo)
|
public BundledSceneProvider(ResourceManager manager, string providerGUID, uint providerPriority, AssetInfo assetInfo, LoadSceneMode sceneMode, bool suspendLoad) : base(manager, providerGUID, providerPriority, assetInfo)
|
||||||
{
|
{
|
||||||
SceneMode = sceneMode;
|
SceneMode = sceneMode;
|
||||||
_sceneName = Path.GetFileNameWithoutExtension(assetInfo.AssetPath);
|
SceneName = Path.GetFileNameWithoutExtension(assetInfo.AssetPath);
|
||||||
_suspendLoad = suspendLoad;
|
_suspendLoad = suspendLoad;
|
||||||
}
|
}
|
||||||
public override void Update()
|
public override void Update()
|
||||||
|
@ -73,7 +72,7 @@ namespace YooAsset
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Status = EStatus.Failed;
|
Status = EStatus.Failed;
|
||||||
LastError = $"Failed to load scene : {_sceneName}";
|
LastError = $"Failed to load scene : {MainAssetInfo.AssetPath}";
|
||||||
YooLogger.Error(LastError);
|
YooLogger.Error(LastError);
|
||||||
InvokeCompletion();
|
InvokeCompletion();
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@ namespace YooAsset
|
||||||
{
|
{
|
||||||
private AssetBundleRequest _cacheRequest;
|
private AssetBundleRequest _cacheRequest;
|
||||||
|
|
||||||
public BundledSubAssetsProvider(ResourceManager impl, string providerGUID, uint providerPriority, AssetInfo assetInfo) : base(impl, providerGUID, providerPriority, assetInfo)
|
public BundledSubAssetsProvider(ResourceManager manager, string providerGUID, uint providerPriority, AssetInfo assetInfo) : base(manager, providerGUID, providerPriority, assetInfo)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
public override void Update()
|
public override void Update()
|
||||||
|
|
|
@ -6,7 +6,7 @@ namespace YooAsset
|
||||||
{
|
{
|
||||||
internal sealed class DatabaseAllAssetsProvider : ProviderBase
|
internal sealed class DatabaseAllAssetsProvider : ProviderBase
|
||||||
{
|
{
|
||||||
public DatabaseAllAssetsProvider(ResourceManager impl, string providerGUID, uint providerPriority, AssetInfo assetInfo) : base(impl, providerGUID, providerPriority, assetInfo)
|
public DatabaseAllAssetsProvider(ResourceManager manager, string providerGUID, uint providerPriority, AssetInfo assetInfo) : base(manager, providerGUID, providerPriority, assetInfo)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
public override void Update()
|
public override void Update()
|
||||||
|
|
|
@ -6,7 +6,7 @@ namespace YooAsset
|
||||||
{
|
{
|
||||||
internal sealed class DatabaseAssetProvider : ProviderBase
|
internal sealed class DatabaseAssetProvider : ProviderBase
|
||||||
{
|
{
|
||||||
public DatabaseAssetProvider(ResourceManager impl, string providerGUID, uint providerPriority, AssetInfo assetInfo) : base(impl, providerGUID, providerPriority, assetInfo)
|
public DatabaseAssetProvider(ResourceManager manager, string providerGUID, uint providerPriority, AssetInfo assetInfo) : base(manager, providerGUID, providerPriority, assetInfo)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
public override void Update()
|
public override void Update()
|
||||||
|
|
|
@ -3,7 +3,7 @@ namespace YooAsset
|
||||||
{
|
{
|
||||||
internal class DatabaseRawFileProvider : ProviderBase
|
internal class DatabaseRawFileProvider : ProviderBase
|
||||||
{
|
{
|
||||||
public DatabaseRawFileProvider(ResourceManager impl, string providerGUID, uint providerPriority, AssetInfo assetInfo) : base(impl, providerGUID, providerPriority, assetInfo)
|
public DatabaseRawFileProvider(ResourceManager manager, string providerGUID, uint providerPriority, AssetInfo assetInfo) : base(manager, providerGUID, providerPriority, assetInfo)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
public override void Update()
|
public override void Update()
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
using UnityEngine;
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using UnityEngine;
|
||||||
using UnityEngine.SceneManagement;
|
using UnityEngine.SceneManagement;
|
||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
|
@ -9,9 +12,10 @@ namespace YooAsset
|
||||||
private readonly bool _suspendLoad;
|
private readonly bool _suspendLoad;
|
||||||
private AsyncOperation _asyncOperation;
|
private AsyncOperation _asyncOperation;
|
||||||
|
|
||||||
public DatabaseSceneProvider(ResourceManager impl, string providerGUID, uint providerPriority, AssetInfo assetInfo, LoadSceneMode sceneMode, bool suspendLoad) : base(impl, providerGUID, providerPriority, assetInfo)
|
public DatabaseSceneProvider(ResourceManager manager, string providerGUID, uint providerPriority, AssetInfo assetInfo, LoadSceneMode sceneMode, bool suspendLoad) : base(manager, providerGUID, providerPriority, assetInfo)
|
||||||
{
|
{
|
||||||
SceneMode = sceneMode;
|
SceneMode = sceneMode;
|
||||||
|
SceneName = Path.GetFileNameWithoutExtension(assetInfo.AssetPath);
|
||||||
_suspendLoad = suspendLoad;
|
_suspendLoad = suspendLoad;
|
||||||
}
|
}
|
||||||
public override void Update()
|
public override void Update()
|
||||||
|
|
|
@ -6,7 +6,7 @@ namespace YooAsset
|
||||||
{
|
{
|
||||||
internal sealed class DatabaseSubAssetsProvider : ProviderBase
|
internal sealed class DatabaseSubAssetsProvider : ProviderBase
|
||||||
{
|
{
|
||||||
public DatabaseSubAssetsProvider(ResourceManager impl, string providerGUID, uint providerPriority, AssetInfo assetInfo) : base(impl, providerGUID, providerPriority, assetInfo)
|
public DatabaseSubAssetsProvider(ResourceManager manager, string providerGUID, uint providerPriority, AssetInfo assetInfo) : base(manager, providerGUID, providerPriority, assetInfo)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
public override void Update()
|
public override void Update()
|
||||||
|
|
|
@ -31,7 +31,7 @@ namespace YooAsset
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 所属资源系统
|
/// 所属资源系统
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ResourceManager Impl { private set; get; }
|
public ResourceManager ResourceMgr { private set; get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 资源信息
|
/// 资源信息
|
||||||
|
@ -53,6 +53,11 @@ namespace YooAsset
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public UnityEngine.SceneManagement.Scene SceneObject { protected set; get; }
|
public UnityEngine.SceneManagement.Scene SceneObject { protected set; get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加载的场景名称
|
||||||
|
/// </summary>
|
||||||
|
public string SceneName { protected set; get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 原生文件路径
|
/// 原生文件路径
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -103,21 +108,21 @@ namespace YooAsset
|
||||||
private readonly List<HandleBase> _handles = new List<HandleBase>();
|
private readonly List<HandleBase> _handles = new List<HandleBase>();
|
||||||
|
|
||||||
|
|
||||||
public ProviderBase(ResourceManager impl, string providerGUID, uint providerPriority, AssetInfo assetInfo)
|
public ProviderBase(ResourceManager manager, string providerGUID, uint providerPriority, AssetInfo assetInfo)
|
||||||
{
|
{
|
||||||
Impl = impl;
|
ResourceMgr = manager;
|
||||||
ProviderGUID = providerGUID;
|
ProviderGUID = providerGUID;
|
||||||
ProviderPriority = providerPriority;
|
ProviderPriority = providerPriority;
|
||||||
MainAssetInfo = assetInfo;
|
MainAssetInfo = assetInfo;
|
||||||
|
|
||||||
// 创建资源包加载器
|
// 创建资源包加载器
|
||||||
if (impl != null)
|
if (manager != null)
|
||||||
{
|
{
|
||||||
OwnerBundle = impl.CreateOwnerAssetBundleLoader(assetInfo);
|
OwnerBundle = manager.CreateOwnerAssetBundleLoader(assetInfo);
|
||||||
OwnerBundle.Reference();
|
OwnerBundle.Reference();
|
||||||
OwnerBundle.AddProvider(this);
|
OwnerBundle.AddProvider(this);
|
||||||
|
|
||||||
var dependList = impl.CreateDependAssetBundleLoaders(assetInfo);
|
var dependList = manager.CreateDependAssetBundleLoaders(assetInfo);
|
||||||
DependBundles = new DependAssetBundles(dependList);
|
DependBundles = new DependAssetBundles(dependList);
|
||||||
DependBundles.Reference();
|
DependBundles.Reference();
|
||||||
}
|
}
|
||||||
|
@ -128,14 +133,6 @@ namespace YooAsset
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public abstract void Update();
|
public abstract void Update();
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 排序接口实现方法
|
|
||||||
/// </summary>
|
|
||||||
public int CompareTo(ProviderBase other)
|
|
||||||
{
|
|
||||||
return other.ProviderPriority.CompareTo(this.ProviderPriority);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 销毁资源提供者
|
/// 销毁资源提供者
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -281,6 +278,13 @@ namespace YooAsset
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region 排序接口实现
|
||||||
|
public int CompareTo(ProviderBase other)
|
||||||
|
{
|
||||||
|
return other.ProviderPriority.CompareTo(this.ProviderPriority);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region 异步编程相关
|
#region 异步编程相关
|
||||||
private TaskCompletionSource<object> _taskCompletionSource;
|
private TaskCompletionSource<object> _taskCompletionSource;
|
||||||
protected void InvokeCompletion()
|
protected void InvokeCompletion()
|
||||||
|
|
|
@ -218,7 +218,9 @@ namespace YooAsset
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 加载场景
|
/// 加载场景对象
|
||||||
|
/// 注意:返回的场景句柄是唯一的,每个场景句柄对应自己的场景提供者对象。
|
||||||
|
/// 注意:业务逻辑层应该避免同时加载一个子场景。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public SceneHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode, bool suspendLoad, uint priority)
|
public SceneHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode, bool suspendLoad, uint priority)
|
||||||
{
|
{
|
||||||
|
@ -387,15 +389,24 @@ namespace YooAsset
|
||||||
return provider.CreateHandle<RawFileHandle>();
|
return provider.CreateHandle<RawFileHandle>();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void UnloadSubScene(ProviderBase provider)
|
internal void UnloadSubScene(string sceneName)
|
||||||
|
{
|
||||||
|
List<string> removeKeys = new List<string>();
|
||||||
|
foreach (var valuePair in _sceneHandles)
|
||||||
|
{
|
||||||
|
var sceneHandle = valuePair.Value;
|
||||||
|
if (sceneHandle.SceneName == sceneName)
|
||||||
{
|
{
|
||||||
string providerGUID = provider.ProviderGUID;
|
|
||||||
if (_sceneHandles.ContainsKey(providerGUID) == false)
|
|
||||||
throw new Exception("Should never get here !");
|
|
||||||
|
|
||||||
// 释放子场景句柄
|
// 释放子场景句柄
|
||||||
_sceneHandles[providerGUID].ReleaseInternal();
|
sceneHandle.ReleaseInternal();
|
||||||
_sceneHandles.Remove(providerGUID);
|
removeKeys.Add(valuePair.Key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (string key in removeKeys)
|
||||||
|
{
|
||||||
|
_sceneHandles.Remove(key);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
private void UnloadAllScene()
|
private void UnloadAllScene()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue