Compare commits

...

15 Commits
1.5.7 ... main

Author SHA1 Message Date
何冠峰 2c68e5dfd5 Update CHANGELOG.md 2024-08-14 10:26:04 +08:00
何冠峰 1c6e54df21 Update package.json 2024-08-14 10:26:01 +08:00
hevinci a4d378894e fix #295 2024-05-10 10:45:57 +08:00
hevinci 9d5a90e8fa fix #276 2024-04-12 11:50:40 +08:00
hevinci bb1c64e444 合并2.x功能到1.5
1. 增加获取缓存文件信息的异步操作
2. 支持资源下载器合并
3. 新增资源导入器
2024-03-27 18:50:10 +08:00
hevinci 92ac301716 feat : support open harmony 2024-03-13 15:42:23 +08:00
hevinci 135d5b4f5b Update AssetBundleCollector.cs
打包忽略编辑器资产 LightmapParameters
2024-03-11 11:28:42 +08:00
hevinci 23931e5d58 update asset bundle collector
移除资源包名的空格
2024-02-20 09:48:32 +08:00
何冠峰 619b5dbdaf
Merge pull request #243 from ZensYue/main
去除文件名中的空格
2024-02-20 09:44:14 +08:00
e 3105521fa9 去除文件名中的空格 2024-02-19 22:20:34 +08:00
何冠峰 b180fd8fc6
Merge pull request #235 from JellyHoney/main
update DeserializeManifestOperation
2024-02-18 10:16:06 +08:00
JellyHoney 769678a4b5 update DeserializeManifestOperation
优化修改文件后缀耗时
2024-02-01 16:46:34 +08:00
hevinci f90530e9f4 fix #226 2024-01-02 10:49:46 +08:00
hevinci 2630a7e793 fix #177 2023-10-08 15:56:19 +08:00
hevinci 45b016ae0f fix #175 2023-10-07 18:56:30 +08:00
25 changed files with 466 additions and 51 deletions

View File

