All notable changes to this package will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning
New:
- Added
CLAUDE.mdwrapper at the package root that importsAGENTS.mdfor Claude Code integration - Added per-sample
README.mddocumentation for every entry underSamples~/(BasicUiFlow, DataPresenter, DelayedPresenter, UiToolkit, DelayedUiToolkit, UiSets, MultiInstance, CustomFeatures, AssetLoadingStrategies)
Changed:
- Renamed package
displayNamefromUiServicetoGameLovers UiServiceto align with the GameLovers GameData and GameLovers Services packages (UPMnamecom.gamelovers.uiserviceand the GitHub repository name are unchanged) - Reorganized editor menu items under
Tools/GameLovers/...to align with the GameLovers Services package layout:Tools/UI Service/Presenter Manager→Tools/GameLovers/UI Presenter Manager;Tools/UI Service/Select UiConfigs→Tools/GameLovers/UI Configs/Select UI Configs;Tools/UI Service/Layer Visualizer→Tools/GameLovers/UI Configs/Layer Visualizer - Moved runtime
[CreateAssetMenu]paths fromScriptableObjects/Configs/UiConfigs/...toGameLovers UiService/UiConfigs/...forAddressablesUiConfigs,ResourcesUiConfigs, andPrefabRegistryUiConfigs; moved theUiSetssample's[CreateAssetMenu]toGameLovers UiService Samples/UiSets Sample Configs - Reorganized
Tests/PlayMode/so unit tests live underTests/PlayMode/Unit/alongside the existingIntegration/,Performance/,Smoke/subfolders - Moved
TestPresenterand other MonoBehaviour-based test fixtures fromTests/EditMode/Helpers/toTests/Helpers/(runtime-compatible) so PlayMode tests canAddComponent<T>()them without hitting the editor-script restriction - Improved the
README.mdandAGENTS.mddocumentation
Fixed:
- Fixed the information in the README.md files to be up to date with the API and project library structure
- Fixed PlayMode test noise by declaring expected warnings via
LogAssert.Expect(loading/open-close/UI-set tests) and assigning an emptyThemeStyleSheetto runtime-createdPanelSettingsin UI Toolkit test helpers to silence theNo Theme Style Sheet set to PanelSettingswarning
New:
- Added
UiPresenterManagerWindowunified editor tool for managing UI presenters in play mode.
Changed:
- BREAKING: Removed
IUiAnalytics,UiAnalytics,NullAnalytics, and all related analytics types. - Removed legacy
UiAnalyticsWindowandUiServiceHierarchyWindoweditor tools.
New:
- Added
OpenUiSetAsync(int setId, CancellationToken)method toIUiServicefor opening all UI presenters in a set with proper address handling, ensuring compatibility withCloseAllUiSetandUnloadUiSet - Added
OnOpenTransitionCompleted()andOnCloseTransitionCompleted()lifecycle hooks toUiPresenterfor reacting after all transition animations/delays complete - Added comprehensive test suite:
- Unit tests for
UiAnalytics,UiConfig,UiInstanceId,UiServiceCore,UiSetConfig - PlayMode integration tests for multi-instance, loading, open/close, and UI set management
- Performance and smoke tests
- Feature-specific tests for
AnimationDelayFeature,TimeDelayFeature, andPresenterFeatureBase
- Unit tests for
- Added
ITransitionFeatureinterface for features that provide open/close transition delays - Added
OpenTransitionTaskandCloseTransitionTaskpublic properties onUiPresenterfor awaiting transition completion externally - Added
AGENTS.mddocumentation for AI coding agents - Added structured documentation under
docs/folder with separate pages for getting started, core concepts, API reference, advanced topics, and troubleshooting - Added multiple new samples to the package library
- Added multiple
IUiAssetLoaderimplementations to support different asset loading scenarios:AddressablesUiAssetLoader(default): Integration with Unity Addressables.PrefabRegistryUiAssetLoader: Simple loader for direct prefab references (useful for testing and samples).ResourcesUiAssetLoader: Support for loading from Unity'sResourcesfolder.
- Added
AddressablesUiConfigs,ResourcesUiConfigs,PrefabRegistryUiConfigs,ResourcesUiConfigsEditor,AddressablesUiConfigsEditorandPrefabRegistryUiConfigsEditorfor managing UI configurations.
Changed:
- BREAKING: Made
UiConfigsclassabstractto enforce usage of specialized subclasses (AddressablesUiConfigs,ResourcesUiConfigs,PrefabRegistryUiConfigs) and prevent runtime errors from misconfiguration - BREAKING: Removed
IPresenterFeatureinterface; features now extendPresenterFeatureBasedirectly - BREAKING: Renamed
UiAssetLoadertoAddressablesUiAssetLoaderto reflect its specific loading mechanism. - BREAKING: Renamed
UiConfig.AddressableAddresstoUiConfig.Addressfor loader-agnosticism - Changed
UiPresenter<T>.Dataproperty to have a public setter that automatically triggersOnSetData()when assigned - Refactored
TimeDelayFeatureandAnimationDelayFeatureto no longer callgameObject.SetActive(false)directly; visibility is now controlled solely byUiPresenter - Refactored
UiPresenter.InternalOpen()andInternalClose()to use internal async processes that awaitITransitionFeaturetasks - Refactored
AnimationDelayFeatureandTimeDelayFeatureto usePresenter.NotifyOpenTransitionCompleted()andPresenter.NotifyCloseTransitionCompleted()instead of internal events - Removed
OnOpenCompletedEventandOnCloseCompletedEventinternal events from delay features - Updated all samples to use UI buttons instead of input system dependencies for better project compatibility
Fixed:
- Fixed
AnimationDelayFeatureanimation playback logic - was incorrectly checking!_introAnimationClipinstead of_introAnimationClip != null - Fixed
UiPresenterEditorplay-mode buttons to properly callInternalOpen()andInternalClose()instead of just togglinggameObject.SetActive() - Fixed delay features to work correctly when tests run together (UniTaskCompletionSource lifecycle)
- Fixed null checks in delay features using explicit null comparisons instead of null-conditional operators for Unity object compatibility
- Fixed inconsistent lifecycle where
OnOpenTransitionCompleted/OnCloseTransitionCompletedwere only called when features existed - Fixed split responsibility for visibility control where both
UiPresenterand features could callSetActive(false), allowing now to properly close the presenters in all scenarios - Fixed
LoadUiAsyncvisibility state inconsistency where calling it on an already-visible presenter withopenAfter=falsewould disable the GameObject but not updateVisiblePresenters, causing subsequentOpenUiAsynccalls to fail silently - Fixed multi-instance ambiguity when calling
Close(destroy: true)from within a presenter and now correctly unloads the specific instance instead of potentially unloading the wrong one - Fixed UI Toolkit timing issue where element queries in
OnInitialized()would fail because the visual tree was not yet attached to a panel
New:
- Added
IUiAnalyticsinterface andUiAnalyticsimplementation for performance tracking - Added three editor windows:
UiAnalyticsWindow,UiServiceHierarchyWindow - Added new "UI Layer Hierarchy Visualizer" section to the
UiConfigsEditorinspector - Added
UiPresenterSceneGizmosfor visual debugging in Scene view - Added
UiPresenterEditorcustom inspector with quick open/close buttons - Added multi-instance support for UI presenters via
UiInstanceIdstruct and instance addresses - Added
UiInstancestruct to encapsulate presenter metadata (type, address, presenter reference) - Added feature-based presenter composition architecture with
IPresenterFeatureinterface - Added
PresenterFeatureBasebase class for composable presenter features - Added
AnimationDelayFeatureandTimeDelayFeaturecomponents for delayed UI operations - Added
UiToolkitPresenterFeaturefor UI Toolkit integration - Added
DefaultUiConfigsEditorfor out-of-the-box UI configuration (no custom implementation required)
Changed:
- Replaced
Task.DelaywithUniTask.Delaythroughout for better performance and WebGL compatibility - Updated
CloseAllUito avoid modifying collection during iteration - Enhanced
UiService.Dispose()with proper cleanup of all presenters, layers, and asset loader LoadUiAsync,OpenUiAsyncmethods now accept optionalCancellationTokenparameter- Updated the README with a complete information of the project
- Replaced
LoadedPresentersproperty withGetLoadedPresenters()method for better encapsulation - Migrated all delay functionality from
PresenterDelayerBaseto feature-based system (AnimationDelayFeature,TimeDelayFeature) - Converted all editor scripts to use UI Toolkit for better performance and modern UI
- Refactored
UiConfigsEditorto use UI Toolkit with improved visuals and drag-and-drop support - Optimized collection types (
Dictionary,List) for better performance inUiService - Removed loading spinner from
UiService(simplified initialization)
Fixed:
- CRITICAL: Fixed
GetOrLoadUiAsyncreturning null when loading new UI (now properly assigns return value) - Fixed exception handling in
UnloadUiwith properTryGetValuechecks - Fixed exception handling in
RemoveUiSetwith properTryGetValuechecks - Fixed redundant operations in
CloseAllUilogic - Fixed initial value handling for UI sets in editor
- Fixed serialization updates before property binding in editor
- Fixed script indentation issues in delay presenter implementations
New:
- Added UiToolkitPresenter script to allow UI Toolkit based UIs to work similar to UiPresenter
Changed:
- Refactored UiToolkitPresenter to also pass the root visual element to it's implemented class and properly assign the element OnValidate
New:
- Added UiToolkitPresenter script to allow UI Toolkit based UIs to work with the library
Changed:
- Updated README to reflect the project structure
- Adjusted the Editor tools and UiService to process UI Toolkit based views
New:
- Added InteractableTextView script to allow linking text code execution, e.g open URLs in the browser
Changed:
- Renamed AdjustScreenSizeFitter to AdjustScreenSizeFitterView to mark it as a View in the architecture conventions
- Moved AdjustScreenSizeFitterView and NonDrawingView, SafeAreaHelperView to the Views folder and namespace to organize the codebase accordingly
New:
- Added two new static event calls to UiService that are triggered when the app changes resolution and another trigger when changes screen orientation
- The new UiServiceMonoComponent was added to the project for internal purposes, in order to support Unity's loop or generic GameObjects dependency code (e.g. the screen resolution trigger change)
- Added new AdjustScreenSizeFitter to extend the ui behaviour of Unity's ContentSizeFitter in order to allow the LayoutElement to fit between the LayoutElement.minSize & LayoutElement.flexibleSize, values defined in the Unity's inspector
Changed:
- Renamed UiPresenterData to UiPresenter to make it less verbose
New:
- Added UniTask dependency to enable WebGL platform support
Changed:
- Updated IUiService async methods to use UniTask instead of Task for better performance and WebGL compatibility
Fixed:
- Fixed the issue that would crash NonDrawingView if the GameObject would be missing a CanvasRenderer
*New:
- Added GetUi method to the IUiService. It requests the UiPresenter by directly using generic T
- Added IsVisible method to the IUiService. It requests the visibility state of UiPresenter
- Added IReadOnlyList property VisiblePresenters to the IUiService to allow external entities to access the list of visible UiPresenter
*Changed:
- Removed GetAllVisibleUi() method. Use IsVisible method instead
*New:
- Added new PresenterDelayerBase, AnimationDelayer and TimeDelayer to support presenters that open/close with a delay
- Added new DelayUiPresenter to interact with PresenterDelayerBase implementations and allow presenters to open/close with a delay
- Improved performance of UiService
*Changed:
- Removed AnimatedUiPresenter. Use the new DelayUiPresenter with one of the PresenterDelayerBase implementations
- Removed UiCloseActivePresenter and UiCloseActivePresenterData. Use the new DelayUiPresenter with one of the PresenterDelayerBase implementations
- Removed the dependency of UiPresenter from Canvas. Allowing different structures of UI Unity project hierarchy to work with the UiService
- Removed all Get and Has methods from IUiService. Replaced with IReadOnlyDictionaries for all the collections being requested from the service
- Changed all OpenUi methods to be async. This guarantees the expected behaviour that will always load the Ui first before opening
- Changed all CloseUi methods to be synchronous. Closing an Ui will now always be atomic. To get the close delay, you can request directly from the DelayUiPresenter
- Changed IUiAssetLoader to unify the prefab instantiation into a single call. This simplefies the method so the caller doesn't have to worry about synchronous or async behaviour
- Changed the UiConfig to know contain the information of the UiPresenter if is loaded sync or async
Fixed:
- Fixed the issue where closing UiPresenter would be called after the game object is disabled
*New:
- Added the possibility for SafeAreaHelpersView to maintain the View in the same position if not placed outside of the safe area
Fixed:
- Fixed the duplicated memory issue when loading the same UiPresenter multiple times at the same time before when of them is finished
*New:
- Added NonDrawingView to have an Image without a renderer to not add additional draw calls.
- Added SafeAreaHelperView to add the possibility for the RectTransform to adjust himself to the screen notches
- Added AnimatedUiPresenter to play animation on enter or closing
- Added the possibility to add Layers externally into the UiService
Changed:
- Now Canvas are single GameObjects that can be controlled outside of the UiService
Fixed:
- Fixed the issue when setting data on UiPresenterData not being invoked
Fixed:
- Updated dependency packages
*New:
- Added the possibility for the IUiService to allow to open/close already opened/closed UiPresenters, and throw an exception if not.
- Added the visible property to UiPresenter of its current visual status Added IUiServiceInit to give a new contract interface for the *UiService" initialisation
Fixed:
- Fixed issue that was not unloading the UiPresenter correctly with the asset bundles
- Fixed issue when UiPresenter might not have a canvas attached
- Fixed crash when trying to open a UiPresenter after loading it
*New:
- Added UiAssetLoader to load Ui assets to memory
Changed:
- Removed the UiService dependency from the com.gamelovers.assetLoader
Changed:
- Removed the UiService dependency from the com.unity.addressables
- Modified the UiService to be testable and injectable into other systems
Changed:
- Moved interface IUiService to a separate file to improve the code readability
Changed:
- Updated dependency packages
*New:
- Added new UiPresenterData class for the case where the UiPresenter needs to be initialized with a default data value
- Added new OnInitialize method that is invoked after the UiPresenter is initialized
*New:
- Added the possibility to open the ui after adding or loading it to the UiService
- Added the possibility to get the canvas reference object based on the given layer
- Added the possibility to remove and unload the UiPresenter by only passing it's reference
Fixed:
- Fixed bug that prevented the UiService to properly unload an UiPresenter
*New:
- Added easy selection of the UiConfigs.asset file. Just go to Tools > Select UiConfigs.asset. If the UiConfigs.asset does not exist, it will create a new one in the Assets folder
- Added the protected Close() method to directly allow to close the UiPresenter from the UiPresenter object file without needing to call the UiService. Also now is possible to close an Ui in the service by referencing the object directly without needing to reference the object type by calling CloseUi(T presenter)
- Now the UnloadUi & UnloadUiSet properly unloads the ui from memory and removes it from the service
- Added RemoveUi & RemoveUiPresentersFromSet to allow the ui to be removed from the service without being unloaded from memory
- Improved documentation
Changed
- Now the Refresh method on the UiPresenter is public and can be called from any object that has asset to it. The UiService will not call this method anymore if trying to open the same UiPresenter twice without closing
- UiService.IsUiLoaded changed to HasUiPresenter
- UiService.IsAllUiLoadedInSet changed to HasAllUiPresentersInSet
- Unified AddUi methods
Fixed:
- Fixed bug that sometimes don't save the UiConfigs state correctly
Fixed:
- Bug that sometimes was not save+ing the UiConfigs state correctly
Fixed:
- Compiler Errors
Fixed:
- The state of a the UiPresenter when loaded. Now the UiPresenters are always disabled when loaded
- Initial submission for package distribution