2022-09-28 14:39:58 +08:00
using System ;
using System.Diagnostics ;
using System.Collections ;
using System.Collections.Generic ;
using UnityEngine.SceneManagement ;
namespace YooAsset
{
2023-12-21 19:10:46 +08:00
public class ResourcePackage
{
2026-01-14 19:26:40 +08:00
private InitializePackageOperation _initializeOp ;
2026-01-17 16:12:03 +08:00
private ResourceManager _resourceManager ;
private FileSystemHost _fileSystemHost ;
2023-12-21 19:10:46 +08:00
/// <summary>
/// 包裹名
/// </summary>
public readonly string PackageName ;
/// <summary>
/// 初始化状态
/// </summary>
public EOperationStatus InitializeStatus
{
2026-01-14 19:26:40 +08:00
get
{
if ( _initializeOp = = null )
return EOperationStatus . None ;
return _initializeOp . Status ;
}
2023-12-21 19:10:46 +08:00
}
2025-02-06 11:15:09 +08:00
/// <summary>
/// 包裹是否有效
/// </summary>
public bool PackageValid
{
get
{
2026-01-16 10:28:01 +08:00
if ( _fileSystemHost = = null )
2025-02-06 11:15:09 +08:00
return false ;
2026-01-16 10:28:01 +08:00
return _fileSystemHost . ActiveManifest ! = null ;
2025-02-06 11:15:09 +08:00
}
}
2026-01-13 12:08:02 +08:00
/// <summary>
/// 包裹优先级(值越大越优先更新)
/// </summary>
public uint PackagePriority
{
get { return OperationSystem . GetSchedulerPriority ( PackageName ) ; }
set { OperationSystem . SetSchedulerPriority ( PackageName , value ) ; }
}
2026-01-14 19:26:40 +08:00
2026-01-17 16:12:03 +08:00
2023-12-21 19:10:46 +08:00
internal ResourcePackage ( string packageName )
{
PackageName = packageName ;
}
2026-01-17 16:12:03 +08:00
internal void InternalInitialize ( ResourceManager manager , FileSystemHost host )
{
_resourceManager = manager ;
_fileSystemHost = host ;
}
2026-01-14 19:26:40 +08:00
internal void InternalDestroy ( )
2023-12-21 19:10:46 +08:00
{
2026-01-14 19:26:40 +08:00
_initializeOp = null ;
2023-12-21 19:10:46 +08:00
2026-01-14 19:26:40 +08:00
// 销毁资源管理器
if ( _resourceManager ! = null )
{
_resourceManager . Destroy ( ) ;
_resourceManager = null ;
}
2025-02-25 12:18:16 +08:00
2026-01-16 10:28:01 +08:00
// 销毁文件系统中枢
if ( _fileSystemHost ! = null )
2026-01-14 19:26:40 +08:00
{
2026-01-16 10:28:01 +08:00
_fileSystemHost . Destroy ( ) ;
_fileSystemHost = null ;
2023-12-21 19:10:46 +08:00
}
}
/// <summary>
2026-01-14 19:26:40 +08:00
/// 异步初始化包裹
2023-12-21 19:10:46 +08:00
/// </summary>
2026-01-14 19:26:40 +08:00
public InitializePackageOperation InitializePackageAsync ( InitializePackageOptions options )
2023-12-21 19:10:46 +08:00
{
2024-07-04 20:36:26 +08:00
// 注意:联机平台因为网络原因可能会初始化失败!
2023-12-21 19:10:46 +08:00
ResetInitializeAfterFailed ( ) ;
2026-01-14 19:26:40 +08:00
// 检测重复初始化
if ( _initializeOp ! = null )
2026-01-17 16:12:03 +08:00
throw new YooPackageException ( PackageName , $"Resource package '{PackageName}' is already initialized!" ) ;
2023-12-21 19:10:46 +08:00
2026-01-14 19:26:40 +08:00
// 开始初始化操作
_initializeOp = new InitializePackageOperation ( this , options ) ;
OperationSystem . StartOperation ( PackageName , _initializeOp ) ;
return _initializeOp ;
2023-12-21 19:10:46 +08:00
}
private void ResetInitializeAfterFailed ( )
{
2026-01-14 19:26:40 +08:00
if ( InitializeStatus = = EOperationStatus . Failed )
2023-12-21 19:10:46 +08:00
{
2026-01-14 19:26:40 +08:00
InternalDestroy ( ) ;
2023-12-21 19:10:46 +08:00
}
}
2026-01-14 19:26:40 +08:00
/// <summary>
/// 异步销毁包裹
/// </summary>
public DestroyPackageOperation DestroyPackageAsync ( )
2023-12-21 19:10:46 +08:00
{
2026-01-14 19:26:40 +08:00
var options = new UnloadAllAssetsOptions ( true , true ) ;
var operation = new DestroyPackageOperation ( this , options ) ;
2026-01-17 16:12:03 +08:00
OperationSystem . StartOperation ( OperationSystem . GlobalSchedulerName , operation ) ;
2026-01-14 19:26:40 +08:00
return operation ;
2023-12-21 19:10:46 +08:00
}
2024-07-04 20:36:26 +08:00
/// <summary>
2026-01-14 19:26:40 +08:00
/// 请求最新的资源版本
/// 说明: 超时时间默认60秒
2024-07-04 20:36:26 +08:00
/// </summary>
2026-01-14 19:26:40 +08:00
public RequestPackageVersionOperation RequestPackageVersionAsync ( )
2024-07-04 20:36:26 +08:00
{
2026-01-17 16:12:03 +08:00
int defaultTimeout = 60 ;
var options = new RequestPackageVersionOptions ( true , defaultTimeout ) ;
2026-01-14 19:26:40 +08:00
return RequestPackageVersionAsync ( options ) ;
2024-07-04 20:36:26 +08:00
}
2023-12-21 19:10:46 +08:00
/// <summary>
2024-12-27 18:37:29 +08:00
/// 请求最新的资源版本
2023-12-21 19:10:46 +08:00
/// </summary>
2026-01-14 19:26:40 +08:00
public RequestPackageVersionOperation RequestPackageVersionAsync ( RequestPackageVersionOptions options )
2023-12-21 19:10:46 +08:00
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( false ) ;
2026-01-16 10:28:01 +08:00
var operation = new RequestPackageVersionOperation ( _fileSystemHost , options ) ;
2025-02-27 18:15:02 +08:00
OperationSystem . StartOperation ( PackageName , operation ) ;
return operation ;
2023-12-21 19:10:46 +08:00
}
/// <summary>
2026-01-14 19:26:40 +08:00
/// 加载指定版本的资源清单
2023-12-21 19:10:46 +08:00
/// </summary>
2026-01-14 19:26:40 +08:00
public LoadPackageManifestOperation LoadPackageManifestAsync ( LoadPackageManifestOptions options )
2023-12-21 19:10:46 +08:00
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( false ) ;
2023-12-21 19:10:46 +08:00
// 注意:强烈建议在更新之前保持加载器为空!
2024-07-04 20:36:26 +08:00
if ( _resourceManager . HasAnyLoader ( ) )
2023-12-21 19:10:46 +08:00
{
2026-01-17 16:12:03 +08:00
YooLogger . Warning ( $"Found loaded bundle before update manifest ! Recommended to call the {nameof(UnloadAllAssetsAsync)} method to release loaded bundle !" ) ;
2023-12-21 19:10:46 +08:00
}
2026-01-16 10:28:01 +08:00
var operation = new LoadPackageManifestOperation ( _fileSystemHost , options ) ;
2025-02-27 18:15:02 +08:00
OperationSystem . StartOperation ( PackageName , operation ) ;
return operation ;
2023-12-21 19:10:46 +08:00
}
/// <summary>
/// 预下载指定版本的包裹资源
/// </summary>
2026-01-14 19:26:40 +08:00
public PreDownloadContentOperation PreDownloadContentAsync ( PreDownloadContentOptions options )
2023-12-21 19:10:46 +08:00
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( false ) ;
2026-01-16 10:28:01 +08:00
var operation = new PreDownloadContentOperation ( _fileSystemHost , options ) ;
2025-02-27 18:15:02 +08:00
OperationSystem . StartOperation ( PackageName , operation ) ;
return operation ;
2023-12-21 19:10:46 +08:00
}
/// <summary>
2024-12-13 10:25:16 +08:00
/// 清理缓存文件
2023-12-21 19:10:46 +08:00
/// </summary>
2026-01-14 19:26:40 +08:00
public ClearCacheFilesOperation ClearCacheFilesAsync ( ClearCacheFilesOptions options )
2023-12-21 19:10:46 +08:00
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( false ) ;
2026-01-16 10:28:01 +08:00
options . Manifest = _fileSystemHost . ActiveManifest ;
var operation = new ClearCacheFilesOperation ( _fileSystemHost , options ) ;
2025-02-27 18:15:02 +08:00
OperationSystem . StartOperation ( PackageName , operation ) ;
return operation ;
2023-12-21 19:10:46 +08:00
}
2025-01-03 15:08:57 +08:00
2024-12-26 21:35:44 +08:00
#region 包 裹 信 息
2023-12-21 19:10:46 +08:00
/// <summary>
2024-12-27 18:37:29 +08:00
/// 获取当前加载包裹的版本信息
2023-12-21 19:10:46 +08:00
/// </summary>
2024-07-04 20:36:26 +08:00
public string GetPackageVersion ( )
2023-12-21 19:10:46 +08:00
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2026-01-16 10:28:01 +08:00
return _fileSystemHost . ActiveManifest . PackageVersion ;
2023-12-21 19:10:46 +08:00
}
2024-12-11 11:22:50 +08:00
/// <summary>
2024-12-27 18:37:29 +08:00
/// 获取当前加载包裹的备注信息
2024-12-11 11:22:50 +08:00
/// </summary>
public string GetPackageNote ( )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2026-01-16 10:28:01 +08:00
return _fileSystemHost . ActiveManifest . PackageNote ;
2024-12-11 11:22:50 +08:00
}
2024-12-19 17:25:31 +08:00
/// <summary>
2024-12-27 18:37:29 +08:00
/// 获取当前加载包裹的详细信息
2024-12-19 17:25:31 +08:00
/// </summary>
public PackageDetails GetPackageDetails ( )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2026-01-16 10:28:01 +08:00
return _fileSystemHost . ActiveManifest . GetPackageDetails ( ) ;
2024-12-19 17:25:31 +08:00
}
2024-12-26 21:35:44 +08:00
#endregion
2024-12-19 17:25:31 +08:00
2024-07-04 20:36:26 +08:00
#region 资 源 回 收
2023-12-21 19:10:46 +08:00
/// <summary>
/// 强制回收所有资源
/// </summary>
2024-07-04 20:36:26 +08:00
public UnloadAllAssetsOperation UnloadAllAssetsAsync ( )
2025-02-11 17:32:31 +08:00
{
2026-01-16 10:28:01 +08:00
var options = new UnloadAllAssetsOptions ( true , true ) ;
2025-02-11 17:32:31 +08:00
return UnloadAllAssetsAsync ( options ) ;
}
/// <summary>
/// 强制回收所有资源
/// </summary>
/// <param name="options">卸载选项</param>
public UnloadAllAssetsOperation UnloadAllAssetsAsync ( UnloadAllAssetsOptions options )
2023-12-21 19:10:46 +08:00
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2025-02-11 17:32:31 +08:00
var operation = new UnloadAllAssetsOperation ( _resourceManager , options ) ;
2024-07-04 20:36:26 +08:00
OperationSystem . StartOperation ( PackageName , operation ) ;
return operation ;
2023-12-21 19:10:46 +08:00
}
2024-02-18 12:11:29 +08:00
2026-01-16 10:28:01 +08:00
/// <summary>
/// 回收不再使用的资源
/// 说明:卸载引用计数为零的资源
/// 说明: 默认循环10次
/// </summary>
public UnloadUnusedAssetsOperation UnloadUnusedAssetsAsync ( )
{
2026-01-17 16:12:03 +08:00
int defaultLoopCount = 10 ;
var options = new UnloadUnusedAssetsOptions ( defaultLoopCount ) ;
2026-01-16 10:28:01 +08:00
return UnloadUnusedAssetsAsync ( options ) ;
}
2024-02-18 12:11:29 +08:00
/// <summary>
2024-07-04 20:36:26 +08:00
/// 回收不再使用的资源
/// 说明:卸载引用计数为零的资源
2024-02-18 12:11:29 +08:00
/// </summary>
2026-01-16 10:28:01 +08:00
public UnloadUnusedAssetsOperation UnloadUnusedAssetsAsync ( UnloadUnusedAssetsOptions options )
2024-02-18 12:11:29 +08:00
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2026-01-16 10:28:01 +08:00
var operation = new UnloadUnusedAssetsOperation ( _resourceManager , options ) ;
2024-02-18 12:11:29 +08:00
OperationSystem . StartOperation ( PackageName , operation ) ;
return operation ;
}
/// <summary>
2024-07-04 20:36:26 +08:00
/// 资源回收
/// 说明:尝试卸载指定的资源
2024-02-18 12:11:29 +08:00
/// </summary>
2025-07-01 18:10:17 +08:00
public void TryUnloadUnusedAsset ( string location , int loopCount = 10 )
2024-02-18 12:11:29 +08:00
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2024-07-04 20:36:26 +08:00
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , null ) ;
2025-07-01 18:10:17 +08:00
_resourceManager . TryUnloadUnusedAsset ( assetInfo , loopCount ) ;
2024-02-18 12:11:29 +08:00
}
2024-02-21 10:10:37 +08:00
/// <summary>
2024-07-04 20:36:26 +08:00
/// 资源回收
/// 说明:尝试卸载指定的资源
2024-02-21 10:10:37 +08:00
/// </summary>
2025-07-01 18:10:17 +08:00
public void TryUnloadUnusedAsset ( AssetInfo assetInfo , int loopCount = 10 )
2024-02-18 12:11:29 +08:00
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2025-07-01 18:10:17 +08:00
_resourceManager . TryUnloadUnusedAsset ( assetInfo , loopCount ) ;
2024-02-18 12:11:29 +08:00
}
2023-12-21 19:10:46 +08:00
#endregion
#region 资 源 信 息
/// <summary>
/// 是否需要从远端更新下载
/// </summary>
/// <param name="location">资源的定位地址</param>
public bool IsNeedDownloadFromRemote ( string location )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , null ) ;
2026-01-16 14:37:04 +08:00
return _fileSystemHost . IsNeedDownloadFromRemoteInternal ( assetInfo ) ;
2023-12-21 19:10:46 +08:00
}
/// <summary>
/// 是否需要从远端更新下载
/// </summary>
/// <param name="location">资源的定位地址</param>
public bool IsNeedDownloadFromRemote ( AssetInfo assetInfo )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2026-01-16 14:37:04 +08:00
return _fileSystemHost . IsNeedDownloadFromRemoteInternal ( assetInfo ) ;
2023-12-21 19:10:46 +08:00
}
2024-12-12 18:13:33 +08:00
/// <summary>
/// 获取所有的资源信息
/// </summary>
public AssetInfo [ ] GetAllAssetInfos ( )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2026-01-16 10:28:01 +08:00
return _fileSystemHost . ActiveManifest . GetAllAssetInfos ( ) ;
2024-12-12 18:13:33 +08:00
}
2023-12-21 19:10:46 +08:00
/// <summary>
/// 获取资源信息列表
/// </summary>
/// <param name="tag">资源标签</param>
public AssetInfo [ ] GetAssetInfos ( string tag )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
string [ ] tags = new string [ ] { tag } ;
2026-01-16 10:28:01 +08:00
return _fileSystemHost . ActiveManifest . GetAssetInfosByTags ( tags ) ;
2023-12-21 19:10:46 +08:00
}
/// <summary>
/// 获取资源信息列表
/// </summary>
/// <param name="tags">资源标签列表</param>
public AssetInfo [ ] GetAssetInfos ( string [ ] tags )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2026-01-16 10:28:01 +08:00
return _fileSystemHost . ActiveManifest . GetAssetInfosByTags ( tags ) ;
2023-12-21 19:10:46 +08:00
}
/// <summary>
/// 获取资源信息
/// </summary>
/// <param name="location">资源的定位地址</param>
public AssetInfo GetAssetInfo ( string location )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
return ConvertLocationToAssetInfo ( location , null ) ;
}
/// <summary>
/// 获取资源信息
/// </summary>
/// <param name="location">资源的定位地址</param>
/// <param name="type">资源类型</param>
public AssetInfo GetAssetInfo ( string location , System . Type type )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
return ConvertLocationToAssetInfo ( location , type ) ;
}
/// <summary>
/// 获取资源信息
/// </summary>
/// <param name="assetGUID">资源GUID</param>
public AssetInfo GetAssetInfoByGUID ( string assetGUID )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
return ConvertAssetGUIDToAssetInfo ( assetGUID , null ) ;
}
/// <summary>
/// 获取资源信息
/// </summary>
/// <param name="assetGUID">资源GUID</param>
/// <param name="type">资源类型</param>
public AssetInfo GetAssetInfoByGUID ( string assetGUID , System . Type type )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
return ConvertAssetGUIDToAssetInfo ( assetGUID , type ) ;
}
/// <summary>
/// 检查资源定位地址是否有效
/// </summary>
/// <param name="location">资源的定位地址</param>
public bool CheckLocationValid ( string location )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2026-01-16 10:28:01 +08:00
string assetPath = _fileSystemHost . ActiveManifest . TryMappingToAssetPath ( location ) ;
2023-12-21 19:10:46 +08:00
return string . IsNullOrEmpty ( assetPath ) = = false ;
}
#endregion
#region 原 生 文 件
/// <summary>
/// 同步加载原生文件
/// </summary>
/// <param name="assetInfo">资源信息</param>
public RawFileHandle LoadRawFileSync ( AssetInfo assetInfo )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
return LoadRawFileInternal ( assetInfo , true , 0 ) ;
}
/// <summary>
/// 同步加载原生文件
/// </summary>
/// <param name="location">资源的定位地址</param>
public RawFileHandle LoadRawFileSync ( string location )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , null ) ;
return LoadRawFileInternal ( assetInfo , true , 0 ) ;
}
/// <summary>
/// 异步加载原生文件
/// </summary>
/// <param name="assetInfo">资源信息</param>
/// <param name="priority">加载的优先级</param>
public RawFileHandle LoadRawFileAsync ( AssetInfo assetInfo , uint priority = 0 )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
return LoadRawFileInternal ( assetInfo , false , priority ) ;
}
/// <summary>
/// 异步加载原生文件
/// </summary>
/// <param name="location">资源的定位地址</param>
/// <param name="priority">加载的优先级</param>
public RawFileHandle LoadRawFileAsync ( string location , uint priority = 0 )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , null ) ;
return LoadRawFileInternal ( assetInfo , false , priority ) ;
}
private RawFileHandle LoadRawFileInternal ( AssetInfo assetInfo , bool waitForAsyncComplete , uint priority )
{
2025-07-23 11:07:29 +08:00
assetInfo . LoadMethod = AssetInfo . ELoadMethod . LoadRawFile ;
2024-07-04 20:36:26 +08:00
var handle = _resourceManager . LoadRawFileAsync ( assetInfo , priority ) ;
2023-12-21 19:10:46 +08:00
if ( waitForAsyncComplete )
handle . WaitForAsyncComplete ( ) ;
return handle ;
}
#endregion
#region 场 景 加 载
2024-03-08 11:06:48 +08:00
/// <summary>
/// 同步加载场景
/// </summary>
/// <param name="location">场景的定位地址</param>
/// <param name="sceneMode">场景加载模式</param>
2024-08-13 10:19:29 +08:00
/// <param name="physicsMode">场景物理模式</param>
2024-08-03 16:53:25 +08:00
public SceneHandle LoadSceneSync ( string location , LoadSceneMode sceneMode = LoadSceneMode . Single , LocalPhysicsMode physicsMode = LocalPhysicsMode . None )
2024-03-08 11:06:48 +08:00
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2024-03-08 11:06:48 +08:00
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , null ) ;
2024-08-03 16:53:25 +08:00
return LoadSceneInternal ( assetInfo , true , sceneMode , physicsMode , false , 0 ) ;
2024-03-08 11:06:48 +08:00
}
/// <summary>
/// 同步加载场景
/// </summary>
/// <param name="assetInfo">场景的资源信息</param>
/// <param name="sceneMode">场景加载模式</param>
2024-08-13 10:19:29 +08:00
/// <param name="physicsMode">场景物理模式</param>
2024-08-03 16:53:25 +08:00
public SceneHandle LoadSceneSync ( AssetInfo assetInfo , LoadSceneMode sceneMode = LoadSceneMode . Single , LocalPhysicsMode physicsMode = LocalPhysicsMode . None )
2024-03-08 11:06:48 +08:00
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2024-08-03 16:53:25 +08:00
return LoadSceneInternal ( assetInfo , true , sceneMode , physicsMode , false , 0 ) ;
2024-03-08 11:06:48 +08:00
}
2023-12-21 19:10:46 +08:00
/// <summary>
/// 异步加载场景
/// </summary>
/// <param name="location">场景的定位地址</param>
/// <param name="sceneMode">场景加载模式</param>
2024-08-13 10:19:29 +08:00
/// <param name="physicsMode">场景物理模式</param>
2023-12-21 19:10:46 +08:00
/// <param name="suspendLoad">场景加载到90%自动挂起</param>
/// <param name="priority">加载的优先级</param>
2024-08-03 16:53:25 +08:00
public SceneHandle LoadSceneAsync ( string location , LoadSceneMode sceneMode = LoadSceneMode . Single , LocalPhysicsMode physicsMode = LocalPhysicsMode . None , bool suspendLoad = false , uint priority = 0 )
2023-12-21 19:10:46 +08:00
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , null ) ;
2024-08-03 16:53:25 +08:00
return LoadSceneInternal ( assetInfo , false , sceneMode , physicsMode , suspendLoad , priority ) ;
2023-12-21 19:10:46 +08:00
}
/// <summary>
/// 异步加载场景
/// </summary>
/// <param name="assetInfo">场景的资源信息</param>
/// <param name="sceneMode">场景加载模式</param>
2024-08-13 10:19:29 +08:00
/// <param name="physicsMode">场景物理模式</param>
2023-12-21 19:10:46 +08:00
/// <param name="suspendLoad">场景加载到90%自动挂起</param>
/// <param name="priority">加载的优先级</param>
2024-08-03 16:53:25 +08:00
public SceneHandle LoadSceneAsync ( AssetInfo assetInfo , LoadSceneMode sceneMode = LoadSceneMode . Single , LocalPhysicsMode physicsMode = LocalPhysicsMode . None , bool suspendLoad = false , uint priority = 0 )
2023-12-21 19:10:46 +08:00
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2024-08-03 16:53:25 +08:00
return LoadSceneInternal ( assetInfo , false , sceneMode , physicsMode , suspendLoad , priority ) ;
2024-03-08 11:06:48 +08:00
}
2024-08-03 16:53:25 +08:00
private SceneHandle LoadSceneInternal ( AssetInfo assetInfo , bool waitForAsyncComplete , LoadSceneMode sceneMode , LocalPhysicsMode physicsMode , bool suspendLoad , uint priority )
2024-03-08 11:06:48 +08:00
{
2026-01-17 16:12:03 +08:00
DebugEnsureAssetType ( assetInfo . AssetType ) ;
2025-03-12 16:36:37 +08:00
assetInfo . LoadMethod = AssetInfo . ELoadMethod . LoadScene ;
2024-08-03 16:53:25 +08:00
var loadSceneParams = new LoadSceneParameters ( sceneMode , physicsMode ) ;
var handle = _resourceManager . LoadSceneAsync ( assetInfo , loadSceneParams , suspendLoad , priority ) ;
2024-03-08 11:06:48 +08:00
if ( waitForAsyncComplete )
handle . WaitForAsyncComplete ( ) ;
2023-12-21 19:10:46 +08:00
return handle ;
}
#endregion
2026-01-17 16:12:03 +08:00
#region 资 源 加 载 [ 主 资 源 ]
2023-12-21 19:10:46 +08:00
/// <summary>
/// 同步加载资源对象
/// </summary>
/// <param name="assetInfo">资源信息</param>
public AssetHandle LoadAssetSync ( AssetInfo assetInfo )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
return LoadAssetInternal ( assetInfo , true , 0 ) ;
}
/// <summary>
/// 同步加载资源对象
/// </summary>
/// <typeparam name="TObject">资源类型</typeparam>
/// <param name="location">资源的定位地址</param>
public AssetHandle LoadAssetSync < TObject > ( string location ) where TObject : UnityEngine . Object
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , typeof ( TObject ) ) ;
return LoadAssetInternal ( assetInfo , true , 0 ) ;
}
/// <summary>
/// 同步加载资源对象
/// </summary>
/// <param name="location">资源的定位地址</param>
/// <param name="type">资源类型</param>
public AssetHandle LoadAssetSync ( string location , System . Type type )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , type ) ;
return LoadAssetInternal ( assetInfo , true , 0 ) ;
}
/// <summary>
/// 同步加载资源对象
/// </summary>
/// <param name="location">资源的定位地址</param>
public AssetHandle LoadAssetSync ( string location )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , typeof ( UnityEngine . Object ) ) ;
2023-12-21 19:10:46 +08:00
return LoadAssetInternal ( assetInfo , true , 0 ) ;
}
/// <summary>
/// 异步加载资源对象
/// </summary>
/// <param name="assetInfo">资源信息</param>
/// <param name="priority">加载的优先级</param>
public AssetHandle LoadAssetAsync ( AssetInfo assetInfo , uint priority = 0 )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
return LoadAssetInternal ( assetInfo , false , priority ) ;
}
/// <summary>
/// 异步加载资源对象
/// </summary>
/// <typeparam name="TObject">资源类型</typeparam>
/// <param name="location">资源的定位地址</param>
/// <param name="priority">加载的优先级</param>
public AssetHandle LoadAssetAsync < TObject > ( string location , uint priority = 0 ) where TObject : UnityEngine . Object
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , typeof ( TObject ) ) ;
return LoadAssetInternal ( assetInfo , false , priority ) ;
}
/// <summary>
/// 异步加载资源对象
/// </summary>
/// <param name="location">资源的定位地址</param>
/// <param name="type">资源类型</param>
/// <param name="priority">加载的优先级</param>
public AssetHandle LoadAssetAsync ( string location , System . Type type , uint priority = 0 )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , type ) ;
return LoadAssetInternal ( assetInfo , false , priority ) ;
}
/// <summary>
/// 异步加载资源对象
/// </summary>
/// <param name="location">资源的定位地址</param>
/// <param name="priority">加载的优先级</param>
public AssetHandle LoadAssetAsync ( string location , uint priority = 0 )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , typeof ( UnityEngine . Object ) ) ;
2023-12-21 19:10:46 +08:00
return LoadAssetInternal ( assetInfo , false , priority ) ;
}
private AssetHandle LoadAssetInternal ( AssetInfo assetInfo , bool waitForAsyncComplete , uint priority )
{
2026-01-17 16:12:03 +08:00
DebugEnsureAssetType ( assetInfo . AssetType ) ;
2025-03-12 16:36:37 +08:00
assetInfo . LoadMethod = AssetInfo . ELoadMethod . LoadAsset ;
2024-07-04 20:36:26 +08:00
var handle = _resourceManager . LoadAssetAsync ( assetInfo , priority ) ;
2023-12-21 19:10:46 +08:00
if ( waitForAsyncComplete )
handle . WaitForAsyncComplete ( ) ;
return handle ;
}
#endregion
2026-01-17 16:12:03 +08:00
#region 资 源 加 载 [ 子 资 源 ]
2023-12-21 19:10:46 +08:00
/// <summary>
/// 同步加载子资源对象
/// </summary>
/// <param name="assetInfo">资源信息</param>
public SubAssetsHandle LoadSubAssetsSync ( AssetInfo assetInfo )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
return LoadSubAssetsInternal ( assetInfo , true , 0 ) ;
}
/// <summary>
/// 同步加载子资源对象
/// </summary>
/// <typeparam name="TObject">资源类型</typeparam>
/// <param name="location">资源的定位地址</param>
public SubAssetsHandle LoadSubAssetsSync < TObject > ( string location ) where TObject : UnityEngine . Object
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , typeof ( TObject ) ) ;
return LoadSubAssetsInternal ( assetInfo , true , 0 ) ;
}
/// <summary>
/// 同步加载子资源对象
/// </summary>
/// <param name="location">资源的定位地址</param>
/// <param name="type">子对象类型</param>
public SubAssetsHandle LoadSubAssetsSync ( string location , System . Type type )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , type ) ;
return LoadSubAssetsInternal ( assetInfo , true , 0 ) ;
}
/// <summary>
/// 同步加载子资源对象
/// </summary>
/// <param name="location">资源的定位地址</param>
public SubAssetsHandle LoadSubAssetsSync ( string location )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , typeof ( UnityEngine . Object ) ) ;
2023-12-21 19:10:46 +08:00
return LoadSubAssetsInternal ( assetInfo , true , 0 ) ;
}
/// <summary>
/// 异步加载子资源对象
/// </summary>
/// <param name="assetInfo">资源信息</param>
/// <param name="priority">加载的优先级</param>
public SubAssetsHandle LoadSubAssetsAsync ( AssetInfo assetInfo , uint priority = 0 )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
return LoadSubAssetsInternal ( assetInfo , false , priority ) ;
}
/// <summary>
/// 异步加载子资源对象
/// </summary>
/// <typeparam name="TObject">资源类型</typeparam>
/// <param name="location">资源的定位地址</param>
/// <param name="priority">加载的优先级</param>
public SubAssetsHandle LoadSubAssetsAsync < TObject > ( string location , uint priority = 0 ) where TObject : UnityEngine . Object
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , typeof ( TObject ) ) ;
return LoadSubAssetsInternal ( assetInfo , false , priority ) ;
}
/// <summary>
/// 异步加载子资源对象
/// </summary>
/// <param name="location">资源的定位地址</param>
/// <param name="type">子对象类型</param>
/// <param name="priority">加载的优先级</param>
public SubAssetsHandle LoadSubAssetsAsync ( string location , System . Type type , uint priority = 0 )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , type ) ;
return LoadSubAssetsInternal ( assetInfo , false , priority ) ;
}
/// <summary>
/// 异步加载子资源对象
/// </summary>
/// <param name="location">资源的定位地址</param>
/// <param name="priority">加载的优先级</param>
public SubAssetsHandle LoadSubAssetsAsync ( string location , uint priority = 0 )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , typeof ( UnityEngine . Object ) ) ;
2023-12-21 19:10:46 +08:00
return LoadSubAssetsInternal ( assetInfo , false , priority ) ;
}
private SubAssetsHandle LoadSubAssetsInternal ( AssetInfo assetInfo , bool waitForAsyncComplete , uint priority )
{
2026-01-17 16:12:03 +08:00
DebugEnsureAssetType ( assetInfo . AssetType ) ;
2025-03-12 16:36:37 +08:00
assetInfo . LoadMethod = AssetInfo . ELoadMethod . LoadSubAssets ;
2024-07-04 20:36:26 +08:00
var handle = _resourceManager . LoadSubAssetsAsync ( assetInfo , priority ) ;
2023-12-21 19:10:46 +08:00
if ( waitForAsyncComplete )
handle . WaitForAsyncComplete ( ) ;
return handle ;
}
#endregion
2026-01-17 16:12:03 +08:00
#region 资 源 加 载 [ 全 部 资 源 ]
2023-12-21 19:10:46 +08:00
/// <summary>
/// 同步加载资源包内所有资源对象
/// </summary>
/// <param name="assetInfo">资源信息</param>
public AllAssetsHandle LoadAllAssetsSync ( AssetInfo assetInfo )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
return LoadAllAssetsInternal ( assetInfo , true , 0 ) ;
}
/// <summary>
/// 同步加载资源包内所有资源对象
/// </summary>
/// <typeparam name="TObject">资源类型</typeparam>
/// <param name="location">资源的定位地址</param>
public AllAssetsHandle LoadAllAssetsSync < TObject > ( string location ) where TObject : UnityEngine . Object
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , typeof ( TObject ) ) ;
return LoadAllAssetsInternal ( assetInfo , true , 0 ) ;
}
/// <summary>
/// 同步加载资源包内所有资源对象
/// </summary>
/// <param name="location">资源的定位地址</param>
/// <param name="type">子对象类型</param>
public AllAssetsHandle LoadAllAssetsSync ( string location , System . Type type )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , type ) ;
return LoadAllAssetsInternal ( assetInfo , true , 0 ) ;
}
/// <summary>
/// 同步加载资源包内所有资源对象
/// </summary>
/// <param name="location">资源的定位地址</param>
public AllAssetsHandle LoadAllAssetsSync ( string location )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , typeof ( UnityEngine . Object ) ) ;
2023-12-21 19:10:46 +08:00
return LoadAllAssetsInternal ( assetInfo , true , 0 ) ;
}
/// <summary>
/// 异步加载资源包内所有资源对象
/// </summary>
/// <param name="assetInfo">资源信息</param>
/// <param name="priority">加载的优先级</param>
public AllAssetsHandle LoadAllAssetsAsync ( AssetInfo assetInfo , uint priority = 0 )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
return LoadAllAssetsInternal ( assetInfo , false , priority ) ;
}
/// <summary>
/// 异步加载资源包内所有资源对象
/// </summary>
/// <typeparam name="TObject">资源类型</typeparam>
/// <param name="location">资源的定位地址</param>
/// <param name="priority">加载的优先级</param>
public AllAssetsHandle LoadAllAssetsAsync < TObject > ( string location , uint priority = 0 ) where TObject : UnityEngine . Object
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , typeof ( TObject ) ) ;
return LoadAllAssetsInternal ( assetInfo , false , priority ) ;
}
/// <summary>
/// 异步加载资源包内所有资源对象
/// </summary>
/// <param name="location">资源的定位地址</param>
/// <param name="type">子对象类型</param>
/// <param name="priority">加载的优先级</param>
public AllAssetsHandle LoadAllAssetsAsync ( string location , System . Type type , uint priority = 0 )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2023-12-21 19:10:46 +08:00
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , type ) ;
return LoadAllAssetsInternal ( assetInfo , false , priority ) ;
}
/// <summary>
/// 异步加载资源包内所有资源对象
/// </summary>
/// <param name="location">资源的定位地址</param>
/// <param name="priority">加载的优先级</param>
public AllAssetsHandle LoadAllAssetsAsync ( string location , uint priority = 0 )
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
AssetInfo assetInfo = ConvertLocationToAssetInfo ( location , typeof ( UnityEngine . Object ) ) ;
2023-12-21 19:10:46 +08:00
return LoadAllAssetsInternal ( assetInfo , false , priority ) ;
}
private AllAssetsHandle LoadAllAssetsInternal ( AssetInfo assetInfo , bool waitForAsyncComplete , uint priority )
{
2026-01-17 16:12:03 +08:00
DebugEnsureAssetType ( assetInfo . AssetType ) ;
2025-03-12 16:36:37 +08:00
assetInfo . LoadMethod = AssetInfo . ELoadMethod . LoadAllAssets ;
2024-07-04 20:36:26 +08:00
var handle = _resourceManager . LoadAllAssetsAsync ( assetInfo , priority ) ;
2023-12-21 19:10:46 +08:00
if ( waitForAsyncComplete )
handle . WaitForAsyncComplete ( ) ;
return handle ;
}
#endregion
#region 资 源 下 载
/// <summary>
/// 创建资源下载器,用于下载指定的资源标签列表关联的资源包文件
/// </summary>
2026-01-16 10:28:01 +08:00
public ResourceDownloaderOperation CreateResourceDownloader ( ResourceDownloaderOptions options )
2023-12-21 19:10:46 +08:00
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2026-01-16 10:28:01 +08:00
return _fileSystemHost . CreateResourceDownloader ( options ) ;
2023-12-21 19:10:46 +08:00
}
2026-01-17 16:12:03 +08:00
2023-12-21 19:10:46 +08:00
/// <summary>
2026-01-16 10:28:01 +08:00
/// 创建资源下载器,用于下载指定的资源信息列表依赖的资源包文件
2023-12-21 19:10:46 +08:00
/// </summary>
2026-01-16 14:37:04 +08:00
public ResourceDownloaderOperation CreateResourceDownloader ( BundleDownloaderOptions options )
2023-12-21 19:10:46 +08:00
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2026-01-16 10:28:01 +08:00
return _fileSystemHost . CreateResourceDownloader ( options ) ;
2023-12-21 19:10:46 +08:00
}
#endregion
#region 资 源 解 压
/// <summary>
/// 创建内置资源解压器,用于解压指定的资源标签列表关联的资源包文件
/// </summary>
2026-01-16 10:28:01 +08:00
public ResourceUnpackerOperation CreateResourceUnpacker ( ResourceUnpackerOptions options )
2023-12-21 19:10:46 +08:00
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2026-01-16 10:28:01 +08:00
return _fileSystemHost . CreateResourceUnpacker ( options ) ;
2023-12-21 19:10:46 +08:00
}
#endregion
#region 资 源 导 入
/// <summary>
/// 创建资源导入器
2025-07-17 20:59:15 +08:00
/// </summary>
2026-01-16 10:28:01 +08:00
public ResourceImporterOperation CreateResourceImporter ( BundleImporterOptions options )
2025-07-17 20:59:15 +08:00
{
2026-01-17 16:12:03 +08:00
EnsureInitialized ( ) ;
2026-01-16 10:28:01 +08:00
return _fileSystemHost . CreateResourceImporter ( options ) ;
2023-12-21 19:10:46 +08:00
}
#endregion
#region 内 部 方 法
2026-01-16 10:28:01 +08:00
internal AssetInfo ConvertLocationToAssetInfo ( string location , System . Type assetType )
2023-12-21 19:10:46 +08:00
{
2026-01-16 10:28:01 +08:00
return _fileSystemHost . ActiveManifest . ConvertLocationToAssetInfo ( location , assetType ) ;
2023-12-21 19:10:46 +08:00
}
2026-01-16 10:28:01 +08:00
internal AssetInfo ConvertAssetGUIDToAssetInfo ( string assetGUID , System . Type assetType )
2023-12-21 19:10:46 +08:00
{
2026-01-16 10:28:01 +08:00
return _fileSystemHost . ActiveManifest . ConvertAssetGUIDToAssetInfo ( assetGUID , assetType ) ;
2023-12-21 19:10:46 +08:00
}
#endregion
#region 调 试 方 法
2026-01-17 16:12:03 +08:00
private void EnsureInitialized ( bool checkActiveManifest = true )
2023-12-21 19:10:46 +08:00
{
2026-01-14 19:26:40 +08:00
if ( InitializeStatus ! = EOperationStatus . Succeed )
{
if ( InitializeStatus = = EOperationStatus . None )
{
2026-01-17 16:12:03 +08:00
throw new YooPackageException ( PackageName , "Resource package not initialized!" ) ;
2026-01-14 19:26:40 +08:00
}
else if ( InitializeStatus = = EOperationStatus . Processing )
{
2026-01-17 16:12:03 +08:00
throw new YooPackageException ( PackageName , "Resource package initialization not completed!" ) ;
2026-01-14 19:26:40 +08:00
}
else if ( InitializeStatus = = EOperationStatus . Failed )
{
string error = _initializeOp = = null ? string . Empty : _initializeOp . Error ;
2026-01-17 16:12:03 +08:00
throw new YooPackageException ( PackageName , $"Resource package initialization failed! Error : {error}" ) ;
2026-01-14 19:26:40 +08:00
}
}
2023-12-21 19:10:46 +08:00
if ( checkActiveManifest )
{
2026-01-16 10:28:01 +08:00
if ( _fileSystemHost . ActiveManifest = = null )
2026-01-17 16:12:03 +08:00
throw new YooPackageException ( PackageName , "Cannot found active package manifest!" ) ;
2023-12-21 19:10:46 +08:00
}
}
[Conditional("DEBUG")]
2026-01-17 16:12:03 +08:00
private void DebugEnsureAssetType ( System . Type type )
2023-12-21 19:10:46 +08:00
{
if ( type = = null )
return ;
if ( typeof ( UnityEngine . Behaviour ) . IsAssignableFrom ( type ) )
2026-01-17 16:12:03 +08:00
throw new YooLoadException ( $"Load asset type is invalid : {type.FullName}" ) ;
2023-12-21 19:10:46 +08:00
if ( typeof ( UnityEngine . Object ) . IsAssignableFrom ( type ) = = false )
2026-01-17 16:12:03 +08:00
throw new YooLoadException ( $"Load asset type is invalid : {type.FullName}" ) ;
2023-12-21 19:10:46 +08:00
}
#endregion
#region 调 试 信 息
internal DebugPackageData GetDebugPackageData ( )
{
2025-02-27 20:37:28 +08:00
DebugPackageData data = new DebugPackageData ( ) ;
data . PackageName = PackageName ;
data . ProviderInfos = _resourceManager . GetDebugProviderInfos ( ) ;
data . BundleInfos = _resourceManager . GetDebugBundleInfos ( ) ;
data . OperationInfos = OperationSystem . GetDebugOperationInfos ( PackageName ) ;
return data ;
2023-12-21 19:10:46 +08:00
}
#endregion
}
2022-09-28 14:39:58 +08:00
}