@ -2,6 +2,26 @@
All notable changes to this package will be documented in this file.
## [1.5.8] - 2024-8-14
### Fixed
- (#175) 修复了Mac平台URL路径有空格的情况会报Malformed URL错误。
- (#177) 修复了加载一个地址的主资源或子资源之后无法再加载另一种的问题。
- (#266) 修复了资源系统遍历IsBusy次数过多导致过多的耗时的问题。
- (#276) 修复了HostPlayMode模式下如果内置清单是最新版本每次运行都会触发拷贝行为。
- (#295) 修复了在安卓平台,华为和三星真机上有极小概率加载资源包失败 : Unable to open archive file。
### Added
- 新增资源导入器。
- 新增获取缓存文件信息的方法。
### Changed
- 支持鸿蒙操作系统。
- 支持资源下载器合并。
## [1.5.7] - 2023-10-07
### Changed

View File

@ -1,5 +1,6 @@
using System;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
@ -130,7 +131,7 @@ namespace YooAsset.Editor
{
var buildMode = buildParametersContext.Parameters.BuildMode;
if (buildMode == EBuildMode.DryRunBuild || buildMode == EBuildMode.SimulateBuild)
return "00000000000000000000000000000000"; //32位
return GetFilePathTempHash(filePath);
else
return HashUtility.FileMD5(filePath);
}
@ -150,5 +151,32 @@ namespace YooAsset.Editor
else
return FileUtility.GetFileSize(filePath);
}
protected string GetFilePathTempHash(string filePath)
{
byte[] bytes = Encoding.UTF8.GetBytes(filePath);
return HashUtility.BytesMD5(bytes);
// 注意:在文件路径的哈希值冲突的情况下,可以使用下面的方法
//return $"{HashUtility.BytesMD5(bytes)}-{Guid.NewGuid():N}";
}
protected long GetBundleTempSize(BuildBundleInfo bundleInfo)
{
long tempSize = 0;
var assetPaths = bundleInfo.GetAllMainAssetPaths();
foreach (var assetPath in assetPaths)
{
long size = FileUtility.GetFileSize(assetPath);
tempSize += size;
}
if (tempSize == 0)
{
string message = $"Bundle temp size is zero, check bundle main asset list : {bundleInfo.BundleName}";
throw new Exception(message);
}
return tempSize;
}
}
}

View File

@ -251,7 +251,7 @@ namespace YooAsset.Editor
// 忽略编辑器下的类型资源
Type assetType = AssetDatabase.GetMainAssetTypeAtPath(assetPath);
if (assetType == typeof(LightingDataAsset))
if (assetType == typeof(LightingDataAsset) || assetType == typeof(LightmapParameters))
return false;
// 检测原生文件是否合规

View File

@ -34,7 +34,7 @@ namespace YooAsset.Editor
public string GetMainBundleName(string packageName, bool uniqueBundleName)
{
string fullName;
string bundleName = EditorTools.GetRegularPath(_bundleName).Replace('/', '_').Replace('.', '_').ToLower();
string bundleName = EditorTools.GetRegularPath(_bundleName).Replace('/', '_').Replace('.', '_').Replace(" ", "_").ToLower();
if (uniqueBundleName)
fullName = $"{packageName}_{bundleName}.{_bundleExtension}";
else
@ -52,7 +52,7 @@ namespace YooAsset.Editor
return string.Empty;
string fullName;
string bundleName = EditorTools.GetRegularPath(_bundleName).Replace('/', '_').Replace('.', '_').ToLower();
string bundleName = EditorTools.GetRegularPath(_bundleName).Replace('/', '_').Replace('.', '_').Replace(" ", "_").ToLower();
if (uniqueBundleName)
fullName = $"{packageName}_share_{bundleName}.{_bundleExtension}";
else

View File

@ -72,9 +72,14 @@ namespace YooAsset
_isUnloadSafe = false;
for (int i = 0; i < _providerList.Count; i++)
{
var provider = _providerList[i];
if (provider.IsDone)
continue;
provider.Update();
if (IsBusy)
break;
_providerList[i].Update();
}
_isUnloadSafe = true;
}
@ -199,7 +204,7 @@ namespace YooAsset
return completedProvider.CreateHandle<AssetOperationHandle>();
}
string providerGUID = assetInfo.GUID;
string providerGUID = nameof(LoadAssetAsync) + assetInfo.GUID;
ProviderBase provider = TryGetProvider(providerGUID);
if (provider == null)
{
@ -227,7 +232,7 @@ namespace YooAsset
return completedProvider.CreateHandle<SubAssetsOperationHandle>();
}
string providerGUID = assetInfo.GUID;
string providerGUID = nameof(LoadSubAssetsAsync) + assetInfo.GUID;
ProviderBase provider = TryGetProvider(providerGUID);
if (provider == null)
{
@ -255,7 +260,7 @@ namespace YooAsset
return completedProvider.CreateHandle<AllAssetsOperationHandle>();
}
string providerGUID = assetInfo.GUID;
string providerGUID = nameof(LoadAllAssetsAsync) + assetInfo.GUID;
ProviderBase provider = TryGetProvider(providerGUID);
if (provider == null)
{
@ -283,7 +288,7 @@ namespace YooAsset
return completedProvider.CreateHandle<RawFileOperationHandle>();
}
string providerGUID = assetInfo.GUID;
string providerGUID = nameof(LoadRawFileAsync) + assetInfo.GUID;
ProviderBase provider = TryGetProvider(providerGUID);
if (provider == null)
{

View File

@ -270,22 +270,47 @@ namespace YooAsset
// Check error
if (CacheBundle == null)
{
_steps = ESteps.Done;
Status = EStatus.Failed;
LastError = $"Failed to load assetBundle : {MainBundleInfo.Bundle.BundleName}";
YooLogger.Error(LastError);
// 注意当缓存文件的校验等级为Low的时候并不能保证缓存文件的完整性。
// 在AssetBundle文件加载失败的情况下我们需要重新验证文件的完整性
if (MainBundleInfo.LoadMode == BundleInfo.ELoadMode.LoadFromCache)
{
var result = CacheSystem.VerifyingRecordFile(MainBundleInfo.Bundle.PackageName, MainBundleInfo.Bundle.CacheGUID);
if (result != EVerifyResult.Succeed)
if (result == EVerifyResult.Succeed)
{
YooLogger.Error($"Found possibly corrupt file ! {MainBundleInfo.Bundle.CacheGUID} Verify result : {result}");
// 说明:在安卓移动平台,华为和三星真机上有极小概率加载资源包失败。
// 大多数情况在首次安装下载资源到沙盒内,游戏过程中切换到后台再回到游戏内有很大概率触发!
byte[] fileData = FileUtility.ReadAllBytes(FileLoadPath);
if (fileData != null && fileData.Length > 0)
CacheBundle = AssetBundle.LoadFromMemory(fileData);
if (CacheBundle == null)
{
_steps = ESteps.Done;
Status = EStatus.Failed;
LastError = $"Failed to load assetBundle from memory : {MainBundleInfo.Bundle.BundleName}";
YooLogger.Error(LastError);
}
else
{
_steps = ESteps.Done;
Status = EStatus.Succeed;
}
}
else
{
_steps = ESteps.Done;
Status = EStatus.Failed;
LastError = $"Found possibly corrupt file ! {MainBundleInfo.Bundle.CacheGUID} Verify result : {result}";
YooLogger.Error(LastError);
CacheSystem.DiscardFile(MainBundleInfo.Bundle.PackageName, MainBundleInfo.Bundle.CacheGUID);
}
}
else
{
_steps = ESteps.Done;
Status = EStatus.Failed;
LastError = $"Failed to load assetBundle : {MainBundleInfo.Bundle.BundleName}";
YooLogger.Error(LastError);
}
}
else
{

View File

@ -90,6 +90,15 @@ namespace YooAsset
}
}
/// <summary>
/// 获取记录对象
/// </summary>
public static PackageCache.RecordWrapper TryGetWrapper(string packageName, string cacheGUID)
{
var cache = GetOrCreateCache(packageName);
return cache.TryGetWrapper(cacheGUID);
}
/// <summary>
/// 验证缓存文件(子线程内操作)
/// </summary>
@ -165,9 +174,9 @@ namespace YooAsset
/// <summary>
/// 获取所有的缓存文件
/// </summary>
public static List<string> GetAllCacheGUIDs(ResourcePackage package)
public static List<string> GetAllCacheGUIDs(string packageName)
{
var cache = GetOrCreateCache(package.PackageName);
var cache = GetOrCreateCache(packageName);
return cache.GetAllKeys();
}

View File

@ -37,7 +37,7 @@ namespace YooAsset
if (_steps == ESteps.GetAllCacheFiles)
{
_allCacheGUIDs = CacheSystem.GetAllCacheGUIDs(_package);
_allCacheGUIDs = CacheSystem.GetAllCacheGUIDs(_package.PackageName);
_fileTotalCount = _allCacheGUIDs.Count;
YooLogger.Log($"Found all cache file count : {_fileTotalCount}");
_steps = ESteps.ClearAllCacheFiles;

View File

@ -0,0 +1,85 @@
using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
namespace YooAsset
{
public class GetAllCacheFileInfosOperation : AsyncOperationBase
{
public class CacheInfo
{
public string FishHash { private set; get; }
public string FilePath { private set; get; }
public string FileCRC { private set; get; }
public long FileSize { private set; get; }
public CacheInfo(string fishHash, string filePath, string fileCRC, long fileSize)
{
FishHash = fishHash;
FilePath = filePath;
FileCRC = fileCRC;
FileSize = fileSize;
}
}
private enum ESteps
{
None,
GetCacheFileInfos,
Done,
}
private readonly string _packageName;
private ESteps _steps = ESteps.None;
private List<CacheInfo> _cacheFileInfos;
/// <summary>
/// 搜索结果
/// </summary>
public List<CacheInfo> Result
{
get { return _cacheFileInfos; }
}
internal GetAllCacheFileInfosOperation(string packageName)
{
_packageName = packageName;
}
internal override void Start()
{
_steps = ESteps.GetCacheFileInfos;
}
internal override void Update()
{
if (_steps == ESteps.None || _steps == ESteps.Done)
return;
if (_steps == ESteps.GetCacheFileInfos)
{
var allCachedGUIDs = CacheSystem.GetAllCacheGUIDs(_packageName);
_cacheFileInfos = new List<CacheInfo>(allCachedGUIDs.Count);
for (int i = 0; i < allCachedGUIDs.Count; i++)
{
var cachedGUID = allCachedGUIDs[i];
var wrapper = CacheSystem.TryGetWrapper(_packageName, cachedGUID);
if (wrapper != null)
{
string directoryName = Path.GetDirectoryName(wrapper.DataFilePath);
var directoryInfo = new DirectoryInfo(directoryName);
if (directoryInfo.Exists)
{
string fishHash = directoryInfo.Name;
var cacheFileInfo = new CacheInfo(fishHash, wrapper.DataFilePath, wrapper.DataFileCRC, wrapper.DataFileSize);
_cacheFileInfos.Add(cacheFileInfo);
}
}
}
// 注意:总是返回成功
_steps = ESteps.Done;
Status = EOperationStatus.Succeed;
}
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d37e37f5d78ddf8468adcf2dff1edfbb
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -46,7 +46,12 @@ namespace YooAsset
}
private static string CreateDefaultBuildinRoot()
{
return PathUtility.Combine(UnityEngine.Application.streamingAssetsPath, YooAssetSettingsData.Setting.DefaultYooFolderName);
string path = PathUtility.Combine(UnityEngine.Application.streamingAssetsPath, YooAssetSettingsData.Setting.DefaultYooFolderName);
#if UNITY_OPENHARMONY
return $"file://{path}";
#else
return path;
#endif
}
private static string CreateDefaultSandboxRoot()
{
@ -128,6 +133,7 @@ namespace YooAsset
/// </summary>
public void SaveSandboxPackageVersionFile(string version)
{
YooLogger.Log($"Save package version : {version}");
string filePath = GetSandboxPackageVersionFilePath();
FileUtility.WriteAllText(filePath, version);
}

View File

@ -37,14 +37,23 @@ namespace YooAsset
{
#if UNITY_EDITOR
return StringUtility.Format("file:///{0}", path);
#elif UNITY_IPHONE
return StringUtility.Format("file://{0}", path);
#elif UNITY_ANDROID
return path;
#elif UNITY_STANDALONE
return StringUtility.Format("file:///{0}", path);
#elif UNITY_WEBGL
return path;
#elif UNITY_IPHONE
return StringUtility.Format("file://{0}", path);
#elif UNITY_ANDROID
if (path.StartsWith("jar:file://"))
return path;
else
return StringUtility.Format("jar:file://{0}", path);
#elif UNITY_STANDALONE_OSX
return new System.Uri(path).ToString();
#elif UNITY_STANDALONE
return StringUtility.Format("file:///{0}", path);
#elif UNITY_OPENHARMONY
return path;
#else
return path;
#endif
}
}

View File

@ -28,9 +28,9 @@ namespace YooAsset
return _providerGUID;
if (AssetType == null)
_providerGUID = $"{AssetPath}[null]";
_providerGUID = $"[{AssetPath}][null]";
else
_providerGUID = $"{AssetPath}[{AssetType.Name}]";
_providerGUID = $"[{AssetPath}][{AssetType.Name}]";
return _providerGUID;
}
}

View File

@ -154,10 +154,12 @@ namespace YooAsset
// 填充BundleDic
manifest.BundleDic = new Dictionary<string, PackageBundle>(manifest.BundleList.Count);
manifest.BundleDic2 = new Dictionary<string, PackageBundle>(manifest.BundleList.Count);
foreach (var packageBundle in manifest.BundleList)
{
packageBundle.ParseBundle(manifest.PackageName, manifest.OutputNameStyle);
manifest.BundleDic.Add(packageBundle.BundleName, packageBundle);
manifest.BundleDic2.Add(packageBundle.FileName, packageBundle);
}
// 填充AssetDic
@ -210,7 +212,18 @@ namespace YooAsset
}
/// <summary>
/// 批量转换为解压BundleInfo
/// 转换为导入BundleInfo
/// </summary>
public static BundleInfo ConvertToImportInfo(PackageBundle packageBundle, string filePath)
{
// 注意:我们把本地文件路径指定为远端下载地址
string persistentPath = PersistentTools.ConvertToWWWPath(filePath);
BundleInfo bundleInfo = new BundleInfo(packageBundle, BundleInfo.ELoadMode.None, persistentPath, persistentPath);
return bundleInfo;
}
/// <summary>
/// 批量转换解压为BundleInfo
/// </summary>
public static List<BundleInfo> ConvertToUnpackInfos(List<PackageBundle> unpackList)
{

View File

@ -91,14 +91,7 @@ namespace YooAsset
_failedTryAgain = failedTryAgain;
_timeout = timeout;
if (downloadList != null)
{
TotalDownloadCount = downloadList.Count;
foreach (var packageBundle in downloadList)
{
TotalDownloadBytes += packageBundle.Bundle.FileSize;
}
}
CalculatDownloaderInfo();
}
internal override void Start()
{
@ -206,6 +199,57 @@ namespace YooAsset
}
}
}
private void CalculatDownloaderInfo()
{
if (_downloadList != null)
{
TotalDownloadBytes = 0;
TotalDownloadCount = _downloadList.Count;
foreach (var packageBundle in _downloadList)
{
TotalDownloadBytes += packageBundle.Bundle.FileSize;
}
}
else
{
TotalDownloadBytes = 0;
TotalDownloadCount = 0;
}
}
/// <summary>
/// 合并其它下载器
/// </summary>
/// <param name="downloader">合并的下载器</param>
public void Combine(DownloaderOperation downloader)
{
if (_steps != ESteps.None)
{
YooLogger.Error("The downloader is running, can not combine with other downloader !");
return;
}
HashSet<string> temper = new HashSet<string>();
foreach (var bundleInfo in _downloadList)
{
if (temper.Contains(bundleInfo.Bundle.CachedDataFilePath) == false)
{
temper.Add(bundleInfo.Bundle.CachedDataFilePath);
}
}
// 合并下载列表
foreach (var bundleInfo in downloader._downloadList)
{
if (temper.Contains(bundleInfo.Bundle.CachedDataFilePath) == false)
{
_downloadList.Add(bundleInfo);
}
}
// 重新统计下载信息
CalculatDownloaderInfo();
}
/// <summary>
/// 开始下载
@ -282,4 +326,21 @@ namespace YooAsset
return operation;
}
}
public sealed class ResourceImporterOperation : DownloaderOperation
{
internal ResourceImporterOperation(List<BundleInfo> downloadList, int downloadingMaxNumber, int failedTryAgain, int timeout)
: base(downloadList, downloadingMaxNumber, failedTryAgain, timeout)
{
}
/// <summary>
/// 创建空的导入器
/// </summary>
internal static ResourceImporterOperation CreateEmptyImporter(int upackingMaxNumber, int failedTryAgain, int timeout)
{
List<BundleInfo> downloadList = new List<BundleInfo>();
var operation = new ResourceImporterOperation(downloadList, upackingMaxNumber, failedTryAgain, int.MaxValue);
return operation;
}
}
}

