mirror of
https://github.com/tuyoogame/YooAsset.git
synced 2026-05-30 05:28:46 +00:00
refactor : 代码重构
This commit is contained in:
@@ -22,7 +22,7 @@ namespace YooAsset.Editor
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static string GetStreamingAssetsRoot()
|
public static string GetStreamingAssetsRoot()
|
||||||
{
|
{
|
||||||
return YooAssetSettingsData.GetYooDefaultBuildinRoot();
|
return YooAssetSettingsData.GetYooDefaultBuiltinRoot();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -31,7 +31,7 @@ namespace YooAsset.Editor
|
|||||||
|
|
||||||
// 创建新补丁清单
|
// 创建新补丁清单
|
||||||
PackageManifest manifest = new PackageManifest();
|
PackageManifest manifest = new PackageManifest();
|
||||||
manifest.FileVersion = PackageManifestDefine.FileVersion;
|
manifest.FileVersion = PackageManifestConsts.FileVersion;
|
||||||
manifest.EnableAddressable = buildMapContext.Command.EnableAddressable;
|
manifest.EnableAddressable = buildMapContext.Command.EnableAddressable;
|
||||||
manifest.SupportExtensionless = buildMapContext.Command.SupportExtensionless;
|
manifest.SupportExtensionless = buildMapContext.Command.SupportExtensionless;
|
||||||
manifest.LocationToLower = buildMapContext.Command.LocationToLower;
|
manifest.LocationToLower = buildMapContext.Command.LocationToLower;
|
||||||
|
|||||||
@@ -147,9 +147,9 @@ namespace YooAsset.Editor
|
|||||||
EditorConnection.instance.Initialize();
|
EditorConnection.instance.Initialize();
|
||||||
EditorConnection.instance.RegisterConnection(OnHandleConnectionEvent);
|
EditorConnection.instance.RegisterConnection(OnHandleConnectionEvent);
|
||||||
EditorConnection.instance.RegisterDisconnection(OnHandleDisconnectionEvent);
|
EditorConnection.instance.RegisterDisconnection(OnHandleDisconnectionEvent);
|
||||||
EditorConnection.instance.Register(DiagnosticSystemDefine.PlayerToEditorMessageId, OnHandlePlayerMessage);
|
EditorConnection.instance.Register(DiagnosticSystemConsts.PlayerToEditorMessageId, OnHandlePlayerMessage);
|
||||||
MockEditorConnection.Instance.Initialize();
|
MockEditorConnection.Instance.Initialize();
|
||||||
MockEditorConnection.Instance.Register(DiagnosticSystemDefine.PlayerToEditorMessageId, OnHandlePlayerMessage);
|
MockEditorConnection.Instance.Register(DiagnosticSystemConsts.PlayerToEditorMessageId, OnHandlePlayerMessage);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -161,8 +161,8 @@ namespace YooAsset.Editor
|
|||||||
// 远程调试
|
// 远程调试
|
||||||
EditorConnection.instance.UnregisterConnection(OnHandleConnectionEvent);
|
EditorConnection.instance.UnregisterConnection(OnHandleConnectionEvent);
|
||||||
EditorConnection.instance.UnregisterDisconnection(OnHandleDisconnectionEvent);
|
EditorConnection.instance.UnregisterDisconnection(OnHandleDisconnectionEvent);
|
||||||
EditorConnection.instance.Unregister(DiagnosticSystemDefine.PlayerToEditorMessageId, OnHandlePlayerMessage);
|
EditorConnection.instance.Unregister(DiagnosticSystemConsts.PlayerToEditorMessageId, OnHandlePlayerMessage);
|
||||||
MockEditorConnection.Instance.Unregister(DiagnosticSystemDefine.PlayerToEditorMessageId, OnHandlePlayerMessage);
|
MockEditorConnection.Instance.Unregister(DiagnosticSystemConsts.PlayerToEditorMessageId, OnHandlePlayerMessage);
|
||||||
_playerSessions.Clear();
|
_playerSessions.Clear();
|
||||||
}
|
}
|
||||||
public void Update()
|
public void Update()
|
||||||
@@ -194,9 +194,9 @@ namespace YooAsset.Editor
|
|||||||
int playerId = args.playerId;
|
int playerId = args.playerId;
|
||||||
var debugReport = DiagnosticReport.Deserialize(args.data);
|
var debugReport = DiagnosticReport.Deserialize(args.data);
|
||||||
|
|
||||||
if (debugReport.ProtocolVersion != DiagnosticSystemDefine.ProtocolVersion)
|
if (debugReport.ProtocolVersion != DiagnosticSystemConsts.ProtocolVersion)
|
||||||
{
|
{
|
||||||
Debug.LogWarning($"Debugger versions are inconsistent : {debugReport.ProtocolVersion} != {DiagnosticSystemDefine.ProtocolVersion}");
|
Debug.LogWarning($"Debugger versions are inconsistent : {debugReport.ProtocolVersion} != {DiagnosticSystemConsts.ProtocolVersion}");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -258,8 +258,8 @@ namespace YooAsset.Editor
|
|||||||
command.CommandType = (int)EDiagnosticCommandType.AutoSampling;
|
command.CommandType = (int)EDiagnosticCommandType.AutoSampling;
|
||||||
command.Parameter = evt.newValue ? "open" : "close";
|
command.Parameter = evt.newValue ? "open" : "close";
|
||||||
byte[] data = DiagnosticCommand.Serialize(command);
|
byte[] data = DiagnosticCommand.Serialize(command);
|
||||||
EditorConnection.instance.Send(DiagnosticSystemDefine.EditorToPlayerMessageId, data);
|
EditorConnection.instance.Send(DiagnosticSystemConsts.EditorToPlayerMessageId, data);
|
||||||
MockEditorConnection.Instance.Send(DiagnosticSystemDefine.EditorToPlayerMessageId, data);
|
MockEditorConnection.Instance.Send(DiagnosticSystemConsts.EditorToPlayerMessageId, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SampleBtn_onClick()
|
private void SampleBtn_onClick()
|
||||||
@@ -269,8 +269,8 @@ namespace YooAsset.Editor
|
|||||||
command.CommandType = (int)EDiagnosticCommandType.SampleOnce;
|
command.CommandType = (int)EDiagnosticCommandType.SampleOnce;
|
||||||
command.Parameter = string.Empty;
|
command.Parameter = string.Empty;
|
||||||
byte[] data = DiagnosticCommand.Serialize(command);
|
byte[] data = DiagnosticCommand.Serialize(command);
|
||||||
EditorConnection.instance.Send(DiagnosticSystemDefine.EditorToPlayerMessageId, data);
|
EditorConnection.instance.Send(DiagnosticSystemConsts.EditorToPlayerMessageId, data);
|
||||||
MockEditorConnection.Instance.Send(DiagnosticSystemDefine.EditorToPlayerMessageId, data);
|
MockEditorConnection.Instance.Send(DiagnosticSystemConsts.EditorToPlayerMessageId, data);
|
||||||
}
|
}
|
||||||
private void ExportBtn_clicked()
|
private void ExportBtn_clicked()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -358,7 +358,7 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
YooLogger.Error($"Exception in inoke callback: {ex}");
|
YooLogger.Error($"Exception in invoke callback: {ex}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: a9ca0d0d29eb5294b9c6926c6a09e76b
|
guid: 4c4801976948fc14cb28d4982c9ebe5c
|
||||||
folderAsset: yes
|
folderAsset: yes
|
||||||
DefaultImporter:
|
DefaultImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
using UnityEngine.SceneManagement;
|
||||||
|
|
||||||
|
namespace YooAsset
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 资源包句柄接口,提供对已加载资源包的操作能力
|
||||||
|
/// </summary>
|
||||||
|
internal interface IBundleHandle
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取资源包文件的本地路径
|
||||||
|
/// </summary>
|
||||||
|
string GetBundleFilePath();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 卸载资源包文件
|
||||||
|
/// </summary>
|
||||||
|
void UnloadBundleFile();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加载资源对象
|
||||||
|
/// </summary>
|
||||||
|
BHLoadAssetOperation LoadAssetAsync(AssetInfo assetInfo);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加载所有资源对象
|
||||||
|
/// </summary>
|
||||||
|
BHLoadAllAssetsOperation LoadAllAssetsAsync(AssetInfo assetInfo);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加载资源对象及所有子资源对象
|
||||||
|
/// </summary>
|
||||||
|
BHLoadSubAssetsOperation LoadSubAssetsAsync(AssetInfo assetInfo);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加载场景对象
|
||||||
|
/// </summary>
|
||||||
|
BHLoadSceneOperation LoadSceneAsync(AssetInfo assetInfo, LoadSceneParameters loadSceneParams, bool suspendLoad);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
namespace YooAsset
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 加载所有资源操作的抽象基类
|
||||||
|
/// </summary>
|
||||||
|
internal abstract class BHLoadAllAssetsOperation : AsyncOperationBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 加载的所有资源对象
|
||||||
|
/// </summary>
|
||||||
|
public UnityEngine.Object[] Result;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
namespace YooAsset
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 加载单个资源操作的抽象基类
|
||||||
|
/// </summary>
|
||||||
|
internal abstract class BHLoadAssetOperation : AsyncOperationBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 加载的资源对象
|
||||||
|
/// </summary>
|
||||||
|
public UnityEngine.Object Result;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
|
||||||
|
namespace YooAsset
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 加载场景操作的抽象基类
|
||||||
|
/// </summary>
|
||||||
|
internal abstract class BHLoadSceneOperation : AsyncOperationBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 加载的场景对象
|
||||||
|
/// </summary>
|
||||||
|
public UnityEngine.SceneManagement.Scene Result;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 恢复挂起的场景加载
|
||||||
|
/// </summary>
|
||||||
|
public abstract void ResumeLoad();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
namespace YooAsset
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 加载子资源操作的抽象基类
|
||||||
|
/// </summary>
|
||||||
|
internal abstract class BHLoadSubAssetsOperation : AsyncOperationBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 加载的子资源对象集合
|
||||||
|
/// </summary>
|
||||||
|
public UnityEngine.Object[] Result;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,17 +1,20 @@
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.SceneManagement;
|
using UnityEngine.SceneManagement;
|
||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
internal class AssetBundleResult : IBundleResult
|
/// <summary>
|
||||||
|
/// AssetBundle资源包句柄
|
||||||
|
/// </summary>
|
||||||
|
internal class AssetBundleHandle : IBundleHandle
|
||||||
{
|
{
|
||||||
private readonly string _bundleFilePath;
|
private readonly string _bundleFilePath;
|
||||||
private readonly PackageBundle _packageBundle;
|
private readonly PackageBundle _packageBundle;
|
||||||
private readonly AssetBundle _assetBundle;
|
private readonly AssetBundle _assetBundle;
|
||||||
private readonly Stream _managedStream;
|
private readonly Stream _managedStream;
|
||||||
|
|
||||||
public AssetBundleResult(string bundleFilePath, PackageBundle packageBundle, AssetBundle assetBundle, Stream managedStream)
|
public AssetBundleHandle(string bundleFilePath, PackageBundle packageBundle, AssetBundle assetBundle, Stream managedStream)
|
||||||
{
|
{
|
||||||
_bundleFilePath = bundleFilePath;
|
_bundleFilePath = bundleFilePath;
|
||||||
_packageBundle = packageBundle;
|
_packageBundle = packageBundle;
|
||||||
@@ -36,24 +39,24 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public FSLoadAssetOperation LoadAssetAsync(AssetInfo assetInfo)
|
public BHLoadAssetOperation LoadAssetAsync(AssetInfo assetInfo)
|
||||||
{
|
{
|
||||||
var operation = new AssetBundleLoadAssetOperation(_packageBundle, _assetBundle, assetInfo);
|
var operation = new ABHLoadAssetOperation(_packageBundle, _assetBundle, assetInfo);
|
||||||
return operation;
|
return operation;
|
||||||
}
|
}
|
||||||
public FSLoadAllAssetsOperation LoadAllAssetsAsync(AssetInfo assetInfo)
|
public BHLoadAllAssetsOperation LoadAllAssetsAsync(AssetInfo assetInfo)
|
||||||
{
|
{
|
||||||
var operation = new AssetBundleLoadAllAssetsOperation(_packageBundle, _assetBundle, assetInfo);
|
var operation = new ABHLoadAllAssetsOperation(_packageBundle, _assetBundle, assetInfo);
|
||||||
return operation;
|
return operation;
|
||||||
}
|
}
|
||||||
public FSLoadSubAssetsOperation LoadSubAssetsAsync(AssetInfo assetInfo)
|
public BHLoadSubAssetsOperation LoadSubAssetsAsync(AssetInfo assetInfo)
|
||||||
{
|
{
|
||||||
var operation = new AssetBundleLoadSubAssetsOperation(_packageBundle, _assetBundle, assetInfo);
|
var operation = new ABHLoadSubAssetsOperation(_packageBundle, _assetBundle, assetInfo);
|
||||||
return operation;
|
return operation;
|
||||||
}
|
}
|
||||||
public FSLoadSceneOperation LoadSceneOperation(AssetInfo assetInfo, LoadSceneParameters loadParams, bool suspendLoad)
|
public BHLoadSceneOperation LoadSceneAsync(AssetInfo assetInfo, LoadSceneParameters loadSceneParams, bool suspendLoad)
|
||||||
{
|
{
|
||||||
var operation = new AssetBundleLoadSceneOperation(assetInfo, loadParams, suspendLoad);
|
var operation = new ABHLoadSceneOperation(assetInfo, loadSceneParams, suspendLoad);
|
||||||
return operation;
|
return operation;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,8 +1,11 @@
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
internal class AssetBundleLoadAllAssetsOperation : FSLoadAllAssetsOperation
|
/// <summary>
|
||||||
|
/// AssetBundle的加载所有资源操作
|
||||||
|
/// </summary>
|
||||||
|
internal class ABHLoadAllAssetsOperation : BHLoadAllAssetsOperation
|
||||||
{
|
{
|
||||||
protected enum ESteps
|
protected enum ESteps
|
||||||
{
|
{
|
||||||
@@ -19,7 +22,7 @@ namespace YooAsset
|
|||||||
private AssetBundleRequest _request;
|
private AssetBundleRequest _request;
|
||||||
private ESteps _steps = ESteps.None;
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
public AssetBundleLoadAllAssetsOperation(PackageBundle packageBundle, AssetBundle assetBundle, AssetInfo assetInfo)
|
public ABHLoadAllAssetsOperation(PackageBundle packageBundle, AssetBundle assetBundle, AssetInfo assetInfo)
|
||||||
{
|
{
|
||||||
_packageBundle = packageBundle;
|
_packageBundle = packageBundle;
|
||||||
_assetBundle = assetBundle;
|
_assetBundle = assetBundle;
|
||||||
@@ -39,8 +42,8 @@ namespace YooAsset
|
|||||||
if (_assetBundle == null)
|
if (_assetBundle == null)
|
||||||
{
|
{
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Error = $"The bundle {_packageBundle.BundleName} has been destroyed due to unity engine bugs.";
|
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = $"The bundle {_packageBundle.BundleName} has been destroyed due to Unity engine bugs.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,10 +74,11 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
if (_request != null)
|
if (_request != null)
|
||||||
{
|
{
|
||||||
|
// 注意: 异步加载过程中,业务逻辑可能会强制转换为同步加载
|
||||||
if (IsWaitForCompletion)
|
if (IsWaitForCompletion)
|
||||||
{
|
{
|
||||||
// 强制挂起主线程(注意:该操作会很耗时)
|
// 强制挂起主线程(注意:该操作会很耗时)
|
||||||
YooLogger.Warning("Suspend the main thread to load unity asset.");
|
YooLogger.Warning("Suspending the main thread to load Unity asset.");
|
||||||
Result = _request.allAssets;
|
Result = _request.allAssets;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -93,11 +97,11 @@ namespace YooAsset
|
|||||||
error = $"Failed to load all assets: {_assetInfo.AssetPath} AssetType: null AssetBundle: {_packageBundle.BundleName}";
|
error = $"Failed to load all assets: {_assetInfo.AssetPath} AssetType: null AssetBundle: {_packageBundle.BundleName}";
|
||||||
else
|
else
|
||||||
error = $"Failed to load all assets: {_assetInfo.AssetPath} AssetType: {_assetInfo.AssetType} AssetBundle: {_packageBundle.BundleName}";
|
error = $"Failed to load all assets: {_assetInfo.AssetPath} AssetType: {_assetInfo.AssetType} AssetBundle: {_packageBundle.BundleName}";
|
||||||
YooLogger.Error(error);
|
|
||||||
|
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Error = error;
|
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = error;
|
||||||
|
YooLogger.Error(error);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1,8 +1,11 @@
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
internal class AssetBundleLoadAssetOperation : FSLoadAssetOperation
|
/// <summary>
|
||||||
|
/// AssetBundle的加载单个资源操作
|
||||||
|
/// </summary>
|
||||||
|
internal class ABHLoadAssetOperation : BHLoadAssetOperation
|
||||||
{
|
{
|
||||||
protected enum ESteps
|
protected enum ESteps
|
||||||
{
|
{
|
||||||
@@ -19,7 +22,7 @@ namespace YooAsset
|
|||||||
private AssetBundleRequest _request;
|
private AssetBundleRequest _request;
|
||||||
private ESteps _steps = ESteps.None;
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
public AssetBundleLoadAssetOperation(PackageBundle packageBundle, AssetBundle assetBundle, AssetInfo assetInfo)
|
public ABHLoadAssetOperation(PackageBundle packageBundle, AssetBundle assetBundle, AssetInfo assetInfo)
|
||||||
{
|
{
|
||||||
_packageBundle = packageBundle;
|
_packageBundle = packageBundle;
|
||||||
_assetBundle = assetBundle;
|
_assetBundle = assetBundle;
|
||||||
@@ -39,8 +42,8 @@ namespace YooAsset
|
|||||||
if (_assetBundle == null)
|
if (_assetBundle == null)
|
||||||
{
|
{
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Error = $"The bundle {_packageBundle.BundleName} has been destroyed due to unity engine bugs.";
|
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = $"The bundle {_packageBundle.BundleName} has been destroyed due to Unity engine bugs.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,10 +74,11 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
if (_request != null)
|
if (_request != null)
|
||||||
{
|
{
|
||||||
|
// 注意: 异步加载过程中,业务逻辑可能会强制转换为同步加载
|
||||||
if (IsWaitForCompletion)
|
if (IsWaitForCompletion)
|
||||||
{
|
{
|
||||||
// 强制挂起主线程(注意:该操作会很耗时)
|
// 强制挂起主线程(注意:该操作会很耗时)
|
||||||
YooLogger.Warning("Suspend the main thread to load unity asset.");
|
YooLogger.Warning("Suspending the main thread to load Unity asset.");
|
||||||
Result = _request.asset;
|
Result = _request.asset;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1,9 +1,12 @@
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.SceneManagement;
|
using UnityEngine.SceneManagement;
|
||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
internal class AssetBundleLoadSceneOperation : FSLoadSceneOperation
|
/// <summary>
|
||||||
|
/// AssetBundle的场景加载操作
|
||||||
|
/// </summary>
|
||||||
|
internal class ABHLoadSceneOperation : BHLoadSceneOperation
|
||||||
{
|
{
|
||||||
protected enum ESteps
|
protected enum ESteps
|
||||||
{
|
{
|
||||||
@@ -14,15 +17,15 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
|
|
||||||
private readonly AssetInfo _assetInfo;
|
private readonly AssetInfo _assetInfo;
|
||||||
private readonly LoadSceneParameters _loadParams;
|
private readonly LoadSceneParameters _loadSceneParams;
|
||||||
private bool _suspendLoad;
|
private bool _suspendLoad;
|
||||||
private AsyncOperation _asyncOperation;
|
private AsyncOperation _asyncOperation;
|
||||||
private ESteps _steps = ESteps.None;
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
public AssetBundleLoadSceneOperation(AssetInfo assetInfo, LoadSceneParameters loadParams, bool suspendLoad)
|
public ABHLoadSceneOperation(AssetInfo assetInfo, LoadSceneParameters loadSceneParams, bool suspendLoad)
|
||||||
{
|
{
|
||||||
_assetInfo = assetInfo;
|
_assetInfo = assetInfo;
|
||||||
_loadParams = loadParams;
|
_loadSceneParams = loadSceneParams;
|
||||||
_suspendLoad = suspendLoad;
|
_suspendLoad = suspendLoad;
|
||||||
}
|
}
|
||||||
internal override void InternalStart()
|
internal override void InternalStart()
|
||||||
@@ -39,14 +42,14 @@ namespace YooAsset
|
|||||||
if (IsWaitForCompletion)
|
if (IsWaitForCompletion)
|
||||||
{
|
{
|
||||||
// 注意:场景同步加载方法不会立即加载场景,而是在下一帧加载。
|
// 注意:场景同步加载方法不会立即加载场景,而是在下一帧加载。
|
||||||
Result = SceneManager.LoadScene(_assetInfo.AssetPath, _loadParams);
|
Result = SceneManager.LoadScene(_assetInfo.AssetPath, _loadSceneParams);
|
||||||
_steps = ESteps.CheckResult;
|
_steps = ESteps.CheckResult;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// 注意:如果场景不存在异步加载方法返回NULL
|
// 注意:如果场景不存在异步加载方法返回NULL
|
||||||
// 注意:即使是异步加载也要在当帧获取到场景对象
|
// 注意:即使是异步加载也要在当帧获取到场景对象
|
||||||
_asyncOperation = SceneManager.LoadSceneAsync(_assetInfo.AssetPath, _loadParams);
|
_asyncOperation = SceneManager.LoadSceneAsync(_assetInfo.AssetPath, _loadSceneParams);
|
||||||
if (_asyncOperation != null)
|
if (_asyncOperation != null)
|
||||||
{
|
{
|
||||||
_asyncOperation.allowSceneActivation = !_suspendLoad;
|
_asyncOperation.allowSceneActivation = !_suspendLoad;
|
||||||
@@ -56,11 +59,10 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string error = $"Failed to load scene : {_assetInfo.AssetPath}";
|
|
||||||
YooLogger.Error(error);
|
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Error = error;
|
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = $"Failed to load scene: {_assetInfo.AssetPath}";
|
||||||
|
YooLogger.Error(Error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -72,7 +74,7 @@ namespace YooAsset
|
|||||||
if (IsWaitForCompletion)
|
if (IsWaitForCompletion)
|
||||||
{
|
{
|
||||||
// 注意:场景加载无法强制异步转同步
|
// 注意:场景加载无法强制异步转同步
|
||||||
YooLogger.Error("The scene is loading asyn.");
|
YooLogger.Error("The scene is already loading asynchronously.");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -96,11 +98,10 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string error = $"The loaded scene is invalid : {_assetInfo.AssetPath}";
|
|
||||||
YooLogger.Error(error);
|
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Error = error;
|
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = $"The loaded scene is invalid: {_assetInfo.AssetPath}";
|
||||||
|
YooLogger.Error(Error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -109,7 +110,7 @@ namespace YooAsset
|
|||||||
//注意:场景加载不支持异步转同步,为了支持同步加载方法需要实现该方法!
|
//注意:场景加载不支持异步转同步,为了支持同步加载方法需要实现该方法!
|
||||||
ExecuteOnce();
|
ExecuteOnce();
|
||||||
}
|
}
|
||||||
public override void UnSuspendLoad()
|
public override void ResumeLoad()
|
||||||
{
|
{
|
||||||
_suspendLoad = false;
|
_suspendLoad = false;
|
||||||
}
|
}
|
||||||
@@ -1,8 +1,11 @@
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
internal class AssetBundleLoadSubAssetsOperation : FSLoadSubAssetsOperation
|
/// <summary>
|
||||||
|
/// AssetBundle的加载子资源操作
|
||||||
|
/// </summary>
|
||||||
|
internal class ABHLoadSubAssetsOperation : BHLoadSubAssetsOperation
|
||||||
{
|
{
|
||||||
protected enum ESteps
|
protected enum ESteps
|
||||||
{
|
{
|
||||||
@@ -19,7 +22,7 @@ namespace YooAsset
|
|||||||
private AssetBundleRequest _request;
|
private AssetBundleRequest _request;
|
||||||
private ESteps _steps = ESteps.None;
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
public AssetBundleLoadSubAssetsOperation(PackageBundle packageBundle, AssetBundle assetBundle, AssetInfo assetInfo)
|
public ABHLoadSubAssetsOperation(PackageBundle packageBundle, AssetBundle assetBundle, AssetInfo assetInfo)
|
||||||
{
|
{
|
||||||
_packageBundle = packageBundle;
|
_packageBundle = packageBundle;
|
||||||
_assetBundle = assetBundle;
|
_assetBundle = assetBundle;
|
||||||
@@ -39,8 +42,8 @@ namespace YooAsset
|
|||||||
if (_assetBundle == null)
|
if (_assetBundle == null)
|
||||||
{
|
{
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Error = $"The bundle {_packageBundle.BundleName} has been destroyed due to unity engine bugs.";
|
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = $"The bundle {_packageBundle.BundleName} has been destroyed due to Unity engine bugs.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,10 +74,11 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
if (_request != null)
|
if (_request != null)
|
||||||
{
|
{
|
||||||
|
// 注意: 异步加载过程中,业务逻辑可能会强制转换为同步加载
|
||||||
if (IsWaitForCompletion)
|
if (IsWaitForCompletion)
|
||||||
{
|
{
|
||||||
// 强制挂起主线程(注意:该操作会很耗时)
|
// 强制挂起主线程(注意:该操作会很耗时)
|
||||||
YooLogger.Warning("Suspend the main thread to load unity asset.");
|
YooLogger.Warning("Suspending the main thread to load Unity asset.");
|
||||||
Result = _request.allAssets;
|
Result = _request.allAssets;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -90,14 +94,14 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
string error;
|
string error;
|
||||||
if (_assetInfo.AssetType == null)
|
if (_assetInfo.AssetType == null)
|
||||||
error = $"Failed to load sub assets : {_assetInfo.AssetPath} AssetType : null AssetBundle : {_packageBundle.BundleName}";
|
error = $"Failed to load sub-assets: {_assetInfo.AssetPath} AssetType: null AssetBundle: {_packageBundle.BundleName}";
|
||||||
else
|
else
|
||||||
error = $"Failed to load sub assets : {_assetInfo.AssetPath} AssetType : {_assetInfo.AssetType} AssetBundle : {_packageBundle.BundleName}";
|
error = $"Failed to load sub-assets: {_assetInfo.AssetPath} AssetType: {_assetInfo.AssetType} AssetBundle: {_packageBundle.BundleName}";
|
||||||
YooLogger.Error(error);
|
|
||||||
|
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Error = error;
|
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = error;
|
||||||
|
YooLogger.Error(error);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: af833833252078e45866dd8e1e8299bb
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c9e4bd9d00f3b2d4482c97519523474d
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
|
||||||
|
namespace YooAsset
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 原生资源包的加载所有资源操作(不支持)
|
||||||
|
/// </summary>
|
||||||
|
internal class RBHLoadAllAssetsOperation : BHLoadAllAssetsOperation
|
||||||
|
{
|
||||||
|
internal override void InternalStart()
|
||||||
|
{
|
||||||
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = $"{nameof(RBHLoadAllAssetsOperation)} does not support loading all assets.";
|
||||||
|
}
|
||||||
|
internal override void InternalUpdate()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,10 @@
|
|||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
internal class RawBundleLoadAssetOperation : FSLoadAssetOperation
|
/// <summary>
|
||||||
|
/// 原生资源包的加载单个资源操作
|
||||||
|
/// </summary>
|
||||||
|
internal class RBHLoadAssetOperation : BHLoadAssetOperation
|
||||||
{
|
{
|
||||||
protected enum ESteps
|
protected enum ESteps
|
||||||
{
|
{
|
||||||
@@ -16,7 +19,7 @@ namespace YooAsset
|
|||||||
private readonly AssetInfo _assetInfo;
|
private readonly AssetInfo _assetInfo;
|
||||||
private ESteps _steps = ESteps.None;
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
public RawBundleLoadAssetOperation(PackageBundle packageBundle, RawBundle rawBundle, AssetInfo assetInfo)
|
public RBHLoadAssetOperation(PackageBundle packageBundle, RawBundle rawBundle, AssetInfo assetInfo)
|
||||||
{
|
{
|
||||||
_packageBundle = packageBundle;
|
_packageBundle = packageBundle;
|
||||||
_rawBundle = rawBundle;
|
_rawBundle = rawBundle;
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
|
||||||
|
namespace YooAsset
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 原生资源包的场景加载操作(不支持)
|
||||||
|
/// </summary>
|
||||||
|
internal class RBHLoadSceneOperation : BHLoadSceneOperation
|
||||||
|
{
|
||||||
|
internal override void InternalStart()
|
||||||
|
{
|
||||||
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = $"{nameof(RBHLoadSceneOperation)} does not support loading scene.";
|
||||||
|
}
|
||||||
|
internal override void InternalUpdate()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
public override void ResumeLoad()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
|
||||||
|
namespace YooAsset
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 原生资源包的加载子资源操作(不支持)
|
||||||
|
/// </summary>
|
||||||
|
internal class RBHLoadSubAssetsOperation : BHLoadSubAssetsOperation
|
||||||
|
{
|
||||||
|
internal override void InternalStart()
|
||||||
|
{
|
||||||
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = $"{nameof(RBHLoadSubAssetsOperation)} does not support loading sub-assets.";
|
||||||
|
}
|
||||||
|
internal override void InternalUpdate()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,9 @@
|
|||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 原生资源包
|
||||||
|
/// </summary>
|
||||||
public class RawBundle
|
public class RawBundle
|
||||||
{
|
{
|
||||||
private byte[] _data;
|
private byte[] _data;
|
||||||
@@ -18,6 +21,9 @@ namespace YooAsset
|
|||||||
return RawFileObject.Create(_data);
|
return RawFileObject.Create(_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 卸载原生资源包数据
|
||||||
|
/// </summary>
|
||||||
public void Unload()
|
public void Unload()
|
||||||
{
|
{
|
||||||
_data = null;
|
_data = null;
|
||||||
@@ -1,14 +1,17 @@
|
|||||||
using UnityEngine.SceneManagement;
|
using UnityEngine.SceneManagement;
|
||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
internal class RawBundleResult : IBundleResult
|
/// <summary>
|
||||||
|
/// 原生资源包句柄
|
||||||
|
/// </summary>
|
||||||
|
internal class RawBundleHandle : IBundleHandle
|
||||||
{
|
{
|
||||||
private readonly string _bundleFilePath;
|
private readonly string _bundleFilePath;
|
||||||
private readonly PackageBundle _packageBundle;
|
private readonly PackageBundle _packageBundle;
|
||||||
private readonly RawBundle _rawBundle;
|
private readonly RawBundle _rawBundle;
|
||||||
|
|
||||||
public RawBundleResult(string bundleFilePath, PackageBundle packageBundle, RawBundle rawBundle)
|
public RawBundleHandle(string bundleFilePath, PackageBundle packageBundle, RawBundle rawBundle)
|
||||||
{
|
{
|
||||||
_bundleFilePath = bundleFilePath;
|
_bundleFilePath = bundleFilePath;
|
||||||
_packageBundle = packageBundle;
|
_packageBundle = packageBundle;
|
||||||
@@ -26,24 +29,24 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public FSLoadAssetOperation LoadAssetAsync(AssetInfo assetInfo)
|
public BHLoadAssetOperation LoadAssetAsync(AssetInfo assetInfo)
|
||||||
{
|
{
|
||||||
var operation = new RawBundleLoadAssetOperation(_packageBundle, _rawBundle, assetInfo);
|
var operation = new RBHLoadAssetOperation(_packageBundle, _rawBundle, assetInfo);
|
||||||
return operation;
|
return operation;
|
||||||
}
|
}
|
||||||
public FSLoadAllAssetsOperation LoadAllAssetsAsync(AssetInfo assetInfo)
|
public BHLoadAllAssetsOperation LoadAllAssetsAsync(AssetInfo assetInfo)
|
||||||
{
|
{
|
||||||
var operation = new RawBundleLoadAllAssetsOperation();
|
var operation = new RBHLoadAllAssetsOperation();
|
||||||
return operation;
|
return operation;
|
||||||
}
|
}
|
||||||
public FSLoadSubAssetsOperation LoadSubAssetsAsync(AssetInfo assetInfo)
|
public BHLoadSubAssetsOperation LoadSubAssetsAsync(AssetInfo assetInfo)
|
||||||
{
|
{
|
||||||
var operation = new RawBundleLoadSubAssetsOperation();
|
var operation = new RBHLoadSubAssetsOperation();
|
||||||
return operation;
|
return operation;
|
||||||
}
|
}
|
||||||
public FSLoadSceneOperation LoadSceneOperation(AssetInfo assetInfo, LoadSceneParameters loadParams, bool suspendLoad)
|
public BHLoadSceneOperation LoadSceneAsync(AssetInfo assetInfo, LoadSceneParameters loadSceneParams, bool suspendLoad)
|
||||||
{
|
{
|
||||||
var operation = new RawBundleLoadSceneOperation();
|
var operation = new RBHLoadSceneOperation();
|
||||||
return operation;
|
return operation;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -11,8 +11,14 @@ namespace YooAsset
|
|||||||
private byte[] _fileData;
|
private byte[] _fileData;
|
||||||
private string _fileText;
|
private string _fileText;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 原生文件的二进制数据
|
||||||
|
/// </summary>
|
||||||
public byte[] Data => _fileData;
|
public byte[] Data => _fileData;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 原生文件的UTF-8文本内容
|
||||||
|
/// </summary>
|
||||||
public string Text
|
public string Text
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@@ -1,8 +1,11 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
internal class VirtualBundleLoadAllAssetsOperation : FSLoadAllAssetsOperation
|
/// <summary>
|
||||||
|
/// 虚拟资源包的加载所有资源操作
|
||||||
|
/// </summary>
|
||||||
|
internal class VBHLoadAllAssetsOperation : BHLoadAllAssetsOperation
|
||||||
{
|
{
|
||||||
protected enum ESteps
|
protected enum ESteps
|
||||||
{
|
{
|
||||||
@@ -17,7 +20,7 @@ namespace YooAsset
|
|||||||
private readonly AssetInfo _assetInfo;
|
private readonly AssetInfo _assetInfo;
|
||||||
private ESteps _steps = ESteps.None;
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
public VirtualBundleLoadAllAssetsOperation(PackageBundle packageBundle, AssetInfo assetInfo)
|
public VBHLoadAllAssetsOperation(PackageBundle packageBundle, AssetInfo assetInfo)
|
||||||
{
|
{
|
||||||
_packageBundle = packageBundle;
|
_packageBundle = packageBundle;
|
||||||
_assetInfo = assetInfo;
|
_assetInfo = assetInfo;
|
||||||
@@ -28,8 +31,8 @@ namespace YooAsset
|
|||||||
_steps = ESteps.CheckBundle;
|
_steps = ESteps.CheckBundle;
|
||||||
#else
|
#else
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Error = $"{nameof(VirtualBundleLoadAllAssetsOperation)} only support unity editor platform.";
|
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = $"{nameof(VirtualBundleLoadAllAssetsOperation)} only support unity editor platform.";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
internal override void InternalUpdate()
|
internal override void InternalUpdate()
|
||||||
@@ -44,11 +47,10 @@ namespace YooAsset
|
|||||||
string guid = UnityEditor.AssetDatabase.AssetPathToGUID(_assetInfo.AssetPath);
|
string guid = UnityEditor.AssetDatabase.AssetPathToGUID(_assetInfo.AssetPath);
|
||||||
if (string.IsNullOrEmpty(guid))
|
if (string.IsNullOrEmpty(guid))
|
||||||
{
|
{
|
||||||
string error = $"Not found asset : {_assetInfo.AssetPath}";
|
|
||||||
YooLogger.Error(error);
|
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Error = error;
|
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = $"Asset not found: {_assetInfo.AssetPath}";
|
||||||
|
YooLogger.Error(Error);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,11 +95,11 @@ namespace YooAsset
|
|||||||
error = $"Failed to load all assets: {_assetInfo.AssetPath} AssetType: null";
|
error = $"Failed to load all assets: {_assetInfo.AssetPath} AssetType: null";
|
||||||
else
|
else
|
||||||
error = $"Failed to load all assets: {_assetInfo.AssetPath} AssetType: {_assetInfo.AssetType}";
|
error = $"Failed to load all assets: {_assetInfo.AssetPath} AssetType: {_assetInfo.AssetType}";
|
||||||
YooLogger.Error(error);
|
|
||||||
|
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Error = error;
|
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = error;
|
||||||
|
YooLogger.Error(error);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1,7 +1,10 @@
|
|||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
internal class VirtualBundleLoadAssetOperation : FSLoadAssetOperation
|
/// <summary>
|
||||||
|
/// 虚拟资源包的加载单个资源操作
|
||||||
|
/// </summary>
|
||||||
|
internal class VBHLoadAssetOperation : BHLoadAssetOperation
|
||||||
{
|
{
|
||||||
protected enum ESteps
|
protected enum ESteps
|
||||||
{
|
{
|
||||||
@@ -16,7 +19,7 @@ namespace YooAsset
|
|||||||
private readonly AssetInfo _assetInfo;
|
private readonly AssetInfo _assetInfo;
|
||||||
private ESteps _steps = ESteps.None;
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
public VirtualBundleLoadAssetOperation(PackageBundle packageBundle, AssetInfo assetInfo)
|
public VBHLoadAssetOperation(PackageBundle packageBundle, AssetInfo assetInfo)
|
||||||
{
|
{
|
||||||
_packageBundle = packageBundle;
|
_packageBundle = packageBundle;
|
||||||
_assetInfo = assetInfo;
|
_assetInfo = assetInfo;
|
||||||
@@ -27,8 +30,8 @@ namespace YooAsset
|
|||||||
_steps = ESteps.CheckBundle;
|
_steps = ESteps.CheckBundle;
|
||||||
#else
|
#else
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Error = $"{nameof(VirtualBundleLoadAssetOperation)} only support unity editor platform.";
|
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = $"{nameof(VirtualBundleLoadAssetOperation)} only support unity editor platform.";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
internal override void InternalUpdate()
|
internal override void InternalUpdate()
|
||||||
@@ -43,11 +46,10 @@ namespace YooAsset
|
|||||||
string guid = UnityEditor.AssetDatabase.AssetPathToGUID(_assetInfo.AssetPath);
|
string guid = UnityEditor.AssetDatabase.AssetPathToGUID(_assetInfo.AssetPath);
|
||||||
if (string.IsNullOrEmpty(guid))
|
if (string.IsNullOrEmpty(guid))
|
||||||
{
|
{
|
||||||
string error = $"Not found asset : {_assetInfo.AssetPath}";
|
|
||||||
YooLogger.Error(error);
|
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Error = error;
|
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = $"Asset not found: {_assetInfo.AssetPath}";
|
||||||
|
YooLogger.Error(Error);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,11 +74,11 @@ namespace YooAsset
|
|||||||
error = $"Failed to load asset object: {_assetInfo.AssetPath} AssetType: null";
|
error = $"Failed to load asset object: {_assetInfo.AssetPath} AssetType: null";
|
||||||
else
|
else
|
||||||
error = $"Failed to load asset object: {_assetInfo.AssetPath} AssetType: {_assetInfo.AssetType}";
|
error = $"Failed to load asset object: {_assetInfo.AssetPath} AssetType: {_assetInfo.AssetType}";
|
||||||
YooLogger.Error(error);
|
|
||||||
|
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Error = error;
|
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = error;
|
||||||
|
YooLogger.Error(error);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1,9 +1,12 @@
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.SceneManagement;
|
using UnityEngine.SceneManagement;
|
||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
internal class VirtualBundleLoadSceneOperation : FSLoadSceneOperation
|
/// <summary>
|
||||||
|
/// 虚拟资源包的场景加载操作
|
||||||
|
/// </summary>
|
||||||
|
internal class VBHLoadSceneOperation : BHLoadSceneOperation
|
||||||
{
|
{
|
||||||
protected enum ESteps
|
protected enum ESteps
|
||||||
{
|
{
|
||||||
@@ -19,7 +22,7 @@ namespace YooAsset
|
|||||||
private AsyncOperation _asyncOperation;
|
private AsyncOperation _asyncOperation;
|
||||||
private ESteps _steps = ESteps.None;
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
public VirtualBundleLoadSceneOperation(AssetInfo assetInfo, LoadSceneParameters loadParams, bool suspendLoad)
|
public VBHLoadSceneOperation(AssetInfo assetInfo, LoadSceneParameters loadParams, bool suspendLoad)
|
||||||
{
|
{
|
||||||
_assetInfo = assetInfo;
|
_assetInfo = assetInfo;
|
||||||
_loadParams = loadParams;
|
_loadParams = loadParams;
|
||||||
@@ -31,8 +34,8 @@ namespace YooAsset
|
|||||||
_steps = ESteps.LoadScene;
|
_steps = ESteps.LoadScene;
|
||||||
#else
|
#else
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Error = $"{nameof(VirtualBundleLoadSceneOperation)} only support unity editor platform.";
|
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = $"{nameof(VirtualBundleLoadSceneOperation)} only support unity editor platform.";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
internal override void InternalUpdate()
|
internal override void InternalUpdate()
|
||||||
@@ -60,11 +63,10 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string error = $"Failed to load scene : {_assetInfo.AssetPath}";
|
|
||||||
YooLogger.Error(error);
|
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Error = error;
|
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = $"Failed to load scene: {_assetInfo.AssetPath}";
|
||||||
|
YooLogger.Error(Error);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -77,7 +79,7 @@ namespace YooAsset
|
|||||||
if (IsWaitForCompletion)
|
if (IsWaitForCompletion)
|
||||||
{
|
{
|
||||||
// 注意:场景加载无法强制异步转同步
|
// 注意:场景加载无法强制异步转同步
|
||||||
YooLogger.Error("The scene is loading asyn.");
|
YooLogger.Error("The scene is already loading asynchronously.");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -101,11 +103,10 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string error = $"The loaded scene is invalid : {_assetInfo.AssetPath}";
|
|
||||||
YooLogger.Error(error);
|
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Error = error;
|
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = $"The loaded scene is invalid: {_assetInfo.AssetPath}";
|
||||||
|
YooLogger.Error(Error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -115,7 +116,7 @@ namespace YooAsset
|
|||||||
//注意:场景加载不支持异步转同步,为了支持同步加载方法需要实现该方法!
|
//注意:场景加载不支持异步转同步,为了支持同步加载方法需要实现该方法!
|
||||||
ExecuteOnce();
|
ExecuteOnce();
|
||||||
}
|
}
|
||||||
public override void UnSuspendLoad()
|
public override void ResumeLoad()
|
||||||
{
|
{
|
||||||
_suspendLoad = false;
|
_suspendLoad = false;
|
||||||
}
|
}
|
||||||
@@ -1,8 +1,11 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
internal class VirtualBundleLoadSubAssetsOperation : FSLoadSubAssetsOperation
|
/// <summary>
|
||||||
|
/// 虚拟资源包的加载子资源操作
|
||||||
|
/// </summary>
|
||||||
|
internal class VBHLoadSubAssetsOperation : BHLoadSubAssetsOperation
|
||||||
{
|
{
|
||||||
protected enum ESteps
|
protected enum ESteps
|
||||||
{
|
{
|
||||||
@@ -17,7 +20,7 @@ namespace YooAsset
|
|||||||
private readonly AssetInfo _assetInfo;
|
private readonly AssetInfo _assetInfo;
|
||||||
private ESteps _steps = ESteps.None;
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
public VirtualBundleLoadSubAssetsOperation(PackageBundle packageBundle, AssetInfo assetInfo)
|
public VBHLoadSubAssetsOperation(PackageBundle packageBundle, AssetInfo assetInfo)
|
||||||
{
|
{
|
||||||
_packageBundle = packageBundle;
|
_packageBundle = packageBundle;
|
||||||
_assetInfo = assetInfo;
|
_assetInfo = assetInfo;
|
||||||
@@ -28,8 +31,8 @@ namespace YooAsset
|
|||||||
_steps = ESteps.CheckBundle;
|
_steps = ESteps.CheckBundle;
|
||||||
#else
|
#else
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Error = $"{nameof(VirtualBundleLoadSubAssetsOperation)} only support unity editor platform.";
|
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = $"{nameof(VirtualBundleLoadSubAssetsOperation)} only support unity editor platform.";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
internal override void InternalUpdate()
|
internal override void InternalUpdate()
|
||||||
@@ -44,11 +47,10 @@ namespace YooAsset
|
|||||||
string guid = UnityEditor.AssetDatabase.AssetPathToGUID(_assetInfo.AssetPath);
|
string guid = UnityEditor.AssetDatabase.AssetPathToGUID(_assetInfo.AssetPath);
|
||||||
if (string.IsNullOrEmpty(guid))
|
if (string.IsNullOrEmpty(guid))
|
||||||
{
|
{
|
||||||
string error = $"Not found asset : {_assetInfo.AssetPath}";
|
|
||||||
YooLogger.Error(error);
|
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Error = error;
|
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = $"Asset not found: {_assetInfo.AssetPath}";
|
||||||
|
YooLogger.Error(Error);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,14 +83,14 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
string error;
|
string error;
|
||||||
if (_assetInfo.AssetType == null)
|
if (_assetInfo.AssetType == null)
|
||||||
error = $"Failed to load sub assets : {_assetInfo.AssetPath} AssetType : null";
|
error = $"Failed to load sub-assets: {_assetInfo.AssetPath} AssetType: null";
|
||||||
else
|
else
|
||||||
error = $"Failed to load sub assets : {_assetInfo.AssetPath} AssetType : {_assetInfo.AssetType}";
|
error = $"Failed to load sub-assets: {_assetInfo.AssetPath} AssetType: {_assetInfo.AssetType}";
|
||||||
YooLogger.Error(error);
|
|
||||||
|
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Error = error;
|
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = error;
|
||||||
|
YooLogger.Error(error);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
using UnityEngine.SceneManagement;
|
||||||
|
|
||||||
|
namespace YooAsset
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 虚拟资源包句柄
|
||||||
|
/// </summary>
|
||||||
|
internal class VirtualBundleHandle : IBundleHandle
|
||||||
|
{
|
||||||
|
private readonly string _bundleFilePath;
|
||||||
|
private readonly PackageBundle _packageBundle;
|
||||||
|
|
||||||
|
public VirtualBundleHandle(string bundleFilePath, PackageBundle bundle)
|
||||||
|
{
|
||||||
|
_bundleFilePath = bundleFilePath;
|
||||||
|
_packageBundle = bundle;
|
||||||
|
}
|
||||||
|
public void UnloadBundleFile()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
public string GetBundleFilePath()
|
||||||
|
{
|
||||||
|
return _bundleFilePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BHLoadAssetOperation LoadAssetAsync(AssetInfo assetInfo)
|
||||||
|
{
|
||||||
|
var operation = new VBHLoadAssetOperation(_packageBundle, assetInfo);
|
||||||
|
return operation;
|
||||||
|
}
|
||||||
|
public BHLoadAllAssetsOperation LoadAllAssetsAsync(AssetInfo assetInfo)
|
||||||
|
{
|
||||||
|
var operation = new VBHLoadAllAssetsOperation(_packageBundle, assetInfo);
|
||||||
|
return operation;
|
||||||
|
}
|
||||||
|
public BHLoadSubAssetsOperation LoadSubAssetsAsync(AssetInfo assetInfo)
|
||||||
|
{
|
||||||
|
var operation = new VBHLoadSubAssetsOperation(_packageBundle, assetInfo);
|
||||||
|
return operation;
|
||||||
|
}
|
||||||
|
public BHLoadSceneOperation LoadSceneAsync(AssetInfo assetInfo, LoadSceneParameters loadSceneParams, bool suspendLoad)
|
||||||
|
{
|
||||||
|
var operation = new VBHLoadSceneOperation(assetInfo, loadSceneParams, suspendLoad);
|
||||||
|
return operation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -31,7 +31,7 @@ namespace YooAsset
|
|||||||
private void OnEnable()
|
private void OnEnable()
|
||||||
{
|
{
|
||||||
#if UNITY_EDITOR
|
#if UNITY_EDITOR
|
||||||
MockPlayerConnection.Instance.Register(DiagnosticSystemDefine.EditorToPlayerMessageId, HandleEditorMessage);
|
MockPlayerConnection.Instance.Register(DiagnosticSystemConsts.EditorToPlayerMessageId, HandleEditorMessage);
|
||||||
#else
|
#else
|
||||||
PlayerConnection.instance.Register(DiagnosticSystemDefine.EditorToPlayerMessageId, HandleEditorMessage);
|
PlayerConnection.instance.Register(DiagnosticSystemDefine.EditorToPlayerMessageId, HandleEditorMessage);
|
||||||
#endif
|
#endif
|
||||||
@@ -39,7 +39,7 @@ namespace YooAsset
|
|||||||
private void OnDisable()
|
private void OnDisable()
|
||||||
{
|
{
|
||||||
#if UNITY_EDITOR
|
#if UNITY_EDITOR
|
||||||
MockPlayerConnection.Instance.Unregister(DiagnosticSystemDefine.EditorToPlayerMessageId, HandleEditorMessage);
|
MockPlayerConnection.Instance.Unregister(DiagnosticSystemConsts.EditorToPlayerMessageId, HandleEditorMessage);
|
||||||
#else
|
#else
|
||||||
PlayerConnection.instance.Unregister(DiagnosticSystemDefine.EditorToPlayerMessageId, HandleEditorMessage);
|
PlayerConnection.instance.Unregister(DiagnosticSystemDefine.EditorToPlayerMessageId, HandleEditorMessage);
|
||||||
#endif
|
#endif
|
||||||
@@ -53,7 +53,7 @@ namespace YooAsset
|
|||||||
var data = DiagnosticReport.Serialize(debugReport);
|
var data = DiagnosticReport.Serialize(debugReport);
|
||||||
|
|
||||||
#if UNITY_EDITOR
|
#if UNITY_EDITOR
|
||||||
MockPlayerConnection.Instance.Send(DiagnosticSystemDefine.PlayerToEditorMessageId, data);
|
MockPlayerConnection.Instance.Send(DiagnosticSystemConsts.PlayerToEditorMessageId, data);
|
||||||
#else
|
#else
|
||||||
PlayerConnection.instance.Send(DiagnosticSystemDefine.PlayerToEditorMessageId, data);
|
PlayerConnection.instance.Send(DiagnosticSystemDefine.PlayerToEditorMessageId, data);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ namespace YooAsset
|
|||||||
public static DiagnosticReport Create()
|
public static DiagnosticReport Create()
|
||||||
{
|
{
|
||||||
var report = new DiagnosticReport();
|
var report = new DiagnosticReport();
|
||||||
report.ProtocolVersion = DiagnosticSystemDefine.ProtocolVersion;
|
report.ProtocolVersion = DiagnosticSystemConsts.ProtocolVersion;
|
||||||
report.FrameCount = Time.frameCount;
|
report.FrameCount = Time.frameCount;
|
||||||
return report;
|
return report;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ namespace YooAsset
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 诊断系统的常量定义
|
/// 诊断系统的常量定义
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal class DiagnosticSystemDefine
|
internal class DiagnosticSystemConsts
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 通信协议版本号
|
/// 通信协议版本号
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace YooAsset
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 网络请求失败计数器(诊断用)
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// 线程安全:内部使用 Dictionary 且未加锁,约定只在 Unity 主线程调用。
|
|
||||||
/// 如需在多线程/回调线程调用,请在外层加锁或改为并发容器实现。
|
|
||||||
/// </remarks>
|
|
||||||
internal class DownloadFailureCounter
|
|
||||||
{
|
|
||||||
#if UNITY_EDITOR
|
|
||||||
[UnityEngine.RuntimeInitializeOnLoadMethod(UnityEngine.RuntimeInitializeLoadType.SubsystemRegistration)]
|
|
||||||
private static void OnRuntimeInitialize()
|
|
||||||
{
|
|
||||||
_failureRecords.Clear();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 失败计数记录表
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// Key 格式:$"{packageName}_{eventName}"
|
|
||||||
/// </remarks>
|
|
||||||
private static readonly Dictionary<string, int> _failureRecords = new Dictionary<string, int>(1000);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 记录一次失败
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="packageName">资源包名称</param>
|
|
||||||
/// <param name="eventName">事件名称</param>
|
|
||||||
public static void RecordFailure(string packageName, string eventName)
|
|
||||||
{
|
|
||||||
string key = $"{packageName}_{eventName}";
|
|
||||||
if (_failureRecords.ContainsKey(key) == false)
|
|
||||||
_failureRecords.Add(key, 0);
|
|
||||||
_failureRecords[key]++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取失败次数
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="packageName">资源包名称</param>
|
|
||||||
/// <param name="eventName">事件名称</param>
|
|
||||||
/// <returns>失败次数,如果未记录过则返回 0</returns>
|
|
||||||
public static int GetFailureCount(string packageName, string eventName)
|
|
||||||
{
|
|
||||||
string key = $"{packageName}_{eventName}";
|
|
||||||
if (_failureRecords.TryGetValue(key, out int count))
|
|
||||||
return count;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
38
Assets/YooAsset/Runtime/DownloadSystem/DownloadReport.cs
Normal file
38
Assets/YooAsset/Runtime/DownloadSystem/DownloadReport.cs
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
|
||||||
|
namespace YooAsset
|
||||||
|
{
|
||||||
|
public struct DownloadReport
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// HTTP 返回码
|
||||||
|
/// </summary>
|
||||||
|
public long HttpCode { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// HTTP 错误信息
|
||||||
|
/// </summary>
|
||||||
|
public string HttpError { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前下载的字节数
|
||||||
|
/// </summary>
|
||||||
|
public long DownloadedBytes { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前下载进度(0f - 1f)
|
||||||
|
/// </summary>
|
||||||
|
public float DownloadProgress { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 创建默认的下载进度实例
|
||||||
|
/// </summary>
|
||||||
|
public static DownloadReport Default
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
var result = new DownloadReport();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
93
Assets/YooAsset/Runtime/DownloadSystem/DownloadRetry.cs
Normal file
93
Assets/YooAsset/Runtime/DownloadSystem/DownloadRetry.cs
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace YooAsset
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 下载重试控制器
|
||||||
|
/// </summary>
|
||||||
|
internal sealed class DownloadRetry
|
||||||
|
{
|
||||||
|
private readonly int _maxRetryCount;
|
||||||
|
private readonly IDownloadRetryPolicy _retryPolicy;
|
||||||
|
private int _retryCount;
|
||||||
|
private float _waitTimer;
|
||||||
|
private float _waitDuration;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 已重试次数
|
||||||
|
/// </summary>
|
||||||
|
public int RetryCount => _retryCount;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前等待目标时长(秒)
|
||||||
|
/// </summary>
|
||||||
|
public float WaitDuration => _waitDuration;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 创建下载重试控制器
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="maxRetryCount">最大重试次数</param>
|
||||||
|
/// <param name="retryPolicy">重试策略</param>
|
||||||
|
public DownloadRetry(int maxRetryCount, IDownloadRetryPolicy retryPolicy)
|
||||||
|
{
|
||||||
|
_maxRetryCount = maxRetryCount;
|
||||||
|
_retryPolicy = retryPolicy;
|
||||||
|
_retryCount = 0;
|
||||||
|
_waitTimer = 0f;
|
||||||
|
_waitDuration = 0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 判断本次失败是否允许重试
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="url">请求地址</param>
|
||||||
|
/// <param name="httpCode">HTTP 状态码</param>
|
||||||
|
/// <param name="httpError">HTTP 错误信息</param>
|
||||||
|
/// <returns>
|
||||||
|
/// 返回 true 表示允许重试;调用方应紧接着调用 BeginWait() 启动等待。
|
||||||
|
/// 返回 false 表示不允许重试(达到次数上限或错误不可重试)。
|
||||||
|
/// </returns>
|
||||||
|
public bool CanRetry(string url, long httpCode, string httpError)
|
||||||
|
{
|
||||||
|
if (_retryCount >= _maxRetryCount)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (_retryPolicy.IsRetryableError(url, httpCode, httpError) == false)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
YooLogger.Warning($"Download failed: {url}. HttpCode={httpCode}");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 判断是否可以进入网络重试
|
||||||
|
/// </summary>
|
||||||
|
public bool CanRetry()
|
||||||
|
{
|
||||||
|
if (_retryCount >= _maxRetryCount)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 开始本次重试等待
|
||||||
|
/// </summary>
|
||||||
|
public void BeginWait()
|
||||||
|
{
|
||||||
|
_waitTimer = 0f;
|
||||||
|
_retryCount++;
|
||||||
|
_waitDuration = _retryPolicy.ComputeDelay(_retryCount, _waitDuration);
|
||||||
|
YooLogger.Warning($"Download retrying in {WaitDuration:F1}s.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 推进等待计时
|
||||||
|
/// </summary>
|
||||||
|
public bool Tick()
|
||||||
|
{
|
||||||
|
_waitTimer += Time.unscaledDeltaTime;
|
||||||
|
return _waitTimer >= _waitDuration;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: ca9b2c6456d21bb4e9eecd9dc820a641
|
guid: 37c93b71779bcdf4da4005128e2cc6b8
|
||||||
MonoImporter:
|
MonoImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
||||||
@@ -42,10 +42,15 @@ namespace YooAsset
|
|||||||
/// HTTP 返回码
|
/// HTTP 返回码
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// 非 HTTP 协议可返回 0。使用 long 类型以兼容各种协议的返回码。
|
/// 非 HTTP 协议可返回 0
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
long HttpCode { get; }
|
long HttpCode { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// HTTP 错误信息
|
||||||
|
/// </summary>
|
||||||
|
string HttpError { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 错误信息
|
/// 错误信息
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
internal abstract class DownloadFileBaseOperation : AsyncOperationBase
|
internal abstract class DownloadFileBaseOperation : AsyncOperationBase
|
||||||
@@ -13,21 +13,16 @@ namespace YooAsset
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public readonly string Url;
|
public readonly string Url;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 下载进度
|
|
||||||
/// </summary>
|
|
||||||
public float DownloadProgress { get; protected set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 下载字节
|
|
||||||
/// </summary>
|
|
||||||
public long DownloadedBytes { get; protected set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 引用计数
|
/// 引用计数
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int RefCount { private set; get; }
|
public int RefCount { private set; get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 下载报告
|
||||||
|
/// </summary>
|
||||||
|
public DownloadReport Report;
|
||||||
|
|
||||||
public DownloadFileBaseOperation(PackageBundle bundle, string url)
|
public DownloadFileBaseOperation(PackageBundle bundle, string url)
|
||||||
{
|
{
|
||||||
Bundle = bundle;
|
Bundle = bundle;
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ namespace YooAsset
|
|||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// 管理所有活跃的下载任务,控制并发数量。
|
/// 管理所有活跃的下载任务,控制并发数量。
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
internal class DownloadSchedulerOperation : AsyncOperationBase, IDisposable
|
internal class DownloadSchedulerOperation : AsyncOperationBase
|
||||||
{
|
{
|
||||||
public struct SchedulerConfig
|
public struct SchedulerConfig
|
||||||
{
|
{
|
||||||
@@ -44,9 +44,6 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 构造下载中心
|
|
||||||
/// </summary>
|
|
||||||
public DownloadSchedulerOperation(SchedulerConfig config)
|
public DownloadSchedulerOperation(SchedulerConfig config)
|
||||||
{
|
{
|
||||||
_config = config;
|
_config = config;
|
||||||
@@ -125,19 +122,6 @@ namespace YooAsset
|
|||||||
return _config.SchedulerName;
|
return _config.SchedulerName;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 释放下载资源
|
|
||||||
/// </summary>
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
foreach (var valuePair in _downloaders)
|
|
||||||
{
|
|
||||||
var operation = valuePair.Value;
|
|
||||||
operation.AbortOperation();
|
|
||||||
}
|
|
||||||
_downloaders.Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 尝试获取已经存在的下载器
|
/// 尝试获取已经存在的下载器
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 4446775dfbf483f46a5edc74890a8245
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace YooAsset
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 默认的下载重试策略
|
||||||
|
/// </summary>
|
||||||
|
public class DefaultDownloadRetryPolicy : IDownloadRetryPolicy
|
||||||
|
{
|
||||||
|
private const float BaseDelay = 1f;
|
||||||
|
private const float MaxDelay = 10f;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 判断本次下载失败是否属于可重试的错误
|
||||||
|
/// </summary>
|
||||||
|
public bool IsRetryableError(string url, long httpCode, string httpError)
|
||||||
|
{
|
||||||
|
// HTTP 状态码
|
||||||
|
// 1xx 信息响应
|
||||||
|
// 2xx 成功响应
|
||||||
|
// 3xx 重定向消息
|
||||||
|
// 4xx 客户端错误响应
|
||||||
|
// 5xx 服务器错误响应
|
||||||
|
|
||||||
|
// 本地协议/本地路径不可重试
|
||||||
|
if (DownloadSystemTools.IsLocalFileUrl(url))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// 网络瞬断可重试
|
||||||
|
if (httpCode == 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// 4xx 客户端错误不可重试
|
||||||
|
// 例外:408 Request Timeout
|
||||||
|
// 例外:416 Range Not Satisfiable
|
||||||
|
// 例外:429 Too Many Requests
|
||||||
|
if (httpCode >= 400 && httpCode < 500)
|
||||||
|
return httpCode == 408 || httpCode == 416 || httpCode == 429;
|
||||||
|
|
||||||
|
// 其它情况可重试
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 计算本次重试应等待的时长(秒)
|
||||||
|
/// 线性退避:每次在上一次基础上 +1 秒,封顶到最大等待秒数。
|
||||||
|
/// </summary>
|
||||||
|
public float ComputeDelay(int retryCount, float previousDelay)
|
||||||
|
{
|
||||||
|
return Mathf.Clamp(previousDelay + 1f, BaseDelay, MaxDelay);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 2a84bce9bf9030645b7241a581a05af6
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace YooAsset
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 默认的 URL 选择策略
|
||||||
|
/// </summary>
|
||||||
|
public class DefaultDownloadURLPolicy : IDownloadURLPolicy
|
||||||
|
{
|
||||||
|
private int _failureCount = 0;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 基于内部失败计数轮转选择 URL
|
||||||
|
/// </summary>
|
||||||
|
public string SelectURL(IReadOnlyList<string> candidateURLs)
|
||||||
|
{
|
||||||
|
int index = _failureCount % candidateURLs.Count;
|
||||||
|
return candidateURLs[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 请求成功反馈(默认策略不做处理)
|
||||||
|
/// </summary>
|
||||||
|
public void OnSuccess(string url)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 请求失败反馈,递增失败计数以切换 URL
|
||||||
|
/// </summary>
|
||||||
|
public void OnFailure(string url, long httpCode, string httpError)
|
||||||
|
{
|
||||||
|
_failureCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 747ba5d3c490c8043b61bbef89fd049c
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -69,6 +69,11 @@ namespace YooAsset
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public long HttpCode { get; private set; }
|
public long HttpCode { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// HTTP 错误信息
|
||||||
|
/// </summary>
|
||||||
|
public string HttpError { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 错误信息
|
/// 错误信息
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -86,6 +86,11 @@ namespace YooAsset
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public long HttpCode { get; private set; }
|
public long HttpCode { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// HTTP 错误信息
|
||||||
|
/// </summary>
|
||||||
|
public string HttpError { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 错误信息
|
/// 错误信息
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -255,6 +260,8 @@ namespace YooAsset
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
HttpCode = _webRequest.responseCode;
|
HttpCode = _webRequest.responseCode;
|
||||||
|
HttpError = _webRequest.error;
|
||||||
|
|
||||||
#if UNITY_2020_3_OR_NEWER
|
#if UNITY_2020_3_OR_NEWER
|
||||||
bool isSuccess = _webRequest.result == UnityWebRequest.Result.Success;
|
bool isSuccess = _webRequest.result == UnityWebRequest.Result.Success;
|
||||||
#else
|
#else
|
||||||
@@ -269,7 +276,7 @@ namespace YooAsset
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
Status = EDownloadRequestStatus.Failed;
|
Status = EDownloadRequestStatus.Failed;
|
||||||
Error = $"[{GetType().Name}] Request failed. URL: {Url}, Error: {_webRequest.error}";
|
Error = $"[{GetType().Name}] Request failed. URL: {Url}, HttpCode={HttpCode} HttpError={HttpError}";
|
||||||
OnRequestFailed();
|
OnRequestFailed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ namespace YooAsset
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 清理缓存文件
|
/// 清理缓存文件
|
||||||
/// </summary>
|
/// </summary>
|
||||||
FCClearCacheOperation ClearCacheAsync(ClearCacheOptions options);
|
FCClearCacheOperation ClearCacheAsync(FCClearCacheOptions options);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 验证缓存文件
|
/// 验证缓存文件
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
@@ -74,7 +74,7 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
Error = $"{_options.CacheName} not support {decryptor.GetType().Name}";
|
Error = $"{_options.CacheName} does not support {decryptor.GetType().Name}";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,6 +94,7 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
if (_createRequest != null)
|
if (_createRequest != null)
|
||||||
{
|
{
|
||||||
|
// 注意: 异步加载过程中,业务逻辑可能会强制转换为同步加载
|
||||||
if (IsWaitForCompletion)
|
if (IsWaitForCompletion)
|
||||||
{
|
{
|
||||||
// 强制挂起主线程(注意:该操作会很耗时)
|
// 强制挂起主线程(注意:该操作会很耗时)
|
||||||
@@ -120,7 +121,7 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Status = EOperationStatus.Succeeded;
|
Status = EOperationStatus.Succeeded;
|
||||||
BundleResult = new AssetBundleResult(_options.FilePath, _options.Bundle, _assetBundle, _loadStream);
|
BundleHandle = new AssetBundleHandle(_options.FilePath, _options.Bundle, _assetBundle, _loadStream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,11 +37,11 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
if (_options.Bundle.IsEncrypted == false)
|
if (_options.Bundle.IsEncrypted == false)
|
||||||
{
|
{
|
||||||
if (SupportsFileIO(_options.FilePath) == false)
|
if (FileUtility.SupportsFileIO(_options.FilePath) == false)
|
||||||
{
|
{
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
Error = $"FileIO not supported for builtin path : {_options.FilePath}";
|
Error = $"FileIO is not supported for builtin path: {_options.FilePath}";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
Error = $"{_options.CacheName} not support {decryptor.GetType().Name}";
|
Error = $"{_options.CacheName} does not support {decryptor.GetType().Name}";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,7 +95,7 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Status = EOperationStatus.Succeeded;
|
Status = EOperationStatus.Succeeded;
|
||||||
BundleResult = new RawBundleResult(_options.FilePath, _options.Bundle, _rawBundle);
|
BundleHandle = new RawBundleHandle(_options.FilePath, _options.Bundle, _rawBundle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
@@ -24,18 +24,16 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected readonly LoadWebAssetBundleOptions _options;
|
protected readonly LoadWebAssetBundleOptions _options;
|
||||||
|
private readonly DownloadRetry _downloadRetry;
|
||||||
private IDownloadAssetBundleRequest _downloadAssetBundleRequest;
|
private IDownloadAssetBundleRequest _downloadAssetBundleRequest;
|
||||||
private ESteps _steps = ESteps.None;
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
// 失败重试
|
|
||||||
private int _requestCount = 0;
|
|
||||||
private float _tryAgainTimer = 0;
|
|
||||||
private int _failedTryAgain;
|
|
||||||
|
|
||||||
public LoadWebNormalAssetBundleOperation(LoadWebAssetBundleOptions options)
|
public LoadWebNormalAssetBundleOperation(LoadWebAssetBundleOptions options)
|
||||||
{
|
{
|
||||||
_options = options;
|
_options = options;
|
||||||
_failedTryAgain = int.MaxValue; //注意:网络原因失败后,重新尝试直到成功
|
|
||||||
|
// 注意:网络原因失败后,重新尝试直到成功
|
||||||
|
_downloadRetry = new DownloadRetry(int.MaxValue, options.RetryPolicy);
|
||||||
}
|
}
|
||||||
internal override void InternalStart()
|
internal override void InternalStart()
|
||||||
{
|
{
|
||||||
@@ -63,6 +61,7 @@ namespace YooAsset
|
|||||||
|
|
||||||
if (_downloadAssetBundleRequest.Status == EDownloadRequestStatus.Succeeded)
|
if (_downloadAssetBundleRequest.Status == EDownloadRequestStatus.Succeeded)
|
||||||
{
|
{
|
||||||
|
_options.URLPolicy.OnSuccess(_downloadAssetBundleRequest.Url);
|
||||||
var assetBundle = _downloadAssetBundleRequest.Result;
|
var assetBundle = _downloadAssetBundleRequest.Result;
|
||||||
if (assetBundle == null)
|
if (assetBundle == null)
|
||||||
{
|
{
|
||||||
@@ -74,13 +73,18 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Status = EOperationStatus.Succeeded;
|
Status = EOperationStatus.Succeeded;
|
||||||
BundleResult = new AssetBundleResult(_downloadAssetBundleRequest.Url, _options.Bundle, assetBundle, null);
|
BundleHandle = new AssetBundleHandle(_downloadAssetBundleRequest.Url, _options.Bundle, assetBundle, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (_failedTryAgain > 0 && IsRetryableError(_downloadAssetBundleRequest.HttpCode))
|
string url = _downloadAssetBundleRequest.Url;
|
||||||
|
long httpCode = _downloadAssetBundleRequest.HttpCode;
|
||||||
|
string httpError = _downloadAssetBundleRequest.HttpError;
|
||||||
|
_options.URLPolicy.OnFailure(url, httpCode, httpError);
|
||||||
|
if (IsWaitForCompletion == false && _downloadRetry.CanRetry(url, httpCode, httpError))
|
||||||
{
|
{
|
||||||
|
_downloadRetry.BeginWait();
|
||||||
_steps = ESteps.TryAgain;
|
_steps = ESteps.TryAgain;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -101,11 +105,8 @@ namespace YooAsset
|
|||||||
_downloadAssetBundleRequest = null;
|
_downloadAssetBundleRequest = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
_tryAgainTimer += UnityEngine.Time.unscaledDeltaTime;
|
if (_downloadRetry.Tick())
|
||||||
if (_tryAgainTimer > 1f)
|
|
||||||
{
|
{
|
||||||
_tryAgainTimer = 0f;
|
|
||||||
_failedTryAgain--;
|
|
||||||
Progress = 0f;
|
Progress = 0f;
|
||||||
_steps = ESteps.BundleRequest;
|
_steps = ESteps.BundleRequest;
|
||||||
}
|
}
|
||||||
@@ -122,12 +123,7 @@ namespace YooAsset
|
|||||||
|
|
||||||
private string GetRequestURL()
|
private string GetRequestURL()
|
||||||
{
|
{
|
||||||
// 轮流返回请求地址
|
return _options.URLPolicy.SelectURL(_options.CandidateURLs);
|
||||||
_requestCount++;
|
|
||||||
if (_requestCount % 2 == 0)
|
|
||||||
return _options.FallbackURL;
|
|
||||||
else
|
|
||||||
return _options.MainURL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -149,20 +145,18 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected readonly LoadWebAssetBundleOptions _options;
|
protected readonly LoadWebAssetBundleOptions _options;
|
||||||
|
private readonly DownloadRetry _downloadRetry;
|
||||||
private IDownloadBytesRequest _downloadBytesRequest;
|
private IDownloadBytesRequest _downloadBytesRequest;
|
||||||
private IBundleMemoryDecryptor _decryptor;
|
private IBundleMemoryDecryptor _decryptor;
|
||||||
private AssetBundleCreateRequest _createRequest;
|
private AssetBundleCreateRequest _createRequest;
|
||||||
private ESteps _steps = ESteps.None;
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
// 失败重试
|
|
||||||
private int _requestCount = 0;
|
|
||||||
private float _tryAgainTimer = 0;
|
|
||||||
private int _failedTryAgain;
|
|
||||||
|
|
||||||
public LoadWebEncryptedAssetBundleOperation(LoadWebAssetBundleOptions options)
|
public LoadWebEncryptedAssetBundleOperation(LoadWebAssetBundleOptions options)
|
||||||
{
|
{
|
||||||
_options = options;
|
_options = options;
|
||||||
_failedTryAgain = int.MaxValue; //注意:网络原因失败后,重新尝试直到成功
|
|
||||||
|
// 注意:网络原因失败后,重新尝试直到成功
|
||||||
|
_downloadRetry = new DownloadRetry(int.MaxValue, options.RetryPolicy);
|
||||||
}
|
}
|
||||||
internal override void InternalStart()
|
internal override void InternalStart()
|
||||||
{
|
{
|
||||||
@@ -197,7 +191,7 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Status = EOperationStatus.Failed;
|
Status = EOperationStatus.Failed;
|
||||||
Error = $"{_options.CacheName} not support {decryptor.GetType().Name}";
|
Error = $"{_options.CacheName} does not support {decryptor.GetType().Name}";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -210,12 +204,18 @@ namespace YooAsset
|
|||||||
|
|
||||||
if (_downloadBytesRequest.Status == EDownloadRequestStatus.Succeeded)
|
if (_downloadBytesRequest.Status == EDownloadRequestStatus.Succeeded)
|
||||||
{
|
{
|
||||||
|
_options.URLPolicy.OnSuccess(_downloadBytesRequest.Url);
|
||||||
_steps = ESteps.VerifyData;
|
_steps = ESteps.VerifyData;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (_failedTryAgain > 0 && IsRetryableError(_downloadBytesRequest.HttpCode))
|
string url = _downloadBytesRequest.Url;
|
||||||
|
long httpCode = _downloadBytesRequest.HttpCode;
|
||||||
|
string httpError = _downloadBytesRequest.HttpError;
|
||||||
|
_options.URLPolicy.OnFailure(url, httpCode, httpError);
|
||||||
|
if (IsWaitForCompletion == false && _downloadRetry.CanRetry(url, httpCode, httpError))
|
||||||
{
|
{
|
||||||
|
_downloadRetry.BeginWait();
|
||||||
_steps = ESteps.TryAgain;
|
_steps = ESteps.TryAgain;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -247,8 +247,9 @@ namespace YooAsset
|
|||||||
string error = $"[WebBundleVerify] Verify failed. Url:{_downloadBytesRequest.Url} Level: {_options.DownloadVerifyLevel} Result: {verifyResult}";
|
string error = $"[WebBundleVerify] Verify failed. Url:{_downloadBytesRequest.Url} Level: {_options.DownloadVerifyLevel} Result: {verifyResult}";
|
||||||
YooLogger.Warning(error);
|
YooLogger.Warning(error);
|
||||||
|
|
||||||
if (_failedTryAgain > 0)
|
if (IsWaitForCompletion == false && _downloadRetry.CanRetry())
|
||||||
{
|
{
|
||||||
|
_downloadRetry.BeginWait();
|
||||||
_steps = ESteps.TryAgain;
|
_steps = ESteps.TryAgain;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -290,7 +291,7 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Status = EOperationStatus.Succeeded;
|
Status = EOperationStatus.Succeeded;
|
||||||
BundleResult = new AssetBundleResult(_downloadBytesRequest.Url, _options.Bundle, assetBundle, null);
|
BundleHandle = new AssetBundleHandle(_downloadBytesRequest.Url, _options.Bundle, assetBundle, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -303,11 +304,8 @@ namespace YooAsset
|
|||||||
_downloadBytesRequest = null;
|
_downloadBytesRequest = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
_tryAgainTimer += Time.unscaledDeltaTime;
|
if (_downloadRetry.Tick())
|
||||||
if (_tryAgainTimer > 1f)
|
|
||||||
{
|
{
|
||||||
_tryAgainTimer = 0f;
|
|
||||||
_failedTryAgain--;
|
|
||||||
Progress = 0f;
|
Progress = 0f;
|
||||||
_steps = ESteps.DataRequest;
|
_steps = ESteps.DataRequest;
|
||||||
}
|
}
|
||||||
@@ -336,12 +334,7 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
private string GetRequestURL()
|
private string GetRequestURL()
|
||||||
{
|
{
|
||||||
// 轮流返回请求地址
|
return _options.URLPolicy.SelectURL(_options.CandidateURLs);
|
||||||
_requestCount++;
|
|
||||||
if (_requestCount % 2 == 0)
|
|
||||||
return _options.FallbackURL;
|
|
||||||
else
|
|
||||||
return _options.MainURL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
@@ -17,14 +18,9 @@ namespace YooAsset
|
|||||||
public PackageBundle Bundle { get; set; }
|
public PackageBundle Bundle { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 请求地址
|
/// 候选下载地址列表
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string MainURL { get; set; }
|
public IReadOnlyList<string> CandidateURLs { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 备用请求地址
|
|
||||||
/// </summary>
|
|
||||||
public string FallbackURL { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// AssetBundle 解密器
|
/// AssetBundle 解密器
|
||||||
@@ -50,5 +46,15 @@ namespace YooAsset
|
|||||||
/// 禁用Unity的网络缓存
|
/// 禁用Unity的网络缓存
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool DisableUnityWebCache { get; set; }
|
public bool DisableUnityWebCache { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 下载重试判定策略
|
||||||
|
/// </summary>
|
||||||
|
public IDownloadRetryPolicy RetryPolicy { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// URL 选择策略
|
||||||
|
/// </summary>
|
||||||
|
public IDownloadURLPolicy URLPolicy { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace YooAsset
|
namespace YooAsset
|
||||||
{
|
{
|
||||||
@@ -6,6 +7,130 @@ namespace YooAsset
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
internal abstract class FCClearCacheOperation : AsyncOperationBase
|
internal abstract class FCClearCacheOperation : AsyncOperationBase
|
||||||
{
|
{
|
||||||
|
protected readonly struct ClearResult
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 错误信息
|
||||||
|
/// </summary>
|
||||||
|
public readonly string Error;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 需要清理的资源标识符集合
|
||||||
|
/// </summary>
|
||||||
|
public readonly List<string> BundleGUIDs;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否成功
|
||||||
|
/// </summary>
|
||||||
|
public bool Succeeded
|
||||||
|
{
|
||||||
|
get { return Error == null; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public ClearResult(string error)
|
||||||
|
{
|
||||||
|
Error = error;
|
||||||
|
BundleGUIDs = null;
|
||||||
|
}
|
||||||
|
public ClearResult(List<string> bundleGUIDs)
|
||||||
|
{
|
||||||
|
Error = null;
|
||||||
|
BundleGUIDs = bundleGUIDs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ClearResult Success(List<string> bundleGUIDs)
|
||||||
|
{
|
||||||
|
return new ClearResult(bundleGUIDs);
|
||||||
|
}
|
||||||
|
public static ClearResult Failure(string error)
|
||||||
|
{
|
||||||
|
return new ClearResult(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ClearResult GetAllCache(IReadOnlyCollection<ICacheEntry> cacheEntries)
|
||||||
|
{
|
||||||
|
var bundleGUIDs = new List<string>(cacheEntries.Count);
|
||||||
|
foreach (var entry in cacheEntries)
|
||||||
|
{
|
||||||
|
bundleGUIDs.Add(entry.BundleGUID);
|
||||||
|
}
|
||||||
|
return ClearResult.Success(bundleGUIDs);
|
||||||
|
}
|
||||||
|
protected ClearResult GetUnusedCache(FCClearCacheOptions options, IReadOnlyCollection<ICacheEntry> cacheEntries)
|
||||||
|
{
|
||||||
|
if (options.Manifest == null)
|
||||||
|
return ClearResult.Failure("Active package manifest not found.");
|
||||||
|
|
||||||
|
var bundleGUIDs = new List<string>(cacheEntries.Count);
|
||||||
|
foreach (var entry in cacheEntries)
|
||||||
|
{
|
||||||
|
if (options.Manifest.IsIncludeBundleFile(entry.BundleGUID) == false)
|
||||||
|
{
|
||||||
|
bundleGUIDs.Add(entry.BundleGUID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ClearResult.Success(bundleGUIDs);
|
||||||
|
}
|
||||||
|
protected ClearResult GetCacheByLocations(FCClearCacheOptions options, IReadOnlyCollection<ICacheEntry> cacheEntries)
|
||||||
|
{
|
||||||
|
if (options.Manifest == null)
|
||||||
|
return ClearResult.Failure("Active package manifest not found.");
|
||||||
|
|
||||||
|
if (options.ClearParam == null)
|
||||||
|
return ClearResult.Failure("Clear param is null.");
|
||||||
|
|
||||||
|
string[] locations;
|
||||||
|
if (options.ClearParam is string str)
|
||||||
|
locations = new string[] { str };
|
||||||
|
else if (options.ClearParam is List<string> list)
|
||||||
|
locations = list.ToArray();
|
||||||
|
else if (options.ClearParam is string[] array)
|
||||||
|
locations = array;
|
||||||
|
else
|
||||||
|
return ClearResult.Failure($"Invalid clear param: {options.ClearParam.GetType().FullName}");
|
||||||
|
|
||||||
|
var bundleGUIDs = new List<string>(locations.Length);
|
||||||
|
foreach (var location in locations)
|
||||||
|
{
|
||||||
|
string assetPath = options.Manifest.TryMappingToAssetPath(location);
|
||||||
|
if (options.Manifest.TryGetPackageAsset(assetPath, out PackageAsset packageAsset))
|
||||||
|
{
|
||||||
|
PackageBundle bundle = options.Manifest.GetMainPackageBundle(packageAsset.BundleID);
|
||||||
|
bundleGUIDs.Add(bundle.BundleGUID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ClearResult.Success(bundleGUIDs);
|
||||||
|
}
|
||||||
|
protected ClearResult GetCacheByTags(FCClearCacheOptions options, IReadOnlyCollection<ICacheEntry> cacheEntries)
|
||||||
|
{
|
||||||
|
if (options.Manifest == null)
|
||||||
|
return ClearResult.Failure("Active package manifest not found.");
|
||||||
|
|
||||||
|
if (options.ClearParam == null)
|
||||||
|
return ClearResult.Failure("Clear param is null.");
|
||||||
|
|
||||||
|
string[] tags;
|
||||||
|
if (options.ClearParam is string str)
|
||||||
|
tags = new string[] { str };
|
||||||
|
else if (options.ClearParam is List<string> list)
|
||||||
|
tags = list.ToArray();
|
||||||
|
else if (options.ClearParam is string[] array)
|
||||||
|
tags = array;
|
||||||
|
else
|
||||||
|
return ClearResult.Failure($"Invalid clear param: {options.ClearParam.GetType().FullName}");
|
||||||
|
|
||||||
|
var bundleGUIDs = new List<string>(cacheEntries.Count);
|
||||||
|
foreach (var entry in cacheEntries)
|
||||||
|
{
|
||||||
|
if (options.Manifest.TryGetPackageBundleByBundleGUID(entry.BundleGUID, out PackageBundle bundle))
|
||||||
|
{
|
||||||
|
if (bundle.HasTag(tags))
|
||||||
|
bundleGUIDs.Add(bundle.BundleGUID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ClearResult.Success(bundleGUIDs);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
|
||||||
|
namespace YooAsset
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 清理缓存操作选项
|
||||||
|
/// </summary>
|
||||||
|
internal struct FCClearCacheOptions
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 清理模式
|
||||||
|
/// </summary>
|
||||||
|
public string ClearMode { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 附加参数
|
||||||
|
/// </summary>
|
||||||
|
public object ClearParam { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 资源清单
|
||||||
|
/// </summary>
|
||||||
|
public PackageManifest Manifest { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: cb7284d99e0056242806b0b21db09c09
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -6,7 +6,7 @@ namespace YooAsset
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
internal abstract class FCLoadBundleOperation : AsyncOperationBase
|
internal abstract class FCLoadBundleOperation : AsyncOperationBase
|
||||||
{
|
{
|
||||||
protected struct LoadResult
|
protected readonly struct LoadResult
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 错误信息
|
/// 错误信息
|
||||||
@@ -14,7 +14,7 @@ namespace YooAsset
|
|||||||
public readonly string Error;
|
public readonly string Error;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 加载成功
|
/// 是否成功
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool Succeeded
|
public bool Succeeded
|
||||||
{
|
{
|
||||||
@@ -37,46 +37,9 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 资源包加载结果
|
/// 资源包句柄
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public IBundleResult BundleResult { get; protected set; }
|
public IBundleHandle BundleHandle { get; protected set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 检查文件路径是否支持 FileIO 读取
|
|
||||||
/// </summary>
|
|
||||||
protected bool SupportsFileIO(string filePath)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(filePath))
|
|
||||||
return false;
|
|
||||||
if (filePath.StartsWith("jar:") || filePath.StartsWith("content:"))
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 判断是否为可重试的错误
|
|
||||||
/// </summary>
|
|
||||||
protected bool IsRetryableError(long httpCode)
|
|
||||||
{
|
|
||||||
// HTTP 状态码
|
|
||||||
// 1xx 信息响应
|
|
||||||
// 2xx 成功响应
|
|
||||||
// 3xx 重定向消息
|
|
||||||
// 4xx 客户端错误响应
|
|
||||||
// 5xx 服务器错误响应
|
|
||||||
|
|
||||||
if (httpCode == 0)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// 4xx 客户端错误不可重试
|
|
||||||
// 说明:408 Request Timeout
|
|
||||||
// 说明:429 Too Many Requests
|
|
||||||
if (httpCode >= 400 && httpCode < 500)
|
|
||||||
return httpCode == 408 || httpCode == 429;
|
|
||||||
|
|
||||||
// 其它情况可重试
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ namespace YooAsset
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 内置资源目录常量定义
|
/// 内置资源目录常量定义
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal class BuiltinCatalogDefine
|
internal class BuiltinCatalogConsts
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 文件极限大小(100MB)
|
/// 文件极限大小(100MB)
|
||||||
@@ -57,7 +57,7 @@ namespace YooAsset
|
|||||||
|
|
||||||
// 创建内置清单实例
|
// 创建内置清单实例
|
||||||
var buildinCatalog = new BuiltinCatalog();
|
var buildinCatalog = new BuiltinCatalog();
|
||||||
buildinCatalog.FileVersion = BuiltinCatalogDefine.FileVersion;
|
buildinCatalog.FileVersion = BuiltinCatalogConsts.FileVersion;
|
||||||
buildinCatalog.PackageName = packageName;
|
buildinCatalog.PackageName = packageName;
|
||||||
buildinCatalog.PackageVersion = packageVersion;
|
buildinCatalog.PackageVersion = packageVersion;
|
||||||
|
|
||||||
@@ -66,8 +66,8 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
"link.xml",
|
"link.xml",
|
||||||
"buildlogtep.json",
|
"buildlogtep.json",
|
||||||
BuiltinCatalogDefine.JsonFileName,
|
BuiltinCatalogConsts.JsonFileName,
|
||||||
BuiltinCatalogDefine.BinaryFileName
|
BuiltinCatalogConsts.BinaryFileName
|
||||||
};
|
};
|
||||||
string packageVersionFileName = YooAssetSettingsData.GetPackageVersionFileName(packageName);
|
string packageVersionFileName = YooAssetSettingsData.GetPackageVersionFileName(packageName);
|
||||||
string packageHashFileName = YooAssetSettingsData.GetPackageHashFileName(packageName, packageVersion);
|
string packageHashFileName = YooAssetSettingsData.GetPackageHashFileName(packageName, packageVersion);
|
||||||
@@ -106,13 +106,13 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 创建输出文件
|
// 创建输出文件
|
||||||
string jsonFilePath = $"{packageDirectory}/{BuiltinCatalogDefine.JsonFileName}";
|
string jsonFilePath = $"{packageDirectory}/{BuiltinCatalogConsts.JsonFileName}";
|
||||||
if (File.Exists(jsonFilePath))
|
if (File.Exists(jsonFilePath))
|
||||||
File.Delete(jsonFilePath);
|
File.Delete(jsonFilePath);
|
||||||
SerializeToJson(jsonFilePath, buildinCatalog);
|
SerializeToJson(jsonFilePath, buildinCatalog);
|
||||||
|
|
||||||
// 创建输出文件
|
// 创建输出文件
|
||||||
string binaryFilePath = $"{packageDirectory}/{BuiltinCatalogDefine.BinaryFileName}";
|
string binaryFilePath = $"{packageDirectory}/{BuiltinCatalogConsts.BinaryFileName}";
|
||||||
if (File.Exists(binaryFilePath))
|
if (File.Exists(binaryFilePath))
|
||||||
File.Delete(binaryFilePath);
|
File.Delete(binaryFilePath);
|
||||||
SerializeToBinary(binaryFilePath, buildinCatalog);
|
SerializeToBinary(binaryFilePath, buildinCatalog);
|
||||||
@@ -129,18 +129,18 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
// 创建内置清单实例
|
// 创建内置清单实例
|
||||||
var buildinFileCatalog = new BuiltinCatalog();
|
var buildinFileCatalog = new BuiltinCatalog();
|
||||||
buildinFileCatalog.FileVersion = BuiltinCatalogDefine.FileVersion;
|
buildinFileCatalog.FileVersion = BuiltinCatalogConsts.FileVersion;
|
||||||
buildinFileCatalog.PackageName = packageName;
|
buildinFileCatalog.PackageName = packageName;
|
||||||
buildinFileCatalog.PackageVersion = packageVersion;
|
buildinFileCatalog.PackageVersion = packageVersion;
|
||||||
|
|
||||||
// 创建输出文件
|
// 创建输出文件
|
||||||
string jsonFilePath = $"{outputPath}/{BuiltinCatalogDefine.JsonFileName}";
|
string jsonFilePath = $"{outputPath}/{BuiltinCatalogConsts.JsonFileName}";
|
||||||
if (File.Exists(jsonFilePath))
|
if (File.Exists(jsonFilePath))
|
||||||
File.Delete(jsonFilePath);
|
File.Delete(jsonFilePath);
|
||||||
SerializeToJson(jsonFilePath, buildinFileCatalog);
|
SerializeToJson(jsonFilePath, buildinFileCatalog);
|
||||||
|
|
||||||
// 创建输出文件
|
// 创建输出文件
|
||||||
string binaryFilePath = $"{outputPath}/{BuiltinCatalogDefine.BinaryFileName}";
|
string binaryFilePath = $"{outputPath}/{BuiltinCatalogConsts.BinaryFileName}";
|
||||||
if (File.Exists(binaryFilePath))
|
if (File.Exists(binaryFilePath))
|
||||||
File.Delete(binaryFilePath);
|
File.Delete(binaryFilePath);
|
||||||
SerializeToBinary(binaryFilePath, buildinFileCatalog);
|
SerializeToBinary(binaryFilePath, buildinFileCatalog);
|
||||||
@@ -167,13 +167,13 @@ namespace YooAsset
|
|||||||
using (FileStream fs = new FileStream(savePath, FileMode.Create))
|
using (FileStream fs = new FileStream(savePath, FileMode.Create))
|
||||||
{
|
{
|
||||||
// 创建缓存器
|
// 创建缓存器
|
||||||
BufferWriter buffer = new BufferWriter(BuiltinCatalogDefine.MaxFileSize);
|
BufferWriter buffer = new BufferWriter(BuiltinCatalogConsts.MaxFileSize);
|
||||||
|
|
||||||
// 写入文件标记
|
// 写入文件标记
|
||||||
buffer.WriteUInt32(BuiltinCatalogDefine.FileHeader);
|
buffer.WriteUInt32(BuiltinCatalogConsts.FileHeader);
|
||||||
|
|
||||||
// 写入文件版本
|
// 写入文件版本
|
||||||
buffer.WriteUTF8(BuiltinCatalogDefine.FileVersion);
|
buffer.WriteUTF8(BuiltinCatalogConsts.FileVersion);
|
||||||
|
|
||||||
// 写入文件头信息
|
// 写入文件头信息
|
||||||
buffer.WriteUTF8(catalog.PackageName);
|
buffer.WriteUTF8(catalog.PackageName);
|
||||||
@@ -216,13 +216,13 @@ namespace YooAsset
|
|||||||
|
|
||||||
// 读取文件标记
|
// 读取文件标记
|
||||||
uint fileHeader = buffer.ReadUInt32();
|
uint fileHeader = buffer.ReadUInt32();
|
||||||
if (fileHeader != BuiltinCatalogDefine.FileHeader)
|
if (fileHeader != BuiltinCatalogConsts.FileHeader)
|
||||||
throw new Exception("Invalid catalog file.");
|
throw new Exception("Invalid catalog file.");
|
||||||
|
|
||||||
// 读取文件版本
|
// 读取文件版本
|
||||||
string fileVersion = buffer.ReadUTF8();
|
string fileVersion = buffer.ReadUTF8();
|
||||||
if (fileVersion != BuiltinCatalogDefine.FileVersion)
|
if (fileVersion != BuiltinCatalogConsts.FileVersion)
|
||||||
throw new Exception($"The catalog file version is not compatible: {fileVersion} != {BuiltinCatalogDefine.FileVersion}");
|
throw new Exception($"The catalog file version is not compatible: {fileVersion} != {BuiltinCatalogConsts.FileVersion}");
|
||||||
|
|
||||||
BuiltinCatalog catalog = new BuiltinCatalog();
|
BuiltinCatalog catalog = new BuiltinCatalog();
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ namespace YooAsset
|
|||||||
var operation = new FCWriteCacheCompleteOperation($"{nameof(BuiltinFileCache)} is readonly.");
|
var operation = new FCWriteCacheCompleteOperation($"{nameof(BuiltinFileCache)} is readonly.");
|
||||||
return operation;
|
return operation;
|
||||||
}
|
}
|
||||||
public virtual FCClearCacheOperation ClearCacheAsync(ClearCacheOptions options)
|
public virtual FCClearCacheOperation ClearCacheAsync(FCClearCacheOptions options)
|
||||||
{
|
{
|
||||||
var operation = new FCClearCacheCompleteOperation($"{nameof(BuiltinFileCache)} is readonly.");
|
var operation = new FCClearCacheCompleteOperation($"{nameof(BuiltinFileCache)} is readonly.");
|
||||||
return operation;
|
return operation;
|
||||||
@@ -120,7 +120,7 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string error = $"{nameof(BuiltinFileCache)} not support load bundle type : {options.Bundle.BundleType}";
|
string error = $"{nameof(BuiltinFileCache)} does not support bundle type: {options.Bundle.BundleType}";
|
||||||
var operation = new FCLoadBundleErrorOperation(error);
|
var operation = new FCLoadBundleErrorOperation(error);
|
||||||
return operation;
|
return operation;
|
||||||
}
|
}
|
||||||
@@ -132,7 +132,7 @@ namespace YooAsset
|
|||||||
|
|
||||||
#region 内部方法
|
#region 内部方法
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取指定缓存
|
/// 获取指定缓存条目
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal BuiltinFileCacheEntry GetEntry(string bundleGUID)
|
internal BuiltinFileCacheEntry GetEntry(string bundleGUID)
|
||||||
{
|
{
|
||||||
@@ -143,7 +143,7 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 添加指定缓存
|
/// 添加指定缓存条目
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal void AddEntry(string bundleGUID, BuiltinFileCacheEntry cacheEntry)
|
internal void AddEntry(string bundleGUID, BuiltinFileCacheEntry cacheEntry)
|
||||||
{
|
{
|
||||||
@@ -158,7 +158,7 @@ namespace YooAsset
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
internal string GetCatalogBinaryFileLoadPath()
|
internal string GetCatalogBinaryFileLoadPath()
|
||||||
{
|
{
|
||||||
return PathUtility.Combine(RootPath, BuiltinCatalogDefine.BinaryFileName);
|
return PathUtility.Combine(RootPath, BuiltinCatalogConsts.BinaryFileName);
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,12 +72,12 @@ namespace YooAsset
|
|||||||
|
|
||||||
if (_loadLocalAssetBundleOp.Status == EOperationStatus.Succeeded)
|
if (_loadLocalAssetBundleOp.Status == EOperationStatus.Succeeded)
|
||||||
{
|
{
|
||||||
if (_loadLocalAssetBundleOp.BundleResult == null)
|
if (_loadLocalAssetBundleOp.BundleHandle == null)
|
||||||
throw new YooInternalException("Loaded bundle result is null.");
|
throw new YooInternalException("Loaded bundle handle is null.");
|
||||||
|
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Status = EOperationStatus.Succeeded;
|
Status = EOperationStatus.Succeeded;
|
||||||
BundleResult = _loadLocalAssetBundleOp.BundleResult;
|
BundleHandle = _loadLocalAssetBundleOp.BundleHandle;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -164,12 +164,12 @@ namespace YooAsset
|
|||||||
|
|
||||||
if(_loadLocalRawBundleOp.Status == EOperationStatus.Succeeded)
|
if(_loadLocalRawBundleOp.Status == EOperationStatus.Succeeded)
|
||||||
{
|
{
|
||||||
if (_loadLocalRawBundleOp.BundleResult == null)
|
if (_loadLocalRawBundleOp.BundleHandle == null)
|
||||||
throw new YooInternalException("Loaded bundle result is null.");
|
throw new YooInternalException("Loaded bundle handle is null.");
|
||||||
|
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Status = EOperationStatus.Succeeded;
|
Status = EOperationStatus.Succeeded;
|
||||||
BundleResult = _loadLocalRawBundleOp.BundleResult;
|
BundleHandle = _loadLocalRawBundleOp.BundleHandle;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -101,9 +101,9 @@ namespace YooAsset
|
|||||||
var operation = new EFCWriteCacheOperation(this, options);
|
var operation = new EFCWriteCacheOperation(this, options);
|
||||||
return operation;
|
return operation;
|
||||||
}
|
}
|
||||||
public virtual FCClearCacheOperation ClearCacheAsync(ClearCacheOptions options)
|
public virtual FCClearCacheOperation ClearCacheAsync(FCClearCacheOptions options)
|
||||||
{
|
{
|
||||||
var operation = new FCClearCacheCompleteOperation();
|
var operation = new EFCClearCacheOperation(this, options);
|
||||||
return operation;
|
return operation;
|
||||||
}
|
}
|
||||||
public virtual FCVerifyCacheOperation VerifyCacheAsync(FCVerifyCacheOptions options)
|
public virtual FCVerifyCacheOperation VerifyCacheAsync(FCVerifyCacheOptions options)
|
||||||
@@ -120,7 +120,7 @@ namespace YooAsset
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string error = $"{nameof(EditorFileCache)} not support load bundle type : {options.Bundle.BundleType}";
|
string error = $"{nameof(EditorFileCache)} does not support bundle type: {options.Bundle.BundleType}";
|
||||||
var operation = new FCLoadBundleErrorOperation(error);
|
var operation = new FCLoadBundleErrorOperation(error);
|
||||||
return operation;
|
return operation;
|
||||||
}
|
}
|
||||||
@@ -135,7 +135,15 @@ namespace YooAsset
|
|||||||
|
|
||||||
#region 内部方法
|
#region 内部方法
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 添加指定缓存
|
/// 获取所有缓存条目
|
||||||
|
/// </summary>
|
||||||
|
internal IReadOnlyCollection<EditorFileCacheEntry> GetAllEntries()
|
||||||
|
{
|
||||||
|
return _cacheEntries.Values;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 添加指定缓存条目
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal void AddEntry(string bundleGUID, EditorFileCacheEntry cacheEntry)
|
internal void AddEntry(string bundleGUID, EditorFileCacheEntry cacheEntry)
|
||||||
{
|
{
|
||||||
@@ -144,6 +152,17 @@ namespace YooAsset
|
|||||||
|
|
||||||
_cacheEntries.Add(bundleGUID, cacheEntry);
|
_cacheEntries.Add(bundleGUID, cacheEntry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 删除指定缓存条目
|
||||||
|
/// </summary>
|
||||||
|
internal void RemoveEntry(string bundleGUID)
|
||||||
|
{
|
||||||
|
if (_cacheEntries.TryGetValue(bundleGUID, out EditorFileCacheEntry entry))
|
||||||
|
{
|
||||||
|
_cacheEntries.Remove(bundleGUID);
|
||||||
|
}
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace YooAsset
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 清理沙盒文件缓存操作
|
||||||
|
/// </summary>
|
||||||
|
internal class EFCClearCacheOperation : FCClearCacheOperation
|
||||||
|
{
|
||||||
|
private enum ESteps
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
GetResult,
|
||||||
|
ClearCacheFiles,
|
||||||
|
Done,
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly EditorFileCache _fileCache;
|
||||||
|
private readonly FCClearCacheOptions _options;
|
||||||
|
private List<string> _bundleGUIDs;
|
||||||
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
|
internal EFCClearCacheOperation(EditorFileCache fileCache, FCClearCacheOptions options)
|
||||||
|
{
|
||||||
|
_fileCache = fileCache;
|
||||||
|
_options = options;
|
||||||
|
}
|
||||||
|
internal override void InternalStart()
|
||||||
|
{
|
||||||
|
_steps = ESteps.GetResult;
|
||||||
|
}
|
||||||
|
internal override void InternalUpdate()
|
||||||
|
{
|
||||||
|
if (_steps == ESteps.None || _steps == ESteps.Done)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (_steps == ESteps.GetResult)
|
||||||
|
{
|
||||||
|
ClearResult clearResult;
|
||||||
|
if (_options.ClearMode == EFileClearMode.ClearAllBundleFiles.ToString())
|
||||||
|
{
|
||||||
|
clearResult = GetAllCache(_fileCache.GetAllEntries());
|
||||||
|
}
|
||||||
|
else if (_options.ClearMode == EFileClearMode.ClearUnusedBundleFiles.ToString())
|
||||||
|
{
|
||||||
|
clearResult = GetUnusedCache(_options, _fileCache.GetAllEntries());
|
||||||
|
}
|
||||||
|
else if (_options.ClearMode == EFileClearMode.ClearBundleFilesByLocations.ToString())
|
||||||
|
{
|
||||||
|
clearResult = GetCacheByLocations(_options, _fileCache.GetAllEntries());
|
||||||
|
}
|
||||||
|
else if (_options.ClearMode == EFileClearMode.ClearBundleFilesByTags.ToString())
|
||||||
|
{
|
||||||
|
clearResult = GetCacheByTags(_options, _fileCache.GetAllEntries());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = $"Invalid clear mode: {_options.ClearMode}";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (clearResult.Succeeded == false)
|
||||||
|
{
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = clearResult.Error;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_bundleGUIDs = clearResult.BundleGUIDs;
|
||||||
|
_steps = ESteps.ClearCacheFiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_steps == ESteps.ClearCacheFiles)
|
||||||
|
{
|
||||||
|
foreach(var bundleGUID in _bundleGUIDs)
|
||||||
|
{
|
||||||
|
_fileCache.RemoveEntry(bundleGUID);
|
||||||
|
}
|
||||||
|
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
Status = EOperationStatus.Succeeded;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
internal override void InternalWaitForCompletion()
|
||||||
|
{
|
||||||
|
ExecuteBatch();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 4dd5972832b5c9e40874d84a0e3b4b60
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -10,6 +10,7 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
None,
|
None,
|
||||||
CheckCache,
|
CheckCache,
|
||||||
|
CheckFilePath,
|
||||||
LoadBundle,
|
LoadBundle,
|
||||||
Done,
|
Done,
|
||||||
}
|
}
|
||||||
@@ -17,6 +18,7 @@ namespace YooAsset
|
|||||||
private readonly EditorFileCache _fileCache;
|
private readonly EditorFileCache _fileCache;
|
||||||
private readonly PackageBundle _bundle;
|
private readonly PackageBundle _bundle;
|
||||||
private int _asyncSimulateFrame;
|
private int _asyncSimulateFrame;
|
||||||
|
private string _editorFilePath;
|
||||||
private ESteps _steps = ESteps.None;
|
private ESteps _steps = ESteps.None;
|
||||||
|
|
||||||
public EFCLoadBundleOperation(EditorFileCache fileCache, PackageBundle bundle)
|
public EFCLoadBundleOperation(EditorFileCache fileCache, PackageBundle bundle)
|
||||||
@@ -44,8 +46,23 @@ namespace YooAsset
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_steps = ESteps.CheckFilePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_steps == ESteps.CheckFilePath)
|
||||||
|
{
|
||||||
|
_editorFilePath = EditorFileSystemTools.GetEditorFilePath(_bundle);
|
||||||
|
if (string.IsNullOrEmpty(_editorFilePath))
|
||||||
|
{
|
||||||
|
_steps = ESteps.Done;
|
||||||
|
Status = EOperationStatus.Failed;
|
||||||
|
Error = $"Editor file path is null. Bundle: {_bundle.BundleName}";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
_steps = ESteps.LoadBundle;
|
_steps = ESteps.LoadBundle;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (_steps == ESteps.LoadBundle)
|
if (_steps == ESteps.LoadBundle)
|
||||||
{
|
{
|
||||||
@@ -61,9 +78,7 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Status = EOperationStatus.Succeeded;
|
Status = EOperationStatus.Succeeded;
|
||||||
|
BundleHandle = new VirtualBundleHandle(_editorFilePath, _bundle);
|
||||||
string editorFilePath = EditorFileSystemTools.GetEditorFilePath(_bundle);
|
|
||||||
BundleResult = new VirtualBundleResult(editorFilePath, _bundle);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -73,9 +88,7 @@ namespace YooAsset
|
|||||||
{
|
{
|
||||||
_steps = ESteps.Done;
|
_steps = ESteps.Done;
|
||||||
Status = EOperationStatus.Succeeded;
|
Status = EOperationStatus.Succeeded;
|
||||||
|
BundleHandle = new VirtualBundleHandle(_editorFilePath, _bundle);
|
||||||
string editorFilePath = EditorFileSystemTools.GetEditorFilePath(_bundle);
|
|
||||||
BundleResult = new VirtualBundleResult(editorFilePath, _bundle);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,8 +92,8 @@ namespace YooAsset
|
|||||||
|
|
||||||
// 创建验证元素类
|
// 创建验证元素类
|
||||||
string fileRootPath = childDirectory;
|
string fileRootPath = childDirectory;
|
||||||
string dataFilePath = PathUtility.Combine(fileRootPath, SandboxFileCacheDefine.BundleDataFileName);
|
string dataFilePath = PathUtility.Combine(fileRootPath, SandboxFileCacheConsts.BundleDataFileName);
|
||||||
string infoFilePath = PathUtility.Combine(fileRootPath, SandboxFileCacheDefine.BundleInfoFileName);
|
string infoFilePath = PathUtility.Combine(fileRootPath, SandboxFileCacheConsts.BundleInfoFileName);
|
||||||
var element = new SearchFileInfo(bundleGUID, fileRootPath, dataFilePath, infoFilePath);
|
var element = new SearchFileInfo(bundleGUID, fileRootPath, dataFilePath, infoFilePath);
|
||||||
Result.Add(element);
|
Result.Add(element);
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user