{"id":13662375,"url":"https://github.com/dre0dru/AssetManagement","last_synced_at":"2025-04-25T10:31:02.224Z","repository":{"id":46330369,"uuid":"342691048","full_name":"dre0dru/AssetManagement","owner":"dre0dru","description":"A set of classes to convert Unity Addressables callbacks/coroutine workflow to async/await with UniTask.","archived":false,"fork":false,"pushed_at":"2023-09-11T10:15:05.000Z","size":193,"stargazers_count":99,"open_issues_count":1,"forks_count":12,"subscribers_count":5,"default_branch":"master","last_synced_at":"2024-10-30T00:04:54.663Z","etag":null,"topics":["addressable","addressables","library","unity","upm-package"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dre0dru.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2021-02-26T20:19:05.000Z","updated_at":"2024-10-12T08:45:02.000Z","dependencies_parsed_at":"2024-01-07T04:48:28.840Z","dependency_job_id":null,"html_url":"https://github.com/dre0dru/AssetManagement","commit_stats":null,"previous_names":[],"tags_count":28,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dre0dru%2FAssetManagement","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dre0dru%2FAssetManagement/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dre0dru%2FAssetManagement/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dre0dru%2FAssetManagement/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dre0dru","download_url":"https://codeload.github.com/dre0dru/AssetManagement/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":222632594,"owners_count":17014546,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["addressable","addressables","library","unity","upm-package"],"created_at":"2024-08-02T05:01:56.978Z","updated_at":"2024-11-10T18:30:16.304Z","avatar_url":"https://github.com/dre0dru.png","language":"C#","funding_links":[],"categories":["Unity","C\\#"],"sub_categories":["Lua"],"readme":"[![openupm](https://img.shields.io/npm/v/com.dre0dru.assetmanagement?label=openupm\u0026registry_uri=https://package.openupm.com)](https://openupm.com/packages/com.dre0dru.assetmanagement/)\n# Addressables Services\nA set of classes to convert Unity `Addressables` callbacks/coroutine workflow to async/await with UniTask.\nUnity 2020.1+\n\n\n## Installation\nThis package can be installed as a Unity package from git url.\n\n### Latest release\n- Add following line in `Packages/manifest.json`:\n```\n\"com.dre0dru.assetmanagement\": \"https://github.com/dre0dru/AssetManagement.git\",\n```\n- Use `Window/Package Manager/Add package from git URL...` in Unity:\n```\nhttps://github.com/dre0dru/AssetManagement.git\n```\n\n## Dependencies\nThis package has following dependencies that must be present for package to compile:\n- [UniTask](https://github.com/Cysharp/UniTask)\n\n### Optional\n- [ScriptingDefineUtility](https://github.com/Thundernerd/Unity3D-ScriptingDefineUtility) enables full logs switch for `Addressables` under `Window-\u003eAsset Management-\u003eAddressables-\u003eLogs`\n- [VContainer](https://github.com/hadashiA/VContainer) - optional extension methods for bindings\n- [Shared.Sources](https://github.com/dre0dru/Shared.Sources) used for implementations of  interfaces in several modules, interfaces are not dependent on this package\n\n## Loaders\nGeneric type-safe assets loader.\nCan be used for both async assets loading on demand or async preloading and sync usage during gameplay.\n```csharp\n[SerializeField]  \nprivate AssetReferenceT\u003cAudioClip\u003e _clipAssetReference01;  \n[SerializeField]  \nprivate AssetReferenceT\u003cAudioClip\u003e _clipAssetReference02;\n\nIAssetsReferenceLoader\u003cAudioClip\u003e loader = new AssetsReferenceLoader\u003cAudioClip\u003e();  \n  \n//Or more generic IAssetsLoader\u003cTKey, TAsset\u003e  \nIAssetsLoader\u003cAssetReferenceT\u003cAudioClip\u003e, AudioClip\u003e loader =  \n new AssetsReferenceLoader\u003cAudioClip\u003e();  \n  \n//Preload assets  \nawait loader.PreloadAssetAsync(_clipAssetReference01);  \nawait loader.PreloadAssetsAsync(_clipAssetReference01, _clipAssetReference02);  \n  \n//Safely extract preloaded asset synchronously  \nif (loader.TryGetAsset(_clipAssetReference01, out AudioClip audioClip))  \n{  \n Debug.Log($\"Asset loaded successfully: {audioClip}\");  \n}  \nelse  \n{  \n Debug.Log($\"No asset was for preloaded for {_clipAssetReference01.RuntimeKey}\");  \n}  \n  \n//Check if asset was loaded  \nbool isAssetPreloaded = loader.IsAssetLoaded(_clipAssetReference01);  \n  \n//Or use unsafe asset extraction, will throw exception if no asset was preloaded  \nAudioClip audioClip = loader.GetAsset(_clipAssetReference01);  \n  \n//Load asynchronously on demand, will be completed immediately if asset is already loaded\nAudioClip audioClip = await loader.LoadAssetAsync(_clipAssetReference01);  \nAudioClip[] audioClips = await loader.LoadAssetsAsync(_clipAssetReference01, _clipAssetReference02);  \n  \n//Unload unused assets  \nloader.UnloadAsset(_clipAssetReference01);  \n//Or unload all assets that were loaded  \nloader.UnloadAllAssets();\n```\n\n\n### AssetReferenceComponent\n`AssetReferenceComponent\u003cT\u003e` allows to filter Addressables assets by specific component in Unity Editor. Must be used with `IAssetsReferenceLoader\u003cGameObject\u003e`.\n```csharp\n[SerializeField]  \nprivate AssetReferenceComponent\u003cCamera\u003e _cameraReference;\n\nIAssetsReferenceLoader\u003cGameObject\u003e gameObjectLoader =  \n new AssetsReferenceLoader\u003cGameObject\u003e();  \n  \n//AssetReferenceComponent\u003cT\u003e can be passed to IAssetsReferenceLoader\u003cGameObject\u003e  \n//since it is inherited from AssetReferenceGameObject  \nawait gameObjectLoader.PreloadAssetAsync(_cameraReference);  \n  \n//Safely extract preloaded GameObject with Camera component on it  \nif(gameObjectLoader.TryGetComponent(_cameraReference, out Camera camera))  \n{  \n Camera cameraInstance = Object.Instantiate(camera);  \n}  \n  \n//Or use unsafe asset extraction, will throw exception if no asset was preloaded  \nvar cameraComponent = gameObjectLoader.GetComponent(_cameraReference);\n```\n\n### VContainer extensions\n```csharp\n//Will bind IAssetReferenceLoader\u003cT\u003e to AssetRefereceLoader\u003cT\u003e implementation\nbuilder.RegisterAssetsReferenceLoader\u003cTAsset\u003e(Lifetime.Scoped);\n```\n\n## Downloaders\nAny downloader implements several interfaces: `IStartableDownload\u003cTDownloadResult\u003e`,  \n`IAssetsDownloadStatus\u003cTDownloadStatus\u003e` and optional ` ITrackableProgress\u003cTDownloadStatus\u003e`.\nCurrently only `AssetLabelsDownloadPack` is provided since downloading by `AssetReferenceLabel` is the most common way.\n```csharp\n//Create download pack\nvar downloadPack = new AssetLabelsDownloadPack(_assetLabelReference);\n\n//Set method to track download status changes, accepts implementations of IProgress\u003cT\u003e\n_downloadPack.TrackProgress(Progress.Create\u003cAssetsDownloadStatus\u003e(DisplayStatus));\n\n//Or get status manually\nvar status = _downloadPack.DownloadStatus;\n\n//Start download\nbool isSuccess = await _downloadPack.StartDownloadAsync();\n\nif(!isSuccess){\n //Download can be restarted anytime\n isSuccess = await _downloadPack.StartDownloadAsync();\n}\n\n_downloadPack.Dispose();\n```\n\n```csharp\nprivate void DisplayStatus(AssetsDownloadStatus status)  \n{  \n _downloadSize.text = $\"Size {status.DownloadSizeBytes.ToString()}\";  \n _percentProgress.text = $\"Percent: {status.PercentProgress:F}\";  \n _isDownloaded.text = $\"Is downloaded {status.IsDownloaded}\";  \n _status.text = $\"Status {status.DownloadOperationStatus.ToString()}\";  \n _downloadedBytes.text = $\"Downloaded: {status.DownloadedBytes.ToString()}\";  \n}\n```\n\n## AssetReferences\nSimple Unity `ScriptableObject` Dictionaries for `AssetLabelReference` and `AssetReference\u003cT\u003e`:\n- `AssetLabelsUDictionarySo\u003cTKey\u003e`\n- `AssetReferencesUDictionarySo\u003cTKey, TAsset\u003e`\n\n## Fonts\n\u003e When using TMP with Addressables without initial preparations there will be either duplicated assets or broken Unity Editor workflow.\n\n1. Inherit `TMPAddressableAssets\u003cTLocaleKey, TSpriteAssetKey\u003e`\n2. Create `ScriptableObject` instance, set it up with fonts/sprite assets addressable references\n3. Create instance of `TMPBuildProcessorSettings`, set it up\n```csharp\nTMPAddressableAssets\u003cstring, string\u003e assets;\nIAssetsReferenceLoader\u003cTMP_FontAsset\u003e fontsLoader;\nIAssetsReferenceLoader\u003cTMP_SpriteAsset\u003e spriteAssetsLoader;\n\n//Setup/bind service instance\nIFontsService\u003cstring, string\u003e service = new FontsService\u003cstring, string\u003e(\n  assets, fontsLoader, spriteAssetsLoader\n);\n\n//Load font by locale\nawait service.LoadFontForLocale(\"en\");\n\n//Unload unused fonts\nservice.UnloadFontForLocale(\"ru\");\n\nawait service.LoadSpriteAsset(\"CurrencyIcons\");\n\nservice.UnloadSpriteAsset(\"CurrencyIcons\");\n\n```\n\n## SpriteAtlases\n`ISpriteAtlasProvider`  implementation can be used to control Unity `SpriteAtlase` loading/unloading at runtime via `Addressables`.\n```csharp\nIAssetsReferenceLoader\u003cSpriteAtlas\u003e spriteAtlasLoader;  \nISpriteAtlasAddressableAssets spriteAtlasAddressableAssets;\n\nISpriteAtlasProvider provider = new SpriteAtlasProvider(\n  spriteAtlasLoader, spriteAtlasAddressableAssets\n);\n\n//Listen SpriteAtlasManager atlas requests\n//Requeted SpriteAtlases will be loaded automatically\nprovider.SubscribeToAtlasManagerRequests();\n\n//Unload all SpriteAtlases that we loaded by this provider\nprovider.UnloadSpriteAtlases();\n\nprovider.UnsubscribeFromAtlasManagerRequests();\n```\n### VContainer extensions\nEntry point for managing provider lifetime:\n ```csharp\n builder.RegisterEntryPoint\u003cSpriteAtlasesProviderEntryPoint\u003e();\n ```\n\n# License\nThe software released under the terms of the [MIT license](./LICENSE.md).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdre0dru%2FAssetManagement","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdre0dru%2FAssetManagement","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdre0dru%2FAssetManagement/lists"}