View File

@ -11,6 +11,11 @@ namespace YooAsset
public abstract class InitializationOperation : AsyncOperationBase
{
public string PackageVersion { protected set; get; }
/// <summary>
/// 本地记录的资源包裹的版本
/// </summary>
public string RecordVersion { protected set; get; }
}
/// <summary>
@ -242,6 +247,7 @@ namespace YooAsset
if (_queryCachePackageVersionOp.Status == EOperationStatus.Succeed)
{
RecordVersion = _queryCachePackageVersionOp.PackageVersion;
_steps = ESteps.TryLoadCacheManifest;
}
else
@ -336,6 +342,7 @@ namespace YooAsset
{
PackageVersion = _loadBuildinManifestOp.Manifest.PackageVersion;
_impl.ActiveManifest = _loadBuildinManifestOp.Manifest;
_impl.FlushManifestVersionFile();
_steps = ESteps.PackageCaching;
}
else

View File

@ -142,9 +142,9 @@ namespace YooAsset
Manifest.AssetPathMapping1.Add(location, packageAsset.AssetPath);
// 添加无后缀名路径的映射
if (Path.HasExtension(location))
string locationWithoutExtension = Path.ChangeExtension(location, null);
if (!ReferenceEquals(location, locationWithoutExtension))
{
string locationWithoutExtension = PathUtility.RemoveExtension(location);
if (Manifest.AssetPathMapping1.ContainsKey(locationWithoutExtension))
YooLogger.Warning($"Location have existed : {locationWithoutExtension}");
else
@ -189,6 +189,8 @@ namespace YooAsset
_packageBundleCount = _buffer.ReadInt32();
Manifest.BundleList = new List<PackageBundle>(_packageBundleCount);
Manifest.BundleDic = new Dictionary<string, PackageBundle>(_packageBundleCount);
Manifest.BundleDic2 = new Dictionary<string, PackageBundle>(_packageBundleCount);
Manifest.BundleDic3 = new Dictionary<string, PackageBundle>(_packageBundleCount);
_progressTotalValue = _packageBundleCount;
_steps = ESteps.DeserializeBundleList;
}
@ -210,10 +212,11 @@ namespace YooAsset
packageBundle.ParseBundle(Manifest.PackageName, Manifest.OutputNameStyle);
Manifest.BundleDic.Add(packageBundle.BundleName, packageBundle);
Manifest.BundleDic2.Add(packageBundle.FileName, packageBundle);
// 注意原始文件可能存在相同的CacheGUID
if (Manifest.CacheGUIDs.Contains(packageBundle.CacheGUID) == false)
Manifest.CacheGUIDs.Add(packageBundle.CacheGUID);
if (Manifest.BundleDic3.ContainsKey(packageBundle.CacheGUID) == false)
Manifest.BundleDic3.Add(packageBundle.CacheGUID, packageBundle);
_packageBundleCount--;
Progress = 1f - _packageBundleCount / _progressTotalValue;

