diff --git a/Editor/Resource/Inspector/ResourceComponentInspector.cs b/Editor/Resource/Inspector/ResourceComponentInspector.cs index c4f56e8..111c328 100644 --- a/Editor/Resource/Inspector/ResourceComponentInspector.cs +++ b/Editor/Resource/Inspector/ResourceComponentInspector.cs @@ -32,6 +32,7 @@ namespace AlicizaX.Resource.Editor private SerializedProperty _packageName = null; private SerializedProperty _decryptionServices = null; private SerializedProperty _playMode = null; + private SerializedProperty _autoUnloadBundleWhenUnused = null; private int _packageNameIndex = 0; private string[] _packageNames; @@ -101,6 +102,7 @@ namespace AlicizaX.Resource.Editor } } + EditorGUILayout.PropertyField(_autoUnloadBundleWhenUnused); EditorGUILayout.PropertyField(_useSystemUnloadUnusedAssets); float minUnloadUnusedAssetsInterval = @@ -245,8 +247,9 @@ namespace AlicizaX.Resource.Editor _downloadingMaxNum = serializedObject.FindProperty("downloadingMaxNum"); _failedTryAgain = serializedObject.FindProperty("failedTryAgain"); _packageName = serializedObject.FindProperty("packageName"); - _decryptionServices = serializedObject.FindProperty("_decryptionServices"); + _decryptionServices = serializedObject.FindProperty("decryptionServices"); _playMode = serializedObject.FindProperty("_playMode"); + _autoUnloadBundleWhenUnused = serializedObject.FindProperty("autoUnloadBundleWhenUnused"); RefreshDecryptionServices(); RefreshTypeNames(); _playModeIndex = EditorPrefs.GetInt(ResourceComponent.PrefsKey, 0); diff --git a/Runtime/Resource/Resource/IResourceModule.cs b/Runtime/Resource/Resource/IResourceModule.cs index 2c2e5e5..f73f9cf 100644 --- a/Runtime/Resource/Resource/IResourceModule.cs +++ b/Runtime/Resource/Resource/IResourceModule.cs @@ -10,7 +10,7 @@ namespace AlicizaX.Resource.Runtime /// /// 资源管理器接口。 /// - public interface IResourceModule:IModule + public interface IResourceModule : IModule { /// /// 获取当前资源适用的游戏版本号。 @@ -29,6 +29,10 @@ namespace AlicizaX.Resource.Runtime string DecryptionServices { get; set; } + /// + /// 自动释放资源引用计数为0的资源包 + /// + bool AutoUnloadBundleWhenUnused { get; set; } /// /// 同时下载的最大数目。 @@ -46,7 +50,7 @@ namespace AlicizaX.Resource.Runtime void Initialize(); - UniTask InitPackageAsync(string packageName="", string hostServerURL = "", string fallbackHostServerURL = ""); + UniTask InitPackageAsync(string packageName = "", string hostServerURL = "", string fallbackHostServerURL = ""); /// /// 默认资源包名称。 diff --git a/Runtime/Resource/Resource/ResourceComponent.cs b/Runtime/Resource/Resource/ResourceComponent.cs index 815922a..ffba1ff 100644 --- a/Runtime/Resource/Resource/ResourceComponent.cs +++ b/Runtime/Resource/Resource/ResourceComponent.cs @@ -34,7 +34,13 @@ namespace AlicizaX.Resource.Runtime [SerializeField] private bool useSystemUnloadUnusedAssets = true; - [SerializeField] private string _decryptionServices = ""; + [SerializeField] private string decryptionServices = ""; + + /// + /// 自动释放资源引用计数为0的资源包 + /// + [SerializeField] public bool autoUnloadBundleWhenUnused = false; + [SerializeField] private EPlayMode _playMode = EPlayMode.EditorSimulateMode; /// @@ -194,7 +200,8 @@ namespace AlicizaX.Resource.Runtime _playMode = (EPlayMode)UnityEditor.EditorPrefs.GetInt(ResourceComponent.PrefsKey, 0); #endif _resourceModule.DefaultPackageName = PackageName; - _resourceModule.DecryptionServices = _decryptionServices; + _resourceModule.DecryptionServices = decryptionServices; + _resourceModule.AutoUnloadBundleWhenUnused = autoUnloadBundleWhenUnused; _resourceModule.PlayMode = _playMode; _resourceModule.Milliseconds = milliseconds; _resourceModule.DownloadingMaxNum = DownloadingMaxNum; diff --git a/Runtime/Resource/Resource/ResourceModule.Initialization.cs b/Runtime/Resource/Resource/ResourceModule.Initialization.cs index ea40b11..7c89242 100644 --- a/Runtime/Resource/Resource/ResourceModule.Initialization.cs +++ b/Runtime/Resource/Resource/ResourceModule.Initialization.cs @@ -13,33 +13,39 @@ namespace AlicizaX.Resource.Runtime private InitializationOperation CreateInitializationOperationHandler(ResourcePackage resourcePackage, string hostServerURL, string fallbackHostServerURL, string decryptionServicesName) { IDecryptionServices decryptionServices = CreateDecryptionServices(decryptionServicesName); + InitializeParameters initializeParameters = null; switch (PlayMode) { case EPlayMode.EditorSimulateMode: { - // 编辑器下的模拟模式 - return InitializeYooAssetEditorSimulateMode(resourcePackage, DefaultPackageName); + initializeParameters = InitializeYooAssetEditorSimulateMode(DefaultPackageName); + break; } case EPlayMode.OfflinePlayMode: { // 单机运行模式 - return InitializeYooAssetOfflinePlayMode(resourcePackage, decryptionServices); + initializeParameters = InitializeYooAssetOfflinePlayMode(decryptionServices); + break; } case EPlayMode.HostPlayMode: { // 联机运行模式 - return InitializeYooAssetHostPlayMode(resourcePackage, hostServerURL, fallbackHostServerURL, decryptionServices); + initializeParameters = InitializeYooAssetHostPlayMode(hostServerURL, fallbackHostServerURL, decryptionServices); + break; } case EPlayMode.WebPlayMode: { // WebGL运行模式 - return InitializeYooAssetWebPlayMode(resourcePackage, hostServerURL, fallbackHostServerURL); - } - default: - { - return null; + initializeParameters = InitializeYooAssetWebPlayMode(hostServerURL, fallbackHostServerURL); + break; } } + + + if (initializeParameters == null) return null; + + initializeParameters.AutoUnloadBundleWhenUnused = AutoUnloadBundleWhenUnused; + return resourcePackage.InitializeAsync(initializeParameters); } private IDecryptionServices CreateDecryptionServices(string decryptionServicesName) @@ -54,32 +60,30 @@ namespace AlicizaX.Resource.Runtime return decryptionServices; } - private InitializationOperation InitializeYooAssetEditorSimulateMode(ResourcePackage resourcePackage, string packageName) + private InitializeParameters InitializeYooAssetEditorSimulateMode(string packageName) { var buildResult = EditorSimulateModeHelper.SimulateBuild(packageName); var packageRoot = buildResult.PackageRootDirectory; - var createParameters = new EditorSimulateModeParameters(); - createParameters.EditorFileSystemParameters = FileSystemParameters.CreateDefaultEditorFileSystemParameters(packageRoot); - // createParameters.EditorFileSystemParameters.AddParameter(FileSystemParametersDefine.DECRYPTION_SERVICES,new FileOffsetEncryption()); - return resourcePackage.InitializeAsync(createParameters); + var initializeParameters = new EditorSimulateModeParameters(); + initializeParameters.EditorFileSystemParameters = FileSystemParameters.CreateDefaultEditorFileSystemParameters(packageRoot); + return initializeParameters; } - private InitializationOperation InitializeYooAssetOfflinePlayMode(ResourcePackage resourcePackage, IDecryptionServices decryptionServices = null) + private InitializeParameters InitializeYooAssetOfflinePlayMode(IDecryptionServices decryptionServices = null) { var buildinFileSystem = FileSystemParameters.CreateDefaultBuildinFileSystemParameters(decryptionServices); - var initParameters = new OfflinePlayModeParameters(); - initParameters.BuildinFileSystemParameters = buildinFileSystem; - return resourcePackage.InitializeAsync(initParameters); + var initializeParameters = new OfflinePlayModeParameters(); + initializeParameters.BuildinFileSystemParameters = buildinFileSystem; + return initializeParameters; } - private InitializationOperation InitializeYooAssetWebPlayMode(ResourcePackage resourcePackage, string hostServerURL, string fallbackHostServerURL) + private InitializeParameters InitializeYooAssetWebPlayMode(string hostServerURL, string fallbackHostServerURL) { - var initParameters = new WebPlayModeParameters(); + var initializeParameters = new WebPlayModeParameters(); FileSystemParameters webRemoteFileSystemParams = null; IRemoteServices remoteServices = new RemoteServices(hostServerURL, fallbackHostServerURL); var webServerFileSystemParams = FileSystemParameters.CreateDefaultWebServerFileSystemParameters(); #if UNITY_WEBGL - #if WEIXINMINIGAME @@ -91,20 +95,20 @@ namespace AlicizaX.Resource.Runtime #endif #endif - initParameters.WebServerFileSystemParameters = webServerFileSystemParams; - initParameters.WebRemoteFileSystemParameters = webRemoteFileSystemParams; - return resourcePackage.InitializeAsync(initParameters); + initializeParameters.WebServerFileSystemParameters = webServerFileSystemParams; + initializeParameters.WebRemoteFileSystemParameters = webRemoteFileSystemParams; + return initializeParameters; } - private InitializationOperation InitializeYooAssetHostPlayMode(ResourcePackage resourcePackage, string hostServerURL, string fallbackHostServerURL, IDecryptionServices decryptionServices = null) + private InitializeParameters InitializeYooAssetHostPlayMode(string hostServerURL, string fallbackHostServerURL, IDecryptionServices decryptionServices = null) { IRemoteServices remoteServices = new RemoteServices(hostServerURL, fallbackHostServerURL); var cacheFileSystem = FileSystemParameters.CreateDefaultCacheFileSystemParameters(remoteServices); var buildinFileSystem = FileSystemParameters.CreateDefaultBuildinFileSystemParameters(decryptionServices); - var initParameters = new HostPlayModeParameters(); - initParameters.BuildinFileSystemParameters = buildinFileSystem; - initParameters.CacheFileSystemParameters = cacheFileSystem; - return resourcePackage.InitializeAsync(initParameters); + var initializeParameters = new HostPlayModeParameters(); + initializeParameters.BuildinFileSystemParameters = buildinFileSystem; + initializeParameters.CacheFileSystemParameters = cacheFileSystem; + return initializeParameters; } } } diff --git a/Runtime/Resource/Resource/ResourceModule.cs b/Runtime/Resource/Resource/ResourceModule.cs index 8a388b1..5a36ef2 100644 --- a/Runtime/Resource/Resource/ResourceModule.cs +++ b/Runtime/Resource/Resource/ResourceModule.cs @@ -27,6 +27,11 @@ namespace AlicizaX.Resource.Runtime public string DecryptionServices { get; set; } + /// + /// 自动释放资源引用计数为0的资源包 + /// + public bool AutoUnloadBundleWhenUnused { get; set; } = false; + /// /// 设置异步系统参数,每帧执行消耗的最大时间切片(单位:毫秒) /// @@ -807,6 +812,7 @@ namespace AlicizaX.Resource.Runtime { loadAssetCallbacks.LoadAssetFailureCallback(location, LoadResourceStatus.NotExist, errorMessage, userData); } + return; } @@ -908,6 +914,7 @@ namespace AlicizaX.Resource.Runtime { loadAssetCallbacks.LoadAssetFailureCallback(location, LoadResourceStatus.NotExist, errorMessage, userData); } + return; }