using System.IO; using System.Collections.Generic; using UnityEngine; namespace YooAsset { internal class BundleInfo { public enum ELoadMode { None, LoadFromDelivery, LoadFromStreaming, LoadFromCache, LoadFromRemote, LoadFromEditor, } private readonly ResourceAssist _assist; /// /// 资源包对象 /// public readonly PackageBundle Bundle; /// /// 资源包加载模式 /// public readonly ELoadMode LoadMode; /// /// 远端下载地址 /// public string RemoteMainURL { private set; get; } /// /// 远端下载备用地址 /// public string RemoteFallbackURL { private set; get; } /// /// 分发资源文件路径 /// public string DeliveryFilePath { private set; get; } /// /// 注意:该字段只用于帮助编辑器下的模拟模式。 /// public string[] IncludeAssetsInEditor; private BundleInfo() { } public BundleInfo(ResourceAssist assist, PackageBundle bundle, ELoadMode loadMode, string mainURL, string fallbackURL) { _assist = assist; Bundle = bundle; LoadMode = loadMode; RemoteMainURL = mainURL; RemoteFallbackURL = fallbackURL; DeliveryFilePath = string.Empty; } public BundleInfo(ResourceAssist assist, PackageBundle bundle, ELoadMode loadMode, string deliveryFilePath) { _assist = assist; Bundle = bundle; LoadMode = loadMode; RemoteMainURL = string.Empty; RemoteFallbackURL = string.Empty; DeliveryFilePath = deliveryFilePath; } public BundleInfo(ResourceAssist assist, PackageBundle bundle, ELoadMode loadMode) { _assist = assist; Bundle = bundle; LoadMode = loadMode; RemoteMainURL = string.Empty; RemoteFallbackURL = string.Empty; DeliveryFilePath = string.Empty; } #region Cache public bool IsCached() { return _assist.Cache.IsCached(Bundle.CacheGUID); } public void CacheRecord() { string infoFilePath = CachedInfoFilePath; string dataFilePath = CachedDataFilePath; string dataFileCRC = Bundle.FileCRC; long dataFileSize = Bundle.FileSize; var wrapper = new CacheManager.RecordWrapper(infoFilePath, dataFilePath, dataFileCRC, dataFileSize); _assist.Cache.Record(Bundle.CacheGUID, wrapper); } public void CacheDiscard() { _assist.Cache.Discard(Bundle.CacheGUID); } public EVerifyResult VerifySelf() { return CacheHelper.VerifyingRecordFile(_assist.Cache, Bundle.CacheGUID); } #endregion #region Persistent public string CachedDataFilePath { get { return _assist.Persistent.GetCachedDataFilePath(Bundle); } } public string CachedInfoFilePath { get { return _assist.Persistent.GetCachedInfoFilePath(Bundle); } } public string TempDataFilePath { get { return _assist.Persistent.GetTempDataFilePath(Bundle); } } public string BuildinFilePath { get { return _assist.Persistent.GetBuildinFilePath(Bundle); } } #endregion #region Download public DownloaderBase CreateDownloader(int failedTryAgain, int timeout = 60) { return _assist.Download.CreateDownload(this, failedTryAgain, timeout); } public DownloaderBase CreateUnpacker(int failedTryAgain, int timeout = 60) { var unpackBundleInfo = ConvertToUnpackInfo(); return _assist.Download.CreateDownload(unpackBundleInfo, failedTryAgain, timeout); } #endregion #region AssetBundle internal AssetBundle LoadAssetBundle(string fileLoadPath, out Stream managedStream) { return _assist.Loader.LoadAssetBundle(this, fileLoadPath, out managedStream); } internal AssetBundleCreateRequest LoadAssetBundleAsync(string fileLoadPath, out Stream managedStream) { return _assist.Loader.LoadAssetBundleAsync(this, fileLoadPath, out managedStream); } internal AssetBundle LoadDeliveryAssetBundle(string fileLoadPath) { return _assist.Loader.LoadDeliveryAssetBundle(this, fileLoadPath); } internal AssetBundleCreateRequest LoadDeliveryAssetBundleAsync(string fileLoadPath) { return _assist.Loader.LoadDeliveryAssetBundleAsync(this, fileLoadPath); } #endregion /// /// 转换为解压BundleInfo /// private BundleInfo ConvertToUnpackInfo() { string streamingPath = PersistentHelper.ConvertToWWWPath(BuildinFilePath); BundleInfo newBundleInfo = new BundleInfo(_assist, Bundle, ELoadMode.LoadFromStreaming, streamingPath, streamingPath); return newBundleInfo; } /// /// 批量创建解压BundleInfo /// public static List CreateUnpackInfos(ResourceAssist assist, List unpackList) { List result = new List(unpackList.Count); foreach (var packageBundle in unpackList) { var bundleInfo = CreateUnpackInfo(assist, packageBundle); result.Add(bundleInfo); } return result; } private static BundleInfo CreateUnpackInfo(ResourceAssist assist, PackageBundle packageBundle) { string streamingPath = PersistentHelper.ConvertToWWWPath(assist.Persistent.GetBuildinFilePath(packageBundle)); BundleInfo newBundleInfo = new BundleInfo(assist, packageBundle, ELoadMode.LoadFromStreaming, streamingPath, streamingPath); return newBundleInfo; } /// /// 创建导入BundleInfo /// public static BundleInfo CreateImportInfo(ResourceAssist assist, PackageBundle packageBundle, string filePath) { // 注意:我们把本地文件路径指定为远端下载地址 string persistentPath = PersistentHelper.ConvertToWWWPath(filePath); BundleInfo bundleInfo = new BundleInfo(assist, packageBundle, BundleInfo.ELoadMode.None, persistentPath, persistentPath); return bundleInfo; } } }