View File

@ -64,6 +64,18 @@ namespace YooAsset
[NonSerialized]
public Dictionary<string, PackageBundle> BundleDic;
/// <summary>
/// 资源包集合提供FileName获取PackageBundle
/// </summary>
[NonSerialized]
public Dictionary<string, PackageBundle> BundleDic2;
/// <summary>
/// 资源包集合提供CacheGUID获取PackageBundle
/// </summary>
[NonSerialized]
public Dictionary<string, PackageBundle> BundleDic3;
/// <summary>
/// 资源映射集合提供AssetPath获取PackageAsset
/// </summary>
@ -82,12 +94,6 @@ namespace YooAsset
[NonSerialized]
public Dictionary<string, string> AssetPathMapping2;
/// <summary>
/// 该资源清单所有文件的缓存GUID集合
/// </summary>
[NonSerialized]
public HashSet<string> CacheGUIDs = new HashSet<string>();
/// <summary>
/// 尝试映射为资源路径
@ -192,12 +198,28 @@ namespace YooAsset
return BundleDic.TryGetValue(bundleName, out result);
}
/// <summary>
/// 尝试获取包裹的资源包
/// </summary>
public bool TryGetPackageBundleByFileName(string fileName, out PackageBundle result)
{
return BundleDic2.TryGetValue(fileName, out result);
}
/// <summary>
/// 尝试获取包裹的资源包
/// </summary>
public bool TryGetPackageBundleByCacheGUID(string cacheGUID, out PackageBundle result)
{
return BundleDic3.TryGetValue(cacheGUID, out result);
}
/// <summary>
/// 是否包含资源文件
/// </summary>
public bool IsIncludeBundleFile(string cacheGUID)
{
return CacheGUIDs.Contains(cacheGUID);
return BundleDic3.ContainsKey(cacheGUID);
}
/// <summary>

