122 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
	
| using System.Collections;
 | |
| using System.Collections.Generic;
 | |
| using UnityEngine;
 | |
| 
 | |
| namespace YooAsset
 | |
| {
 | |
|     internal sealed class BundledSubAssetsProvider : ProviderBase
 | |
|     {
 | |
|         private AssetBundleRequest _cacheRequest;
 | |
| 
 | |
|         public BundledSubAssetsProvider(ResourceManager manager, string providerGUID, AssetInfo assetInfo) : base(manager, providerGUID, assetInfo)
 | |
|         {
 | |
|         }
 | |
|         internal override void InternalOnStart()
 | |
|         {
 | |
|             DebugBeginRecording();
 | |
|         }
 | |
|         internal override void InternalOnUpdate()
 | |
|         {
 | |
|             if (IsDone)
 | |
|                 return;
 | |
| 
 | |
|             if (_steps == ESteps.None)
 | |
|             {
 | |
|                 _steps = ESteps.CheckBundle;
 | |
|             }
 | |
| 
 | |
|             // 1. 检测资源包
 | |
|             if (_steps == ESteps.CheckBundle)
 | |
|             {
 | |
|                 if (IsWaitForAsyncComplete)
 | |
|                 {
 | |
|                     DependBundles.WaitForAsyncComplete();
 | |
|                     OwnerBundle.WaitForAsyncComplete();
 | |
|                 }
 | |
| 
 | |
|                 if (DependBundles.IsDone() == false)
 | |
|                     return;
 | |
|                 if (OwnerBundle.IsDone() == false)
 | |
|                     return;
 | |
| 
 | |
|                 if (DependBundles.IsSucceed() == false)
 | |
|                 {
 | |
|                     string error = DependBundles.GetLastError();
 | |
|                     InvokeCompletion(error, EOperationStatus.Failed);
 | |
|                     return;
 | |
|                 }
 | |
| 
 | |
|                 if (OwnerBundle.Status != BundleLoaderBase.EStatus.Succeed)
 | |
|                 {
 | |
|                     string error = OwnerBundle.LastError;
 | |
|                     InvokeCompletion(error, EOperationStatus.Failed);
 | |
|                     return;
 | |
|                 }
 | |
| 
 | |
|                 if (OwnerBundle.CacheBundle == null)
 | |
|                 {
 | |
|                     ProcessCacheBundleException();
 | |
|                     return;
 | |
|                 }
 | |
| 
 | |
|                 _steps = ESteps.Loading;
 | |
|             }
 | |
| 
 | |
|             // 2. 加载资源对象
 | |
|             if (_steps == ESteps.Loading)
 | |
|             {
 | |
|                 if (IsWaitForAsyncComplete || IsForceDestroyComplete)
 | |
|                 {
 | |
|                     if (MainAssetInfo.AssetType == null)
 | |
|                         AllAssetObjects = OwnerBundle.CacheBundle.LoadAssetWithSubAssets(MainAssetInfo.AssetPath);
 | |
|                     else
 | |
|                         AllAssetObjects = OwnerBundle.CacheBundle.LoadAssetWithSubAssets(MainAssetInfo.AssetPath, MainAssetInfo.AssetType);
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     if (MainAssetInfo.AssetType == null)
 | |
|                         _cacheRequest = OwnerBundle.CacheBundle.LoadAssetWithSubAssetsAsync(MainAssetInfo.AssetPath);
 | |
|                     else
 | |
|                         _cacheRequest = OwnerBundle.CacheBundle.LoadAssetWithSubAssetsAsync(MainAssetInfo.AssetPath, MainAssetInfo.AssetType);
 | |
|                 }
 | |
|                 _steps = ESteps.Checking;
 | |
|             }
 | |
| 
 | |
|             // 3. 检测加载结果
 | |
|             if (_steps == ESteps.Checking)
 | |
|             {
 | |
|                 if (_cacheRequest != null)
 | |
|                 {
 | |
|                     if (IsWaitForAsyncComplete || IsForceDestroyComplete)
 | |
|                     {
 | |
|                         // 强制挂起主线程(注意:该操作会很耗时)
 | |
|                         YooLogger.Warning("Suspend the main thread to load unity asset.");
 | |
|                         AllAssetObjects = _cacheRequest.allAssets;
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         Progress = _cacheRequest.progress;
 | |
|                         if (_cacheRequest.isDone == false)
 | |
|                             return;
 | |
|                         AllAssetObjects = _cacheRequest.allAssets;
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 if (AllAssetObjects == null)
 | |
|                 {
 | |
|                     string error;
 | |
|                     if (MainAssetInfo.AssetType == null)
 | |
|                         error = $"Failed to load sub assets : {MainAssetInfo.AssetPath} AssetType : null AssetBundle : {OwnerBundle.MainBundleInfo.Bundle.BundleName}";
 | |
|                     else
 | |
|                         error = $"Failed to load sub assets : {MainAssetInfo.AssetPath} AssetType : {MainAssetInfo.AssetType} AssetBundle : {OwnerBundle.MainBundleInfo.Bundle.BundleName}";
 | |
|                     YooLogger.Error(error);
 | |
|                     InvokeCompletion(error, EOperationStatus.Failed);
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     InvokeCompletion(string.Empty, EOperationStatus.Succeed);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| } |