From e9c165d60458ed8d44cc9bafea34a5deb9e08de0 Mon Sep 17 00:00:00 2001 From: Unity Technologies <@unity> Date: Fri, 18 Oct 2024 00:00:00 +0000 Subject: [PATCH] =?UTF-8?q?com.unity.addressables@1.22.3=20##=20[1.22.3]?= =?UTF-8?q?=20-=202024-10-18=20-=20Fixed=20issue=20where=20the=20content?= =?UTF-8?q?=20of=20the=20list=20with=20Addressable=20Assets=20Groups=20is?= =?UTF-8?q?=20improperly=20indented=20when=20displayed=20in=20Group=20Hier?= =?UTF-8?q?archy=20with=20Dashes=20Group=20View.=20-=20Fixed=20issue=20whe?= =?UTF-8?q?re=20=E2=80=9CProfile=20rename=20failed=20because=20default=20p?= =?UTF-8?q?rofile=20cannot=20be=20renamed=E2=80=9C=20error=20is=20thrown?= =?UTF-8?q?=20when=20renaming=20a=20new=20profile=20in=20Addressables=20Pr?= =?UTF-8?q?ofiles.=20-=20Fixed=20loading=20error=20when=20the=20loading=20?= =?UTF-8?q?from=20an=20assetbundle=20that=20is=20currently=20being=20prelo?= =?UTF-8?q?aded.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 5 + .../AddressableAssetsSettingsGroupTreeView.cs | 7 +- .../AddressableAssetProfileSettings.cs | 48 +++++++++- Editor/Settings/AddressableAssetSettings.cs | 2 +- Runtime/ResourceManager/ResourceManager.cs | 22 +---- .../ResourceProviders/AssetBundleProvider.cs | 20 +++- .../ResourceProviders/SceneProvider.cs | 9 +- .../Simulation/VirtualAssetBundleProvider.cs | 3 +- .../Util/OperationCacheKeys.cs | 8 +- Tests/Editor/ProfileSettingsTests.cs | 91 +++++++++++++++++++ Tests/Runtime/AddressablesImplTests.cs | 36 ++++++++ Tests/Runtime/AddressablesIntegrationTests.cs | 1 + Tests/Runtime/SceneTests.cs | 51 ++++++++--- package.json | 10 +- 14 files changed, 254 insertions(+), 59 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb9ca9f8..d64b022e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ All notable changes to this package will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## [1.22.3] - 2024-10-18 +- Fixed issue where the content of the list with Addressable Assets Groups is improperly indented when displayed in Group Hierarchy with Dashes Group View. +- Fixed issue where “Profile rename failed because default profile cannot be renamed“ error is thrown when renaming a new profile in Addressables Profiles. +- Fixed loading error when the loading from an assetbundle that is currently being preloaded. + ## [1.22.2] - 2024-05-13 - Fixed memory leak when loading Sprite objects from a SpriteAtlas asset. - Added support for directly calling Release() on AsyncOperationHandles that didn't have the option to. diff --git a/Editor/GUI/AddressableAssetsSettingsGroupTreeView.cs b/Editor/GUI/AddressableAssetsSettingsGroupTreeView.cs index ebe972d6..3042415e 100644 --- a/Editor/GUI/AddressableAssetsSettingsGroupTreeView.cs +++ b/Editor/GUI/AddressableAssetsSettingsGroupTreeView.cs @@ -573,7 +573,12 @@ protected override void RowGUI(RowGUIArgs args) if (item == null || item.group == null && item.entry == null) { using (new EditorGUI.DisabledScope(true)) - base.RowGUI(args); + { + if (!string.IsNullOrEmpty(item.folderPath)) + CellGUI(args.GetCellRect(1), null, (int)ColumnId.Id, ref args); + else + base.RowGUI(args); + } } else { diff --git a/Editor/Settings/AddressableAssetProfileSettings.cs b/Editor/Settings/AddressableAssetProfileSettings.cs index 808ad440..0e7b991e 100644 --- a/Editor/Settings/AddressableAssetProfileSettings.cs +++ b/Editor/Settings/AddressableAssetProfileSettings.cs @@ -499,12 +499,36 @@ string GetDefaultProfileId() return null; } - BuildProfile GetDefaultProfile() + internal BuildProfile GetDefaultProfile() { - BuildProfile profile = null; + BuildProfile defaultProfile = null; if (m_Profiles.Count > 0) - profile = m_Profiles[0]; - return profile; + { + if (m_Profiles[0].profileName != k_RootProfileName) + { + int rootProfileIndex = -1; + for (int i = 0; i < m_Profiles.Count; i++) + { + if (m_Profiles[i].profileName == k_RootProfileName) + { + rootProfileIndex = i; + break; + } + } + + if (rootProfileIndex != -1) + { + BuildProfile rootProfile = m_Profiles[rootProfileIndex]; + m_Profiles[rootProfileIndex] = m_Profiles[0]; + m_Profiles[0] = rootProfile; + + defaultProfile = rootProfile; + } + } + else + defaultProfile = m_Profiles[0]; + } + return defaultProfile; } bool ValidateProfiles() @@ -914,5 +938,21 @@ public void OnBeforeSerialize() public void OnAfterDeserialize() { } + + internal void SortProfiles() + { + BuildProfile defaultProfile = GetDefaultProfile(); + + if (m_Profiles.Count <= 1) + return; + + List otherProfiles = m_Profiles.GetRange(1, m_Profiles.Count - 1); + otherProfiles.Sort((a, b) => string.CompareOrdinal(a.id, b.id)); + + for (int i = 1; i < m_Profiles.Count; i++) + { + m_Profiles[i] = otherProfiles[i - 1]; + } + } } } diff --git a/Editor/Settings/AddressableAssetSettings.cs b/Editor/Settings/AddressableAssetSettings.cs index 2168a936..56ecaeb5 100644 --- a/Editor/Settings/AddressableAssetSettings.cs +++ b/Editor/Settings/AddressableAssetSettings.cs @@ -3105,7 +3105,7 @@ public static bool InvokeAssetGroupCommand(string cmdId, IEnumerable string.CompareOrdinal(a.id, b.id)); + profileSettings.SortProfiles(); m_GroupAssets.Sort((a, b) => string.CompareOrdinal(a?.Guid, b?.Guid)); } diff --git a/Runtime/ResourceManager/ResourceManager.cs b/Runtime/ResourceManager/ResourceManager.cs index 02d77e1f..1c692650 100644 --- a/Runtime/ResourceManager/ResourceManager.cs +++ b/Runtime/ResourceManager/ResourceManager.cs @@ -195,7 +195,6 @@ internal int InstanceOperationCount HashSet m_TrackedInstanceOperations = new HashSet(); internal DelegateList m_UpdateCallbacks = DelegateList.CreateWithGlobalCache(); List m_DeferredCompleteCallbacks = new List(); - HashSet m_AssetBundleProviders = new HashSet(); bool m_InsideExecuteDeferredCallbacksMethod = false; List m_DeferredCallbacksToRegister = null; @@ -507,29 +506,14 @@ internal IAsyncOperation GetOperationFromCache(IResourceLocation location, Type /// An IOperationCacheKey for use with the async operation cache. internal IOperationCacheKey CreateCacheKeyForLocation(IResourceProvider provider, IResourceLocation location, Type desiredType = null) { - IOperationCacheKey key = null; - bool isAssetBundleProvider = false; - if (provider != null) - { - if (m_AssetBundleProviders.Contains(provider)) - isAssetBundleProvider = true; - else if (typeof(AssetBundleProvider).IsAssignableFrom(provider.GetType())) - { - isAssetBundleProvider = true; - m_AssetBundleProviders.Add(provider); - } - } - //Actual key generation has been moved to AssetBundleProvider virtual method to allow provider derived from AssetBundleProvider //skip calling TransformInternalId method, as it may return different values before and after asset bundle is loaded, //for example when using Play Asset Delivery for Android. //For major package release consider this method to be made a part of IResourceProvider to simplify this whole logic. - if (isAssetBundleProvider) - key = (provider as AssetBundleProvider).CreateCacheKeyForLocation(this, location, desiredType); + if(provider is AssetBundleProvider abProvider) + return abProvider.CreateCacheKeyForLocation(this, location, desiredType); else - key = new LocationCacheKey(location, desiredType); - - return key; + return new LocationCacheKey(location, desiredType); } Dictionary m_ProviderOperationTypeCache = new Dictionary(); diff --git a/Runtime/ResourceManager/ResourceProviders/AssetBundleProvider.cs b/Runtime/ResourceManager/ResourceProviders/AssetBundleProvider.cs index 8a18f312..512e4952 100644 --- a/Runtime/ResourceManager/ResourceProviders/AssetBundleProvider.cs +++ b/Runtime/ResourceManager/ResourceProviders/AssetBundleProvider.cs @@ -614,10 +614,21 @@ private void BeginOperation() m_DownloadedBytes = 0; m_RequestCompletedCallbackCalled = false; GetLoadInfo(m_ProvideHandle, out LoadType loadType, out m_TransformedInternalId); - + if (loadType == LoadType.Local) { - LoadLocalBundle(); + //download only bundles loads should not load local bundles + if (m_ProvideHandle.Location is DownloadOnlyLocation) + { + m_Source = BundleSource.Local; + m_RequestOperation = null; + m_ProvideHandle.Complete(null, true, null); + m_Completed = true; + } + else + { + LoadLocalBundle(); + } return; } @@ -960,7 +971,8 @@ public override void Release(IResourceLocation location, object asset) throw new ArgumentNullException("location"); if (asset == null) { - Debug.LogWarningFormat("Releasing null asset bundle from location {0}. This is an indication that the bundle failed to load.", location); + if(!(location is DownloadOnlyLocation)) + Debug.LogWarningFormat("Releasing null asset bundle from location {0}. This is an indication that the bundle failed to load.", location); return; } @@ -984,7 +996,7 @@ internal virtual IOperationCacheKey CreateCacheKeyForLocation(ResourceManager rm { //We need to transform the ID first //so we don't try and load the same bundle twice if the user is manipulating the path at runtime. - return new IdCacheKey(rm.TransformInternalId(location)); + return new IdCacheKey(location.GetType(), rm.TransformInternalId(location)); } } } diff --git a/Runtime/ResourceManager/ResourceProviders/SceneProvider.cs b/Runtime/ResourceManager/ResourceProviders/SceneProvider.cs index d278449a..1945dddd 100644 --- a/Runtime/ResourceManager/ResourceProviders/SceneProvider.cs +++ b/Runtime/ResourceManager/ResourceProviders/SceneProvider.cs @@ -234,9 +234,9 @@ protected override void Execute() #endif var unloadOp = SceneManager.UnloadSceneAsync(m_Instance.Scene, m_UnloadOptions); if (unloadOp == null) - UnloadSceneCompletedNoRelease(null); + UnloadSceneCompleted(null); else - unloadOp.completed += UnloadSceneCompletedNoRelease; + unloadOp.completed += UnloadSceneCompleted; } else UnloadSceneCompleted(null); @@ -266,11 +266,6 @@ private void UnloadSceneCompleted(AsyncOperation obj) } } - private void UnloadSceneCompletedNoRelease(AsyncOperation obj) - { - Complete(m_Instance, true, ""); - } - protected override float Progress { get { return m_sceneLoadHandle.PercentComplete; } diff --git a/Runtime/ResourceManager/ResourceProviders/Simulation/VirtualAssetBundleProvider.cs b/Runtime/ResourceManager/ResourceProviders/Simulation/VirtualAssetBundleProvider.cs index 5ad7da3f..21d020d0 100644 --- a/Runtime/ResourceManager/ResourceProviders/Simulation/VirtualAssetBundleProvider.cs +++ b/Runtime/ResourceManager/ResourceProviders/Simulation/VirtualAssetBundleProvider.cs @@ -107,7 +107,8 @@ public override void Release(IResourceLocation location, object asset) throw new ArgumentNullException("location"); if (asset == null) { - Debug.LogWarningFormat("Releasing null asset bundle from location {0}. This is an indication that the bundle failed to load.", location); + if (!(location is DownloadOnlyLocation)) + Debug.LogWarningFormat("Releasing null asset bundle from location {0}. This is an indication that the bundle failed to load.", location); return; } diff --git a/Runtime/ResourceManager/Util/OperationCacheKeys.cs b/Runtime/ResourceManager/Util/OperationCacheKeys.cs index 9dd5d76a..63601bd8 100644 --- a/Runtime/ResourceManager/Util/OperationCacheKeys.cs +++ b/Runtime/ResourceManager/Util/OperationCacheKeys.cs @@ -15,10 +15,12 @@ internal interface IOperationCacheKey : IEquatable internal sealed class IdCacheKey : IOperationCacheKey { public string ID; + public Type locationType; - public IdCacheKey(string id) + public IdCacheKey(Type locType, string id) { ID = id; + locationType = locType; } bool Equals(IdCacheKey other) @@ -26,12 +28,12 @@ bool Equals(IdCacheKey other) if (ReferenceEquals(this, other)) return true; if (ReferenceEquals(other, null)) return false; - return other.ID == ID; + return other.ID == ID && locationType == other.locationType; } public override int GetHashCode() { - return ID.GetHashCode(); + return (17 * 31 + ID.GetHashCode()) * 31 + locationType.GetHashCode(); } public override bool Equals(object obj) => Equals(obj as IdCacheKey); diff --git a/Tests/Editor/ProfileSettingsTests.cs b/Tests/Editor/ProfileSettingsTests.cs index 6e9e9018..46e9fa64 100644 --- a/Tests/Editor/ProfileSettingsTests.cs +++ b/Tests/Editor/ProfileSettingsTests.cs @@ -381,5 +381,96 @@ public void GenerateUniqueName_AlwaysReturnUniqueNames() Assert.AreEqual(count, list.Distinct().Count()); } + + [Test] + public void WhenInvalidDefaultProfileState_GetDefaultProfileDoesNotLogError() + { + Assert.IsNotNull(Settings.profileSettings); + + try + { + var idDefault = Settings.profileSettings.Reset(); + Settings.profileSettings.AddProfile("A Test Profile", idDefault); + Settings.profileSettings.AddProfile("B Test Profile", idDefault); + + List profiles = Settings.profileSettings.profiles; + + var temp = profiles[0]; + profiles[0] = profiles[2]; + profiles[2] = temp; + + var defaultProfile = Settings.profileSettings.GetDefaultProfile(); + Assert.IsTrue(defaultProfile != null); + Assert.AreEqual(idDefault, defaultProfile.id, "GetDefaultProfile did not return the default profile."); + } + finally + { + Settings.profileSettings.Reset(); + } + } + + [Test] + public void WhenNoProfiles_SortDoesNotLogError() + { + Assert.IsNotNull(Settings.profileSettings); + + try + { + Settings.profileSettings.profiles.Clear(); + Assert.DoesNotThrow(() => Settings.profileSettings.SortProfiles(), "SortProfiles should not log errors when there are no profiles."); + } + finally + { + Settings.profileSettings.Reset(); + } + } + + [Test] + public void CanSortAndRenameProfiles() + { + Assert.IsNotNull(Settings.profileSettings); + var defaultProfileInitId = Settings.profileSettings.Reset(); + + string idSuffix = defaultProfileInitId.Substring(1); + string idDefault = '4' + idSuffix; + string idA = '1' + idSuffix; + string idB = '2' + idSuffix; + string idC = '3' + idSuffix; + + var defaultProfile = Settings.profileSettings.GetProfile(defaultProfileInitId); + defaultProfile.id = idDefault; + + string profileIdB = Settings.profileSettings.AddProfile("B Test Profile", idDefault); + var profileB = Settings.profileSettings.GetProfile(profileIdB); + profileB.id = idB; + + string profileIdA = Settings.profileSettings.AddProfile("A Test Profile", idDefault); + var profileA = Settings.profileSettings.GetProfile(profileIdA); + profileA.id = idA; + + string profileIdC = Settings.profileSettings.AddProfile("C Test Profile", idDefault); + var profileC = Settings.profileSettings.GetProfile(profileIdC); + profileC.id = idC; + + try + { + List profileIds = new List { profileIdC, profileA.id, profileIdB }; + profileIds.Sort((a, b) => string.CompareOrdinal(a, b)); + Settings.profileSettings.SortProfiles(); + + var currentProfiles = Settings.profileSettings.profiles; + Assert.AreEqual(idDefault, currentProfiles[0].id, "After all profiles were sorted, the default profile is no longer the first profile."); + + Assert.AreEqual(idA, currentProfiles[1].id); + Assert.AreEqual(idB, currentProfiles[2].id); + Assert.AreEqual(idC, currentProfiles[3].id); + + Assert.IsTrue(Settings.profileSettings.RenameProfile(profileA, "a test profile"), "After all profiles were sorted, renaming a non-default profile failed."); + } + finally + { + Settings.profileSettings.Reset(); + } + } } } diff --git a/Tests/Runtime/AddressablesImplTests.cs b/Tests/Runtime/AddressablesImplTests.cs index 0a690645..4dfbe250 100644 --- a/Tests/Runtime/AddressablesImplTests.cs +++ b/Tests/Runtime/AddressablesImplTests.cs @@ -320,6 +320,42 @@ public IEnumerator AddressablesImpl_DownloadDependenciesAsync_CanDownloadDepende op.Release(); } + [UnityTest] + public IEnumerator AddressablesImpl_DownloadDependenciesAsync_CanLoadFromCompletionEvent() + { + // Setup + yield return Init(); + + if (TypeName == "BuildScriptFastMode") + { + Assert.Ignore($"Skipping test {nameof(AddressablesImpl_DownloadDependenciesAsync_CanLoadFromCompletionEvent)} for {TypeName}"); + } +#if ENABLE_CACHING + Caching.ClearCache(); +#endif + AsyncOperationHandle op = m_Addressables.DownloadDependenciesAsync(m_PrefabKeysList[0]); + + AsyncOperationStatus loadStatus = AsyncOperationStatus.None; + + op.Completed += (o) => + { + m_Addressables.LoadAssetAsync(m_PrefabKeysList[0]).Completed += (o2) => + { + loadStatus = o2.Status; + o2.Release(); + }; + }; + yield return op; + while (loadStatus == AsyncOperationStatus.None) + yield return null; + + Assert.IsTrue(loadStatus == AsyncOperationStatus.Succeeded); + + // Cleanup + op.Release(); + } + + [UnityTest] public IEnumerator AddressablesImpl_DownloadDependenciesAsync_CantDownloadWhenGetResourceLocFailsKey() { diff --git a/Tests/Runtime/AddressablesIntegrationTests.cs b/Tests/Runtime/AddressablesIntegrationTests.cs index 472eb9ad..44b9c29a 100644 --- a/Tests/Runtime/AddressablesIntegrationTests.cs +++ b/Tests/Runtime/AddressablesIntegrationTests.cs @@ -74,6 +74,7 @@ public virtual void DeleteTempFiles() [TearDown] public void TearDown() { + AssetBundleProvider.WaitForAllUnloadingBundlesToComplete(); if (m_Addressables != null) { Assert.AreEqual(0, m_Addressables.ResourceManager.DeferredCompleteCallbacksCount); diff --git a/Tests/Runtime/SceneTests.cs b/Tests/Runtime/SceneTests.cs index 81ffd393..ab005977 100644 --- a/Tests/Runtime/SceneTests.cs +++ b/Tests/Runtime/SceneTests.cs @@ -4,6 +4,8 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Text; + #if UNITY_EDITOR using UnityEditor; using UnityEditor.AddressableAssets.Settings; @@ -354,15 +356,16 @@ public IEnumerator SceneTests_UnloadSceneAsync_CanUnloadFromSceneInstance() public IEnumerator SceneTests_UnloadSceneAsync_UnloadSceneDecreaseRefOnlyOnce() { var op = m_Addressables.LoadSceneAsync(sceneKeys[0], new LoadSceneParameters(LoadSceneMode.Additive)); + Assert.AreEqual(2, op.ReferenceCount); yield return op; + Assert.AreEqual(1, op.ReferenceCount); Assert.AreEqual(AsyncOperationStatus.Succeeded, op.Status); Assert.AreEqual(sceneKeys[0], SceneManager.GetSceneByName(sceneKeys[0]).name); - - Addressables.ResourceManager.Acquire(op); - yield return UnloadSceneFromHandlerRefCountCheck(op, m_Addressables); - - // Cleanup - Addressables.Release(op); + var ulOp = m_Addressables.UnloadSceneAsync(op); + Assert.AreEqual(1, op.ReferenceCount); + yield return ulOp; + Assert.IsFalse(op.IsValid()); + AssetBundleProvider.WaitForAllUnloadingBundlesToComplete(); } [UnityTest] @@ -611,6 +614,33 @@ public IEnumerator UnloadScene_ChainsBehindLoadOp_IfLoadOpIsRunning_TypelessHand unloadHandle.Release(); } + [UnityTest] + public IEnumerator UnloadSceneAsyncWithHAndle_BeforeLoadSceneAsyncFinishes_UnloadsAssetBundles() + { + int bundleCountBeforeTest = AssetBundle.GetAllLoadedAssetBundles().Count(); + var loadOp = m_Addressables.LoadSceneAsync(sceneKeys[1], new LoadSceneParameters(LoadSceneMode.Additive)); + var unloadOp = m_Addressables.UnloadSceneAsync(loadOp); + yield return unloadOp; + AssetBundleProvider.WaitForAllUnloadingBundlesToComplete(); + Assert.AreEqual(bundleCountBeforeTest, AssetBundle.GetAllLoadedAssetBundles().Count()); + } + + [UnityTest] + public IEnumerator UnloadSceneAsyncWithSceneManager_BeforeLoadSceneAsyncFinishes_UnloadsAssetBundles() + { + int bundleCountBeforeTest = AssetBundle.GetAllLoadedAssetBundles().Count(); + var loadOp = m_Addressables.LoadSceneAsync(sceneKeys[1], new LoadSceneParameters(LoadSceneMode.Additive)); + string allDone = null; + loadOp.Completed += (op)=> + { + SceneManager.UnloadSceneAsync(SceneManager.GetSceneAt(SceneManager.sceneCount - 1)).completed += o=> allDone = "true"; + }; + while (allDone != "true") + yield return null; + AssetBundleProvider.WaitForAllUnloadingBundlesToComplete(); + Assert.AreEqual(bundleCountBeforeTest, AssetBundle.GetAllLoadedAssetBundles().Count()); + } + [UnityTest] public IEnumerator SceneTests_UnloadSceneAsync_UnloadSceneAfterAcquireAndDoNotDestroyOnLoadDoesNotUnloadDependenciesUntilSecondRelease() { @@ -640,18 +670,11 @@ public IEnumerator SceneTests_UnloadSceneAsync_UnloadSceneAfterAcquireAndDoNotDe yield return UnloadSceneFromHandlerRefCountCheck(activeScene, m_Addressables); Assert.NotNull(GameObject.Find(instOp.Result.name)); - Assert.IsFalse(activeScene.Result.Scene.isLoaded); + Assert.IsFalse(activeScene.IsValid()); int bundleCountAfterUnload = AssetBundle.GetAllLoadedAssetBundles().Count(); Assert.AreEqual(bundleCountAfterInstantiate, bundleCountAfterUnload); - var activeSceneCpy = activeScene; - Assert.IsTrue(activeScene.IsValid()); - activeSceneCpy.Release(); - - yield return activeScene; - // Cleanup - Assert.IsFalse(activeScene.IsValid()); instOp.Release(); AssetBundleProvider.WaitForAllUnloadingBundlesToComplete(); int bundleCountEndTest = AssetBundle.GetAllLoadedAssetBundles().Count(); diff --git a/package.json b/package.json index 397d195b..d9985e80 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "com.unity.addressables", "displayName": "Addressables", - "version": "1.22.2", + "version": "1.22.3", "unity": "2019.4", "description": "The Addressable Asset System allows the developer to ask for an asset via its address. Once an asset (e.g. a prefab) is marked \"addressable\", it generates an address which can be called from anywhere. Wherever the asset resides (local or remote), the system will locate it and its dependencies, then return it.\n\nUse 'Window->Asset Management->Addressables' to begin working with the system.\n\nAddressables use asynchronous loading to support loading from any location with any collection of dependencies. Whether you have been using direct references, traditional asset bundles, or Resource folders, addressables provide a simpler way to make your game more dynamic. Addressables simultaneously opens up the world of asset bundles while managing all the complexity.\n\nFor usage samples, see github.com/Unity-Technologies/Addressables-Sample", "keywords": [ @@ -12,7 +12,7 @@ "assetbundles" ], "dependencies": { - "com.unity.scriptablebuildpipeline": "1.21.24", + "com.unity.scriptablebuildpipeline": "1.21.25", "com.unity.modules.assetbundle": "1.0.0", "com.unity.modules.imageconversion": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0", @@ -20,16 +20,16 @@ "com.unity.modules.unitywebrequestassetbundle": "1.0.0" }, "_upm": { - "changelog": "- Fixed memory leak when loading Sprite objects from a SpriteAtlas asset.\n- Added support for directly calling Release() on AsyncOperationHandles that didn't have the option to.\n- Fixed issue where operation that uses WaitForCompletion can timeout much earlier than it should.\n- Sort collections to make serialized editor files deterministic\n- Fixed an issue where tearing down the Addressables instance could happen before user teardown code was getting called.\n- Fixed issue where labels on an addressable sub-entry are incorrectly added to the former parent entry." + "changelog": "- Fixed issue where the content of the list with Addressable Assets Groups is improperly indented when displayed in Group Hierarchy with Dashes Group View.\n- Fixed issue where “Profile rename failed because default profile cannot be renamed“ error is thrown when renaming a new profile in Addressables Profiles.\n- Fixed loading error when the loading from an assetbundle that is currently being preloaded." }, "upmCi": { - "footprint": "d828e27c19c8a0b02bc63dd74aa88208da4959ad" + "footprint": "9a521c2dfc5bdef945c0bdbce2e860dc1ac950fc" }, "documentationUrl": "https://docs.unity3d.com/Packages/com.unity.addressables@1.22/manual/index.html", "repository": { "url": "https://github.cds.internal.unity3d.com/unity/Addressables.git", "type": "git", - "revision": "8c3d8e3f459edf307b582d67a31d29e34e6dcfb1" + "revision": "10cb5465c9d5eb7ae72cfc3c120116131c3852f0" }, "samples": [ {