View File

@ -74,6 +74,11 @@ namespace YooAsset
{
return ResourceUnpackerOperation.CreateEmptyUnpacker(upackingMaxNumber, failedTryAgain, timeout);
}
ResourceImporterOperation IPlayModeServices.CreateResourceImporterByFilePaths(string[] filePaths, int importerMaxNumber, int failedTryAgain, int timeout)
{
return ResourceImporterOperation.CreateEmptyImporter(importerMaxNumber, failedTryAgain, timeout);
}
#endregion
#region IBundleServices接口

View File

@ -284,6 +284,39 @@ namespace YooAsset
return ManifestTools.ConvertToUnpackInfos(downloadList);
}
ResourceImporterOperation IPlayModeServices.CreateResourceImporterByFilePaths(string[] filePaths, int importerMaxNumber, int failedTryAgain, int timeout)
{
List<BundleInfo> importerList = GetImporterListByFilePaths(_activeManifest, filePaths);
var operation = new ResourceImporterOperation(importerList, importerMaxNumber, failedTryAgain, timeout);
return operation;
}
private List<BundleInfo> GetImporterListByFilePaths(PackageManifest manifest, string[] filePaths)
{
List<BundleInfo> result = new List<BundleInfo>();
foreach (var filePath in filePaths)
{
string fileName = System.IO.Path.GetFileName(filePath);
if (manifest.TryGetPackageBundleByFileName(fileName, out PackageBundle packageBundle))
{
// 忽略缓存文件
if (IsCachedPackageBundle(packageBundle))
continue;
// 忽略APP资源
if (IsBuildinPackageBundle(packageBundle))
continue;
var bundleInfo = ManifestTools.ConvertToImportInfo(packageBundle, filePath);
result.Add(bundleInfo);
}
else
{
YooLogger.Warning($"Not found package bundle, importer file path : {filePath}");
}
}
return result;
}
#endregion
#region IBundleServices接口

