├── .github └── FUNDING.yml ├── .gitignore ├── .vscode ├── extensions.json ├── launch.json └── settings.json ├── .vsconfig ├── AlternativeDestributionOptions.md ├── Assets ├── _PackageRoot.meta └── _PackageRoot │ ├── Documentation~ │ ├── .gitignore │ └── README.md │ ├── Editor.meta │ ├── Editor │ ├── Gizmos.meta │ ├── Gizmos │ │ └── .gitignore │ ├── Scripts.meta │ └── Scripts │ │ └── .gitignore │ ├── README.md │ ├── README.md.meta │ ├── Runtime.meta │ ├── Runtime │ ├── .gitignore │ ├── AudioLoader.AudioSource.cs │ ├── AudioLoader.AudioSource.cs.meta │ ├── AudioLoader.DiskCache.cs │ ├── AudioLoader.DiskCache.cs.meta │ ├── AudioLoader.MemoryCache.cs │ ├── AudioLoader.MemoryCache.cs.meta │ ├── AudioLoader.Settings.cs │ ├── AudioLoader.Settings.cs.meta │ ├── AudioLoader.cs │ ├── AudioLoader.cs.meta │ ├── Extensions.Unity.AudioLoader.asmdef │ ├── Extensions.Unity.AudioLoader.asmdef.meta │ ├── LimitedConcurrencyLevelTaskScheduler.cs │ └── LimitedConcurrencyLevelTaskScheduler.cs.meta │ ├── Samples~ │ └── .gitignore │ ├── Tests.meta │ ├── Tests │ ├── Editor.meta │ ├── Editor │ │ ├── .gitignore │ │ ├── Extensions.Unity.AudioLoader.Editor.Tests.asmdef │ │ ├── Extensions.Unity.AudioLoader.Editor.Tests.asmdef.meta │ │ ├── TestCache.cs │ │ ├── TestCache.cs.meta │ │ ├── TestLoading.cs │ │ └── TestLoading.cs.meta │ ├── Runtime.meta │ └── Runtime │ │ └── .gitignore │ ├── package.json │ └── package.json.meta ├── Commands ├── NPM--AddUser.bat ├── NPM--CopyREADME.bat ├── NPM--UpdateDependencies.bat ├── NPM--VersionMajor.bat ├── NPM--VersionMinor.bat ├── NPM--VersionPatch.bat ├── [!!!]--GitHub--Release.bat ├── [!!!]--NPM--Publish.bat └── [!]--GitHub--DraftRelease.bat ├── Header-Full.png ├── Header.jpg ├── LICENSE ├── Packages ├── manifest.json └── packages-lock.json ├── ProjectSettings ├── AudioManager.asset ├── ClusterInputManager.asset ├── DynamicsManager.asset ├── EditorBuildSettings.asset ├── EditorSettings.asset ├── GraphicsSettings.asset ├── InputManager.asset ├── MemorySettings.asset ├── NavMeshAreas.asset ├── PackageManagerSettings.asset ├── Physics2DSettings.asset ├── PresetManager.asset ├── ProjectSettings.asset ├── ProjectVersion.txt ├── QualitySettings.asset ├── TagManager.asset ├── TimeManager.asset ├── UnityConnectSettings.asset ├── VFXManager.asset └── VersionControlSettings.asset ├── README.md ├── Test Audio Files ├── sample.aiff ├── sample.mp3 └── sample.wav └── UserSettings ├── EditorUserSettings.asset ├── Search.index └── Search.settings /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: IvanMurzak 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 12 | polar: # Replace with a single Polar username 13 | buy_me_a_coffee: # Replace with a single Buy Me a Coffee username 14 | thanks_dev: # Replace with a single thanks.dev username 15 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # This .gitignore file should be placed at the root of your Unity project directory 2 | # 3 | # Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore 4 | # 5 | /[Ll]ibrary/ 6 | /[Tt]emp/ 7 | /[Oo]bj/ 8 | /[Bb]uild/ 9 | /[Bb]uilds/ 10 | /[Ll]ogs/ 11 | /[Mm]emoryCaptures/ 12 | 13 | # Asset meta data should only be ignored when the corresponding asset is also ignored 14 | !/[Aa]ssets/**/*.meta 15 | 16 | # Uncomment this line if you wish to ignore the asset store tools plugin 17 | # /[Aa]ssets/AssetStoreTools* 18 | 19 | # Autogenerated Jetbrains Rider plugin 20 | [Aa]ssets/Plugins/Editor/JetBrains* 21 | 22 | # Visual Studio cache directory 23 | .vs/ 24 | 25 | # Gradle cache directory 26 | .gradle/ 27 | 28 | # Autogenerated VS/MD/Consulo solution and project files 29 | ExportedObj/ 30 | .consulo/ 31 | *.csproj 32 | *.unityproj 33 | *.sln 34 | *.suo 35 | *.tmp 36 | *.user 37 | *.userprefs 38 | *.pidb 39 | *.booproj 40 | *.svd 41 | *.pdb 42 | *.mdb 43 | *.opendb 44 | *.VC.db 45 | 46 | # Unity3D generated meta files 47 | *.pidb.meta 48 | *.pdb.meta 49 | *.mdb.meta 50 | 51 | # Unity3D generated file on crash reports 52 | sysinfo.txt 53 | 54 | # Builds 55 | *.apk 56 | *.unitypackage 57 | 58 | # Crashlytics generated file 59 | crashlytics-build.properties 60 | 61 | */AndroidLogcatSettings.asset 62 | /Assets/StreamingAssets 63 | 64 | # Crashlytics generated file 65 | crashlytics-build.properties 66 | 67 | # ODIN Ignore the auto-generated AOT compatibility dll. 68 | /Assets/Plugins/Sirenix/Assemblies/AOT/* 69 | /Assets/Plugins/Sirenix/Assemblies/AOT** 70 | 71 | # ODIN Ignore all unpacked demos. 72 | /Assets/Plugins/Sirenix/Demos/* 73 | 74 | # ODIN plugin 75 | /Assets/Plugins/Sirenix** 76 | 77 | UserSettings/* -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "visualstudiotoolsforunity.vstuc" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Attach to Unity", 6 | "type": "vstuc", 7 | "request": "attach", 8 | } 9 | ] 10 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.exclude": 3 | { 4 | "**/.DS_Store":true, 5 | "**/.git":true, 6 | "**/.vs":true, 7 | "**/.gitmodules":true, 8 | "**/.vsconfig":true, 9 | "**/*.booproj":true, 10 | "**/*.pidb":true, 11 | "**/*.suo":true, 12 | "**/*.user":true, 13 | "**/*.userprefs":true, 14 | "**/*.unityproj":true, 15 | "**/*.dll":true, 16 | "**/*.exe":true, 17 | "**/*.pdf":true, 18 | "**/*.mid":true, 19 | "**/*.midi":true, 20 | "**/*.wav":true, 21 | "**/*.gif":true, 22 | "**/*.ico":true, 23 | "**/*.jpg":true, 24 | "**/*.jpeg":true, 25 | "**/*.png":true, 26 | "**/*.psd":true, 27 | "**/*.tga":true, 28 | "**/*.tif":true, 29 | "**/*.tiff":true, 30 | "**/*.3ds":true, 31 | "**/*.3DS":true, 32 | "**/*.fbx":true, 33 | "**/*.FBX":true, 34 | "**/*.lxo":true, 35 | "**/*.LXO":true, 36 | "**/*.ma":true, 37 | "**/*.MA":true, 38 | "**/*.obj":true, 39 | "**/*.OBJ":true, 40 | "**/*.asset":true, 41 | "**/*.cubemap":true, 42 | "**/*.flare":true, 43 | "**/*.mat":true, 44 | "**/*.meta":true, 45 | "**/*.prefab":true, 46 | "**/*.unity":true, 47 | "build/":true, 48 | "Build/":true, 49 | "Library/":true, 50 | "library/":true, 51 | "obj/":true, 52 | "Obj/":true, 53 | "Logs/":true, 54 | "logs/":true, 55 | "ProjectSettings/":true, 56 | "UserSettings/":true, 57 | "temp/":true, 58 | "Temp/":true 59 | }, 60 | "omnisharp.enableRoslynAnalyzers": true 61 | } -------------------------------------------------------------------------------- /.vsconfig: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0", 3 | "components": [ 4 | "Microsoft.VisualStudio.Workload.ManagedGame" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /AlternativeDestributionOptions.md: -------------------------------------------------------------------------------- 1 | # NPMJS 2 | ![image](https://user-images.githubusercontent.com/9135028/198755166-5d0f50a7-33e1-4c18-9462-ed880d099908.png) 3 | 4 | NPMJS is the most popular Package destribution portal in the world. It is used for any packages from different programming areas of knowledge. We are interesting in using the platform for having dependencies on Unity packages only and publishing our own. It is free to use and work very well for my opinion. 5 | ### Pros 6 | - Ultra fast deployment 7 | - Easy creation of new versions 8 | - Unity Package Manager supports versioning from NPMJS 9 | - Trusted platform by huge community 10 | ### Cons 11 | - Need to create account and authorize once 12 | 13 |

14 | 15 | # OpenUPM 16 | ![image](https://user-images.githubusercontent.com/9135028/198767467-993b7b46-7d5f-440a-a15e-2d7c7b968bcb.png) 17 | 18 | Popular in Unity community platform for package destribution. Created as open sourced project for helping people to destribute their packages. 19 | ### Pros 20 | - Made especially for Unity 21 | - No registration needed 22 | - Package can be deployed directly from GitHub repository 23 | ### Cons 24 | - Long deployment duration (10 - 60 minutes) 25 | - Small community (in comparison to other options) 26 | 27 |

28 | 29 | # GitHub Packages 30 | ![image](https://user-images.githubusercontent.com/9135028/198767290-688cf8eb-a350-40c4-beb6-a50dcbe536a6.png) 31 | 32 | Amazing GitHub feature, also Unity support it 33 | ### Pros 34 | - Ultra fast deployment 35 | - Trusted platform by huge community 36 | ### Cons 37 | - Does not support version fetching, it means you can't see when new version of the package is available in UPM. To install new version you should manually change the version in a project. 38 | 39 |

40 | 41 | # GitHub Repository 42 | ![image](https://user-images.githubusercontent.com/9135028/198767290-688cf8eb-a350-40c4-beb6-a50dcbe536a6.png) 43 | 44 | Unity UPM support direct GitHub links to public repositories for using them as a package. The only required thing - the link should point on a folder which contains `package.json` file. 45 | ### Pros 46 | - no special steps required, just use your public repository as a package in UPM 47 | ### Cons 48 | - Does not support version fetching, it means you can't see when new version of the package is available in UPM. To install new version you should manually change the version in a project. 49 | 50 |

