IEnumerator CoLoadFile(AssetFileWork file) { yield return(StartCoroutine(file.CoLoadAsync(timeOutDownload))); if (!file.IsLoadError) { //新たにキャッシュファイル書きこむ必要がある場合 if (file.FileInfo.IsWriteNewCache && !file.IgnoreLoad) { //ロード成功 DebugLog("WriteCacheFile:" + file.FileName + " ver:" + file.FileInfo.Version + " cache:" + file.FileInfo.CacheVersion); WriteNewVersion(file); } //ロード終了処理 file.LoadComplete(); //再ロード必要 if (file.IsLoadRetry) { StartCoroutine(CoLoadFile(file)); } else { //ロード成功 DebugLog("Load End :" + file.FileName + " ver:" + file.FileInfo.Version); loadingFileList.Remove(file); LoadNextFile(); MemoryOptimize(); } } else { //ロード失敗 DebugLogError("Load Failed :" + file.FileName + " ver:" + file.FileInfo.Version + "\n" + file.LoadErrorMsg); //リトライ if (file.IncLoadErrorRetryCount() < autoRetryCountOnDonwloadError) { DebugLog("Load Retry :" + file.FileName + " ver:" + file.FileInfo.Version); StartCoroutine(CoLoadFile(file)); } else { if (file.FileInfo.IsCaching) { //キャシュ削除してもう一度DL file.ResetLoadErrorRetryCount(); DeleteCacheFileSub(file.FileName); StartCoroutine(CoLoadFile(file)); } else { if (null != CallbackError) { CallbackError(file); } } } } }
//ロード待ちリストを追加 void AddLoadFile(AssetFileWork file) { if (!LoadFile(file)) { loadWaitFileList.Add(file); } }
// 管理ファイルを追加 AssetFileWork AddSub(string path) { AssetFileWork file; if (fileTbl.TryGetValue(path, out file)) { //既にマネージャーの管理下にある return(file); } else { file = new AssetFileWork(GetFileInfoCreateIfMissing(path), FileIOManger); fileTbl.Add(file); string ext = System.IO.Path.GetExtension(path).ToLower(); file.IgnoreLoad |= Array.Exists(ignoreLoadFileTypes, s => (s == ext)); #if true if (file.FileInfo.FileType == AssetFileType.UnityObject && ((file.FileInfo.StrageType == AssetFileStrageType.Web) || (file.FileInfo.StrageType == AssetFileStrageType.WebNocache))) { file.IgnoreLoad |= true; } #endif return(file); } }
// プリロード void PreloadSub(AssetFileWork file, System.Object referenceObj) { MoveToUseList(file); if (file.ReadyToLoad(AssetFileWork.LoadPriority.Preload, referenceObj)) { RefleshMemSize(); return; } AddLoadFile(file); }
//ファイルを使用中リストに void MoveToUseList(AssetFileWork work) { if (!usingFileList.Contains(work)) { usingFileList.Add(work); } if (unuesdFileList.Contains(work)) { unuesdFileList.Remove(work); } RefleshMemSize(); }
// ダウンロード void DownloadSub(AssetFileWork file) { if (file.FileInfo.IsWriteNewCache) { if (file.ReadyToLoad(AssetFileWork.LoadPriority.DownloadOnly, null)) { RefleshMemSize(); return; } AddLoadFile(file); } }
//キャッシュファイル書き込み void WriteNewVersion(AssetFileWork file) { //キャッシュファイル書き込み準備 file.FileInfo.ReadyToWriteCache(fileInfoTbl.IncCacheID(), GetCacheRootDir(), isDebugCacheFileName); string cachePath = file.FileInfo.CachePath; //キャッシュ用のディレクトリがなければ作成 FileIOManger.CreateDirectory(cachePath); //ファイル書き込み bool ret = false; if (file.FileInfo.IsCrypt) { switch (file.FileInfo.FileType) { case AssetFileType.Sound: ret = FileIOManger.WriteSound(cachePath, file.WriteCacheFileSound); break; case AssetFileType.Texture: ret = FileIOManger.WriteEncodeNoCompress(cachePath, file.CacheWriteBytes); break; default: ret = FileIOManger.WriteEncode(cachePath, file.CacheWriteBytes); break; } } else { ret = FileIOManger.Write(cachePath, file.CacheWriteBytes); } #if UNITY_IPHONE iPhone.SetNoBackupFlag(cachePath); #endif //キャッシュファイルテーブルを更新して上書き if (!ret) { DebugLogError("Write Failed :" + file.FileInfo.CachePath); } else { WriteCacheTbl(); file.FileInfo.DeleteOldCacheFile(); } }
// 管理ファイルを追加 AssetFileWork AddSub(string path) { AssetFileWork file; if (fileTbl.TryGetValue(path, out file)) { //既にマネージャーの管理下にある return(file); } else { file = new AssetFileWork(GetFileInfoCreateIfMissing(path), FileIOManger); fileTbl.Add(file); return(file); } }
//ファイルロード開始(ファイルロード数が上限を超えていたら失敗) bool LoadFile(AssetFileWork file) { if (loadingFileList.Count < loadFileMax) { if (loadingFileList.Contains(file)) { Debug.LogError(file.Key + " is already loaded"); } loadingFileList.Add(file); DebugLog("Load Start :" + file.FileName + " ver:" + file.FileInfo.Version + " cache:" + file.FileInfo.CacheVersion); StartCoroutine(CoLoadFile(file)); return(true); } else { return(false); } }
void LoadNextFile() { AssetFileWork next = null; foreach (AssetFileWork file in loadWaitFileList) { if (next == null) { next = file; } else { if (file.Priority < next.Priority) { next = file; } } } if (next != null) { loadWaitFileList.Remove(next); AddLoadFile(next); } }
//ファイルリロード void ReloadFileSub(AssetFileWork file) { StartCoroutine(CoLoadFile(file)); }