View File

@ -117,6 +117,35 @@ namespace YooAsset
return ManifestTools.ConvertToUnpackInfos(downloadList);
}
ResourceImporterOperation IPlayModeServices.CreateResourceImporterByFilePaths(string[] filePaths, int importerMaxNumber, int failedTryAgain, int timeout)
{
List<BundleInfo> importerList = GetImporterListByFilePaths(_activeManifest, filePaths);
var operation = new ResourceImporterOperation(importerList, importerMaxNumber, failedTryAgain, timeout);
return operation;
}
private List<BundleInfo> GetImporterListByFilePaths(PackageManifest manifest, string[] filePaths)
{
List<BundleInfo> result = new List<BundleInfo>();
foreach (var filePath in filePaths)
{
string fileName = System.IO.Path.GetFileName(filePath);
if (manifest.TryGetPackageBundleByFileName(fileName, out PackageBundle packageBundle))
{
// 忽略缓存文件
if (IsCachedPackageBundle(packageBundle))
continue;
var bundleInfo = ManifestTools.ConvertToImportInfo(packageBundle, filePath);
result.Add(bundleInfo);
}
else
{
YooLogger.Warning($"Not found package bundle, importer file path : {filePath}");
}
}
return result;
}
#endregion
#region IBundleServices接口