51 | 52 | # How to use 53 | - "Use this template" green button at top right corner of GitHub page 54 | - Clone your new repository 55 | - Add all your stuff to Assets/_PackageRoot directory 56 | - Update Assets/_PackageRoot/package.json to yours 57 | - (on Windows) execute gitSubTreePushToUPM.bat 58 | - (on Mac) execute gitSubTreePushToUPM.makefile 59 | 60 | - (optional) Create release from UPM branch on GitHub web page for support different versions 61 | 62 | ![alt text](https://neogeek.dev/images/creating-custom-packages-for-unity-2018.3--git-release.png) 63 | 64 | 65 | # How to import your package to Unity project 66 | You may use one of the variants 67 | 68 | ## Variant 1 69 | - Select "Add package from git URL" 70 | - Paste URL to your GitHub repository with simple modification: 71 | - https://github.com/USER/REPO.git#upm 72 | Dont forget to replace **USER** and **REPO** to yours 73 | 74 | ![alt text](https://neogeek.dev/images/creating-custom-packages-for-unity-2018.3--package-manager.png) 75 | 76 | ### **Or** you may use special version if you create one 77 | https://github.com/USER/REPO.git#v1.0.0 78 | Dont forget to replace **USER** and **REPO** to yours 79 | 80 | ## Variant 2 81 | Modify manifest.json file. Change "your.own.package" to the name of your package. 82 | Dont forget to replace **USER** and **REPO** to yours. 83 |
{
84 |     "dependencies": {
85 |         "your.own.package": "https://github.com/USER/REPO.git#upm"
86 |     }
87 | }
88 | 
89 | 90 | ### **Or** you may use special version if you create one 91 | Dont forget to replace **USER** and **REPO** to yours. 92 |
{
93 |     "dependencies": {
94 |         "your.own.package": "https://github.com/USER/REPO.git#v1.0.0"
95 |     }
96 | }
97 | 
98 | -------------------------------------------------------------------------------- /Assets/_PackageRoot.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 74eef2d7f723dee4ea8edf6e9fbfc9c5 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/_PackageRoot/Documentation~/.gitignore: -------------------------------------------------------------------------------- 1 | # Except this file 2 | !.gitignore -------------------------------------------------------------------------------- /Assets/_PackageRoot/Documentation~/README.md: -------------------------------------------------------------------------------- 1 | # Unity Audio Loader 2 | 3 | ![npm](https://img.shields.io/npm/v/extensions.unity.audioloader) [![openupm](https://img.shields.io/npm/v/extensions.unity.audioloader?label=openupm®istry_uri=https://package.openupm.com)](https://openupm.com/packages/extensions.unity.audioloader/) ![License](https://img.shields.io/github/license/IvanMurzak/Unity-AudioLoader) [![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg)](https://stand-with-ukraine.pp.ua) 4 | 5 | Async audio loader with two caching layers for Unity. 6 | 7 | ## Features 8 | 9 | - ✔️ Async loading from **Web** or **Local** `AudioLoader.LoadAudioClip(audioURL);` 10 | - ✔️ **Memory** and **Disk** caching - tries to load from memory first, then from disk 11 | - ✔️ Dedicated thread for disk operations 12 | - ✔️ Avoids loading same audio multiple times simultaneously, task waits for completion the first and just returns loaded audio if at least one cache layer activated 13 | - ✔️ Auto set to AudioSource `AudioLoader.SetAudioSource(audioURL, audioSource);` 14 | - ✔️ Debug level for logging `AudioLoader.settings.debugLevel = DebugLevel.Error;` 15 | 16 | # Usage 17 | 18 | In main thread somewhere at start of the project need to call `AudioLoader.Init();` once to initialize static properties in right thread. It is required to make in main thread. Then you can use `AudioLoader` from any thread and any time. 19 | 20 | ## Sample - Loading audio file, set to AudioSource 21 | 22 | ``` C# 23 | using Extensions.Unity.AudioLoader; 24 | using Cysharp.Threading.Tasks; 25 | 26 | public class AudioLoaderSample : MonoBehaviour 27 | { 28 | [SerializeField] string audioURL; 29 | [SerializeField] AudioSource audioSource; 30 | 31 | async void Start() 32 | { 33 | // Loading audio file from web, cached for quick load next time 34 | audioSource.clip = await AudioLoader.LoadAudioClip(audioURL); 35 | 36 | // Same loading with auto set to audio 37 | await AudioLoader.SetAudioSource(audioURL, audioSource); 38 | } 39 | } 40 | ``` 41 | 42 | ## Sample - Loading audio into multiple Audio components 43 | 44 | ``` C# 45 | using Extensions.Unity.AudioLoader; 46 | using Cysharp.Threading.Tasks; 47 | 48 | public class AudioLoaderSample : MonoBehaviour 49 | { 50 | [SerializeField] string audioURL; 51 | [SerializeField] AudioSource audioSource1; 52 | [SerializeField] AudioSource audioSource2; 53 | 54 | void Start() 55 | { 56 | // Loading with auto set to audio 57 | AudioLoader.SetAudioSource(audioURL, audioSource1, audioSource2).Forget(); 58 | } 59 | } 60 | ``` 61 | 62 | # Cache 63 | 64 | Cache system based on the two layers. First layer is **memory cache**, second is **disk cache**. Each layer could be enabled or disabled. Could be used without caching at all. By default both layers are enabled. 65 | 66 | ## Setup Cache 67 | 68 | - `AudioLoader.settings.useMemoryCache = true;` default value is `true` 69 | - `AudioLoader.settings.useDiskCache = true;` default value is `true` 70 | 71 | Change disk cache folder: 72 | 73 | ``` C# 74 | AudioLoader.settings.diskSaveLocation = Application.persistentDataPath + "/myCustomFolder"; 75 | ``` 76 | 77 | ## Override Cache 78 | 79 | ``` C# 80 | // Override Memory cache for specific audio 81 | AudioLoader.SaveToMemoryCache(url, audioClip); 82 | 83 | // Take from Memory cache for specific audio file if exists 84 | AudioLoader.LoadFromMemoryCache(url); 85 | ``` 86 | 87 | ## Does Cache contain audio 88 | 89 | ``` C# 90 | // Check if any cache contains specific audio file 91 | AudioLoader.CacheContains(url); 92 | 93 | // Check if Memory cache contains specific audio file 94 | AudioLoader.MemoryCacheContains(url); 95 | 96 | // Check if Memory cache contains specific audio file 97 | AudioLoader.DiskCacheContains(url); 98 | ``` 99 | 100 | ## Clear Cache 101 | 102 | ``` C# 103 | // Clear memory Memory and Disk cache 104 | AudioLoader.ClearCache(); 105 | 106 | // Clear only Memory cache for all audio files 107 | AudioLoader.ClearMemoryCache(); 108 | 109 | // Clear only Memory cache for specific audio file 110 | AudioLoader.ClearMemoryCache(url); 111 | 112 | // Clear only Disk cache for all audio files 113 | AudioLoader.ClearDiskCache(); 114 | 115 | // Clear only Disk cache for specific audio file 116 | AudioLoader.ClearDiskCache(url); 117 | ``` 118 | 119 | # Installation 120 | 121 | - [Install OpenUPM-CLI](https://github.com/openupm/openupm-cli#installation) 122 | - Open command line in Unity project folder 123 | - Run the command 124 | 125 | ``` CLI 126 | openupm add extensions.unity.audioloader 127 | ``` 128 | -------------------------------------------------------------------------------- /Assets/_PackageRoot/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 197ccdd7d24df8c43b73e9e90cd41999 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/_PackageRoot/Editor/Gizmos.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c2f19e30d068eda41926bedfc2a0822b 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/_PackageRoot/Editor/Gizmos/.gitignore: -------------------------------------------------------------------------------- 1 | # Except this file 2 | !.gitignore -------------------------------------------------------------------------------- /Assets/_PackageRoot/Editor/Scripts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b43cdf50ff69fa748bec1936e75843f7 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/_PackageRoot/Editor/Scripts/.gitignore: -------------------------------------------------------------------------------- 1 | # Except this file 2 | !.gitignore -------------------------------------------------------------------------------- /Assets/_PackageRoot/README.md: -------------------------------------------------------------------------------- 1 | # Unity Audio Loader 2 | 3 | ![npm](https://img.shields.io/npm/v/extensions.unity.audioloader) [![openupm](https://img.shields.io/npm/v/extensions.unity.audioloader?label=openupm®istry_uri=https://package.openupm.com)](https://openupm.com/packages/extensions.unity.audioloader/) ![License](https://img.shields.io/github/license/IvanMurzak/Unity-AudioLoader) [![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg)](https://stand-with-ukraine.pp.ua) 4 | 5 | Async audio loader with two caching layers for Unity. 6 | 7 | ## Features 8 | 9 | - ✔️ Async loading from **Web** or **Local** `AudioLoader.LoadAudioClip(audioURL);` 10 | - ✔️ **Memory** and **Disk** caching - tries to load from memory first, then from disk 11 | - ✔️ Dedicated thread for disk operations 12 | - ✔️ Avoids loading same audio multiple times simultaneously, task waits for completion the first and just returns loaded audio if at least one cache layer activated 13 | - ✔️ Auto set to AudioSource `AudioLoader.SetAudioSource(audioURL, audioSource);` 14 | - ✔️ Debug level for logging `AudioLoader.settings.debugLevel = DebugLevel.Error;` 15 | 16 | # Usage 17 | 18 | In main thread somewhere at start of the project need to call `AudioLoader.Init();` once to initialize static properties in right thread. It is required to make in main thread. Then you can use `AudioLoader` from any thread and any time. 19 | 20 | ## Sample - Loading audio file, set to AudioSource 21 | 22 | ``` C# 23 | using Extensions.Unity.AudioLoader; 24 | using Cysharp.Threading.Tasks; 25 | 26 | public class AudioLoaderSample : MonoBehaviour 27 | { 28 | [SerializeField] string audioURL; 29 | [SerializeField] AudioSource audioSource; 30 | 31 | async void Start() 32 | { 33 | // Loading audio file from web, cached for quick load next time 34 | audioSource.clip = await AudioLoader.LoadAudioClip(audioURL); 35 | 36 | // Same loading with auto set to audio 37 | await AudioLoader.SetAudioSource(audioURL, audioSource); 38 | } 39 | } 40 | ``` 41 | 42 | ## Sample - Loading audio into multiple Audio components 43 | 44 | ``` C# 45 | using Extensions.Unity.AudioLoader; 46 | using Cysharp.Threading.Tasks; 47 | 48 | public class AudioLoaderSample : MonoBehaviour 49 | { 50 | [SerializeField] string audioURL; 51 | [SerializeField] AudioSource audioSource1; 52 | [SerializeField] AudioSource audioSource2; 53 | 54 | void Start() 55 | { 56 | // Loading with auto set to audio 57 | AudioLoader.SetAudioSource(audioURL, audioSource1, audioSource2).Forget(); 58 | } 59 | } 60 | ``` 61 | 62 | # Cache 63 | 64 | Cache system based on the two layers. First layer is **memory cache**, second is **disk cache**. Each layer could be enabled or disabled. Could be used without caching at all. By default both layers are enabled. 65 | 66 | ## Setup Cache 67 | 68 | - `AudioLoader.settings.useMemoryCache = true;` default value is `true` 69 | - `AudioLoader.settings.useDiskCache = true;` default value is `true` 70 | 71 | Change disk cache folder: 72 | 73 | ``` C# 74 | AudioLoader.settings.diskSaveLocation = Application.persistentDataPath + "/myCustomFolder"; 75 | ``` 76 | 77 | ## Override Cache 78 | 79 | ``` C# 80 | // Override Memory cache for specific audio 81 | AudioLoader.SaveToMemoryCache(url, audioClip); 82 | 83 | // Take from Memory cache for specific audio file if exists 84 | AudioLoader.LoadFromMemoryCache(url); 85 | ``` 86 | 87 | ## Does Cache contain audio 88 | 89 | ``` C# 90 | // Check if any cache contains specific audio file 91 | AudioLoader.CacheContains(url); 92 | 93 | // Check if Memory cache contains specific audio file 94 | AudioLoader.MemoryCacheContains(url); 95 | 96 | // Check if Memory cache contains specific audio file 97 | AudioLoader.DiskCacheContains(url); 98 | ``` 99 | 100 | ## Clear Cache 101 | 102 | ``` C# 103 | // Clear memory Memory and Disk cache 104 | AudioLoader.ClearCache(); 105 | 106 | // Clear only Memory cache for all audio files 107 | AudioLoader.ClearMemoryCache(); 108 | 109 | // Clear only Memory cache for specific audio file 110 | AudioLoader.ClearMemoryCache(url); 111 | 112 | // Clear only Disk cache for all audio files 113 | AudioLoader.ClearDiskCache(); 114 | 115 | // Clear only Disk cache for specific audio file 116 | AudioLoader.ClearDiskCache(url); 117 | ``` 118 | 119 | # Installation 120 | 121 | - [Install OpenUPM-CLI](https://github.com/openupm/openupm-cli#installation) 122 | - Open command line in Unity project folder 123 | - Run the command 124 | 125 | ``` CLI 126 | openupm add extensions.unity.audioloader 127 | ``` 128 | -------------------------------------------------------------------------------- /Assets/_PackageRoot/README.md.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d56290d1d0c380c48a6731a5d8f8baea 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/_PackageRoot/Runtime.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e9390d4a8618b324eb78ce585ce15672 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/_PackageRoot/Runtime/.gitignore: -------------------------------------------------------------------------------- 1 | # Except this file 2 | !.gitignore -------------------------------------------------------------------------------- /Assets/_PackageRoot/Runtime/AudioLoader.AudioSource.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine; 3 | using Cysharp.Threading.Tasks; 4 | 5 | namespace Extensions.Unity.AudioLoader 6 | { 7 | public static partial class AudioLoader 8 | { 9 | /// 10 | /// Load audio file from URL and set it to the AudioSource component 11 | /// 12 | /// URL to the audio file, web or local 13 | /// AudioSource component from Unity UI 14 | /// Ignore error if the audio file was not found by specified url 15 | /// Returns async task 16 | public static async UniTask SetAudioSource(string url, AudioSource audioSource, bool ignoreImageNotFoundError = false) 17 | { 18 | try 19 | { 20 | if (audioSource == null || audioSource.gameObject == null) 21 | return; 22 | 23 | var audioClip = await LoadAudioClip(url, ignoreImageNotFoundError); 24 | UniTask.Post(() => 25 | { 26 | if (audioSource == null || GameObject.Equals(audioSource.gameObject, null)) 27 | return; 28 | try 29 | { 30 | audioSource.clip = audioClip; 31 | } 32 | catch (Exception e) 33 | { 34 | if (settings.debugLevel <= DebugLevel.Exception) 35 | Debug.LogException(e); 36 | } 37 | }); 38 | } 39 | catch (Exception e) 40 | { 41 | if (settings.debugLevel <= DebugLevel.Exception) 42 | Debug.LogException(e); 43 | } 44 | } 45 | 46 | /// 47 | /// Load audio file from URL and set it to the AudioSource components 48 | /// 49 | /// URL to the audio file, web or local 50 | /// Array of AudioSource components from Unity UI 51 | /// Returns async task 52 | public static UniTask SetAudioSource(string url, params AudioSource[] audioSources) 53 | => SetAudioSource(url, false, audioSources); 54 | 55 | /// 56 | /// Load audio file from URL and set it to the AudioSource components 57 | /// 58 | /// URL to the audio file, web or local 59 | /// Ignore error if the audio file was not found by specified url 60 | /// Array of AudioSource components from Unity UI 61 | /// Returns async task 62 | public static async UniTask SetAudioSource(string url, bool ignoreAudioFileNotFoundError = false, params AudioSource[] audioSources) 63 | { 64 | if (audioSources == null) 65 | return; 66 | 67 | var audioClip = await LoadAudioClip(url, ignoreAudioFileNotFoundError); 68 | UniTask.Post(() => 69 | { 70 | for (var i = 0; i < audioSources.Length; i++) 71 | { 72 | try 73 | { 74 | if (audioSources[i] == null || GameObject.Equals((object)audioSources[i].gameObject, null)) 75 | continue; 76 | 77 | audioSources[i].clip = audioClip; 78 | } 79 | catch (Exception e) 80 | { 81 | if (settings.debugLevel <= DebugLevel.Exception) 82 | Debug.LogException(e); 83 | } 84 | } 85 | }); 86 | } 87 | } 88 | } -------------------------------------------------------------------------------- /Assets/_PackageRoot/Runtime/AudioLoader.AudioSource.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1ab5fc41fc0c58944a7fff156cfb0f7d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/_PackageRoot/Runtime/AudioLoader.DiskCache.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using System.Threading.Tasks; 4 | 5 | namespace Extensions.Unity.AudioLoader 6 | { 7 | public static partial class AudioLoader 8 | { 9 | internal static readonly TaskFactory diskTaskFactory = new TaskFactory(new LimitedConcurrencyLevelTaskScheduler(1)); 10 | private static string DiskCachePath(string url) => $"{settings.diskSaveLocation}/I_{url.GetHashCode()}"; 11 | private static void SaveDisk(string url, byte[] data) 12 | { 13 | if (!settings.useDiskCache) return; 14 | Directory.CreateDirectory(settings.diskSaveLocation); 15 | Directory.CreateDirectory(Path.GetDirectoryName(DiskCachePath(url))); 16 | File.WriteAllBytes(DiskCachePath(url), data); 17 | } 18 | private static float[] LoadDisk(string url) 19 | { 20 | if (!settings.useDiskCache) return null; 21 | Directory.CreateDirectory(settings.diskSaveLocation); 22 | Directory.CreateDirectory(Path.GetDirectoryName(DiskCachePath(url))); 23 | if (!DiskCacheContains(url)) return null; 24 | return ConvertByteToFloat(File.ReadAllBytes(DiskCachePath(url))); 25 | } 26 | private static Task SaveDiskAsync(string url, byte[] data) 27 | { 28 | if (!settings.useDiskCache) 29 | return Task.CompletedTask; 30 | 31 | return diskTaskFactory.StartNew(() => SaveDisk(url, data)); 32 | } 33 | private static Task LoadDiskAsync(string url) 34 | { 35 | if (!settings.useDiskCache) 36 | return Task.FromResult(null); 37 | 38 | return diskTaskFactory.StartNew(() => LoadDisk(url)); 39 | } 40 | 41 | /// 42 | /// Check if the AudioClip is cached on disk 43 | /// 44 | /// URL to the audio file, web or local 45 | /// Returns true if AudioClip is cached on disk 46 | public static bool DiskCacheContains(string url) => File.Exists(DiskCachePath(url)); 47 | 48 | /// 49 | /// Check if the AudioClip is cached on disk 50 | /// 51 | /// URL to the audio file, web or local 52 | /// Returns true if AudioClip is cached on disk 53 | public static Task DiskCacheExistsAsync(string url) 54 | { 55 | var path = DiskCachePath(url); 56 | return diskTaskFactory.StartNew(() => File.Exists(path)); 57 | } 58 | 59 | /// 60 | /// Clear Disk cache for all urls 61 | /// 62 | public static Task ClearDiskCache() 63 | { 64 | return diskTaskFactory.StartNew(() => 65 | { 66 | if (Directory.Exists(settings.diskSaveLocation)) 67 | Directory.Delete(settings.diskSaveLocation, true); 68 | }); 69 | } 70 | 71 | /// 72 | /// Clear Disk cache for the given url 73 | /// 74 | /// URL to the audio file, web or local 75 | public static Task ClearDiskCache(string url) 76 | { 77 | var diskPath = DiskCachePath(url); 78 | return diskTaskFactory.StartNew(() => 79 | { 80 | if (!File.Exists(diskPath)) return; 81 | File.Delete(diskPath); 82 | }); 83 | } 84 | 85 | private static float[] ConvertByteToFloat(byte[] array) 86 | { 87 | if ((array?.Length ?? 0) == 0) 88 | return null; 89 | 90 | var floatArr = new float[array.Length / 4]; 91 | for (var i = 0; i < floatArr.Length; i++) 92 | { 93 | if (BitConverter.IsLittleEndian) 94 | Array.Reverse(array, i * 4, 4); 95 | 96 | floatArr[i] = BitConverter.ToSingle(array, i * 4) / 0x80000000; 97 | } 98 | return floatArr; 99 | } 100 | } 101 | } -------------------------------------------------------------------------------- /Assets/_PackageRoot/Runtime/AudioLoader.DiskCache.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 37f6ca60dc662484690e8aafb9b29396 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/_PackageRoot/Runtime/AudioLoader.MemoryCache.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UnityEngine; 3 | 4 | namespace Extensions.Unity.AudioLoader 5 | { 6 | public static partial class AudioLoader 7 | { 8 | internal static Dictionary memoryAudioClipCache = new Dictionary(); 9 | 10 | /// 11 | /// Check if the Memory cache contains AudioClip for the given url 12 | /// 13 | /// URL to the audio file, web or local 14 | /// Returns true if AudioClip exists in Memory cache 15 | public static bool MemoryCacheContains(string url) 16 | { 17 | return memoryAudioClipCache.ContainsKey(url); 18 | } 19 | /// 20 | /// Save AudioClip to Memory cache directly. Should be used for overloading cache system 21 | /// 22 | /// URL to the audio file, web or local 23 | /// AudioClip which should be saved 24 | /// replace existed cached AudioClip if any 25 | public static void SaveToMemoryCache(string url, AudioClip audioClip, bool replace = false) 26 | { 27 | if (!settings.useMemoryCache) return; 28 | if (!replace && memoryAudioClipCache.ContainsKey(url)) 29 | { 30 | if (settings.debugLevel <= DebugLevel.Warning) 31 | Debug.LogError($"[AudioLoader] Memory cache already contains key: {url}"); 32 | return; 33 | } 34 | memoryAudioClipCache[url] = audioClip; 35 | } 36 | /// 37 | /// Loads directly from Memory cache if exists and allowed 38 | /// 39 | /// URL to the audio file, web or local 40 | /// Returns null if not allowed to use Memory cache or if there is no cached AudioClip 41 | public static AudioClip LoadFromMemoryCache(string url) 42 | { 43 | if (!settings.useMemoryCache) return null; 44 | return memoryAudioClipCache.GetValueOrDefault(url); 45 | } 46 | /// 47 | /// Clear Memory cache for the given url 48 | /// 49 | /// URL to the audio file, web or local 50 | public static void ClearMemoryCache(string url) 51 | { 52 | var cache = memoryAudioClipCache.GetValueOrDefault(url); 53 | UnityEngine.Object.DestroyImmediate(cache); 54 | 55 | memoryAudioClipCache.Remove(url); 56 | } 57 | /// 58 | /// Clear Memory cache for all urls 59 | /// 60 | /// URL to the audio file, web or local 61 | public static void ClearMemoryCache() 62 | { 63 | foreach (var cache in memoryAudioClipCache.Values) 64 | UnityEngine.Object.DestroyImmediate(cache); 65 | 66 | memoryAudioClipCache.Clear(); 67 | } 68 | } 69 | } -------------------------------------------------------------------------------- /Assets/_PackageRoot/Runtime/AudioLoader.MemoryCache.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 92fe858ecc2241949a01324b420b4189 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/_PackageRoot/Runtime/AudioLoader.Settings.cs: -------------------------------------------------------------------------------- 1 | namespace Extensions.Unity.AudioLoader 2 | { 3 | public static partial class AudioLoader 4 | { 5 | public static readonly Settings settings = new Settings(); 6 | } 7 | public partial class Settings 8 | { 9 | public DebugLevel debugLevel = DebugLevel.Error; 10 | public bool useMemoryCache = true; 11 | #if UNITY_WEBGL 12 | public bool useDiskCache = false; // default value for WebGL = false 13 | #else 14 | public bool useDiskCache = true; // default value for non WebGL = true 15 | #endif 16 | public string diskSaveLocation { get; set; } = UnityEngine.Application.persistentDataPath + "/audioCache"; 17 | } 18 | 19 | public enum DebugLevel 20 | { 21 | Log = 0, 22 | Warning = 1, 23 | Error = 2, 24 | Exception = 3, 25 | None = 4 26 | } 27 | } -------------------------------------------------------------------------------- /Assets/_PackageRoot/Runtime/AudioLoader.Settings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 422321dc2704f0c41a88939247240a3c 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/_PackageRoot/Runtime/AudioLoader.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine; 3 | using UnityEngine.Networking; 4 | using Cysharp.Threading.Tasks; 5 | using System.Collections.Generic; 6 | using System.Threading.Tasks; 7 | 8 | namespace Extensions.Unity.AudioLoader 9 | { 10 | public static partial class AudioLoader 11 | { 12 | private static HashSet loadingInProcess = new HashSet(); 13 | private static void AddLoading(string url) => loadingInProcess.Add(url); 14 | private static void RemoveLoading(string url) => loadingInProcess.Remove(url); 15 | 16 | /// 17 | /// Initialization of static variables, should be called from main thread at project start 18 | /// 19 | public static void Init() 20 | { 21 | // need get SaveLocation variable in runtime from thread to setup the default static value into it 22 | var temp = settings.diskSaveLocation + settings.diskSaveLocation; 23 | } 24 | 25 | /// 26 | /// Check if the url is loading right now 27 | /// 28 | /// Returns true if the url is loading right now 29 | public static bool IsLoading(string url) => loadingInProcess.Contains(url); 30 | 31 | /// 32 | /// Clear cache from Memory and Disk layers for all urls 33 | /// 34 | public static Task ClearCache() 35 | { 36 | ClearMemoryCache(); 37 | return ClearDiskCache(); 38 | } 39 | 40 | /// 41 | /// Clear cache from Memory and Disk layers for all urls 42 | /// 43 | /// URL to the audio file, web or local 44 | /// Returns AudioClip 45 | public static bool CacheContains(string url) => MemoryCacheContains(url) || DiskCacheContains(url); 46 | 47 | /// 48 | /// Load audio file from web or local path and return it as AudioClip 49 | /// 50 | /// URL to the audio file, web or local 51 | /// Ignore error if the audio file was not found by specified url 52 | /// Returns AudioClip asynchronously 53 | public static async UniTask LoadAudioClip(string url, bool ignoreAudioFileNotFoundError = false) 54 | { 55 | if (string.IsNullOrEmpty(url)) 56 | { 57 | if (settings.debugLevel <= DebugLevel.Error) 58 | Debug.LogError($"[AudioLoader] Empty url. Audio file could not be loaded!"); 59 | return null; 60 | } 61 | 62 | if (MemoryCacheContains(url)) 63 | { 64 | var audioClip = LoadFromMemoryCache(url); 65 | if (audioClip != null) 66 | return audioClip; 67 | } 68 | 69 | if (IsLoading(url)) 70 | { 71 | if (settings.debugLevel <= DebugLevel.Log) 72 | Debug.Log($"[AudioLoader] Waiting while another task is loading the AudioClip url={url}"); 73 | await UniTask.WaitWhile(() => IsLoading(url)); 74 | return await LoadAudioClip(url, ignoreAudioFileNotFoundError); 75 | } 76 | 77 | AddLoading(url); 78 | 79 | if (settings.debugLevel <= DebugLevel.Log) 80 | Debug.Log($"[AudioLoader] Loading new AudioClip into memory url={url}"); 81 | try 82 | { 83 | var cachedAudioFile = await LoadDiskAsync(url); 84 | if (cachedAudioFile != null && cachedAudioFile.Length > 0) 85 | { 86 | await UniTask.SwitchToMainThread(); 87 | var audioClip = AudioClip.Create("CachedAudioClip", cachedAudioFile.Length * 4, 1, 48000, false); 88 | audioClip.SetData(cachedAudioFile, 0); 89 | SaveToMemoryCache(url, audioClip, replace: true); 90 | RemoveLoading(url); 91 | return audioClip; 92 | } 93 | } 94 | catch (Exception e) 95 | { 96 | if (settings.debugLevel <= DebugLevel.Exception) 97 | Debug.LogException(e); 98 | } 99 | 100 | UnityWebRequest request = null; 101 | var finished = false; 102 | UniTask.Post(async () => 103 | { 104 | try 105 | { 106 | request = UnityWebRequestMultimedia.GetAudioClip(url, AudioType.UNKNOWN); 107 | await request.SendWebRequest(); 108 | } 109 | catch (Exception e) 110 | { 111 | if (!ignoreAudioFileNotFoundError) 112 | if (settings.debugLevel <= DebugLevel.Exception) 113 | Debug.LogException(e); 114 | } 115 | finally 116 | { 117 | finished = true; 118 | } 119 | }); 120 | await UniTask.WaitUntil(() => finished); 121 | 122 | RemoveLoading(url); 123 | 124 | #if UNITY_2020_1_OR_NEWER 125 | var isError = request.result != UnityWebRequest.Result.Success; 126 | #else 127 | var isError = request.isNetworkError || request.isHttpError; 128 | #endif 129 | 130 | if (isError) 131 | { 132 | if (settings.debugLevel <= DebugLevel.Error) 133 | #if UNITY_2020_1_OR_NEWER 134 | Debug.LogError($"[AudioLoader] {request.result} {request.error}: url={url}"); 135 | #else 136 | Debug.LogError($"[AudioLoader] {request.error}: url={url}"); 137 | #endif 138 | return null; 139 | } 140 | else 141 | { 142 | await SaveDiskAsync(url, request.downloadHandler.data); 143 | var audioClip = ((DownloadHandlerAudioClip)request.downloadHandler).audioClip; 144 | SaveToMemoryCache(url, audioClip, replace: true); 145 | return audioClip; 146 | } 147 | } 148 | } 149 | } -------------------------------------------------------------------------------- /Assets/_PackageRoot/Runtime/AudioLoader.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b25129e988fa6764f925e6b3ac08908c 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/_PackageRoot/Runtime/Extensions.Unity.AudioLoader.asmdef: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Extensions.Unity.AudioLoader", 3 | "rootNamespace": "Extensions.Unity.AudioLoader", 4 | "references": [ 5 | "UniTask" 6 | ], 7 | "includePlatforms": [], 8 | "excludePlatforms": [], 9 | "allowUnsafeCode": false, 10 | "overrideReferences": false, 11 | "precompiledReferences": [], 12 | "autoReferenced": true, 13 | "defineConstraints": [], 14 | "versionDefines": [], 15 | "noEngineReferences": false 16 | } -------------------------------------------------------------------------------- /Assets/_PackageRoot/Runtime/Extensions.Unity.AudioLoader.asmdef.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fe0d97e744422ab41aee68032d2da800 3 | AssemblyDefinitionImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/_PackageRoot/Runtime/LimitedConcurrencyLevelTaskScheduler.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading; 5 | using System.Threading.Tasks; 6 | using UnityEngine; 7 | 8 | namespace Extensions.Unity.AudioLoader 9 | { 10 | internal class LimitedConcurrencyLevelTaskScheduler : TaskScheduler 11 | { 12 | /// Whether the current thread is processing work items. 13 | [ThreadStatic] 14 | private static bool _currentThreadIsProcessingItems; 15 | /// The list of tasks to be executed. 16 | private readonly LinkedList _tasks = new LinkedList(); // protected by lock(_tasks) 17 | /// The maximum concurrency level allowed by this scheduler. 18 | private readonly int _maxDegreeOfParallelism; 19 | /// Whether the scheduler is currently processing work items. 20 | private int _delegatesQueuedOrRunning = 0; // protected by lock(_tasks) 21 | 22 | /// 23 | /// Initializes an instance of the LimitedConcurrencyLevelTaskScheduler class with the 24 | /// specified degree of parallelism. 25 | /// 26 | /// The maximum degree of parallelism provided by this scheduler. 27 | public LimitedConcurrencyLevelTaskScheduler(int maxDegreeOfParallelism) 28 | { 29 | if (maxDegreeOfParallelism < 1) throw new ArgumentOutOfRangeException("maxDegreeOfParallelism"); 30 | _maxDegreeOfParallelism = maxDegreeOfParallelism; 31 | } 32 | 33 | /// Queues a task to the scheduler. 34 | /// The task to be queued. 35 | protected sealed override void QueueTask(Task task) 36 | { 37 | // Add the task to the list of tasks to be processed. If there aren't enough 38 | // delegates currently queued or running to process tasks, schedule another. 39 | lock (_tasks) 40 | { 41 | _tasks.AddLast(task); 42 | if (_delegatesQueuedOrRunning < _maxDegreeOfParallelism) 43 | { 44 | ++_delegatesQueuedOrRunning; 45 | NotifyThreadPoolOfPendingWork(); 46 | } 47 | } 48 | } 49 | 50 | /// 51 | /// Informs the ThreadPool that there's work to be executed for this scheduler. 52 | /// 53 | private void NotifyThreadPoolOfPendingWork() 54 | { 55 | ThreadPool.UnsafeQueueUserWorkItem(_ => 56 | { 57 | // Note that the current thread is now processing work items. 58 | // This is necessary to enable inlining of tasks into this thread. 59 | _currentThreadIsProcessingItems = true; 60 | try 61 | { 62 | // Process all available items in the queue. 63 | while (true) 64 | { 65 | Task item; 66 | lock (_tasks) 67 | { 68 | // When there are no more items to be processed, 69 | // note that we're done processing, and get out. 70 | if (_tasks.Count == 0) 71 | { 72 | --_delegatesQueuedOrRunning; 73 | break; 74 | } 75 | 76 | // Get the next item from the queue 77 | item = _tasks.First.Value; 78 | _tasks.RemoveFirst(); 79 | } 80 | 81 | // Execute the task we pulled out of the queue 82 | base.TryExecuteTask(item); 83 | } 84 | } 85 | catch (Exception e) { Debug.LogException(e); } 86 | // We're done processing items on the current thread 87 | finally { _currentThreadIsProcessingItems = false; } 88 | }, null); 89 | } 90 | 91 | /// Attempts to execute the specified task on the current thread. 92 | /// The task to be executed. 93 | /// 94 | /// Whether the task could be executed on the current thread. 95 | protected sealed override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued) 96 | { 97 | // If this thread isn't already processing a task, we don't support inlining 98 | if (!_currentThreadIsProcessingItems) return false; 99 | 100 | // If the task was previously queued, remove it from the queue 101 | if (taskWasPreviouslyQueued) TryDequeue(task); 102 | 103 | // Try to run the task. 104 | return base.TryExecuteTask(task); 105 | } 106 | 107 | /// Attempts to remove a previously scheduled task from the scheduler. 108 | /// The task to be removed. 109 | /// Whether the task could be found and removed. 110 | protected sealed override bool TryDequeue(Task task) 111 | { 112 | lock (_tasks) return _tasks.Remove(task); 113 | } 114 | 115 | /// Gets the maximum concurrency level supported by this scheduler. 116 | public sealed override int MaximumConcurrencyLevel { get { return _maxDegreeOfParallelism; } } 117 | 118 | /// Gets an enumerable of the tasks currently scheduled on this scheduler. 119 | /// An enumerable of the tasks currently scheduled. 120 | protected sealed override IEnumerable GetScheduledTasks() 121 | { 122 | bool lockTaken = false; 123 | try 124 | { 125 | Monitor.TryEnter(_tasks, ref lockTaken); 126 | if (lockTaken) return _tasks.ToArray(); 127 | else throw new NotSupportedException(); 128 | } 129 | catch (Exception e) { Debug.LogException(e); return null; } 130 | finally { if (lockTaken) Monitor.Exit(_tasks); } 131 | } 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /Assets/_PackageRoot/Runtime/LimitedConcurrencyLevelTaskScheduler.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 02bef5f305ebdbd4ca16ffee123feffa 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/_PackageRoot/Samples~/.gitignore: -------------------------------------------------------------------------------- 1 | # Except this file 2 | !.gitignore -------------------------------------------------------------------------------- /Assets/_PackageRoot/Tests.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8425395fe92f9064f99ccb46cd3abf0c 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/_PackageRoot/Tests/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4b33dc61e58deba449bb911eb1946b53 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/_PackageRoot/Tests/Editor/.gitignore: -------------------------------------------------------------------------------- 1 | # Except this file 2 | !.gitignore -------------------------------------------------------------------------------- /Assets/_PackageRoot/Tests/Editor/Extensions.Unity.AudioLoader.Editor.Tests.asmdef: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Extensions.Unity.AudioLoader.Editor.Tests", 3 | "rootNamespace": "Extensions.Unity.AudioLoader.Editor.Tests", 4 | "references": [ 5 | "Extensions.Unity.AudioLoader", 6 | "UniTask" 7 | ], 8 | "includePlatforms": [ 9 | "Editor" 10 | ], 11 | "excludePlatforms": [], 12 | "allowUnsafeCode": false, 13 | "overrideReferences": false, 14 | "precompiledReferences": [], 15 | "autoReferenced": true, 16 | "defineConstraints": [], 17 | "versionDefines": [], 18 | "noEngineReferences": false 19 | } -------------------------------------------------------------------------------- /Assets/_PackageRoot/Tests/Editor/Extensions.Unity.AudioLoader.Editor.Tests.asmdef.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 084e3ad4d4e4a224cb1416dc68e24d02 3 | AssemblyDefinitionImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/_PackageRoot/Tests/Editor/TestCache.cs: -------------------------------------------------------------------------------- 1 | using NUnit.Framework; 2 | using Cysharp.Threading.Tasks; 3 | using UnityEngine.TestTools; 4 | using System.Collections; 5 | 6 | namespace Extensions.Unity.AudioLoader.Tests 7 | { 8 | public class TestCache 9 | { 10 | static readonly string[] AudioURLs = 11 | { 12 | "https://github.com/IvanMurzak/Unity-AudioLoader/raw/master/Test%20Audio%20Files/sample.aiff", 13 | "https://github.com/IvanMurzak/Unity-AudioLoader/raw/master/Test%20Audio%20Files/sample.mp3", 14 | "https://github.com/IvanMurzak/Unity-AudioLoader/raw/master/Test%20Audio%20Files/sample.wav" 15 | }; 16 | 17 | public async UniTask LoadAudioClip(string url) 18 | { 19 | var AudioClip = await AudioLoader.LoadAudioClip(url); 20 | Assert.IsNotNull(AudioClip); 21 | } 22 | 23 | [UnityTest] public IEnumerator LoadingFromMemoryCache() 24 | { 25 | yield return AudioLoader.ClearCache().AsUniTask().ToCoroutine(); 26 | AudioLoader.settings.useMemoryCache = true; 27 | AudioLoader.settings.useDiskCache = false; 28 | 29 | foreach (var imageURL in AudioURLs) 30 | { 31 | yield return LoadAudioClip(imageURL).ToCoroutine(); 32 | Assert.IsTrue(AudioLoader.MemoryCacheContains(imageURL)); 33 | yield return LoadAudioClip(imageURL).ToCoroutine(); 34 | Assert.IsTrue(AudioLoader.MemoryCacheContains(imageURL)); 35 | } 36 | } 37 | [UnityTest] public IEnumerator LoadingFromDiskCache() 38 | { 39 | yield return AudioLoader.ClearCache().AsUniTask().ToCoroutine(); 40 | AudioLoader.settings.useMemoryCache = false; 41 | AudioLoader.settings.useDiskCache = true; 42 | 43 | foreach (var imageURL in AudioURLs) 44 | { 45 | yield return LoadAudioClip(imageURL).ToCoroutine(); 46 | Assert.IsTrue(AudioLoader.DiskCacheContains(imageURL)); 47 | yield return LoadAudioClip(imageURL).ToCoroutine(); 48 | Assert.IsTrue(AudioLoader.DiskCacheContains(imageURL)); 49 | } 50 | } 51 | [UnityTest] public IEnumerator DiskCacheEnable() 52 | { 53 | yield return AudioLoader.ClearCache().AsUniTask().ToCoroutine(); 54 | AudioLoader.settings.useDiskCache = true; 55 | 56 | foreach (var imageURL in AudioURLs) 57 | { 58 | yield return LoadAudioClip(imageURL).ToCoroutine(); 59 | Assert.IsTrue(AudioLoader.DiskCacheContains(imageURL)); 60 | } 61 | } 62 | [UnityTest] public IEnumerator DiskCacheDisable() 63 | { 64 | yield return AudioLoader.ClearCache().AsUniTask().ToCoroutine(); 65 | AudioLoader.settings.useDiskCache = false; 66 | 67 | foreach (var imageURL in AudioURLs) 68 | { 69 | yield return LoadAudioClip(imageURL).ToCoroutine(); 70 | Assert.IsFalse(AudioLoader.DiskCacheContains(imageURL)); 71 | } 72 | } 73 | [UnityTest] public IEnumerator MemoryCacheEnabled() 74 | { 75 | yield return AudioLoader.ClearCache().AsUniTask().ToCoroutine(); 76 | AudioLoader.settings.useMemoryCache = true; 77 | 78 | foreach (var imageURL in AudioURLs) 79 | { 80 | yield return LoadAudioClip(imageURL).ToCoroutine(); 81 | Assert.IsTrue(AudioLoader.MemoryCacheContains(imageURL)); 82 | } 83 | } 84 | [UnityTest] public IEnumerator MemoryCacheDisabled() 85 | { 86 | yield return AudioLoader.ClearCache().AsUniTask().ToCoroutine(); 87 | AudioLoader.settings.useMemoryCache = false; 88 | 89 | foreach (var imageURL in AudioURLs) 90 | { 91 | yield return LoadAudioClip(imageURL).ToCoroutine(); 92 | Assert.IsFalse(AudioLoader.MemoryCacheContains(imageURL)); 93 | } 94 | } 95 | [UnityTest] public IEnumerator ClearDiskCache() 96 | { 97 | yield return AudioLoader.ClearCache().AsUniTask().ToCoroutine(); 98 | AudioLoader.settings.useDiskCache = true; 99 | 100 | foreach (var imageURL in AudioURLs) 101 | { 102 | yield return LoadAudioClip(imageURL).ToCoroutine(); 103 | Assert.IsTrue(AudioLoader.DiskCacheContains(imageURL)); 104 | yield return AudioLoader.ClearDiskCache().AsUniTask().ToCoroutine(); 105 | Assert.IsFalse(AudioLoader.DiskCacheContains(imageURL)); 106 | } 107 | } 108 | [UnityTest] public IEnumerator ClearMemoryCache() 109 | { 110 | yield return AudioLoader.ClearCache().AsUniTask().ToCoroutine(); 111 | AudioLoader.settings.useMemoryCache = true; 112 | 113 | foreach (var imageURL in AudioURLs) 114 | { 115 | yield return LoadAudioClip(imageURL).ToCoroutine(); 116 | Assert.IsTrue(AudioLoader.MemoryCacheContains(imageURL)); 117 | AudioLoader.ClearMemoryCache(imageURL); 118 | Assert.IsFalse(AudioLoader.MemoryCacheContains(imageURL)); 119 | } 120 | } 121 | [UnityTest] public IEnumerator ClearDiskCacheAll() 122 | { 123 | yield return AudioLoader.ClearCache().AsUniTask().ToCoroutine(); 124 | AudioLoader.settings.useDiskCache = true; 125 | 126 | foreach (var imageURL in AudioURLs) 127 | { 128 | yield return LoadAudioClip(imageURL).ToCoroutine(); 129 | Assert.IsTrue(AudioLoader.DiskCacheContains(imageURL)); 130 | } 131 | yield return AudioLoader.ClearDiskCache().AsUniTask().ToCoroutine(); 132 | foreach (var imageURL in AudioURLs) 133 | Assert.IsFalse(AudioLoader.DiskCacheContains(imageURL)); 134 | } 135 | [UnityTest] public IEnumerator ClearMemoryCacheAll() 136 | { 137 | yield return AudioLoader.ClearCache().AsUniTask().ToCoroutine(); 138 | AudioLoader.settings.useMemoryCache = true; 139 | 140 | foreach (var imageURL in AudioURLs) 141 | { 142 | yield return LoadAudioClip(imageURL).ToCoroutine(); 143 | Assert.IsTrue(AudioLoader.MemoryCacheContains(imageURL)); 144 | } 145 | AudioLoader.ClearMemoryCache(); 146 | foreach (var imageURL in AudioURLs) 147 | Assert.IsFalse(AudioLoader.MemoryCacheContains(imageURL)); 148 | } 149 | } 150 | } -------------------------------------------------------------------------------- /Assets/_PackageRoot/Tests/Editor/TestCache.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b3efd94523455e344bb695b4f4d58e89 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/_PackageRoot/Tests/Editor/TestLoading.cs: -------------------------------------------------------------------------------- 1 | using NUnit.Framework; 2 | using Cysharp.Threading.Tasks; 3 | using UnityEngine.TestTools; 4 | using System.Collections; 5 | 6 | namespace Extensions.Unity.AudioLoader.Tests 7 | { 8 | public class TestLoading 9 | { 10 | static readonly string[] AudioURLs = 11 | { 12 | "https://github.com/IvanMurzak/Unity-AudioLoader/raw/master/Test%20Audio%20Files/sample.aiff", 13 | "https://github.com/IvanMurzak/Unity-AudioLoader/raw/master/Test%20Audio%20Files/sample.mp3", 14 | "https://github.com/IvanMurzak/Unity-AudioLoader/raw/master/Test%20Audio%20Files/sample.wav" 15 | }; 16 | 17 | public async UniTask LoadAudioClip(string url) 18 | { 19 | var audioClip = await AudioLoader.LoadAudioClip(url); 20 | Assert.IsNotNull(audioClip); 21 | } 22 | 23 | [UnityTest] public IEnumerator LoadAudioClipCacheMemoryDisk() 24 | { 25 | yield return AudioLoader.ClearCache().AsUniTask().ToCoroutine(); 26 | AudioLoader.settings.useDiskCache = true; 27 | AudioLoader.settings.useMemoryCache = true; 28 | 29 | foreach (var imageURL in AudioURLs) 30 | yield return LoadAudioClip(imageURL).ToCoroutine(); 31 | } 32 | [UnityTest] public IEnumerator LoadAudioClipsCacheMemory() 33 | { 34 | yield return AudioLoader.ClearCache().AsUniTask().ToCoroutine(); 35 | AudioLoader.settings.useDiskCache = false; 36 | AudioLoader.settings.useMemoryCache = true; 37 | 38 | foreach (var imageURL in AudioURLs) 39 | yield return LoadAudioClip(imageURL).ToCoroutine(); 40 | } 41 | [UnityTest] public IEnumerator LoadAudioClipsCacheDisk() 42 | { 43 | yield return AudioLoader.ClearCache().AsUniTask().ToCoroutine(); 44 | AudioLoader.settings.useDiskCache = true; 45 | AudioLoader.settings.useMemoryCache = false; 46 | 47 | foreach (var imageURL in AudioURLs) 48 | yield return LoadAudioClip(imageURL).ToCoroutine(); 49 | } 50 | [UnityTest] public IEnumerator LoadAudioClipsNoCache() 51 | { 52 | yield return AudioLoader.ClearCache().AsUniTask().ToCoroutine(); 53 | AudioLoader.settings.useDiskCache = false; 54 | AudioLoader.settings.useMemoryCache = false; 55 | 56 | foreach (var imageURL in AudioURLs) 57 | yield return LoadAudioClip(imageURL).ToCoroutine(); 58 | } 59 | } 60 | } -------------------------------------------------------------------------------- /Assets/_PackageRoot/Tests/Editor/TestLoading.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b24e70b2ab6f7c04398eb855aab28704 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/_PackageRoot/Tests/Runtime.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b3f29fd130eb4ca4091eb7be7bfbdb7c 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/_PackageRoot/Tests/Runtime/.gitignore: -------------------------------------------------------------------------------- 1 | # Except this file 2 | !.gitignore -------------------------------------------------------------------------------- /Assets/_PackageRoot/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "extensions.unity.audioloader", 3 | "displayName": "Audio Loader", 4 | "author": { 5 | "name": "Ivan Murzak", 6 | "url": "https://github.com/IvanMurzak" 7 | }, 8 | "version": "1.0.4", 9 | "unity": "2019.2", 10 | "description": "Asynchronous audio loading from remote or local destination. It has two layers of configurable cache system: RAM and Disk.", 11 | "dependencies": { 12 | "com.cysharp.unitask": "2.3.3" 13 | }, 14 | "scopedRegistries": [ 15 | { 16 | "name": "package.openupm.com", 17 | "url": "https://package.openupm.com", 18 | "scopes": [ 19 | "com.cysharp.unitask", 20 | "com.openupm" 21 | ] 22 | } 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /Assets/_PackageRoot/package.json.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 043e4e033788a68478756f5c9513ccc6 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Commands/NPM--AddUser.bat: -------------------------------------------------------------------------------- 1 | cd ..\Assets\_PackageRoot 2 | npm adduser -------------------------------------------------------------------------------- /Commands/NPM--CopyREADME.bat: -------------------------------------------------------------------------------- 1 | xcopy ..\README.md ..\Assets\_PackageRoot\README.md* /Y 2 | xcopy ..\README.md ..\Assets\_PackageRoot\Documentation~\README.md* /Y -------------------------------------------------------------------------------- /Commands/NPM--UpdateDependencies.bat: -------------------------------------------------------------------------------- 1 | call npm --prefix ..\Assets\_PackageRoot update 2 | del /f ..\Assets\_PackageRoot\package-lock.* 3 | pause -------------------------------------------------------------------------------- /Commands/NPM--VersionMajor.bat: -------------------------------------------------------------------------------- 1 | cd ..\Assets\_PackageRoot 2 | npm version major 3 | pause -------------------------------------------------------------------------------- /Commands/NPM--VersionMinor.bat: -------------------------------------------------------------------------------- 1 | cd ..\Assets\_PackageRoot 2 | npm version minor 3 | pause -------------------------------------------------------------------------------- /Commands/NPM--VersionPatch.bat: -------------------------------------------------------------------------------- 1 | cd ..\Assets\_PackageRoot 2 | npm version patch 3 | pause -------------------------------------------------------------------------------- /Commands/[!!!]--GitHub--Release.bat: -------------------------------------------------------------------------------- 1 | cd ..\Assets\_PackageRoot 2 | @echo off 3 | echo ---------------------------------------------------- 4 | echo Executing "npm pkg get version" 5 | FOR /F "tokens=* USEBACKQ" %%F IN (`npm pkg get version`) DO ( 6 | SET RawVersion=%%F 7 | ) 8 | echo Version of current package is extracted: %RawVersion% 9 | SET CleanVersion=%RawVersion:~1,-1% 10 | echo Current version: %CleanVersion% 11 | 12 | git push -u origin HEAD 13 | 14 | echo ---------------------------------------------------- 15 | cd ..\..\ 16 | echo Creating GitHub release with tag=%CleanVersion% 17 | @echo on 18 | gh release create %CleanVersion% --generate-notes --title %CleanVersion% 19 | gh release view %CleanVersion% --web 20 | @echo off 21 | echo ---------------------------------------------------- 22 | 23 | pause 24 | -------------------------------------------------------------------------------- /Commands/[!!!]--NPM--Publish.bat: -------------------------------------------------------------------------------- 1 | xcopy ..\README.md ..\Assets\_PackageRoot\README.md* /Y 2 | xcopy ..\README.md ..\Assets\_PackageRoot\Documentation~\README.md* /Y 3 | cd ..\Assets\_PackageRoot 4 | npm publish 5 | pause -------------------------------------------------------------------------------- /Commands/[!]--GitHub--DraftRelease.bat: -------------------------------------------------------------------------------- 1 | cd ..\Assets\_PackageRoot 2 | @echo off 3 | echo ---------------------------------------------------- 4 | echo Executing "npm pkg get version" 5 | FOR /F "tokens=* USEBACKQ" %%F IN (`npm pkg get version`) DO ( 6 | SET RawVersion=%%F 7 | ) 8 | echo Version of current package is extracted: %RawVersion% 9 | SET CleanVersion=%RawVersion:~1,-1% 10 | echo Current version: %CleanVersion% 11 | 12 | git push -u origin HEAD 13 | 14 | echo ---------------------------------------------------- 15 | cd ..\..\ 16 | echo Creating GitHub release with tag=%CleanVersion% 17 | @echo on 18 | gh release create %CleanVersion% --draft --generate-notes --title %CleanVersion% 19 | gh repo view --web 20 | @echo off 21 | echo ---------------------------------------------------- 22 | 23 | pause 24 | -------------------------------------------------------------------------------- /Header-Full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IvanMurzak/Unity-AudioLoader/432c13650ce3567ca9778fbb0fd7553a9e71563d/Header-Full.png -------------------------------------------------------------------------------- /Header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IvanMurzak/Unity-AudioLoader/432c13650ce3567ca9778fbb0fd7553a9e71563d/Header.jpg -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Ivan Murzak 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Packages/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "com.cysharp.unitask": "2.3.3", 4 | "com.unity.ide.visualstudio": "2.0.20", 5 | "com.unity.test-framework": "1.1.33", 6 | "com.unity.ugui": "1.0.0", 7 | "com.unity.modules.ai": "1.0.0", 8 | "com.unity.modules.androidjni": "1.0.0", 9 | "com.unity.modules.animation": "1.0.0", 10 | "com.unity.modules.assetbundle": "1.0.0", 11 | "com.unity.modules.audio": "1.0.0", 12 | "com.unity.modules.cloth": "1.0.0", 13 | "com.unity.modules.director": "1.0.0", 14 | "com.unity.modules.imageconversion": "1.0.0", 15 | "com.unity.modules.imgui": "1.0.0", 16 | "com.unity.modules.jsonserialize": "1.0.0", 17 | "com.unity.modules.particlesystem": "1.0.0", 18 | "com.unity.modules.physics": "1.0.0", 19 | "com.unity.modules.physics2d": "1.0.0", 20 | "com.unity.modules.screencapture": "1.0.0", 21 | "com.unity.modules.terrain": "1.0.0", 22 | "com.unity.modules.terrainphysics": "1.0.0", 23 | "com.unity.modules.tilemap": "1.0.0", 24 | "com.unity.modules.ui": "1.0.0", 25 | "com.unity.modules.uielements": "1.0.0", 26 | "com.unity.modules.umbra": "1.0.0", 27 | "com.unity.modules.unityanalytics": "1.0.0", 28 | "com.unity.modules.unitywebrequest": "1.0.0", 29 | "com.unity.modules.unitywebrequestassetbundle": "1.0.0", 30 | "com.unity.modules.unitywebrequestaudio": "1.0.0", 31 | "com.unity.modules.unitywebrequesttexture": "1.0.0", 32 | "com.unity.modules.unitywebrequestwww": "1.0.0", 33 | "com.unity.modules.vehicles": "1.0.0", 34 | "com.unity.modules.video": "1.0.0", 35 | "com.unity.modules.vr": "1.0.0", 36 | "com.unity.modules.wind": "1.0.0", 37 | "com.unity.modules.xr": "1.0.0" 38 | }, 39 | "scopedRegistries": [ 40 | { 41 | "name": "package.openupm.com", 42 | "url": "https://package.openupm.com", 43 | "scopes": [ 44 | "com.cysharp.unitask", 45 | "com.openupm" 46 | ] 47 | } 48 | ] 49 | } 50 | -------------------------------------------------------------------------------- /Packages/packages-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "com.cysharp.unitask": { 4 | "version": "2.3.3", 5 | "depth": 0, 6 | "source": "registry", 7 | "dependencies": {}, 8 | "url": "https://package.openupm.com" 9 | }, 10 | "com.unity.ext.nunit": { 11 | "version": "1.0.6", 12 | "depth": 1, 13 | "source": "registry", 14 | "dependencies": {}, 15 | "url": "https://packages.unity.com" 16 | }, 17 | "com.unity.ide.visualstudio": { 18 | "version": "2.0.20", 19 | "depth": 0, 20 | "source": "registry", 21 | "dependencies": { 22 | "com.unity.test-framework": "1.1.9" 23 | }, 24 | "url": "https://packages.unity.com" 25 | }, 26 | "com.unity.test-framework": { 27 | "version": "1.1.33", 28 | "depth": 0, 29 | "source": "registry", 30 | "dependencies": { 31 | "com.unity.ext.nunit": "1.0.6", 32 | "com.unity.modules.imgui": "1.0.0", 33 | "com.unity.modules.jsonserialize": "1.0.0" 34 | }, 35 | "url": "https://packages.unity.com" 36 | }, 37 | "com.unity.ugui": { 38 | "version": "1.0.0", 39 | "depth": 0, 40 | "source": "builtin", 41 | "dependencies": { 42 | "com.unity.modules.ui": "1.0.0", 43 | "com.unity.modules.imgui": "1.0.0" 44 | } 45 | }, 46 | "com.unity.modules.ai": { 47 | "version": "1.0.0", 48 | "depth": 0, 49 | "source": "builtin", 50 | "dependencies": {} 51 | }, 52 | "com.unity.modules.androidjni": { 53 | "version": "1.0.0", 54 | "depth": 0, 55 | "source": "builtin", 56 | "dependencies": {} 57 | }, 58 | "com.unity.modules.animation": { 59 | "version": "1.0.0", 60 | "depth": 0, 61 | "source": "builtin", 62 | "dependencies": {} 63 | }, 64 | "com.unity.modules.assetbundle": { 65 | "version": "1.0.0", 66 | "depth": 0, 67 | "source": "builtin", 68 | "dependencies": {} 69 | }, 70 | "com.unity.modules.audio": { 71 | "version": "1.0.0", 72 | "depth": 0, 73 | "source": "builtin", 74 | "dependencies": {} 75 | }, 76 | "com.unity.modules.cloth": { 77 | "version": "1.0.0", 78 | "depth": 0, 79 | "source": "builtin", 80 | "dependencies": { 81 | "com.unity.modules.physics": "1.0.0" 82 | } 83 | }, 84 | "com.unity.modules.director": { 85 | "version": "1.0.0", 86 | "depth": 0, 87 | "source": "builtin", 88 | "dependencies": { 89 | "com.unity.modules.audio": "1.0.0", 90 | "com.unity.modules.animation": "1.0.0" 91 | } 92 | }, 93 | "com.unity.modules.imageconversion": { 94 | "version": "1.0.0", 95 | "depth": 0, 96 | "source": "builtin", 97 | "dependencies": {} 98 | }, 99 | "com.unity.modules.imgui": { 100 | "version": "1.0.0", 101 | "depth": 0, 102 | "source": "builtin", 103 | "dependencies": {} 104 | }, 105 | "com.unity.modules.jsonserialize": { 106 | "version": "1.0.0", 107 | "depth": 0, 108 | "source": "builtin", 109 | "dependencies": {} 110 | }, 111 | "com.unity.modules.particlesystem": { 112 | "version": "1.0.0", 113 | "depth": 0, 114 | "source": "builtin", 115 | "dependencies": {} 116 | }, 117 | "com.unity.modules.physics": { 118 | "version": "1.0.0", 119 | "depth": 0, 120 | "source": "builtin", 121 | "dependencies": {} 122 | }, 123 | "com.unity.modules.physics2d": { 124 | "version": "1.0.0", 125 | "depth": 0, 126 | "source": "builtin", 127 | "dependencies": {} 128 | }, 129 | "com.unity.modules.screencapture": { 130 | "version": "1.0.0", 131 | "depth": 0, 132 | "source": "builtin", 133 | "dependencies": { 134 | "com.unity.modules.imageconversion": "1.0.0" 135 | } 136 | }, 137 | "com.unity.modules.subsystems": { 138 | "version": "1.0.0", 139 | "depth": 1, 140 | "source": "builtin", 141 | "dependencies": { 142 | "com.unity.modules.jsonserialize": "1.0.0" 143 | } 144 | }, 145 | "com.unity.modules.terrain": { 146 | "version": "1.0.0", 147 | "depth": 0, 148 | "source": "builtin", 149 | "dependencies": {} 150 | }, 151 | "com.unity.modules.terrainphysics": { 152 | "version": "1.0.0", 153 | "depth": 0, 154 | "source": "builtin", 155 | "dependencies": { 156 | "com.unity.modules.physics": "1.0.0", 157 | "com.unity.modules.terrain": "1.0.0" 158 | } 159 | }, 160 | "com.unity.modules.tilemap": { 161 | "version": "1.0.0", 162 | "depth": 0, 163 | "source": "builtin", 164 | "dependencies": { 165 | "com.unity.modules.physics2d": "1.0.0" 166 | } 167 | }, 168 | "com.unity.modules.ui": { 169 | "version": "1.0.0", 170 | "depth": 0, 171 | "source": "builtin", 172 | "dependencies": {} 173 | }, 174 | "com.unity.modules.uielements": { 175 | "version": "1.0.0", 176 | "depth": 0, 177 | "source": "builtin", 178 | "dependencies": { 179 | "com.unity.modules.ui": "1.0.0", 180 | "com.unity.modules.imgui": "1.0.0", 181 | "com.unity.modules.jsonserialize": "1.0.0" 182 | } 183 | }, 184 | "com.unity.modules.umbra": { 185 | "version": "1.0.0", 186 | "depth": 0, 187 | "source": "builtin", 188 | "dependencies": {} 189 | }, 190 | "com.unity.modules.unityanalytics": { 191 | "version": "1.0.0", 192 | "depth": 0, 193 | "source": "builtin", 194 | "dependencies": { 195 | "com.unity.modules.unitywebrequest": "1.0.0", 196 | "com.unity.modules.jsonserialize": "1.0.0" 197 | } 198 | }, 199 | "com.unity.modules.unitywebrequest": { 200 | "version": "1.0.0", 201 | "depth": 0, 202 | "source": "builtin", 203 | "dependencies": {} 204 | }, 205 | "com.unity.modules.unitywebrequestassetbundle": { 206 | "version": "1.0.0", 207 | "depth": 0, 208 | "source": "builtin", 209 | "dependencies": { 210 | "com.unity.modules.assetbundle": "1.0.0", 211 | "com.unity.modules.unitywebrequest": "1.0.0" 212 | } 213 | }, 214 | "com.unity.modules.unitywebrequestaudio": { 215 | "version": "1.0.0", 216 | "depth": 0, 217 | "source": "builtin", 218 | "dependencies": { 219 | "com.unity.modules.unitywebrequest": "1.0.0", 220 | "com.unity.modules.audio": "1.0.0" 221 | } 222 | }, 223 | "com.unity.modules.unitywebrequesttexture": { 224 | "version": "1.0.0", 225 | "depth": 0, 226 | "source": "builtin", 227 | "dependencies": { 228 | "com.unity.modules.unitywebrequest": "1.0.0", 229 | "com.unity.modules.imageconversion": "1.0.0" 230 | } 231 | }, 232 | "com.unity.modules.unitywebrequestwww": { 233 | "version": "1.0.0", 234 | "depth": 0, 235 | "source": "builtin", 236 | "dependencies": { 237 | "com.unity.modules.unitywebrequest": "1.0.0", 238 | "com.unity.modules.unitywebrequestassetbundle": "1.0.0", 239 | "com.unity.modules.unitywebrequestaudio": "1.0.0", 240 | "com.unity.modules.audio": "1.0.0", 241 | "com.unity.modules.assetbundle": "1.0.0", 242 | "com.unity.modules.imageconversion": "1.0.0" 243 | } 244 | }, 245 | "com.unity.modules.vehicles": { 246 | "version": "1.0.0", 247 | "depth": 0, 248 | "source": "builtin", 249 | "dependencies": { 250 | "com.unity.modules.physics": "1.0.0" 251 | } 252 | }, 253 | "com.unity.modules.video": { 254 | "version": "1.0.0", 255 | "depth": 0, 256 | "source": "builtin", 257 | "dependencies": { 258 | "com.unity.modules.audio": "1.0.0", 259 | "com.unity.modules.ui": "1.0.0", 260 | "com.unity.modules.unitywebrequest": "1.0.0" 261 | } 262 | }, 263 | "com.unity.modules.vr": { 264 | "version": "1.0.0", 265 | "depth": 0, 266 | "source": "builtin", 267 | "dependencies": { 268 | "com.unity.modules.jsonserialize": "1.0.0", 269 | "com.unity.modules.physics": "1.0.0", 270 | "com.unity.modules.xr": "1.0.0" 271 | } 272 | }, 273 | "com.unity.modules.wind": { 274 | "version": "1.0.0", 275 | "depth": 0, 276 | "source": "builtin", 277 | "dependencies": {} 278 | }, 279 | "com.unity.modules.xr": { 280 | "version": "1.0.0", 281 | "depth": 0, 282 | "source": "builtin", 283 | "dependencies": { 284 | "com.unity.modules.physics": "1.0.0", 285 | "com.unity.modules.jsonserialize": "1.0.0", 286 | "com.unity.modules.subsystems": "1.0.0" 287 | } 288 | } 289 | } 290 | } 291 | -------------------------------------------------------------------------------- /ProjectSettings/AudioManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!11 &1 4 | AudioManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Volume: 1 8 | Rolloff Scale: 1 9 | Doppler Factor: 1 10 | Default Speaker Mode: 2 11 | m_SampleRate: 0 12 | m_DSPBufferSize: 1024 13 | m_VirtualVoiceCount: 512 14 | m_RealVoiceCount: 32 15 | m_EnableOutputSuspension: 1 16 | m_SpatializerPlugin: 17 | m_AmbisonicDecoderPlugin: 18 | m_DisableAudio: 0 19 | m_VirtualizeEffects: 1 20 | m_RequestedDSPBufferSize: 0 21 | -------------------------------------------------------------------------------- /ProjectSettings/ClusterInputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!236 &1 4 | ClusterInputManager: 5 | m_ObjectHideFlags: 0 6 | m_Inputs: [] 7 | -------------------------------------------------------------------------------- /ProjectSettings/DynamicsManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!55 &1 4 | PhysicsManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 14 7 | m_Gravity: {x: 0, y: -9.81, z: 0} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_BounceThreshold: 2 10 | m_DefaultMaxDepenetrationVelocity: 10 11 | m_SleepThreshold: 0.005 12 | m_DefaultContactOffset: 0.01 13 | m_DefaultSolverIterations: 6 14 | m_DefaultSolverVelocityIterations: 1 15 | m_QueriesHitBackfaces: 0 16 | m_QueriesHitTriggers: 1 17 | m_EnableAdaptiveForce: 0 18 | m_ClothInterCollisionDistance: 0.1 19 | m_ClothInterCollisionStiffness: 0.2 20 | m_ContactsGeneration: 1 21 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 22 | m_SimulationMode: 0 23 | m_AutoSyncTransforms: 0 24 | m_ReuseCollisionCallbacks: 0 25 | m_InvokeCollisionCallbacks: 1 26 | m_ClothInterCollisionSettingsToggle: 0 27 | m_ClothGravity: {x: 0, y: -9.81, z: 0} 28 | m_ContactPairsMode: 0 29 | m_BroadphaseType: 0 30 | m_WorldBounds: 31 | m_Center: {x: 0, y: 0, z: 0} 32 | m_Extent: {x: 250, y: 250, z: 250} 33 | m_WorldSubdivisions: 8 34 | m_FrictionType: 0 35 | m_EnableEnhancedDeterminism: 0 36 | m_EnableUnifiedHeightmaps: 1 37 | m_ImprovedPatchFriction: 0 38 | m_SolverType: 0 39 | m_DefaultMaxAngularSpeed: 50 40 | -------------------------------------------------------------------------------- /ProjectSettings/EditorBuildSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1045 &1 4 | EditorBuildSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Scenes: [] 8 | m_configObjects: {} 9 | -------------------------------------------------------------------------------- /ProjectSettings/EditorSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!159 &1 4 | EditorSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 12 7 | m_SerializationMode: 2 8 | m_LineEndingsForNewScripts: 2 9 | m_DefaultBehaviorMode: 0 10 | m_PrefabRegularEnvironment: {fileID: 0} 11 | m_PrefabUIEnvironment: {fileID: 0} 12 | m_SpritePackerMode: 0 13 | m_SpritePackerCacheSize: 10 14 | m_SpritePackerPaddingPower: 1 15 | m_Bc7TextureCompressor: 0 16 | m_EtcTextureCompressorBehavior: 1 17 | m_EtcTextureFastCompressor: 1 18 | m_EtcTextureNormalCompressor: 2 19 | m_EtcTextureBestCompressor: 4 20 | m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;asmref;rsp;java;cpp;c;mm;m;h 21 | m_ProjectGenerationRootNamespace: 22 | m_EnableTextureStreamingInEditMode: 1 23 | m_EnableTextureStreamingInPlayMode: 1 24 | m_EnableEditorAsyncCPUTextureLoading: 0 25 | m_AsyncShaderCompilation: 1 26 | m_PrefabModeAllowAutoSave: 1 27 | m_EnterPlayModeOptionsEnabled: 0 28 | m_EnterPlayModeOptions: 3 29 | m_GameObjectNamingDigits: 1 30 | m_GameObjectNamingScheme: 0 31 | m_AssetNamingUsesSpace: 1 32 | m_InspectorUseIMGUIDefaultInspector: 0 33 | m_UseLegacyProbeSampleCount: 0 34 | m_SerializeInlineMappingsOnOneLine: 1 35 | m_DisableCookiesInLightmapper: 0 36 | m_AssetPipelineMode: 1 37 | m_RefreshImportMode: 0 38 | m_CacheServerMode: 0 39 | m_CacheServerEndpoint: 40 | m_CacheServerNamespacePrefix: default 41 | m_CacheServerEnableDownload: 1 42 | m_CacheServerEnableUpload: 1 43 | m_CacheServerEnableAuth: 0 44 | m_CacheServerEnableTls: 0 45 | m_CacheServerValidationMode: 2 46 | m_CacheServerDownloadBatchSize: 128 47 | m_EnableEnlightenBakedGI: 0 48 | -------------------------------------------------------------------------------- /ProjectSettings/GraphicsSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!30 &1 4 | GraphicsSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 15 7 | m_Deferred: 8 | m_Mode: 1 9 | m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} 10 | m_DeferredReflections: 11 | m_Mode: 1 12 | m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} 13 | m_ScreenSpaceShadows: 14 | m_Mode: 1 15 | m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} 16 | m_DepthNormals: 17 | m_Mode: 1 18 | m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} 19 | m_MotionVectors: 20 | m_Mode: 1 21 | m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} 22 | m_LightHalo: 23 | m_Mode: 1 24 | m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} 25 | m_LensFlare: 26 | m_Mode: 1 27 | m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} 28 | m_VideoShadersIncludeMode: 2 29 | m_AlwaysIncludedShaders: 30 | - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} 31 | - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} 32 | - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} 33 | - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} 34 | - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} 35 | - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} 36 | - {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0} 37 | m_PreloadedShaders: [] 38 | m_PreloadShadersBatchTimeLimit: -1 39 | m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} 40 | m_CustomRenderPipeline: {fileID: 0} 41 | m_TransparencySortMode: 0 42 | m_TransparencySortAxis: {x: 0, y: 0, z: 1} 43 | m_DefaultRenderingPath: 1 44 | m_DefaultMobileRenderingPath: 1 45 | m_TierSettings: [] 46 | m_LightmapStripping: 0 47 | m_FogStripping: 0 48 | m_InstancingStripping: 0 49 | m_BrgStripping: 0 50 | m_LightmapKeepPlain: 1 51 | m_LightmapKeepDirCombined: 1 52 | m_LightmapKeepDynamicPlain: 1 53 | m_LightmapKeepDynamicDirCombined: 1 54 | m_LightmapKeepShadowMask: 1 55 | m_LightmapKeepSubtractive: 1 56 | m_FogKeepLinear: 1 57 | m_FogKeepExp: 1 58 | m_FogKeepExp2: 1 59 | m_AlbedoSwatchInfos: [] 60 | m_LightsUseLinearIntensity: 0 61 | m_LightsUseColorTemperature: 0 62 | m_DefaultRenderingLayerMask: 1 63 | m_LogWhenShaderIsCompiled: 0 64 | m_SRPDefaultSettings: {} 65 | m_LightProbeOutsideHullStrategy: 1 66 | m_CameraRelativeLightCulling: 0 67 | m_CameraRelativeShadowCulling: 0 68 | -------------------------------------------------------------------------------- /ProjectSettings/InputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!13 &1 4 | InputManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Axes: 8 | - serializedVersion: 3 9 | m_Name: Horizontal 10 | descriptiveName: 11 | descriptiveNegativeName: 12 | negativeButton: left 13 | positiveButton: right 14 | altNegativeButton: a 15 | altPositiveButton: d 16 | gravity: 3 17 | dead: 0.001 18 | sensitivity: 3 19 | snap: 1 20 | invert: 0 21 | type: 0 22 | axis: 0 23 | joyNum: 0 24 | - serializedVersion: 3 25 | m_Name: Vertical 26 | descriptiveName: 27 | descriptiveNegativeName: 28 | negativeButton: down 29 | positiveButton: up 30 | altNegativeButton: s 31 | altPositiveButton: w 32 | gravity: 3 33 | dead: 0.001 34 | sensitivity: 3 35 | snap: 1 36 | invert: 0 37 | type: 0 38 | axis: 0 39 | joyNum: 0 40 | - serializedVersion: 3 41 | m_Name: Fire1 42 | descriptiveName: 43 | descriptiveNegativeName: 44 | negativeButton: 45 | positiveButton: left ctrl 46 | altNegativeButton: 47 | altPositiveButton: mouse 0 48 | gravity: 1000 49 | dead: 0.001 50 | sensitivity: 1000 51 | snap: 0 52 | invert: 0 53 | type: 0 54 | axis: 0 55 | joyNum: 0 56 | - serializedVersion: 3 57 | m_Name: Fire2 58 | descriptiveName: 59 | descriptiveNegativeName: 60 | negativeButton: 61 | positiveButton: left alt 62 | altNegativeButton: 63 | altPositiveButton: mouse 1 64 | gravity: 1000 65 | dead: 0.001 66 | sensitivity: 1000 67 | snap: 0 68 | invert: 0 69 | type: 0 70 | axis: 0 71 | joyNum: 0 72 | - serializedVersion: 3 73 | m_Name: Fire3 74 | descriptiveName: 75 | descriptiveNegativeName: 76 | negativeButton: 77 | positiveButton: left shift 78 | altNegativeButton: 79 | altPositiveButton: mouse 2 80 | gravity: 1000 81 | dead: 0.001 82 | sensitivity: 1000 83 | snap: 0 84 | invert: 0 85 | type: 0 86 | axis: 0 87 | joyNum: 0 88 | - serializedVersion: 3 89 | m_Name: Jump 90 | descriptiveName: 91 | descriptiveNegativeName: 92 | negativeButton: 93 | positiveButton: space 94 | altNegativeButton: 95 | altPositiveButton: 96 | gravity: 1000 97 | dead: 0.001 98 | sensitivity: 1000 99 | snap: 0 100 | invert: 0 101 | type: 0 102 | axis: 0 103 | joyNum: 0 104 | - serializedVersion: 3 105 | m_Name: Mouse X 106 | descriptiveName: 107 | descriptiveNegativeName: 108 | negativeButton: 109 | positiveButton: 110 | altNegativeButton: 111 | altPositiveButton: 112 | gravity: 0 113 | dead: 0 114 | sensitivity: 0.1 115 | snap: 0 116 | invert: 0 117 | type: 1 118 | axis: 0 119 | joyNum: 0 120 | - serializedVersion: 3 121 | m_Name: Mouse Y 122 | descriptiveName: 123 | descriptiveNegativeName: 124 | negativeButton: 125 | positiveButton: 126 | altNegativeButton: 127 | altPositiveButton: 128 | gravity: 0 129 | dead: 0 130 | sensitivity: 0.1 131 | snap: 0 132 | invert: 0 133 | type: 1 134 | axis: 1 135 | joyNum: 0 136 | - serializedVersion: 3 137 | m_Name: Mouse ScrollWheel 138 | descriptiveName: 139 | descriptiveNegativeName: 140 | negativeButton: 141 | positiveButton: 142 | altNegativeButton: 143 | altPositiveButton: 144 | gravity: 0 145 | dead: 0 146 | sensitivity: 0.1 147 | snap: 0 148 | invert: 0 149 | type: 1 150 | axis: 2 151 | joyNum: 0 152 | - serializedVersion: 3 153 | m_Name: Horizontal 154 | descriptiveName: 155 | descriptiveNegativeName: 156 | negativeButton: 157 | positiveButton: 158 | altNegativeButton: 159 | altPositiveButton: 160 | gravity: 0 161 | dead: 0.19 162 | sensitivity: 1 163 | snap: 0 164 | invert: 0 165 | type: 2 166 | axis: 0 167 | joyNum: 0 168 | - serializedVersion: 3 169 | m_Name: Vertical 170 | descriptiveName: 171 | descriptiveNegativeName: 172 | negativeButton: 173 | positiveButton: 174 | altNegativeButton: 175 | altPositiveButton: 176 | gravity: 0 177 | dead: 0.19 178 | sensitivity: 1 179 | snap: 0 180 | invert: 1 181 | type: 2 182 | axis: 1 183 | joyNum: 0 184 | - serializedVersion: 3 185 | m_Name: Fire1 186 | descriptiveName: 187 | descriptiveNegativeName: 188 | negativeButton: 189 | positiveButton: joystick button 0 190 | altNegativeButton: 191 | altPositiveButton: 192 | gravity: 1000 193 | dead: 0.001 194 | sensitivity: 1000 195 | snap: 0 196 | invert: 0 197 | type: 0 198 | axis: 0 199 | joyNum: 0 200 | - serializedVersion: 3 201 | m_Name: Fire2 202 | descriptiveName: 203 | descriptiveNegativeName: 204 | negativeButton: 205 | positiveButton: joystick button 1 206 | altNegativeButton: 207 | altPositiveButton: 208 | gravity: 1000 209 | dead: 0.001 210 | sensitivity: 1000 211 | snap: 0 212 | invert: 0 213 | type: 0 214 | axis: 0 215 | joyNum: 0 216 | - serializedVersion: 3 217 | m_Name: Fire3 218 | descriptiveName: 219 | descriptiveNegativeName: 220 | negativeButton: 221 | positiveButton: joystick button 2 222 | altNegativeButton: 223 | altPositiveButton: 224 | gravity: 1000 225 | dead: 0.001 226 | sensitivity: 1000 227 | snap: 0 228 | invert: 0 229 | type: 0 230 | axis: 0 231 | joyNum: 0 232 | - serializedVersion: 3 233 | m_Name: Jump 234 | descriptiveName: 235 | descriptiveNegativeName: 236 | negativeButton: 237 | positiveButton: joystick button 3 238 | altNegativeButton: 239 | altPositiveButton: 240 | gravity: 1000 241 | dead: 0.001 242 | sensitivity: 1000 243 | snap: 0 244 | invert: 0 245 | type: 0 246 | axis: 0 247 | joyNum: 0 248 | - serializedVersion: 3 249 | m_Name: Submit 250 | descriptiveName: 251 | descriptiveNegativeName: 252 | negativeButton: 253 | positiveButton: return 254 | altNegativeButton: 255 | altPositiveButton: joystick button 0 256 | gravity: 1000 257 | dead: 0.001 258 | sensitivity: 1000 259 | snap: 0 260 | invert: 0 261 | type: 0 262 | axis: 0 263 | joyNum: 0 264 | - serializedVersion: 3 265 | m_Name: Submit 266 | descriptiveName: 267 | descriptiveNegativeName: 268 | negativeButton: 269 | positiveButton: enter 270 | altNegativeButton: 271 | altPositiveButton: space 272 | gravity: 1000 273 | dead: 0.001 274 | sensitivity: 1000 275 | snap: 0 276 | invert: 0 277 | type: 0 278 | axis: 0 279 | joyNum: 0 280 | - serializedVersion: 3 281 | m_Name: Cancel 282 | descriptiveName: 283 | descriptiveNegativeName: 284 | negativeButton: 285 | positiveButton: escape 286 | altNegativeButton: 287 | altPositiveButton: joystick button 1 288 | gravity: 1000 289 | dead: 0.001 290 | sensitivity: 1000 291 | snap: 0 292 | invert: 0 293 | type: 0 294 | axis: 0 295 | joyNum: 0 296 | m_UsePhysicalKeys: 1 297 | -------------------------------------------------------------------------------- /ProjectSettings/MemorySettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!387306366 &1 4 | MemorySettings: 5 | m_ObjectHideFlags: 0 6 | m_EditorMemorySettings: 7 | m_MainAllocatorBlockSize: -1 8 | m_ThreadAllocatorBlockSize: -1 9 | m_MainGfxBlockSize: -1 10 | m_ThreadGfxBlockSize: -1 11 | m_CacheBlockSize: -1 12 | m_TypetreeBlockSize: -1 13 | m_ProfilerBlockSize: -1 14 | m_ProfilerEditorBlockSize: -1 15 | m_BucketAllocatorGranularity: -1 16 | m_BucketAllocatorBucketsCount: -1 17 | m_BucketAllocatorBlockSize: -1 18 | m_BucketAllocatorBlockCount: -1 19 | m_ProfilerBucketAllocatorGranularity: -1 20 | m_ProfilerBucketAllocatorBucketsCount: -1 21 | m_ProfilerBucketAllocatorBlockSize: -1 22 | m_ProfilerBucketAllocatorBlockCount: -1 23 | m_TempAllocatorSizeMain: -1 24 | m_JobTempAllocatorBlockSize: -1 25 | m_BackgroundJobTempAllocatorBlockSize: -1 26 | m_JobTempAllocatorReducedBlockSize: -1 27 | m_TempAllocatorSizeGIBakingWorker: -1 28 | m_TempAllocatorSizeNavMeshWorker: -1 29 | m_TempAllocatorSizeAudioWorker: -1 30 | m_TempAllocatorSizeCloudWorker: -1 31 | m_TempAllocatorSizeGfx: -1 32 | m_TempAllocatorSizeJobWorker: -1 33 | m_TempAllocatorSizeBackgroundWorker: -1 34 | m_TempAllocatorSizePreloadManager: -1 35 | m_PlatformMemorySettings: {} 36 | -------------------------------------------------------------------------------- /ProjectSettings/NavMeshAreas.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!126 &1 4 | NavMeshProjectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | areas: 8 | - name: Walkable 9 | cost: 1 10 | - name: Not Walkable 11 | cost: 1 12 | - name: Jump 13 | cost: 2 14 | - name: 15 | cost: 1 16 | - name: 17 | cost: 1 18 | - name: 19 | cost: 1 20 | - name: 21 | cost: 1 22 | - name: 23 | cost: 1 24 | - name: 25 | cost: 1 26 | - name: 27 | cost: 1 28 | - name: 29 | cost: 1 30 | - name: 31 | cost: 1 32 | - name: 33 | cost: 1 34 | - name: 35 | cost: 1 36 | - name: 37 | cost: 1 38 | - name: 39 | cost: 1 40 | - name: 41 | cost: 1 42 | - name: 43 | cost: 1 44 | - name: 45 | cost: 1 46 | - name: 47 | cost: 1 48 | - name: 49 | cost: 1 50 | - name: 51 | cost: 1 52 | - name: 53 | cost: 1 54 | - name: 55 | cost: 1 56 | - name: 57 | cost: 1 58 | - name: 59 | cost: 1 60 | - name: 61 | cost: 1 62 | - name: 63 | cost: 1 64 | - name: 65 | cost: 1 66 | - name: 67 | cost: 1 68 | - name: 69 | cost: 1 70 | - name: 71 | cost: 1 72 | m_LastAgentTypeID: -887442657 73 | m_Settings: 74 | - serializedVersion: 3 75 | agentTypeID: 0 76 | agentRadius: 0.5 77 | agentHeight: 2 78 | agentSlope: 45 79 | agentClimb: 0.75 80 | ledgeDropHeight: 0 81 | maxJumpAcrossDistance: 0 82 | minRegionArea: 2 83 | manualCellSize: 0 84 | cellSize: 0.16666667 85 | manualTileSize: 0 86 | tileSize: 256 87 | buildHeightMesh: 0 88 | maxJobWorkers: 0 89 | preserveTilesOutsideBounds: 0 90 | debug: 91 | m_Flags: 0 92 | m_SettingNames: 93 | - Humanoid 94 | -------------------------------------------------------------------------------- /ProjectSettings/PackageManagerSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &1 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 61 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} 13 | m_Name: 14 | m_EditorClassIdentifier: 15 | m_EnablePreReleasePackages: 0 16 | m_AdvancedSettingsExpanded: 1 17 | m_ScopedRegistriesSettingsExpanded: 1 18 | m_SeeAllPackageVersions: 0 19 | m_DismissPreviewPackagesInUse: 0 20 | oneTimeWarningShown: 0 21 | m_Registries: 22 | - m_Id: main 23 | m_Name: 24 | m_Url: https://packages.unity.com 25 | m_Scopes: [] 26 | m_IsDefault: 1 27 | m_Capabilities: 7 28 | m_ConfigSource: 0 29 | - m_Id: scoped:project:package.openupm.com 30 | m_Name: package.openupm.com 31 | m_Url: https://package.openupm.com 32 | m_Scopes: 33 | - com.cysharp.unitask 34 | - com.openupm 35 | m_IsDefault: 0 36 | m_Capabilities: 0 37 | m_ConfigSource: 4 38 | m_UserSelectedRegistryName: package.openupm.com 39 | m_UserAddingNewScopedRegistry: 0 40 | m_RegistryInfoDraft: 41 | m_Modified: 0 42 | m_ErrorMessage: 43 | m_UserModificationsInstanceId: -896 44 | m_OriginalInstanceId: -898 45 | m_LoadAssets: 0 46 | -------------------------------------------------------------------------------- /ProjectSettings/Physics2DSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!19 &1 4 | Physics2DSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 6 7 | m_Gravity: {x: 0, y: -9.81} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_VelocityIterations: 8 10 | m_PositionIterations: 3 11 | m_VelocityThreshold: 1 12 | m_MaxLinearCorrection: 0.2 13 | m_MaxAngularCorrection: 8 14 | m_MaxTranslationSpeed: 100 15 | m_MaxRotationSpeed: 360 16 | m_BaumgarteScale: 0.2 17 | m_BaumgarteTimeOfImpactScale: 0.75 18 | m_TimeToSleep: 0.5 19 | m_LinearSleepTolerance: 0.01 20 | m_AngularSleepTolerance: 2 21 | m_DefaultContactOffset: 0.01 22 | m_JobOptions: 23 | serializedVersion: 2 24 | useMultithreading: 0 25 | useConsistencySorting: 0 26 | m_InterpolationPosesPerJob: 100 27 | m_NewContactsPerJob: 30 28 | m_CollideContactsPerJob: 100 29 | m_ClearFlagsPerJob: 200 30 | m_ClearBodyForcesPerJob: 200 31 | m_SyncDiscreteFixturesPerJob: 50 32 | m_SyncContinuousFixturesPerJob: 50 33 | m_FindNearestContactsPerJob: 100 34 | m_UpdateTriggerContactsPerJob: 100 35 | m_IslandSolverCostThreshold: 100 36 | m_IslandSolverBodyCostScale: 1 37 | m_IslandSolverContactCostScale: 10 38 | m_IslandSolverJointCostScale: 10 39 | m_IslandSolverBodiesPerJob: 50 40 | m_IslandSolverContactsPerJob: 50 41 | m_SimulationMode: 0 42 | m_QueriesHitTriggers: 1 43 | m_QueriesStartInColliders: 1 44 | m_CallbacksOnDisable: 1 45 | m_ReuseCollisionCallbacks: 1 46 | m_AutoSyncTransforms: 0 47 | m_GizmoOptions: 10 48 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 49 | -------------------------------------------------------------------------------- /ProjectSettings/PresetManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1386491679 &1 4 | PresetManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_DefaultPresets: {} 8 | -------------------------------------------------------------------------------- /ProjectSettings/ProjectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!129 &1 4 | PlayerSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 26 7 | productGUID: 56e5fc3a2d6e25d4a9bbb83dfa9c7cc7 8 | AndroidProfiler: 0 9 | AndroidFilterTouchesWhenObscured: 0 10 | AndroidEnableSustainedPerformanceMode: 0 11 | defaultScreenOrientation: 4 12 | targetDevice: 2 13 | useOnDemandResources: 0 14 | accelerometerFrequency: 60 15 | companyName: DefaultCompany 16 | productName: Unity-AudioLoader 17 | defaultCursor: {fileID: 0} 18 | cursorHotspot: {x: 0, y: 0} 19 | m_SplashScreenBackgroundColor: {r: 0.12156863, g: 0.12156863, b: 0.1254902, a: 1} 20 | m_ShowUnitySplashScreen: 1 21 | m_ShowUnitySplashLogo: 1 22 | m_SplashScreenOverlayOpacity: 1 23 | m_SplashScreenAnimation: 1 24 | m_SplashScreenLogoStyle: 1 25 | m_SplashScreenDrawMode: 0 26 | m_SplashScreenBackgroundAnimationZoom: 1 27 | m_SplashScreenLogoAnimationZoom: 1 28 | m_SplashScreenBackgroundLandscapeAspect: 1 29 | m_SplashScreenBackgroundPortraitAspect: 1 30 | m_SplashScreenBackgroundLandscapeUvs: 31 | serializedVersion: 2 32 | x: 0 33 | y: 0 34 | width: 1 35 | height: 1 36 | m_SplashScreenBackgroundPortraitUvs: 37 | serializedVersion: 2 38 | x: 0 39 | y: 0 40 | width: 1 41 | height: 1 42 | m_SplashScreenLogos: [] 43 | m_VirtualRealitySplashScreen: {fileID: 0} 44 | m_HolographicTrackingLossScreen: {fileID: 0} 45 | defaultScreenWidth: 1920 46 | defaultScreenHeight: 1080 47 | defaultScreenWidthWeb: 960 48 | defaultScreenHeightWeb: 600 49 | m_StereoRenderingPath: 0 50 | m_ActiveColorSpace: 0 51 | m_SpriteBatchVertexThreshold: 300 52 | m_MTRendering: 1 53 | mipStripping: 0 54 | numberOfMipsStripped: 0 55 | numberOfMipsStrippedPerMipmapLimitGroup: {} 56 | m_StackTraceTypes: 010000000100000001000000010000000100000001000000 57 | iosShowActivityIndicatorOnLoading: -1 58 | androidShowActivityIndicatorOnLoading: -1 59 | iosUseCustomAppBackgroundBehavior: 0 60 | allowedAutorotateToPortrait: 1 61 | allowedAutorotateToPortraitUpsideDown: 1 62 | allowedAutorotateToLandscapeRight: 1 63 | allowedAutorotateToLandscapeLeft: 1 64 | useOSAutorotation: 1 65 | use32BitDisplayBuffer: 1 66 | preserveFramebufferAlpha: 0 67 | disableDepthAndStencilBuffers: 0 68 | androidStartInFullscreen: 1 69 | androidRenderOutsideSafeArea: 1 70 | androidUseSwappy: 1 71 | androidBlitType: 0 72 | androidResizableWindow: 0 73 | androidDefaultWindowWidth: 1920 74 | androidDefaultWindowHeight: 1080 75 | androidMinimumWindowWidth: 400 76 | androidMinimumWindowHeight: 300 77 | androidFullscreenMode: 1 78 | defaultIsNativeResolution: 1 79 | macRetinaSupport: 1 80 | runInBackground: 0 81 | captureSingleScreen: 0 82 | muteOtherAudioSources: 0 83 | Prepare IOS For Recording: 0 84 | Force IOS Speakers When Recording: 0 85 | deferSystemGesturesMode: 0 86 | hideHomeButton: 0 87 | submitAnalytics: 1 88 | usePlayerLog: 1 89 | bakeCollisionMeshes: 0 90 | forceSingleInstance: 0 91 | useFlipModelSwapchain: 1 92 | resizableWindow: 0 93 | useMacAppStoreValidation: 0 94 | macAppStoreCategory: public.app-category.games 95 | gpuSkinning: 0 96 | xboxPIXTextureCapture: 0 97 | xboxEnableAvatar: 0 98 | xboxEnableKinect: 0 99 | xboxEnableKinectAutoTracking: 0 100 | xboxEnableFitness: 0 101 | visibleInBackground: 1 102 | allowFullscreenSwitch: 1 103 | fullscreenMode: 1 104 | xboxSpeechDB: 0 105 | xboxEnableHeadOrientation: 0 106 | xboxEnableGuest: 0 107 | xboxEnablePIXSampling: 0 108 | metalFramebufferOnly: 0 109 | xboxOneResolution: 0 110 | xboxOneSResolution: 0 111 | xboxOneXResolution: 3 112 | xboxOneMonoLoggingLevel: 0 113 | xboxOneLoggingLevel: 1 114 | xboxOneDisableEsram: 0 115 | xboxOneEnableTypeOptimization: 0 116 | xboxOnePresentImmediateThreshold: 0 117 | switchQueueCommandMemory: 1048576 118 | switchQueueControlMemory: 16384 119 | switchQueueComputeMemory: 262144 120 | switchNVNShaderPoolsGranularity: 33554432 121 | switchNVNDefaultPoolsGranularity: 16777216 122 | switchNVNOtherPoolsGranularity: 16777216 123 | switchGpuScratchPoolGranularity: 2097152 124 | switchAllowGpuScratchShrinking: 0 125 | switchNVNMaxPublicTextureIDCount: 0 126 | switchNVNMaxPublicSamplerIDCount: 0 127 | switchNVNGraphicsFirmwareMemory: 32 128 | stadiaPresentMode: 0 129 | stadiaTargetFramerate: 0 130 | vulkanNumSwapchainBuffers: 3 131 | vulkanEnableSetSRGBWrite: 0 132 | vulkanEnablePreTransform: 0 133 | vulkanEnableLateAcquireNextImage: 0 134 | vulkanEnableCommandBufferRecycling: 1 135 | loadStoreDebugModeEnabled: 0 136 | bundleVersion: 1.0 137 | preloadedAssets: [] 138 | metroInputSource: 0 139 | wsaTransparentSwapchain: 0 140 | m_HolographicPauseOnTrackingLoss: 1 141 | xboxOneDisableKinectGpuReservation: 1 142 | xboxOneEnable7thCore: 1 143 | vrSettings: 144 | enable360StereoCapture: 0 145 | isWsaHolographicRemotingEnabled: 0 146 | enableFrameTimingStats: 0 147 | enableOpenGLProfilerGPURecorders: 1 148 | useHDRDisplay: 0 149 | hdrBitDepth: 0 150 | m_ColorGamuts: 00000000 151 | targetPixelDensity: 30 152 | resolutionScalingMode: 0 153 | resetResolutionOnWindowResize: 0 154 | androidSupportedAspectRatio: 1 155 | androidMaxAspectRatio: 2.1 156 | applicationIdentifier: {} 157 | buildNumber: 158 | Standalone: 0 159 | VisionOS: 0 160 | iPhone: 0 161 | tvOS: 0 162 | overrideDefaultApplicationIdentifier: 0 163 | AndroidBundleVersionCode: 1 164 | AndroidMinSdkVersion: 22 165 | AndroidTargetSdkVersion: 0 166 | AndroidPreferredInstallLocation: 1 167 | aotOptions: 168 | stripEngineCode: 1 169 | iPhoneStrippingLevel: 0 170 | iPhoneScriptCallOptimization: 0 171 | ForceInternetPermission: 0 172 | ForceSDCardPermission: 0 173 | CreateWallpaper: 0 174 | APKExpansionFiles: 0 175 | keepLoadedShadersAlive: 0 176 | StripUnusedMeshComponents: 0 177 | strictShaderVariantMatching: 0 178 | VertexChannelCompressionMask: 4054 179 | iPhoneSdkVersion: 988 180 | iOSTargetOSVersionString: 12.0 181 | tvOSSdkVersion: 0 182 | tvOSRequireExtendedGameController: 0 183 | tvOSTargetOSVersionString: 12.0 184 | VisionOSSdkVersion: 0 185 | VisionOSTargetOSVersionString: 1.0 186 | uIPrerenderedIcon: 0 187 | uIRequiresPersistentWiFi: 0 188 | uIRequiresFullScreen: 1 189 | uIStatusBarHidden: 1 190 | uIExitOnSuspend: 0 191 | uIStatusBarStyle: 0 192 | appleTVSplashScreen: {fileID: 0} 193 | appleTVSplashScreen2x: {fileID: 0} 194 | tvOSSmallIconLayers: [] 195 | tvOSSmallIconLayers2x: [] 196 | tvOSLargeIconLayers: [] 197 | tvOSLargeIconLayers2x: [] 198 | tvOSTopShelfImageLayers: [] 199 | tvOSTopShelfImageLayers2x: [] 200 | tvOSTopShelfImageWideLayers: [] 201 | tvOSTopShelfImageWideLayers2x: [] 202 | iOSLaunchScreenType: 0 203 | iOSLaunchScreenPortrait: {fileID: 0} 204 | iOSLaunchScreenLandscape: {fileID: 0} 205 | iOSLaunchScreenBackgroundColor: 206 | serializedVersion: 2 207 | rgba: 0 208 | iOSLaunchScreenFillPct: 100 209 | iOSLaunchScreenSize: 100 210 | iOSLaunchScreenCustomXibPath: 211 | iOSLaunchScreeniPadType: 0 212 | iOSLaunchScreeniPadImage: {fileID: 0} 213 | iOSLaunchScreeniPadBackgroundColor: 214 | serializedVersion: 2 215 | rgba: 0 216 | iOSLaunchScreeniPadFillPct: 100 217 | iOSLaunchScreeniPadSize: 100 218 | iOSLaunchScreeniPadCustomXibPath: 219 | iOSLaunchScreenCustomStoryboardPath: 220 | iOSLaunchScreeniPadCustomStoryboardPath: 221 | iOSDeviceRequirements: [] 222 | iOSURLSchemes: [] 223 | macOSURLSchemes: [] 224 | iOSBackgroundModes: 0 225 | iOSMetalForceHardShadows: 0 226 | metalEditorSupport: 1 227 | metalAPIValidation: 1 228 | iOSRenderExtraFrameOnPause: 0 229 | iosCopyPluginsCodeInsteadOfSymlink: 0 230 | appleDeveloperTeamID: 231 | iOSManualSigningProvisioningProfileID: 232 | tvOSManualSigningProvisioningProfileID: 233 | VisionOSManualSigningProvisioningProfileID: 234 | iOSManualSigningProvisioningProfileType: 0 235 | tvOSManualSigningProvisioningProfileType: 0 236 | VisionOSManualSigningProvisioningProfileType: 0 237 | appleEnableAutomaticSigning: 0 238 | iOSRequireARKit: 0 239 | iOSAutomaticallyDetectAndAddCapabilities: 1 240 | appleEnableProMotion: 0 241 | shaderPrecisionModel: 0 242 | clonedFromGUID: 00000000000000000000000000000000 243 | templatePackageId: 244 | templateDefaultScene: 245 | useCustomMainManifest: 0 246 | useCustomLauncherManifest: 0 247 | useCustomMainGradleTemplate: 0 248 | useCustomLauncherGradleManifest: 0 249 | useCustomBaseGradleTemplate: 0 250 | useCustomGradlePropertiesTemplate: 0 251 | useCustomGradleSettingsTemplate: 0 252 | useCustomProguardFile: 0 253 | AndroidTargetArchitectures: 1 254 | AndroidTargetDevices: 0 255 | AndroidSplashScreenScale: 0 256 | androidSplashScreen: {fileID: 0} 257 | AndroidKeystoreName: 258 | AndroidKeyaliasName: 259 | AndroidEnableArmv9SecurityFeatures: 0 260 | AndroidBuildApkPerCpuArchitecture: 0 261 | AndroidTVCompatibility: 0 262 | AndroidIsGame: 1 263 | AndroidEnableTango: 0 264 | androidEnableBanner: 1 265 | androidUseLowAccuracyLocation: 0 266 | androidUseCustomKeystore: 0 267 | m_AndroidBanners: 268 | - width: 320 269 | height: 180 270 | banner: {fileID: 0} 271 | androidGamepadSupportLevel: 0 272 | chromeosInputEmulation: 1 273 | AndroidMinifyRelease: 0 274 | AndroidMinifyDebug: 0 275 | AndroidValidateAppBundleSize: 1 276 | AndroidAppBundleSizeToValidate: 150 277 | m_BuildTargetIcons: [] 278 | m_BuildTargetPlatformIcons: 279 | - m_BuildTarget: iPhone 280 | m_Icons: 281 | - m_Textures: [] 282 | m_Width: 180 283 | m_Height: 180 284 | m_Kind: 0 285 | m_SubKind: iPhone 286 | - m_Textures: [] 287 | m_Width: 120 288 | m_Height: 120 289 | m_Kind: 0 290 | m_SubKind: iPhone 291 | - m_Textures: [] 292 | m_Width: 167 293 | m_Height: 167 294 | m_Kind: 0 295 | m_SubKind: iPad 296 | - m_Textures: [] 297 | m_Width: 152 298 | m_Height: 152 299 | m_Kind: 0 300 | m_SubKind: iPad 301 | - m_Textures: [] 302 | m_Width: 76 303 | m_Height: 76 304 | m_Kind: 0 305 | m_SubKind: iPad 306 | - m_Textures: [] 307 | m_Width: 120 308 | m_Height: 120 309 | m_Kind: 3 310 | m_SubKind: iPhone 311 | - m_Textures: [] 312 | m_Width: 80 313 | m_Height: 80 314 | m_Kind: 3 315 | m_SubKind: iPhone 316 | - m_Textures: [] 317 | m_Width: 80 318 | m_Height: 80 319 | m_Kind: 3 320 | m_SubKind: iPad 321 | - m_Textures: [] 322 | m_Width: 40 323 | m_Height: 40 324 | m_Kind: 3 325 | m_SubKind: iPad 326 | - m_Textures: [] 327 | m_Width: 87 328 | m_Height: 87 329 | m_Kind: 1 330 | m_SubKind: iPhone 331 | - m_Textures: [] 332 | m_Width: 58 333 | m_Height: 58 334 | m_Kind: 1 335 | m_SubKind: iPhone 336 | - m_Textures: [] 337 | m_Width: 29 338 | m_Height: 29 339 | m_Kind: 1 340 | m_SubKind: iPhone 341 | - m_Textures: [] 342 | m_Width: 58 343 | m_Height: 58 344 | m_Kind: 1 345 | m_SubKind: iPad 346 | - m_Textures: [] 347 | m_Width: 29 348 | m_Height: 29 349 | m_Kind: 1 350 | m_SubKind: iPad 351 | - m_Textures: [] 352 | m_Width: 60 353 | m_Height: 60 354 | m_Kind: 2 355 | m_SubKind: iPhone 356 | - m_Textures: [] 357 | m_Width: 40 358 | m_Height: 40 359 | m_Kind: 2 360 | m_SubKind: iPhone 361 | - m_Textures: [] 362 | m_Width: 40 363 | m_Height: 40 364 | m_Kind: 2 365 | m_SubKind: iPad 366 | - m_Textures: [] 367 | m_Width: 20 368 | m_Height: 20 369 | m_Kind: 2 370 | m_SubKind: iPad 371 | - m_Textures: [] 372 | m_Width: 1024 373 | m_Height: 1024 374 | m_Kind: 4 375 | m_SubKind: App Store 376 | - m_BuildTarget: Android 377 | m_Icons: 378 | - m_Textures: [] 379 | m_Width: 432 380 | m_Height: 432 381 | m_Kind: 2 382 | m_SubKind: 383 | - m_Textures: [] 384 | m_Width: 324 385 | m_Height: 324 386 | m_Kind: 2 387 | m_SubKind: 388 | - m_Textures: [] 389 | m_Width: 216 390 | m_Height: 216 391 | m_Kind: 2 392 | m_SubKind: 393 | - m_Textures: [] 394 | m_Width: 162 395 | m_Height: 162 396 | m_Kind: 2 397 | m_SubKind: 398 | - m_Textures: [] 399 | m_Width: 108 400 | m_Height: 108 401 | m_Kind: 2 402 | m_SubKind: 403 | - m_Textures: [] 404 | m_Width: 81 405 | m_Height: 81 406 | m_Kind: 2 407 | m_SubKind: 408 | - m_Textures: [] 409 | m_Width: 192 410 | m_Height: 192 411 | m_Kind: 1 412 | m_SubKind: 413 | - m_Textures: [] 414 | m_Width: 144 415 | m_Height: 144 416 | m_Kind: 1 417 | m_SubKind: 418 | - m_Textures: [] 419 | m_Width: 96 420 | m_Height: 96 421 | m_Kind: 1 422 | m_SubKind: 423 | - m_Textures: [] 424 | m_Width: 72 425 | m_Height: 72 426 | m_Kind: 1 427 | m_SubKind: 428 | - m_Textures: [] 429 | m_Width: 48 430 | m_Height: 48 431 | m_Kind: 1 432 | m_SubKind: 433 | - m_Textures: [] 434 | m_Width: 36 435 | m_Height: 36 436 | m_Kind: 1 437 | m_SubKind: 438 | - m_Textures: [] 439 | m_Width: 192 440 | m_Height: 192 441 | m_Kind: 0 442 | m_SubKind: 443 | - m_Textures: [] 444 | m_Width: 144 445 | m_Height: 144 446 | m_Kind: 0 447 | m_SubKind: 448 | - m_Textures: [] 449 | m_Width: 96 450 | m_Height: 96 451 | m_Kind: 0 452 | m_SubKind: 453 | - m_Textures: [] 454 | m_Width: 72 455 | m_Height: 72 456 | m_Kind: 0 457 | m_SubKind: 458 | - m_Textures: [] 459 | m_Width: 48 460 | m_Height: 48 461 | m_Kind: 0 462 | m_SubKind: 463 | - m_Textures: [] 464 | m_Width: 36 465 | m_Height: 36 466 | m_Kind: 0 467 | m_SubKind: 468 | m_BuildTargetBatching: [] 469 | m_BuildTargetShaderSettings: [] 470 | m_BuildTargetGraphicsJobs: [] 471 | m_BuildTargetGraphicsJobMode: [] 472 | m_BuildTargetGraphicsAPIs: [] 473 | m_BuildTargetVRSettings: [] 474 | m_DefaultShaderChunkSizeInMB: 16 475 | m_DefaultShaderChunkCount: 0 476 | openGLRequireES31: 0 477 | openGLRequireES31AEP: 0 478 | openGLRequireES32: 0 479 | m_TemplateCustomTags: {} 480 | mobileMTRendering: 481 | Android: 1 482 | VisionOS: 1 483 | iPhone: 1 484 | tvOS: 1 485 | m_BuildTargetGroupLightmapEncodingQuality: [] 486 | m_BuildTargetGroupHDRCubemapEncodingQuality: [] 487 | m_BuildTargetGroupLightmapSettings: [] 488 | m_BuildTargetGroupLoadStoreDebugModeSettings: [] 489 | m_BuildTargetNormalMapEncoding: [] 490 | m_BuildTargetDefaultTextureCompressionFormat: [] 491 | playModeTestRunnerEnabled: 0 492 | runPlayModeTestAsEditModeTest: 0 493 | actionOnDotNetUnhandledException: 1 494 | enableInternalProfiler: 0 495 | logObjCUncaughtExceptions: 1 496 | enableCrashReportAPI: 0 497 | cameraUsageDescription: 498 | locationUsageDescription: 499 | microphoneUsageDescription: 500 | bluetoothUsageDescription: 501 | macOSTargetOSVersion: 10.13.0 502 | switchNMETAOverride: 503 | switchNetLibKey: 504 | switchSocketMemoryPoolSize: 6144 505 | switchSocketAllocatorPoolSize: 128 506 | switchSocketConcurrencyLimit: 14 507 | switchScreenResolutionBehavior: 2 508 | switchUseCPUProfiler: 0 509 | switchUseGOLDLinker: 0 510 | switchLTOSetting: 0 511 | switchApplicationID: 0x01004b9000490000 512 | switchNSODependencies: 513 | switchCompilerFlags: 514 | switchTitleNames_0: 515 | switchTitleNames_1: 516 | switchTitleNames_2: 517 | switchTitleNames_3: 518 | switchTitleNames_4: 519 | switchTitleNames_5: 520 | switchTitleNames_6: 521 | switchTitleNames_7: 522 | switchTitleNames_8: 523 | switchTitleNames_9: 524 | switchTitleNames_10: 525 | switchTitleNames_11: 526 | switchTitleNames_12: 527 | switchTitleNames_13: 528 | switchTitleNames_14: 529 | switchTitleNames_15: 530 | switchPublisherNames_0: 531 | switchPublisherNames_1: 532 | switchPublisherNames_2: 533 | switchPublisherNames_3: 534 | switchPublisherNames_4: 535 | switchPublisherNames_5: 536 | switchPublisherNames_6: 537 | switchPublisherNames_7: 538 | switchPublisherNames_8: 539 | switchPublisherNames_9: 540 | switchPublisherNames_10: 541 | switchPublisherNames_11: 542 | switchPublisherNames_12: 543 | switchPublisherNames_13: 544 | switchPublisherNames_14: 545 | switchPublisherNames_15: 546 | switchIcons_0: {fileID: 0} 547 | switchIcons_1: {fileID: 0} 548 | switchIcons_2: {fileID: 0} 549 | switchIcons_3: {fileID: 0} 550 | switchIcons_4: {fileID: 0} 551 | switchIcons_5: {fileID: 0} 552 | switchIcons_6: {fileID: 0} 553 | switchIcons_7: {fileID: 0} 554 | switchIcons_8: {fileID: 0} 555 | switchIcons_9: {fileID: 0} 556 | switchIcons_10: {fileID: 0} 557 | switchIcons_11: {fileID: 0} 558 | switchIcons_12: {fileID: 0} 559 | switchIcons_13: {fileID: 0} 560 | switchIcons_14: {fileID: 0} 561 | switchIcons_15: {fileID: 0} 562 | switchSmallIcons_0: {fileID: 0} 563 | switchSmallIcons_1: {fileID: 0} 564 | switchSmallIcons_2: {fileID: 0} 565 | switchSmallIcons_3: {fileID: 0} 566 | switchSmallIcons_4: {fileID: 0} 567 | switchSmallIcons_5: {fileID: 0} 568 | switchSmallIcons_6: {fileID: 0} 569 | switchSmallIcons_7: {fileID: 0} 570 | switchSmallIcons_8: {fileID: 0} 571 | switchSmallIcons_9: {fileID: 0} 572 | switchSmallIcons_10: {fileID: 0} 573 | switchSmallIcons_11: {fileID: 0} 574 | switchSmallIcons_12: {fileID: 0} 575 | switchSmallIcons_13: {fileID: 0} 576 | switchSmallIcons_14: {fileID: 0} 577 | switchSmallIcons_15: {fileID: 0} 578 | switchManualHTML: 579 | switchAccessibleURLs: 580 | switchLegalInformation: 581 | switchMainThreadStackSize: 1048576 582 | switchPresenceGroupId: 583 | switchLogoHandling: 0 584 | switchReleaseVersion: 0 585 | switchDisplayVersion: 1.0.0 586 | switchStartupUserAccount: 0 587 | switchSupportedLanguagesMask: 0 588 | switchLogoType: 0 589 | switchApplicationErrorCodeCategory: 590 | switchUserAccountSaveDataSize: 0 591 | switchUserAccountSaveDataJournalSize: 0 592 | switchApplicationAttribute: 0 593 | switchCardSpecSize: -1 594 | switchCardSpecClock: -1 595 | switchRatingsMask: 0 596 | switchRatingsInt_0: 0 597 | switchRatingsInt_1: 0 598 | switchRatingsInt_2: 0 599 | switchRatingsInt_3: 0 600 | switchRatingsInt_4: 0 601 | switchRatingsInt_5: 0 602 | switchRatingsInt_6: 0 603 | switchRatingsInt_7: 0 604 | switchRatingsInt_8: 0 605 | switchRatingsInt_9: 0 606 | switchRatingsInt_10: 0 607 | switchRatingsInt_11: 0 608 | switchRatingsInt_12: 0 609 | switchLocalCommunicationIds_0: 610 | switchLocalCommunicationIds_1: 611 | switchLocalCommunicationIds_2: 612 | switchLocalCommunicationIds_3: 613 | switchLocalCommunicationIds_4: 614 | switchLocalCommunicationIds_5: 615 | switchLocalCommunicationIds_6: 616 | switchLocalCommunicationIds_7: 617 | switchParentalControl: 0 618 | switchAllowsScreenshot: 1 619 | switchAllowsVideoCapturing: 1 620 | switchAllowsRuntimeAddOnContentInstall: 0 621 | switchDataLossConfirmation: 0 622 | switchUserAccountLockEnabled: 0 623 | switchSystemResourceMemory: 16777216 624 | switchSupportedNpadStyles: 22 625 | switchNativeFsCacheSize: 32 626 | switchIsHoldTypeHorizontal: 1 627 | switchSupportedNpadCount: 8 628 | switchEnableTouchScreen: 1 629 | switchSocketConfigEnabled: 0 630 | switchTcpInitialSendBufferSize: 32 631 | switchTcpInitialReceiveBufferSize: 64 632 | switchTcpAutoSendBufferSizeMax: 256 633 | switchTcpAutoReceiveBufferSizeMax: 256 634 | switchUdpSendBufferSize: 9 635 | switchUdpReceiveBufferSize: 42 636 | switchSocketBufferEfficiency: 4 637 | switchSocketInitializeEnabled: 1 638 | switchNetworkInterfaceManagerInitializeEnabled: 1 639 | switchPlayerConnectionEnabled: 1 640 | switchUseNewStyleFilepaths: 1 641 | switchUseLegacyFmodPriorities: 0 642 | switchUseMicroSleepForYield: 1 643 | switchEnableRamDiskSupport: 0 644 | switchMicroSleepForYieldTime: 25 645 | switchRamDiskSpaceSize: 12 646 | ps4NPAgeRating: 12 647 | ps4NPTitleSecret: 648 | ps4NPTrophyPackPath: 649 | ps4ParentalLevel: 11 650 | ps4ContentID: ED1633-NPXX51362_00-0000000000000000 651 | ps4Category: 0 652 | ps4MasterVersion: 01.00 653 | ps4AppVersion: 01.00 654 | ps4AppType: 0 655 | ps4ParamSfxPath: 656 | ps4VideoOutPixelFormat: 0 657 | ps4VideoOutInitialWidth: 1920 658 | ps4VideoOutBaseModeInitialWidth: 1920 659 | ps4VideoOutReprojectionRate: 60 660 | ps4PronunciationXMLPath: 661 | ps4PronunciationSIGPath: 662 | ps4BackgroundImagePath: 663 | ps4StartupImagePath: 664 | ps4StartupImagesFolder: 665 | ps4IconImagesFolder: 666 | ps4SaveDataImagePath: 667 | ps4SdkOverride: 668 | ps4BGMPath: 669 | ps4ShareFilePath: 670 | ps4ShareOverlayImagePath: 671 | ps4PrivacyGuardImagePath: 672 | ps4ExtraSceSysFile: 673 | ps4NPtitleDatPath: 674 | ps4RemotePlayKeyAssignment: -1 675 | ps4RemotePlayKeyMappingDir: 676 | ps4PlayTogetherPlayerCount: 0 677 | ps4EnterButtonAssignment: 2 678 | ps4ApplicationParam1: 0 679 | ps4ApplicationParam2: 0 680 | ps4ApplicationParam3: 0 681 | ps4ApplicationParam4: 0 682 | ps4DownloadDataSize: 0 683 | ps4GarlicHeapSize: 2048 684 | ps4ProGarlicHeapSize: 2560 685 | playerPrefsMaxSize: 32768 686 | ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ 687 | ps4pnSessions: 1 688 | ps4pnPresence: 1 689 | ps4pnFriends: 1 690 | ps4pnGameCustomData: 1 691 | playerPrefsSupport: 0 692 | enableApplicationExit: 0 693 | resetTempFolder: 1 694 | restrictedAudioUsageRights: 0 695 | ps4UseResolutionFallback: 0 696 | ps4ReprojectionSupport: 0 697 | ps4UseAudio3dBackend: 0 698 | ps4UseLowGarlicFragmentationMode: 1 699 | ps4SocialScreenEnabled: 0 700 | ps4ScriptOptimizationLevel: 2 701 | ps4Audio3dVirtualSpeakerCount: 14 702 | ps4attribCpuUsage: 0 703 | ps4PatchPkgPath: 704 | ps4PatchLatestPkgPath: 705 | ps4PatchChangeinfoPath: 706 | ps4PatchDayOne: 0 707 | ps4attribUserManagement: 0 708 | ps4attribMoveSupport: 0 709 | ps4attrib3DSupport: 0 710 | ps4attribShareSupport: 0 711 | ps4attribExclusiveVR: 0 712 | ps4disableAutoHideSplash: 0 713 | ps4videoRecordingFeaturesUsed: 0 714 | ps4contentSearchFeaturesUsed: 0 715 | ps4CompatibilityPS5: 0 716 | ps4AllowPS5Detection: 0 717 | ps4GPU800MHz: 1 718 | ps4attribEyeToEyeDistanceSettingVR: 0 719 | ps4IncludedModules: [] 720 | ps4attribVROutputEnabled: 0 721 | monoEnv: 722 | splashScreenBackgroundSourceLandscape: {fileID: 0} 723 | splashScreenBackgroundSourcePortrait: {fileID: 0} 724 | blurSplashScreenBackground: 1 725 | spritePackerPolicy: 726 | webGLMemorySize: 32 727 | webGLExceptionSupport: 1 728 | webGLNameFilesAsHashes: 0 729 | webGLShowDiagnostics: 0 730 | webGLDataCaching: 1 731 | webGLDebugSymbols: 0 732 | webGLEmscriptenArgs: 733 | webGLModulesDirectory: 734 | webGLTemplate: APPLICATION:Default 735 | webGLAnalyzeBuildSize: 0 736 | webGLUseEmbeddedResources: 0 737 | webGLCompressionFormat: 0 738 | webGLWasmArithmeticExceptions: 0 739 | webGLLinkerTarget: 1 740 | webGLThreadsSupport: 0 741 | webGLDecompressionFallback: 0 742 | webGLInitialMemorySize: 32 743 | webGLMaximumMemorySize: 2048 744 | webGLMemoryGrowthMode: 2 745 | webGLMemoryLinearGrowthStep: 16 746 | webGLMemoryGeometricGrowthStep: 0.2 747 | webGLMemoryGeometricGrowthCap: 96 748 | webGLPowerPreference: 2 749 | scriptingDefineSymbols: {} 750 | additionalCompilerArguments: {} 751 | platformArchitecture: {} 752 | scriptingBackend: {} 753 | il2cppCompilerConfiguration: {} 754 | il2cppCodeGeneration: {} 755 | managedStrippingLevel: {} 756 | incrementalIl2cppBuild: {} 757 | suppressCommonWarnings: 1 758 | allowUnsafeCode: 0 759 | useDeterministicCompilation: 1 760 | additionalIl2CppArgs: 761 | scriptingRuntimeVersion: 1 762 | gcIncremental: 1 763 | gcWBarrierValidation: 0 764 | apiCompatibilityLevelPerPlatform: {} 765 | m_RenderingPath: 1 766 | m_MobileRenderingPath: 1 767 | metroPackageName: Unity-AudioLoader 768 | metroPackageVersion: 769 | metroCertificatePath: 770 | metroCertificatePassword: 771 | metroCertificateSubject: 772 | metroCertificateIssuer: 773 | metroCertificateNotAfter: 0000000000000000 774 | metroApplicationDescription: Unity-AudioLoader 775 | wsaImages: {} 776 | metroTileShortName: 777 | metroTileShowName: 0 778 | metroMediumTileShowName: 0 779 | metroLargeTileShowName: 0 780 | metroWideTileShowName: 0 781 | metroSupportStreamingInstall: 0 782 | metroLastRequiredScene: 0 783 | metroDefaultTileSize: 1 784 | metroTileForegroundText: 2 785 | metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} 786 | metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1} 787 | metroSplashScreenUseBackgroundColor: 0 788 | platformCapabilities: {} 789 | metroTargetDeviceFamilies: {} 790 | metroFTAName: 791 | metroFTAFileTypes: [] 792 | metroProtocolName: 793 | vcxProjDefaultLanguage: 794 | XboxOneProductId: 795 | XboxOneUpdateKey: 796 | XboxOneSandboxId: 797 | XboxOneContentId: 798 | XboxOneTitleId: 799 | XboxOneSCId: 800 | XboxOneGameOsOverridePath: 801 | XboxOnePackagingOverridePath: 802 | XboxOneAppManifestOverridePath: 803 | XboxOneVersion: 1.0.0.0 804 | XboxOnePackageEncryption: 0 805 | XboxOnePackageUpdateGranularity: 2 806 | XboxOneDescription: 807 | XboxOneLanguage: 808 | - enus 809 | XboxOneCapability: [] 810 | XboxOneGameRating: {} 811 | XboxOneIsContentPackage: 0 812 | XboxOneEnhancedXboxCompatibilityMode: 0 813 | XboxOneEnableGPUVariability: 1 814 | XboxOneSockets: {} 815 | XboxOneSplashScreen: {fileID: 0} 816 | XboxOneAllowedProductIds: [] 817 | XboxOnePersistentLocalStorageSize: 0 818 | XboxOneXTitleMemory: 8 819 | XboxOneOverrideIdentityName: 820 | XboxOneOverrideIdentityPublisher: 821 | vrEditorSettings: {} 822 | cloudServicesEnabled: {} 823 | luminIcon: 824 | m_Name: 825 | m_ModelFolderPath: 826 | m_PortalFolderPath: 827 | luminCert: 828 | m_CertPath: 829 | m_SignPackage: 1 830 | luminIsChannelApp: 0 831 | luminVersion: 832 | m_VersionCode: 1 833 | m_VersionName: 834 | hmiPlayerDataPath: 835 | hmiForceSRGBBlit: 1 836 | embeddedLinuxEnableGamepadInput: 1 837 | hmiLogStartupTiming: 0 838 | hmiCpuConfiguration: 839 | apiCompatibilityLevel: 6 840 | activeInputHandler: 0 841 | windowsGamepadBackendHint: 0 842 | cloudProjectId: 843 | framebufferDepthMemorylessMode: 0 844 | qualitySettingsNames: [] 845 | projectName: 846 | organizationId: 847 | cloudEnabled: 0 848 | legacyClampBlendShapeWeights: 0 849 | hmiLoadingImage: {fileID: 0} 850 | platformRequiresReadableAssets: 0 851 | virtualTexturingSupportEnabled: 0 852 | insecureHttpOption: 0 853 | -------------------------------------------------------------------------------- /ProjectSettings/ProjectVersion.txt: -------------------------------------------------------------------------------- 1 | m_EditorVersion: 2022.3.5f1 2 | m_EditorVersionWithRevision: 2022.3.5f1 (9674261d40ee) 3 | -------------------------------------------------------------------------------- /ProjectSettings/QualitySettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!47 &1 4 | QualitySettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 5 7 | m_CurrentQuality: 5 8 | m_QualitySettings: 9 | - serializedVersion: 3 10 | name: Very Low 11 | pixelLightCount: 0 12 | shadows: 0 13 | shadowResolution: 0 14 | shadowProjection: 1 15 | shadowCascades: 1 16 | shadowDistance: 15 17 | shadowNearPlaneOffset: 3 18 | shadowCascade2Split: 0.33333334 19 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 20 | shadowmaskMode: 0 21 | skinWeights: 1 22 | globalTextureMipmapLimit: 1 23 | textureMipmapLimitSettings: [] 24 | anisotropicTextures: 0 25 | antiAliasing: 0 26 | softParticles: 0 27 | softVegetation: 0 28 | realtimeReflectionProbes: 0 29 | billboardsFaceCameraPosition: 0 30 | useLegacyDetailDistribution: 0 31 | vSyncCount: 0 32 | realtimeGICPUUsage: 25 33 | lodBias: 0.3 34 | maximumLODLevel: 0 35 | enableLODCrossFade: 1 36 | streamingMipmapsActive: 0 37 | streamingMipmapsAddAllCameras: 1 38 | streamingMipmapsMemoryBudget: 512 39 | streamingMipmapsRenderersPerFrame: 512 40 | streamingMipmapsMaxLevelReduction: 2 41 | streamingMipmapsMaxFileIORequests: 1024 42 | particleRaycastBudget: 4 43 | asyncUploadTimeSlice: 2 44 | asyncUploadBufferSize: 16 45 | asyncUploadPersistentBuffer: 1 46 | resolutionScalingFixedDPIFactor: 1 47 | customRenderPipeline: {fileID: 0} 48 | terrainQualityOverrides: 0 49 | terrainPixelError: 1 50 | terrainDetailDensityScale: 1 51 | terrainBasemapDistance: 1000 52 | terrainDetailDistance: 80 53 | terrainTreeDistance: 5000 54 | terrainBillboardStart: 50 55 | terrainFadeLength: 5 56 | terrainMaxTrees: 50 57 | excludedTargetPlatforms: [] 58 | - serializedVersion: 3 59 | name: Low 60 | pixelLightCount: 0 61 | shadows: 0 62 | shadowResolution: 0 63 | shadowProjection: 1 64 | shadowCascades: 1 65 | shadowDistance: 20 66 | shadowNearPlaneOffset: 3 67 | shadowCascade2Split: 0.33333334 68 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 69 | shadowmaskMode: 0 70 | skinWeights: 2 71 | globalTextureMipmapLimit: 0 72 | textureMipmapLimitSettings: [] 73 | anisotropicTextures: 0 74 | antiAliasing: 0 75 | softParticles: 0 76 | softVegetation: 0 77 | realtimeReflectionProbes: 0 78 | billboardsFaceCameraPosition: 0 79 | useLegacyDetailDistribution: 0 80 | vSyncCount: 0 81 | realtimeGICPUUsage: 25 82 | lodBias: 0.4 83 | maximumLODLevel: 0 84 | enableLODCrossFade: 1 85 | streamingMipmapsActive: 0 86 | streamingMipmapsAddAllCameras: 1 87 | streamingMipmapsMemoryBudget: 512 88 | streamingMipmapsRenderersPerFrame: 512 89 | streamingMipmapsMaxLevelReduction: 2 90 | streamingMipmapsMaxFileIORequests: 1024 91 | particleRaycastBudget: 16 92 | asyncUploadTimeSlice: 2 93 | asyncUploadBufferSize: 16 94 | asyncUploadPersistentBuffer: 1 95 | resolutionScalingFixedDPIFactor: 1 96 | customRenderPipeline: {fileID: 0} 97 | terrainQualityOverrides: 0 98 | terrainPixelError: 1 99 | terrainDetailDensityScale: 1 100 | terrainBasemapDistance: 1000 101 | terrainDetailDistance: 80 102 | terrainTreeDistance: 5000 103 | terrainBillboardStart: 50 104 | terrainFadeLength: 5 105 | terrainMaxTrees: 50 106 | excludedTargetPlatforms: [] 107 | - serializedVersion: 3 108 | name: Medium 109 | pixelLightCount: 1 110 | shadows: 1 111 | shadowResolution: 0 112 | shadowProjection: 1 113 | shadowCascades: 1 114 | shadowDistance: 20 115 | shadowNearPlaneOffset: 3 116 | shadowCascade2Split: 0.33333334 117 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 118 | shadowmaskMode: 0 119 | skinWeights: 2 120 | globalTextureMipmapLimit: 0 121 | textureMipmapLimitSettings: [] 122 | anisotropicTextures: 1 123 | antiAliasing: 0 124 | softParticles: 0 125 | softVegetation: 0 126 | realtimeReflectionProbes: 0 127 | billboardsFaceCameraPosition: 0 128 | useLegacyDetailDistribution: 0 129 | vSyncCount: 1 130 | realtimeGICPUUsage: 25 131 | lodBias: 0.7 132 | maximumLODLevel: 0 133 | enableLODCrossFade: 1 134 | streamingMipmapsActive: 0 135 | streamingMipmapsAddAllCameras: 1 136 | streamingMipmapsMemoryBudget: 512 137 | streamingMipmapsRenderersPerFrame: 512 138 | streamingMipmapsMaxLevelReduction: 2 139 | streamingMipmapsMaxFileIORequests: 1024 140 | particleRaycastBudget: 64 141 | asyncUploadTimeSlice: 2 142 | asyncUploadBufferSize: 16 143 | asyncUploadPersistentBuffer: 1 144 | resolutionScalingFixedDPIFactor: 1 145 | customRenderPipeline: {fileID: 0} 146 | terrainQualityOverrides: 0 147 | terrainPixelError: 1 148 | terrainDetailDensityScale: 1 149 | terrainBasemapDistance: 1000 150 | terrainDetailDistance: 80 151 | terrainTreeDistance: 5000 152 | terrainBillboardStart: 50 153 | terrainFadeLength: 5 154 | terrainMaxTrees: 50 155 | excludedTargetPlatforms: [] 156 | - serializedVersion: 3 157 | name: High 158 | pixelLightCount: 2 159 | shadows: 2 160 | shadowResolution: 1 161 | shadowProjection: 1 162 | shadowCascades: 2 163 | shadowDistance: 40 164 | shadowNearPlaneOffset: 3 165 | shadowCascade2Split: 0.33333334 166 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 167 | shadowmaskMode: 1 168 | skinWeights: 2 169 | globalTextureMipmapLimit: 0 170 | textureMipmapLimitSettings: [] 171 | anisotropicTextures: 1 172 | antiAliasing: 0 173 | softParticles: 0 174 | softVegetation: 1 175 | realtimeReflectionProbes: 1 176 | billboardsFaceCameraPosition: 1 177 | useLegacyDetailDistribution: 0 178 | vSyncCount: 1 179 | realtimeGICPUUsage: 50 180 | lodBias: 1 181 | maximumLODLevel: 0 182 | enableLODCrossFade: 1 183 | streamingMipmapsActive: 0 184 | streamingMipmapsAddAllCameras: 1 185 | streamingMipmapsMemoryBudget: 512 186 | streamingMipmapsRenderersPerFrame: 512 187 | streamingMipmapsMaxLevelReduction: 2 188 | streamingMipmapsMaxFileIORequests: 1024 189 | particleRaycastBudget: 256 190 | asyncUploadTimeSlice: 2 191 | asyncUploadBufferSize: 16 192 | asyncUploadPersistentBuffer: 1 193 | resolutionScalingFixedDPIFactor: 1 194 | customRenderPipeline: {fileID: 0} 195 | terrainQualityOverrides: 0 196 | terrainPixelError: 1 197 | terrainDetailDensityScale: 1 198 | terrainBasemapDistance: 1000 199 | terrainDetailDistance: 80 200 | terrainTreeDistance: 5000 201 | terrainBillboardStart: 50 202 | terrainFadeLength: 5 203 | terrainMaxTrees: 50 204 | excludedTargetPlatforms: [] 205 | - serializedVersion: 3 206 | name: Very High 207 | pixelLightCount: 3 208 | shadows: 2 209 | shadowResolution: 2 210 | shadowProjection: 1 211 | shadowCascades: 2 212 | shadowDistance: 70 213 | shadowNearPlaneOffset: 3 214 | shadowCascade2Split: 0.33333334 215 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 216 | shadowmaskMode: 1 217 | skinWeights: 4 218 | globalTextureMipmapLimit: 0 219 | textureMipmapLimitSettings: [] 220 | anisotropicTextures: 2 221 | antiAliasing: 2 222 | softParticles: 1 223 | softVegetation: 1 224 | realtimeReflectionProbes: 1 225 | billboardsFaceCameraPosition: 1 226 | useLegacyDetailDistribution: 0 227 | vSyncCount: 1 228 | realtimeGICPUUsage: 50 229 | lodBias: 1.5 230 | maximumLODLevel: 0 231 | enableLODCrossFade: 1 232 | streamingMipmapsActive: 0 233 | streamingMipmapsAddAllCameras: 1 234 | streamingMipmapsMemoryBudget: 512 235 | streamingMipmapsRenderersPerFrame: 512 236 | streamingMipmapsMaxLevelReduction: 2 237 | streamingMipmapsMaxFileIORequests: 1024 238 | particleRaycastBudget: 1024 239 | asyncUploadTimeSlice: 2 240 | asyncUploadBufferSize: 16 241 | asyncUploadPersistentBuffer: 1 242 | resolutionScalingFixedDPIFactor: 1 243 | customRenderPipeline: {fileID: 0} 244 | terrainQualityOverrides: 0 245 | terrainPixelError: 1 246 | terrainDetailDensityScale: 1 247 | terrainBasemapDistance: 1000 248 | terrainDetailDistance: 80 249 | terrainTreeDistance: 5000 250 | terrainBillboardStart: 50 251 | terrainFadeLength: 5 252 | terrainMaxTrees: 50 253 | excludedTargetPlatforms: [] 254 | - serializedVersion: 3 255 | name: Ultra 256 | pixelLightCount: 4 257 | shadows: 2 258 | shadowResolution: 2 259 | shadowProjection: 1 260 | shadowCascades: 4 261 | shadowDistance: 150 262 | shadowNearPlaneOffset: 3 263 | shadowCascade2Split: 0.33333334 264 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 265 | shadowmaskMode: 1 266 | skinWeights: 255 267 | globalTextureMipmapLimit: 0 268 | textureMipmapLimitSettings: [] 269 | anisotropicTextures: 2 270 | antiAliasing: 2 271 | softParticles: 1 272 | softVegetation: 1 273 | realtimeReflectionProbes: 1 274 | billboardsFaceCameraPosition: 1 275 | useLegacyDetailDistribution: 0 276 | vSyncCount: 1 277 | realtimeGICPUUsage: 100 278 | lodBias: 2 279 | maximumLODLevel: 0 280 | enableLODCrossFade: 1 281 | streamingMipmapsActive: 0 282 | streamingMipmapsAddAllCameras: 1 283 | streamingMipmapsMemoryBudget: 512 284 | streamingMipmapsRenderersPerFrame: 512 285 | streamingMipmapsMaxLevelReduction: 2 286 | streamingMipmapsMaxFileIORequests: 1024 287 | particleRaycastBudget: 4096 288 | asyncUploadTimeSlice: 2 289 | asyncUploadBufferSize: 16 290 | asyncUploadPersistentBuffer: 1 291 | resolutionScalingFixedDPIFactor: 1 292 | customRenderPipeline: {fileID: 0} 293 | terrainQualityOverrides: 0 294 | terrainPixelError: 1 295 | terrainDetailDensityScale: 1 296 | terrainBasemapDistance: 1000 297 | terrainDetailDistance: 80 298 | terrainTreeDistance: 5000 299 | terrainBillboardStart: 50 300 | terrainFadeLength: 5 301 | terrainMaxTrees: 50 302 | excludedTargetPlatforms: [] 303 | m_TextureMipmapLimitGroupNames: [] 304 | m_PerPlatformDefaultQuality: 305 | Android: 2 306 | EmbeddedLinux: 5 307 | GameCoreScarlett: 5 308 | GameCoreXboxOne: 5 309 | LinuxHeadlessSimulation: 5 310 | Nintendo Switch: 5 311 | PS4: 5 312 | PS5: 5 313 | QNX: 5 314 | Server: 5 315 | Stadia: 5 316 | Standalone: 5 317 | VisionOS: 5 318 | WebGL: 3 319 | Windows Store Apps: 5 320 | XboxOne: 5 321 | iPhone: 2 322 | tvOS: 2 323 | -------------------------------------------------------------------------------- /ProjectSettings/TagManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!78 &1 4 | TagManager: 5 | serializedVersion: 2 6 | tags: [] 7 | layers: 8 | - Default 9 | - TransparentFX 10 | - Ignore Raycast 11 | - 12 | - Water 13 | - UI 14 | - 15 | - 16 | - 17 | - 18 | - 19 | - 20 | - 21 | - 22 | - 23 | - 24 | - 25 | - 26 | - 27 | - 28 | - 29 | - 30 | - 31 | - 32 | - 33 | - 34 | - 35 | - 36 | - 37 | - 38 | - 39 | - 40 | m_SortingLayers: 41 | - name: Default 42 | uniqueID: 0 43 | locked: 0 44 | -------------------------------------------------------------------------------- /ProjectSettings/TimeManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!5 &1 4 | TimeManager: 5 | m_ObjectHideFlags: 0 6 | Fixed Timestep: 0.02 7 | Maximum Allowed Timestep: 0.33333334 8 | m_TimeScale: 1 9 | Maximum Particle Timestep: 0.03 10 | -------------------------------------------------------------------------------- /ProjectSettings/UnityConnectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!310 &1 4 | UnityConnectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 1 7 | m_Enabled: 0 8 | m_TestMode: 0 9 | m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events 10 | m_EventUrl: https://cdp.cloud.unity3d.com/v1/events 11 | m_ConfigUrl: https://config.uca.cloud.unity3d.com 12 | m_DashboardUrl: https://dashboard.unity3d.com 13 | m_TestInitMode: 0 14 | CrashReportingSettings: 15 | m_EventUrl: https://perf-events.cloud.unity3d.com 16 | m_Enabled: 0 17 | m_LogBufferSize: 10 18 | m_CaptureEditorExceptions: 1 19 | UnityPurchasingSettings: 20 | m_Enabled: 0 21 | m_TestMode: 0 22 | UnityAnalyticsSettings: 23 | m_Enabled: 0 24 | m_TestMode: 0 25 | m_InitializeOnStartup: 1 26 | m_PackageRequiringCoreStatsPresent: 0 27 | UnityAdsSettings: 28 | m_Enabled: 0 29 | m_InitializeOnStartup: 1 30 | m_TestMode: 0 31 | m_IosGameId: 32 | m_AndroidGameId: 33 | m_GameIds: {} 34 | m_GameId: 35 | PerformanceReportingSettings: 36 | m_Enabled: 0 37 | -------------------------------------------------------------------------------- /ProjectSettings/VFXManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!937362698 &1 4 | VFXManager: 5 | m_ObjectHideFlags: 0 6 | m_IndirectShader: {fileID: 0} 7 | m_CopyBufferShader: {fileID: 0} 8 | m_SortShader: {fileID: 0} 9 | m_StripUpdateShader: {fileID: 0} 10 | m_RenderPipeSettingsPath: 11 | m_FixedTimeStep: 0.016666668 12 | m_MaxDeltaTime: 0.05 13 | m_MaxScrubTime: 30 14 | m_CompiledVersion: 0 15 | m_RuntimeVersion: 0 16 | m_RuntimeResources: {fileID: 0} 17 | m_BatchEmptyLifetime: 300 18 | -------------------------------------------------------------------------------- /ProjectSettings/VersionControlSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!890905787 &1 4 | VersionControlSettings: 5 | m_ObjectHideFlags: 0 6 | m_Mode: Visible Meta Files 7 | m_CollabEditorSettings: 8 | inProgressEnabled: 1 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Unity Audio Loader 2 | 3 | ![npm](https://img.shields.io/npm/v/extensions.unity.audioloader) [![openupm](https://img.shields.io/npm/v/extensions.unity.audioloader?label=openupm®istry_uri=https://package.openupm.com)](https://openupm.com/packages/extensions.unity.audioloader/) ![License](https://img.shields.io/github/license/IvanMurzak/Unity-AudioLoader) [![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg)](https://stand-with-ukraine.pp.ua) 4 | 5 | Async audio loader with two caching layers for Unity. 6 | 7 | ![Image Loader](https://github.com/IvanMurzak/Unity-AudioLoader/blob/master/Header.jpg?raw=true) 8 | 9 | ## Features 10 | 11 | - ✔️ Async loading from **Web** or **Local** `AudioLoader.LoadAudioClip(audioURL);` 12 | - ✔️ **Memory** and **Disk** caching - tries to load from memory first, then from disk 13 | - ✔️ Dedicated thread for disk operations 14 | - ✔️ Avoids loading same audio multiple times simultaneously, a task waits for completion the first and just returns loaded audio if at least one cache layer activated 15 | - ✔️ Auto set to AudioSource `AudioLoader.SetAudioSource(audioURL, audioSource);` 16 | - ✔️ Debug level for logging `AudioLoader.settings.debugLevel = DebugLevel.Error;` 17 | 18 | # Usage 19 | 20 | In the main thread somewhere at the start of the project need to call `AudioLoader.Init();` once to initialize static properties in the right thread. It is required to be made in the main thread. Then you can use `AudioLoader` from any thread and at any time. 21 | 22 | ## Sample - Loading audio file, set to AudioSource 23 | 24 | ``` C# 25 | using Extensions.Unity.AudioLoader; 26 | using Cysharp.Threading.Tasks; 27 | 28 | public class AudioLoaderSample : MonoBehaviour 29 | { 30 | [SerializeField] string audioURL; 31 | [SerializeField] AudioSource audioSource; 32 | 33 | async void Start() 34 | { 35 | // Loading audio file from web, cached for quick load next time 36 | audioSource.clip = await AudioLoader.LoadAudioClip(audioURL); 37 | 38 | // Same loading with auto set to audio 39 | await AudioLoader.SetAudioSource(audioURL, audioSource); 40 | } 41 | } 42 | ``` 43 | 44 | ## Sample - Loading audio into multiple Audio components 45 | 46 | ``` C# 47 | using Extensions.Unity.AudioLoader; 48 | using Cysharp.Threading.Tasks; 49 | 50 | public class AudioLoaderSample : MonoBehaviour 51 | { 52 | [SerializeField] string audioURL; 53 | [SerializeField] AudioSource audioSource1; 54 | [SerializeField] AudioSource audioSource2; 55 | 56 | void Start() 57 | { 58 | // Loading with auto set to audio 59 | AudioLoader.SetAudioSource(audioURL, audioSource1, audioSource2).Forget(); 60 | } 61 | } 62 | ``` 63 | 64 | # Cache 65 | 66 | Cache system based on the two layers. The first layer is **memory cache**, and the second is **disk cache**. Each layer could be enabled or disabled. It could be used without caching at all. By default, both layers are enabled. 67 | 68 | ## Setup Cache 69 | 70 | - `AudioLoader.settings.useMemoryCache = true;` default value is `true` 71 | - `AudioLoader.settings.useDiskCache = true;` default value is `true` 72 | 73 | Change disk cache folder: 74 | 75 | ``` C# 76 | AudioLoader.settings.diskSaveLocation = Application.persistentDataPath + "/myCustomFolder"; 77 | ``` 78 | 79 | ## Override Cache 80 | 81 | ``` C# 82 | // Override Memory cache for specific audio 83 | AudioLoader.SaveToMemoryCache(url, audioClip); 84 | 85 | // Take from Memory cache for specific audio file if exists 86 | AudioLoader.LoadFromMemoryCache(url); 87 | ``` 88 | 89 | ## Does Cache contain audio 90 | 91 | ``` C# 92 | // Check if any cache contains specific audio file 93 | AudioLoader.CacheContains(url); 94 | 95 | // Check if Memory cache contains specific audio file 96 | AudioLoader.MemoryCacheContains(url); 97 | 98 | // Check if Memory cache contains specific audio file 99 | AudioLoader.DiskCacheContains(url); 100 | ``` 101 | 102 | ## Clear Cache 103 | 104 | ``` C# 105 | // Clear memory Memory and Disk cache 106 | AudioLoader.ClearCache(); 107 | 108 | // Clear only Memory cache for all audio files 109 | AudioLoader.ClearMemoryCache(); 110 | 111 | // Clear only Memory cache for specific audio file 112 | AudioLoader.ClearMemoryCache(url); 113 | 114 | // Clear only Disk cache for all audio files 115 | AudioLoader.ClearDiskCache(); 116 | 117 | // Clear only Disk cache for specific audio file 118 | AudioLoader.ClearDiskCache(url); 119 | ``` 120 | 121 | # Installation 122 | 123 | - [Install OpenUPM-CLI](https://github.com/openupm/openupm-cli#installation) 124 | - Open command line in Unity project folder 125 | - Run the command 126 | 127 | ``` CLI 128 | openupm add extensions.unity.audioloader 129 | ``` 130 | -------------------------------------------------------------------------------- /Test Audio Files/sample.aiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IvanMurzak/Unity-AudioLoader/432c13650ce3567ca9778fbb0fd7553a9e71563d/Test Audio Files/sample.aiff -------------------------------------------------------------------------------- /Test Audio Files/sample.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IvanMurzak/Unity-AudioLoader/432c13650ce3567ca9778fbb0fd7553a9e71563d/Test Audio Files/sample.mp3 -------------------------------------------------------------------------------- /Test Audio Files/sample.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IvanMurzak/Unity-AudioLoader/432c13650ce3567ca9778fbb0fd7553a9e71563d/Test Audio Files/sample.wav -------------------------------------------------------------------------------- /UserSettings/EditorUserSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!162 &1 4 | EditorUserSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 4 7 | m_ConfigSettings: 8 | vcSharedLogLevel: 9 | value: 0d5e400f0650 10 | flags: 0 11 | m_VCAutomaticAdd: 1 12 | m_VCDebugCom: 0 13 | m_VCDebugCmd: 0 14 | m_VCDebugOut: 0 15 | m_SemanticMergeMode: 2 16 | m_DesiredImportWorkerCount: 8 17 | m_StandbyImportWorkerCount: 2 18 | m_IdleImportWorkerShutdownDelay: 60000 19 | m_VCShowFailedCheckout: 1 20 | m_VCOverwriteFailedCheckoutAssets: 1 21 | m_VCProjectOverlayIcons: 1 22 | m_VCHierarchyOverlayIcons: 1 23 | m_VCOtherOverlayIcons: 1 24 | m_VCAllowAsyncUpdate: 1 25 | m_ArtifactGarbageCollection: 1 26 | -------------------------------------------------------------------------------- /UserSettings/Search.index: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Assets", 3 | "roots": ["Assets"], 4 | "includes": [], 5 | "excludes": [], 6 | "options": { 7 | "types": true, 8 | "properties": true, 9 | "extended": false, 10 | "dependencies": false 11 | }, 12 | "baseScore": 999 13 | } -------------------------------------------------------------------------------- /UserSettings/Search.settings: -------------------------------------------------------------------------------- 1 | trackSelection = true 2 | refreshSearchWindowsInPlayMode = false 3 | fetchPreview = true 4 | defaultFlags = 0 5 | keepOpen = false 6 | queryFolder = "Assets" 7 | onBoardingDoNotAskAgain = true 8 | showPackageIndexes = false 9 | showStatusBar = false 10 | scopes = { 11 | } 12 | providers = { 13 | adb = { 14 | active = false 15 | priority = 2500 16 | defaultAction = null 17 | } 18 | log = { 19 | active = false 20 | priority = 210 21 | defaultAction = null 22 | } 23 | performance = { 24 | active = false 25 | priority = 100 26 | defaultAction = null 27 | } 28 | store = { 29 | active = true 30 | priority = 100 31 | defaultAction = null 32 | } 33 | profilermarkers = { 34 | active = false 35 | priority = 100 36 | defaultAction = null 37 | } 38 | scene = { 39 | active = true 40 | priority = 50 41 | defaultAction = null 42 | } 43 | find = { 44 | active = true 45 | priority = 25 46 | defaultAction = null 47 | } 48 | packages = { 49 | active = true 50 | priority = 90 51 | defaultAction = null 52 | } 53 | asset = { 54 | active = true 55 | priority = 25 56 | defaultAction = null 57 | } 58 | } 59 | objectSelectors = { 60 | } 61 | recentSearches = [ 62 | ] 63 | searchItemFavorites = [ 64 | ] 65 | savedSearchesSortOrder = 0 66 | showSavedSearchPanel = false 67 | hideTabs = false 68 | expandedQueries = [ 69 | ] 70 | queryBuilder = false 71 | ignoredProperties = "id;name;classname;imagecontentshash" 72 | helperWidgetCurrentArea = "all" 73 | disabledIndexers = "" 74 | minIndexVariations = 2 75 | findProviderIndexHelper = true --------------------------------------------------------------------------------