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 Services Explorer window (
Tools > GameLovers > Services Explorer) with 13 live-refresh tabs: Overview, Installer, MessageBroker, Tick, Coroutine, Pool, Data, Time, RNG, AssetResolver, Versioning, Assets Importer, Addressable Ids — works in both Edit and Play mode - Menu stubs under
Tools > GameLovers:-
Versioning / Refresh Version DataandVersioning / Open in Explorer -
Assets Importer / Import Assets DataandAssets Importer / Open in Explorer -
Addressable Ids / Generate Addressable IdsandAddressable Ids / Open in Explorer
-
- Added
Assets > Create > GameLovers Services > …scaffolders: Message, Command, Service, Pool Entity (template-based,$NAME$ /$NAMESPACE$ substitution) - Absorbed
com.gamelovers.assetsimporterv0.5.2 into this package - Added
IAssetLoader,ISceneLoader,AddressablesAssetLoadertoRuntime/AssetsImporter/(nsGameLovers.Services.AssetsImporter) - Added
AddressableConfig,AssetConfigsScriptableObject<TId,TAsset>,AssetLoaderUtils,AssetReferenceScenetoRuntime/AssetsImporter/(nsGameLovers.Services.AssetsImporter) - Added
AssetResolverService(implementsIAssetResolverService/IAssetAdderService) toRuntime/root (nsGameLovers.Services) - Added Editor/AssetsImporter/:
AssetsImporter,AssetsToolImporter,AssetConfigsImporter,AddressableIdsGenerator,AddressablesIdGeneratorSettings(nsGameLovers.Services.AssetsImporter.Editor) - Added importable Samples under
Samples~/(importable via Unity Package Manager > GameLovers Services > Samples).-
Services Playground — single-scene, zero-setup walk-through that wires every foundation service via
MainInstallerand exercises 10 of 13 Services Explorer tabs end-to-end. -
Asset Resolver — focused demo of
AssetResolverServiceend-to-end (AddConfigs/RequestAsset/UnloadAssets) withSpriteConfigs : AssetConfigsScriptableObject<SpriteId, Sprite>. Drives the three Services Explorer tabs the Playground does not cover (Asset Resolver, Assets Importer, Addressable Ids).
-
Services Playground — single-scene, zero-setup walk-through that wires every foundation service via
Changed:
- Addressable Ids generator and Assets Importer settings moved from
Assets/*.assetScriptableObjects toProjectSettings/ScriptableSingletons (mirrorsVersioningEditorSettings). - Generation logic extracted from
AddressableIdsGeneratorintoAddressableIdsGeneratorUtils(staticinternal); importer discovery/import logic extracted intoAssetsImporterEditorUtils. Tools/Assets Importer/*andTools/AddressableIds Generator/*menu entries removed. UseTools/GameLovers/Assets Importer/...,Tools/GameLovers/Addressable Ids/..., or the Services Explorer tabs instead.Toggle Auto Import On Refreshmenu entry removed. The toggle now lives exclusively in the Services Explorer Assets Importer tab.Assets/AssetsImporter.assetandAssets/AddressablesIdGeneratorSettings.assetare no longer used (settings moved toProjectSettings/); safe to delete from consumer projects.- Deleted editor source files:
AssetsImporter.cs,AssetsToolImporter.cs,AddressableIdsGenerator.cs,AddressablesIdGeneratorSettings.cs. - Folder reorganization:
Runtime/now has domain subfoldersDependencyInjection/,Commands/,Pooling/,AssetsImporter/;Editor/now hasVersioning/andAssetsImporter/subfolders Installer.csandMainInstaller.csmoved toRuntime/DependencyInjection/(namespace unchanged:GameLovers.Services)CommandService.cstrimmed to concrete class only; command contract interfaces extracted toRuntime/Commands/under nsGameLovers.Services.CommandsPoolService.cstrimmed to concrete class only; pool interfaces + implementations moved toRuntime/Pooling/under nsGameLovers.Services.PoolingObjectPool.cs(578 lines, 10 types) split into 4 files underRuntime/Pooling/:IPoolEntity.cs,IObjectPool.cs,ObjectPool.cs,GameObjectPool.csVersionEditorUtils.csandGitEditorProcess.csmoved toEditor/Versioning/; re-namespaced fromGameLovers.Services.Editor→GameLovers.Services.Versioning.Editor- Added new hard dependencies:
com.unity.addressables(1.21.20) andcom.cysharp.unitask(2.5.10)
Fixed:
AddressablesAssetLoader.UnloadAssetno longer callsGC.Collect(),GC.WaitForPendingFinalizers(), orResources.UnloadUnusedAssets(). The method now only decrements the Addressables reference count. The old implementation caused PlayMode Test Runner crashes on macOS and O(total-assets-in-memory) main-thread stalls per per-asset release. Callers that need memory reclamation should invokeResources.UnloadUnusedAssets()themselves at appropriate moments (scene transitions, boot, memory-pressure events); Unity also runs an unused-assets sweep automatically onLoadSceneMode.Singlescene loads.- Corrected
IAssetLoader.UnloadAssetXML documentation: removed the incorrect "will also destroy GameObject instances" claim —Addressables.Release(gameObject)does not destroy the instance; callers mustObject.Destroyit separately. IAsyncCoroutine.StopCoroutine(bool triggerOnComplete)now honors itstriggerOnCompleteparameter and flipsIsCompletedtotrueandIsRunningtofalseafter stopping. The previous implementation always invokedOnCompletecallbacks regardless of the flag and left state flags unchanged, so consumers could not distinguish a stopped coroutine from a running one andtriggerOnComplete: falsewas silently ignored.GameObjectPool.Dispose()andGameObjectPool<T>.Dispose()now skip pooled entries whose underlyingGameObjecthas already been destroyed by an external owner (e.g. a parent GameObject was destroyed while pooled instances were still reparented under it viaDespawnToSampleParent).
Breaking Changes — see MIGRATION.md for details:
- Pool types moved from
GameLovers.ServicestoGameLovers.Services.Pooling(IPoolService,IObjectPool,IObjectPool<T>,ObjectPool<T>,ObjectPoolBase<T>,GameObjectPool,GameObjectPool<T>,IPoolEntitySpawn,IPoolEntitySpawn<T>,IPoolEntityDespawn,IPoolEntityObject<T>).PoolServiceconcrete class remains inGameLovers.Services. - Command contract types moved from
GameLovers.ServicestoGameLovers.Services.Commands(IGameCommandBase,IGameCommand<>,IGameServerCommand<>,ICommandService<>).CommandService<>concrete class remains inGameLovers.Services. GameLovers.AssetsImporter.*renamed toGameLovers.Services.AssetsImporter.*GameLovers.AssetsImporter.AssetResolverServiceis nowGameLovers.Services.AssetResolverServiceGameLovers.Services.Editor.*(versioning editor) renamed toGameLovers.Services.Versioning.Editor.*IAssetLoader.UnloadAssetAsync<T>(T, Action)→IAssetLoader.UnloadAsset<T>(T, Action): method renamed (droppedAsyncsuffix) and return type changed fromUniTasktovoidto reflect its synchronous nature. Replaceawait loader.UnloadAssetAsync(x);withloader.UnloadAsset(x);.- Code generated by
AddressableIdsGeneratormust be re-generated (updated emittedusingstatement)
Changed:
- Updated dependency
com.gamelovers.dataextensionstocom.gamelovers.gamedata - Updated assembly definitions to reference
GameLovers.GameData
New:
- Added AGENTS.md document to help guide AI coding assistants to understand and work with this package library
- Added an entire test suit of unit/integration/performance/smoke tests to cover all the code for all services in this package
Changed:
- Changed VersionServices namespace from GameLovers to GameLovers.Services to maintain consistency with other services in the package.
- Made CallOnSpawned, CallOnSpawned<TData>, and CallOnDespawned methods virtual in ObjectPoolBase<T> to allow derived pool classes to customize lifecycle callback behavior.
Fixed:
- Fixed the README.md file to now follow best practices in OSS standards for Unity's package library projects
- Fixed linter warnings in VersionServices.cs (redundant field initialization, unused lambda parameter, member shadowing)
- Fixed GameObjectPool not invoking IPoolEntitySpawn.OnSpawn() and IPoolEntityDespawn.OnDespawn() on components attached to spawned GameObjects.
New:
- Added protected property for all private fields in CommandService for access to any game specific project inheritance
New:
- Added StartDelayCall method to ICoroutineService to allow deferred methods to be safely executed within the bounds of a Unity Coroutine
- Added the possibility to know the current state of an IAsyncCoroutine
- Added the access to the Sample Entity used to generete new entites within an IObjectPool and destroy it when disposing the object pool
- Added the possibility to reset an IObjectPool to a new state
Fixed:
- Fixed the RngLogic.Range(float, float, bool) method to allow having the same min and max values with maxInclusive set to true
New:
- Added PublishSafe method to IMessageBrokerService to allow publishing messages safely in chase of chain subscriptions during publishing of a message
Changed:
- Subscribe and Unsubscribe throw an InvalidOperationException when being executed during a message being published
Fixed:
- CoroutineTests issues running when building released projects
Fixed:
- Fixed the IInstaller when trying to bind multiple interfaces at the same time
Changed:
- Changed CommandService to now receive the MessageBrokerService in the command and help communication with the game architecture
Fixed:
- Fixed an inssue where IPoolEntityObject.Init() wouldn't be called when spawning entities
Fixed:
- The endless loop when calling RngService.Range()
- The endless loop GameObjectPool when spawning new entities
New:
- Added IRngData to PoolService to suppprt read only data structure and allow abtract injection of data into other objects
Changed:
- Changed RngData to a class in orther to avoid boxing/unboxing performance when injecting IRngData.
New:
- Added Spawn(T data) method to PoolService to allow spawning new objects with defined spawning data
- Added GetPool() && TryGetPool() methods to PoolService to allow requesting the pool object maintained by the pool service.
Changed:
- Removed IsSpawned() method from PoolService because is not a fundamental function and can now be accessed from the Pool requested from GetPool()
- Now Spawn(T data) also invokes OnSpawn() without data so objects that implement IPoolEntitySpawn have the entire behaviour lifecycle
New:
- Updated CommandService to allow non struct type commands to be executed for reference type commands
- Added Spawn(T data) method to pool object to allow spawning new objects with defined spawning data
New:
- Updated interfaces and classes related to data services, enhancing modularity and improving version handling.
- Added classes for Git commands, version management, and random number generation.
Changed:
- Restructured the data service interfaces, consolidating functionality into a single IDataService interface and removing unnecessary interfaces.
- Changed AddData to AddOrReplaceData in the DataService implementation.
- Removed the isLocal state from data handling.
New:
- Added GitEditorProcess class to run Git commands as processes, enabling checks for valid Git repositories, retrieving current branch names, commit hashes, and diffs from given commits.
- Introduced VersionEditorUtils class for managing application versioning. This includes setting and saving the internal version before building, loading version data from disk, and generating an internal version suffix based on Git information and build settings.
Changed:
- Enhanced IInstaller interface with new methods for binding multiple type interfaces to a single instance, improving modularity and code organization.
New:
- Introduced MainInstaller, a singleton class for managing instances in the project.
- Added RngService for generating and managing random numbers.
- Implemented VersionServices to manage application version, including asynchronous loading of version data and comparison of version strings.
Changed:
- Tests have been moved to proper folders, and the package number has been updated.
- An unused namespace import has been removed from the InstallerTest class.
Fixed:
- Compilation errors in various test files and the PoolService class have been fixed.
New:
- Introduced a code review process using GitHub Actions workflow.
- Added IInstaller interface and Installer implementation for binding and resolving instances.
- Updated namespaces, removed unused code, and modified method calls in test classes.
Changed:
- Removed dependency on *ICommandNetworkService *and SendCommand method in CommandService.
- Updated IDataService interface and DataService class to handle local and online data saving.
- Improved readability of MessageBrokerService class by using var for type inference.
- Removed unused network service related interfaces, classes, and methods.
- Modified calculation of overFlow in TickService to check for zero DeltaTime.
Changed:
- Made NetworkService abstract and removed INetworkService to make easier to work with
- Improved Readme documentation
New:
- Added connection between NetworkService & CommandService
- Added integration tests
New:
- Added NetworkService
- Improved Readme documentation
Changed:
- Renamed IDataWriter and it's FlushData methods to IDataSaver & SaveData respectively to match with it's execution logic scope
- Moved the AddData to the IDataService to allow the IDataSaver have the single responsibility of saving data into disk
New:
- Added CommandService
New:
- Added DataService
Fixed:
- Fixed object pool despawn all elements. It was not despawning all the elements
- Fixed issue preventing to stop coroutines and thrown MissingReferenceException
Changed:
- Now the MainInstaller checks the object binding relationship in compile time
- Improved the ObjectPools helper classes with a now static global instatiator for game objects.
- Now the PoolService is only a service container for objects pools and no longer creates/initializes new pools.
- Removed Pool.Clear functionality. Use DespawnAll or delete the pool instead
Fixed:
- The CoroutineService no longer fails on null coroutines
- Added new ObjectPool & GameObjectPool pools to allow to allow to use object pools independent from the PoolService. This allows to have different pools of the same type in the project in different object controllers
- Added new interface IPoolEntityClear that allows a callback method for entities when they are cleared from the pool
- Added new unit tests for the ObjectPool
Changed:
- Now the PoolService.Clear() does not take any action parameters. To have a callback when the entity is cleared, please have the entity implement the IPoolEntityClear interface
New:
- Added License
- Initial submission for package distribution