View File

@ -199,6 +199,11 @@ namespace YooAsset
{
return ResourceUnpackerOperation.CreateEmptyUnpacker(upackingMaxNumber, failedTryAgain, timeout);
}
ResourceImporterOperation IPlayModeServices.CreateResourceImporterByFilePaths(string[] filePaths, int importerMaxNumber, int failedTryAgain, int timeout)
{
return ResourceImporterOperation.CreateEmptyImporter(importerMaxNumber, failedTryAgain, timeout);
}
#endregion
#region IBundleServices接口

View File

@ -299,6 +299,17 @@ namespace YooAsset
return operation;
}
/// <summary>
/// 获取指定版本的缓存信息
/// </summary>
public GetAllCacheFileInfosOperation GetAllCacheFileInfosAsync(string packageVersion, int timeout = 60)
{
DebugCheckInitialize();
var operation = new GetAllCacheFileInfosOperation(PackageName);
OperationSystem.StartOperation(operation);
return operation;
}
/// <summary>
/// 获取本地包裹的版本信息
/// </summary>
@ -335,7 +346,7 @@ namespace YooAsset
{
DebugCheckInitialize();
var persistent = PersistentTools.GetPersistent(PackageName);
return persistent.BuildinRoot;
return persistent.BuildinPackageRoot;
}
/// <summary>
@ -345,7 +356,17 @@ namespace YooAsset
{
DebugCheckInitialize();
var persistent = PersistentTools.GetPersistent(PackageName);
return persistent.SandboxRoot;
return persistent.SandboxPackageRoot;
}
/// <summary>
/// 获取包裹的沙盒文件AB文件的缓存目录
/// </summary>
public string GetPackageSandboxCacheBundleRootDirectory()
{
DebugCheckInitialize();
var persistent = PersistentTools.GetPersistent(PackageName);
return persistent.SandboxCacheBundleFilesRoot;
}
/// <summary>
@ -1026,6 +1047,21 @@ namespace YooAsset
}
#endregion
#region 资源导入
/// <summary>
/// 创建资源导入器
/// 注意:资源文件名称必须和资源服务器部署的文件名称一致!
/// </summary>
/// <param name="filePaths">资源路径列表</param>
/// <param name="importerMaxNumber">同时导入的最大文件数</param>
/// <param name="failedTryAgain">导入失败的重试次数</param>
public ResourceImporterOperation CreateResourceImporter(string[] filePaths, int importerMaxNumber, int failedTryAgain)
{
DebugCheckInitialize();
return _playModeServices.CreateResourceImporterByFilePaths(filePaths, importerMaxNumber, failedTryAgain, int.MaxValue);
}
#endregion
#region 内部方法
/// <summary>
/// 是否包含资源文件

View File

@ -36,5 +36,8 @@ namespace YooAsset
// 解压相关
ResourceUnpackerOperation CreateResourceUnpackerByAll(int upackingMaxNumber, int failedTryAgain, int timeout);
ResourceUnpackerOperation CreateResourceUnpackerByTags(string[] tags, int upackingMaxNumber, int failedTryAgain, int timeout);
// 导入相关
ResourceImporterOperation CreateResourceImporterByFilePaths(string[] filePaths, int importerMaxNumber, int failedTryAgain, int timeout);
}
}

View File

@ -1,7 +1,7 @@
{
"name": "com.tuyoogame.yooasset",
"displayName": "YooAsset",
"version": "1.5.7",
"version": "1.5.8",
"unity": "2019.4",
"description": "unity3d resources management system.",
"author": {