//ファイルを使用中リストに void MoveToUseList(AssetFileWork work) { if (!usingFileList.Contains(work)) { usingFileList.Add(work); } if (unuesdFileList.Contains(work)) { unuesdFileList.Remove(work); } RefleshMemSize(); }
//ロード終了チェック bool IsLoadEnd( AssetFileWork.LoadPriority priority ) { foreach (var file in loadingFileList) { if( file.Priority <= priority ) { if (!file.IsLoadEnd) return false; } } foreach (var file in loadWaitFileList) { if (file.Priority <= priority) { if (!file.IsLoadEnd) return false; } } return true; }
//ファイルリロード void ReloadFileSub(AssetFileWork file) { StartCoroutine(CoLoadFile(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 && !file.FileInfo.IsAlreadyEncoded) { 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); } WrapperUnityVersion.SetNoBackupFlag(cachePath); //キャッシュファイルテーブルを更新して上書き if (!ret) { DebugLogError("Write Failed :" + file.FileInfo.CachePath); } else { WriteCacheTbl(); file.FileInfo.DeleteOldCacheFile(); } }
//ファイルロード開始(ファイルロード数が上限を超えていたら失敗) 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; } }
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 BackGroundLoadSub(AssetFileWork file, System.Object referenceObj) { MoveToUseList(file); if (file.ReadyToLoad(AssetFileWork.LoadPriority.BackGround, referenceObj)) { RefleshMemSize(); return file; } AddLoadFile(file); return file; }
// ダウンロード void DownloadSub(AssetFileWork file) { if (file.FileInfo.IsWriteNewCache ) { if (file.ReadyToLoad(AssetFileWork.LoadPriority.DownloadOnly, null)) { RefleshMemSize(); return; } AddLoadFile(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; } }
//ロード中のファイル数 int CountLoading(AssetFileWork.LoadPriority priority) { int count = 0; foreach (var file in loadingFileList) { if (file.Priority <= priority) { if (!file.IsLoadEnd) { ++count; } } } foreach (var file in loadWaitFileList) { if (file.Priority <= priority) { if (!file.IsLoadEnd) { ++count; } } } return count; }