├── ProjectSettings ├── ProjectVersion.txt ├── CommonBurstAotSettings.json ├── ClusterInputManager.asset ├── PresetManager.asset ├── XRSettings.asset ├── VersionControlSettings.asset ├── TimeManager.asset ├── EditorBuildSettings.asset ├── VFXManager.asset ├── BurstAotSettings_StandaloneWindows.json ├── URPProjectSettings.asset ├── AudioManager.asset ├── ShaderGraphSettings.asset ├── TagManager.asset ├── UnityConnectSettings.asset ├── PackageManagerSettings.asset ├── EditorSettings.asset ├── MemorySettings.asset ├── DynamicsManager.asset ├── NavMeshAreas.asset ├── Physics2DSettings.asset ├── GraphicsSettings.asset ├── QualitySettings.asset ├── SceneTemplateSettings.json ├── InputManager.asset └── ProjectSettings.asset ├── .github └── FUNDING.yml ├── Assets ├── LeaderboardCreator │ ├── Resources.meta │ ├── Scripts │ │ ├── Enums.meta │ │ ├── Models.meta │ │ ├── Utils.meta │ │ ├── Enums │ │ │ ├── Routes.cs.meta │ │ │ ├── StatusCode.cs.meta │ │ │ ├── TimePeriodType.cs.meta │ │ │ ├── TimePeriodType.cs │ │ │ ├── Routes.cs │ │ │ └── StatusCode.cs │ │ ├── Models │ │ │ ├── Entry.cs.meta │ │ │ ├── LeaderboardSearchQuery.cs.meta │ │ │ ├── Entry.cs │ │ │ └── LeaderboardSearchQuery.cs │ │ ├── Utils │ │ │ ├── Requests.cs.meta │ │ │ ├── ConstantVariables.cs.meta │ │ │ ├── ExtensionMethods.cs.meta │ │ │ ├── LeaderboardCreatorConfig.cs.meta │ │ │ ├── ExtensionMethods.cs │ │ │ ├── LeaderboardCreatorConfig.cs │ │ │ ├── ConstantVariables.cs │ │ │ └── Requests.cs │ │ ├── Demo │ │ │ ├── EntryDisplay.cs.meta │ │ │ ├── LeaderboardShowcase.cs.meta │ │ │ ├── EntryDisplay.cs │ │ │ └── LeaderboardShowcase.cs │ │ ├── Main │ │ │ ├── Leaderboards.cs.meta │ │ │ ├── LeaderboardCreator.cs.meta │ │ │ ├── LeaderboardReference.cs.meta │ │ │ ├── LeaderboardCreatorBehaviour.cs.meta │ │ │ ├── Leaderboards.cs │ │ │ ├── LeaderboardReference.cs │ │ │ ├── LeaderboardCreatorBehaviour.cs │ │ │ └── LeaderboardCreator.cs │ │ ├── Dan.asmdef.meta │ │ ├── Demo.meta │ │ ├── Main.meta │ │ └── Dan.asmdef │ ├── Editor │ │ ├── LeaderboardCreatorWindow.cs.meta │ │ ├── LeaderboardCreatorEditor.asmdef.meta │ │ ├── LeaderboardCreatorEditor.asmdef │ │ └── LeaderboardCreatorWindow.cs │ ├── Prefabs │ │ ├── Entry.prefab.meta │ │ └── Entry.prefab │ ├── Scenes │ │ └── DemoScene.unity.meta │ ├── leaderboards.json │ ├── leaderboards.json.meta │ ├── Editor.meta │ ├── Prefabs.meta │ ├── Scenes.meta │ ├── Scripts.meta │ └── Resources │ │ ├── LeaderboardCreatorConfig.asset.meta │ │ └── LeaderboardCreatorConfig.asset └── LeaderboardCreator.meta ├── .gitignore ├── Packages ├── manifest.json └── packages-lock.json └── README.md /ProjectSettings/ProjectVersion.txt: -------------------------------------------------------------------------------- 1 | m_EditorVersion: 2022.3.8f1 2 | m_EditorVersionWithRevision: 2022.3.8f1 (b5eafc012955) 3 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: danqzq 2 | ko_fi: danqzq 3 | buy_me_a_coffee: danqzq 4 | custom: ["https://www.paypal.me/danqzq"] 5 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Resources.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9dc78f1686d94215a156a0f58fdcd3c4 3 | timeCreated: 1693951712 -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Enums.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9af4667ade994defb8e7ce8c2dd6c48c 3 | timeCreated: 1660484752 -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Models.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2c8fa39508ba479592eefc448fcf4573 3 | timeCreated: 1660482071 -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Utils.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8889c8935b154ff4b70b2fcf3c719412 3 | timeCreated: 1660491089 -------------------------------------------------------------------------------- /ProjectSettings/CommonBurstAotSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "MonoBehaviour": { 3 | "Version": 3, 4 | "DisabledWarnings": "" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Enums/Routes.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 72c5e1d220e94059b6b1cf3f7b99f95a 3 | timeCreated: 1660484888 -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Models/Entry.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e9f6f4e4968841efa3dc6efbeeffd447 3 | timeCreated: 1660484221 -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Utils/Requests.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 82185ae765074638b9962f5fbb356776 3 | timeCreated: 1651554086 -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Demo/EntryDisplay.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9c1d101096214144bd4e0f906a9ec5b6 3 | timeCreated: 1684166040 -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Enums/StatusCode.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 614196160841412b874fa7173e5a3c83 3 | timeCreated: 1660484853 -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Enums/TimePeriodType.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b9963a6d153c4971ab8b79eeb542e7bf 3 | timeCreated: 1679742430 -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Main/Leaderboards.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8ff334e8988744eea42cf12786ee20d5 3 | timeCreated: 1693949488 -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Editor/LeaderboardCreatorWindow.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e80aaf6d96cc45b692e96e66380889ee 3 | timeCreated: 1693947366 -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Main/LeaderboardCreator.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3dd7127c7a2c45bfa590eb249427722d 3 | timeCreated: 1660544476 -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Main/LeaderboardReference.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 237dfda88f2848018d42e238dec5b66c 3 | timeCreated: 1693950058 -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Utils/ConstantVariables.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8ba37bb8809248c793a754c692830a1b 3 | timeCreated: 1660731015 -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Utils/ExtensionMethods.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 07c46008f49546899a5404ae5730f8e5 3 | timeCreated: 1660647932 -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Models/LeaderboardSearchQuery.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 29284a0880dd4054ac8294cc917db6f8 3 | timeCreated: 1679736989 -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Utils/LeaderboardCreatorConfig.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f004774a7efa44eab4c0e289b68f484f 3 | timeCreated: 1693951769 -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Main/LeaderboardCreatorBehaviour.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1844164b113842008a02b38fc49304f7 3 | timeCreated: 1660544772 -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Prefabs/Entry.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 188bdb8a837f74c4087c00cbf810b79c 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 45325e6620862ac4fb9c579aeded5f92 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scenes/DemoScene.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a864ccbe3a968094ba55cfc99b8c4bc3 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/leaderboards.json: -------------------------------------------------------------------------------- 1 | {"leaderboards":[{"name":"DemoSceneLeaderboard","publicKey":"980324f10e2f03fc0fd6a38a70f88123919a6aed35a4aea86211ad58b68db9c4","secretKey":"SECRET KEY NOT PROVIDED DUE TO SECURITY REASONS"}]} -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/leaderboards.json.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5acfc3d506d9a854589cebec611a66e7 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /ProjectSettings/XRSettings.asset: -------------------------------------------------------------------------------- 1 | { 2 | "m_SettingKeys": [ 3 | "VR Device Disabled", 4 | "VR Device User Alert" 5 | ], 6 | "m_SettingValues": [ 7 | "False", 8 | "False" 9 | ] 10 | } -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6bd863986c5684e45b8f23f508c892f5 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Prefabs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ed3e733270559574d9920a905b6b3b7a 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scenes.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9993989975703744ca67012328cd64f7 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 10b9fd2348cee4746a2d9cf74c22fac1 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Dan.asmdef.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b84cf0863fb105f47a726476f8d80bd8 3 | AssemblyDefinitionImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Demo.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1d122e04d3b3c344184ef1b4c663b059 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Main.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 210cca2d87e75a948aee8beba1643210 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Editor/LeaderboardCreatorEditor.asmdef.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 638022afa367caf49b81e5b491548ae2 3 | AssemblyDefinitionImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Enums/TimePeriodType.cs: -------------------------------------------------------------------------------- 1 | namespace Dan.Enums 2 | { 3 | public enum TimePeriodType 4 | { 5 | AllTime = 0, 6 | Today = 1, 7 | ThisWeek = 7, 8 | ThisMonth = 30, 9 | ThisYear = 365 10 | } 11 | } -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Resources/LeaderboardCreatorConfig.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e5dcb9a6ab6c652448b9fe34a810dfd0 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 11400000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Main/Leaderboards.cs: -------------------------------------------------------------------------------- 1 | namespace Dan.Main 2 | { 3 | public static class Leaderboards 4 | { 5 | public static LeaderboardReference DemoSceneLeaderboard = new LeaderboardReference("980324f10e2f03fc0fd6a38a70f88123919a6aed35a4aea86211ad58b68db9c4"); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Enums/Routes.cs: -------------------------------------------------------------------------------- 1 | namespace Dan.Enums 2 | { 3 | public enum Routes 4 | { 5 | Activate, 6 | Authorize, 7 | Get, 8 | None, 9 | Upload, 10 | UpdateUsername, 11 | DeleteEntry, 12 | GetPersonalEntry, 13 | GetEntryCount 14 | } 15 | } -------------------------------------------------------------------------------- /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 | - enabled: 1 9 | path: Assets/Scenes/SampleScene.unity 10 | guid: 99c9720ab356a0642a771bea13969a05 11 | m_configObjects: {} 12 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Demo/LeaderboardShowcase.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 12696615b7625f04baae0bf7809c049d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Utils/ExtensionMethods.cs: -------------------------------------------------------------------------------- 1 | using System.Text.RegularExpressions; 2 | 3 | namespace Dan 4 | { 5 | public static class ExtensionMethods 6 | { 7 | public static string SplitByUppercase(this string str) => 8 | Regex.Replace(str, @"(\B[A-Z]+?(?=[A-Z][^A-Z])|\B[A-Z]+?(?=[^A-Z]))", " $1"); 9 | } 10 | } -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Enums/StatusCode.cs: -------------------------------------------------------------------------------- 1 | namespace Dan.Enums 2 | { 3 | public enum StatusCode 4 | { 5 | FailedToConnect = 0, 6 | Ok = 200, 7 | BadRequest = 400, 8 | Unauthorized = 401, 9 | Forbidden = 403, 10 | NotFound = 404, 11 | Conflict = 409, 12 | TooManyRequests = 429, 13 | InternalServerError = 500, 14 | NotImplemented = 501, 15 | ServiceUnavailable = 503 16 | } 17 | } -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Dan.asmdef: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Dan", 3 | "rootNamespace": "Dan", 4 | "references": [ 5 | "GUID:6055be8ebefd69e48b49212b09b47b2f" 6 | ], 7 | "includePlatforms": [], 8 | "excludePlatforms": [], 9 | "allowUnsafeCode": false, 10 | "overrideReferences": false, 11 | "precompiledReferences": [], 12 | "autoReferenced": true, 13 | "defineConstraints": [], 14 | "versionDefines": [], 15 | "noEngineReferences": false 16 | } -------------------------------------------------------------------------------- /ProjectSettings/BurstAotSettings_StandaloneWindows.json: -------------------------------------------------------------------------------- 1 | { 2 | "MonoBehaviour": { 3 | "Version": 3, 4 | "EnableBurstCompilation": true, 5 | "EnableOptimisations": true, 6 | "EnableSafetyChecks": false, 7 | "EnableDebugInAllBuilds": false, 8 | "UsePlatformSDKLinker": false, 9 | "CpuMinTargetX32": 0, 10 | "CpuMaxTargetX32": 0, 11 | "CpuMinTargetX64": 0, 12 | "CpuMaxTargetX64": 0, 13 | "CpuTargetsX32": 6, 14 | "CpuTargetsX64": 72 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /ProjectSettings/URPProjectSettings.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: 11500000, guid: 247994e1f5a72c2419c26a37e9334c01, type: 3} 13 | m_Name: 14 | m_EditorClassIdentifier: 15 | m_LastMaterialVersion: 7 16 | -------------------------------------------------------------------------------- /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_SpatializerPlugin: 16 | m_AmbisonicDecoderPlugin: 17 | m_DisableAudio: 0 18 | m_VirtualizeEffects: 1 19 | m_RequestedDSPBufferSize: 0 20 | -------------------------------------------------------------------------------- /ProjectSettings/ShaderGraphSettings.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: 11500000, guid: de02f9e1d18f588468e474319d09a723, type: 3} 13 | m_Name: 14 | m_EditorClassIdentifier: 15 | customInterpolatorErrorThreshold: 32 16 | customInterpolatorWarningThreshold: 16 17 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Editor/LeaderboardCreatorEditor.asmdef: -------------------------------------------------------------------------------- 1 | { 2 | "name": "LeaderboardCreatorEditor", 3 | "rootNamespace": "LeaderboardCreatorEditor", 4 | "references": [ 5 | "GUID:b84cf0863fb105f47a726476f8d80bd8" 6 | ], 7 | "includePlatforms": [ 8 | "Editor" 9 | ], 10 | "excludePlatforms": [], 11 | "allowUnsafeCode": false, 12 | "overrideReferences": false, 13 | "precompiledReferences": [], 14 | "autoReferenced": true, 15 | "defineConstraints": [], 16 | "versionDefines": [], 17 | "noEngineReferences": false 18 | } -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Utils/LeaderboardCreatorConfig.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace Dan 4 | { 5 | public enum AuthSaveMode 6 | { 7 | PlayerPrefs, 8 | PersistentDataPath, 9 | Unhandled 10 | } 11 | 12 | public class LeaderboardCreatorConfig : ScriptableObject 13 | { 14 | public AuthSaveMode authSaveMode = AuthSaveMode.PlayerPrefs; 15 | public string fileName = "leaderboard-creator-guid.txt"; 16 | public bool isUpdateLogsEnabled = true; 17 | 18 | public TextAsset leaderboardsFile; 19 | #if UNITY_EDITOR 20 | public TextAsset editorOnlyLeaderboardsFile; 21 | #endif 22 | } 23 | } -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Resources/LeaderboardCreatorConfig.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 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: 11500000, guid: f004774a7efa44eab4c0e289b68f484f, type: 3} 13 | m_Name: LeaderboardCreatorConfig 14 | m_EditorClassIdentifier: 15 | authSaveMode: 0 16 | fileName: leaderboard-creator-guid.txt 17 | isUpdateLogsEnabled: 1 18 | leaderboardsFile: {fileID: 11500000, guid: 8ff334e8988744eea42cf12786ee20d5, type: 3} 19 | editorOnlyLeaderboardsFile: {fileID: 4900000, guid: 5acfc3d506d9a854589cebec611a66e7, type: 3} 20 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Utils/ConstantVariables.cs: -------------------------------------------------------------------------------- 1 | using Dan.Enums; 2 | 3 | namespace Dan 4 | { 5 | internal static class ConstantVariables 6 | { 7 | internal const string GUID_KEY = "LEADERBOARD_CREATOR___LOCAL_GUID"; 8 | 9 | internal static string GetServerURL(Routes route = Routes.None, string extra = "") 10 | { 11 | return SERVER_URL + (route == Routes.Authorize ? "/authorize" : 12 | route == Routes.Get ? "/get" : 13 | route == Routes.Upload ? "/entry/upload" : 14 | route == Routes.UpdateUsername ? "/entry/update-username" : 15 | route == Routes.DeleteEntry ? "/entry/delete" : 16 | route == Routes.GetPersonalEntry ? "/entry/get" : 17 | route == Routes.GetEntryCount ? "/entry/count" : "/") + extra; 18 | } 19 | 20 | private const string SERVER_URL = "https://lcv2-server.danqzq.games"; 21 | } 22 | } -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Utils/Requests.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UnityEngine.Networking; 3 | 4 | namespace Dan 5 | { 6 | internal static partial class Requests 7 | { 8 | /// 9 | /// Creates a form section and adds the parameters to it. 10 | /// 11 | /// IMultipartFormSection object 12 | public static IMultipartFormSection Field(string fieldName, string data) => 13 | new MultipartFormDataSection(fieldName, data); 14 | 15 | /// 16 | /// Creates a form out of the given parameters. 17 | /// 18 | /// 19 | /// A list of IMultipartFormSection objects 20 | public static List Form(params IMultipartFormSection[] formDataSections) => 21 | new List(formDataSections); 22 | } 23 | } -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Demo/EntryDisplay.cs: -------------------------------------------------------------------------------- 1 | using TMPro; 2 | using UnityEngine; 3 | using UnityEngine.UI; 4 | 5 | using Dan.Models; 6 | 7 | namespace Dan.Demo 8 | { 9 | public class EntryDisplay : MonoBehaviour 10 | { 11 | [SerializeField] private TextMeshProUGUI _rankText, _usernameText, _scoreText, _timeText; 12 | 13 | public void SetEntry(Entry entry) 14 | { 15 | _rankText.text = entry.RankSuffix(); 16 | _usernameText.text = entry.Username; 17 | _scoreText.text = entry.Score.ToString(); 18 | var dateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc); 19 | dateTime = dateTime.AddSeconds(entry.Date); 20 | _timeText.text = $"{dateTime.Hour:00}:{dateTime.Minute:00}:{dateTime.Second:00} (UTC)\n{dateTime:dd/MM/yyyy}"; 21 | 22 | GetComponent().color = entry.IsMine() ? Color.yellow : Color.white; 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /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/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_EnablePreviewPackages: 0 16 | m_EnablePackageDependencies: 0 17 | m_AdvancedSettingsExpanded: 1 18 | m_ScopedRegistriesSettingsExpanded: 1 19 | oneTimeWarningShown: 0 20 | m_Registries: 21 | - m_Id: main 22 | m_Name: 23 | m_Url: https://packages.unity.com 24 | m_Scopes: [] 25 | m_IsDefault: 1 26 | m_Capabilities: 7 27 | m_UserSelectedRegistryName: 28 | m_UserAddingNewScopedRegistry: 0 29 | m_RegistryInfoDraft: 30 | m_ErrorMessage: 31 | m_Original: 32 | m_Id: 33 | m_Name: 34 | m_Url: 35 | m_Scopes: [] 36 | m_IsDefault: 0 37 | m_Capabilities: 0 38 | m_Modified: 0 39 | m_Name: 40 | m_Url: 41 | m_Scopes: 42 | - 43 | m_SelectedScopeIndex: 0 44 | -------------------------------------------------------------------------------- /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: 9 7 | m_ExternalVersionControlSupport: Visible Meta Files 8 | m_SerializationMode: 2 9 | m_LineEndingsForNewScripts: 2 10 | m_DefaultBehaviorMode: 0 11 | m_PrefabRegularEnvironment: {fileID: 0} 12 | m_PrefabUIEnvironment: {fileID: 0} 13 | m_SpritePackerMode: 0 14 | m_SpritePackerPaddingPower: 1 15 | m_EtcTextureCompressorBehavior: 1 16 | m_EtcTextureFastCompressor: 1 17 | m_EtcTextureNormalCompressor: 2 18 | m_EtcTextureBestCompressor: 4 19 | m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;asmref;rsp 20 | m_ProjectGenerationRootNamespace: 21 | m_CollabEditorSettings: 22 | inProgressEnabled: 1 23 | m_EnableTextureStreamingInEditMode: 1 24 | m_EnableTextureStreamingInPlayMode: 1 25 | m_AsyncShaderCompilation: 1 26 | m_EnterPlayModeOptionsEnabled: 0 27 | m_EnterPlayModeOptions: 3 28 | m_ShowLightmapResolutionOverlay: 1 29 | m_UseLegacyProbeSampleCount: 0 30 | m_AssetPipelineMode: 1 31 | m_CacheServerMode: 0 32 | m_CacheServerEndpoint: 33 | m_CacheServerNamespacePrefix: default 34 | m_CacheServerEnableDownload: 1 35 | m_CacheServerEnableUpload: 1 36 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Models/Entry.cs: -------------------------------------------------------------------------------- 1 | using Dan.Main; 2 | using UnityEngine; 3 | 4 | namespace Dan.Models 5 | { 6 | [System.Serializable] 7 | public struct Entry 8 | { 9 | public string Username; 10 | public int Score; 11 | public ulong Date; 12 | public string Extra; 13 | public int Rank; 14 | [SerializeField] internal string UserGuid; 15 | [field: System.NonSerialized] internal string NewUsername { get; set; } 16 | 17 | /// 18 | /// Returns whether the entry is the current user's entry. 19 | /// 20 | public bool IsMine() => UserGuid == LeaderboardCreator.UserGuid; 21 | 22 | /// 23 | /// Returns the rank of the entry with its suffix. 24 | /// 25 | /// Rank + suffix (e.g. 1st, 2nd, 3rd, 4th, 5th, etc.). 26 | public string RankSuffix() 27 | { 28 | var rank = Rank; 29 | var lastDigit = rank % 10; 30 | var lastTwoDigits = rank % 100; 31 | 32 | var suffix = lastDigit == 1 && lastTwoDigits != 11 ? "st" : 33 | lastDigit == 2 && lastTwoDigits != 12 ? "nd" : 34 | lastDigit == 3 && lastTwoDigits != 13 ? "rd" : "th"; 35 | 36 | return $"{rank}{suffix}"; 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /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: 13 7 | m_Gravity: {x: 0, y: -9.81, z: 0} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_BounceThreshold: 2 10 | m_SleepThreshold: 0.005 11 | m_DefaultContactOffset: 0.01 12 | m_DefaultSolverIterations: 6 13 | m_DefaultSolverVelocityIterations: 1 14 | m_QueriesHitBackfaces: 0 15 | m_QueriesHitTriggers: 1 16 | m_EnableAdaptiveForce: 0 17 | m_ClothInterCollisionDistance: 0.1 18 | m_ClothInterCollisionStiffness: 0.2 19 | m_ContactsGeneration: 1 20 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 21 | m_AutoSimulation: 1 22 | m_AutoSyncTransforms: 0 23 | m_ReuseCollisionCallbacks: 0 24 | m_ClothInterCollisionSettingsToggle: 0 25 | m_ClothGravity: {x: 0, y: -9.81, z: 0} 26 | m_ContactPairsMode: 0 27 | m_BroadphaseType: 0 28 | m_WorldBounds: 29 | m_Center: {x: 0, y: 0, z: 0} 30 | m_Extent: {x: 250, y: 250, z: 250} 31 | m_WorldSubdivisions: 8 32 | m_FrictionType: 0 33 | m_EnableEnhancedDeterminism: 0 34 | m_EnableUnifiedHeightmaps: 1 35 | m_SolverType: 0 36 | m_DefaultMaxAngularSpeed: 50 37 | -------------------------------------------------------------------------------- /.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/main/Unity.gitignore 4 | # 5 | /[Ll]ibrary/ 6 | /[Tt]emp/ 7 | /[Oo]bj/ 8 | /[Bb]uild/ 9 | /[Bb]uilds/ 10 | /[Ll]ogs/ 11 | /[Uu]ser[Ss]ettings/ 12 | 13 | # MemoryCaptures can get excessive in size. 14 | # They also could contain extremely sensitive data 15 | /[Mm]emoryCaptures/ 16 | 17 | # Recordings can get excessive in size 18 | /[Rr]ecordings/ 19 | 20 | # Uncomment this line if you wish to ignore the asset store tools plugin 21 | # /[Aa]ssets/AssetStoreTools* 22 | 23 | # Autogenerated Jetbrains Rider plugin 24 | /[Aa]ssets/Plugins/Editor/JetBrains* 25 | 26 | # Visual Studio cache directory 27 | .vs/ 28 | 29 | # Gradle cache directory 30 | .gradle/ 31 | 32 | # Autogenerated VS/MD/Consulo solution and project files 33 | ExportedObj/ 34 | .consulo/ 35 | *.csproj 36 | *.unityproj 37 | *.sln 38 | *.suo 39 | *.tmp 40 | *.user 41 | *.userprefs 42 | *.pidb 43 | *.booproj 44 | *.svd 45 | *.pdb 46 | *.mdb 47 | *.opendb 48 | *.VC.db 49 | 50 | # Unity3D generated meta files 51 | *.pidb.meta 52 | *.pdb.meta 53 | *.mdb.meta 54 | 55 | # Unity3D generated file on crash reports 56 | sysinfo.txt 57 | 58 | # Builds 59 | *.apk 60 | *.aab 61 | *.unitypackage 62 | *.app 63 | 64 | # Crashlytics generated file 65 | crashlytics-build.properties 66 | 67 | # Packed Addressables 68 | /[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin* 69 | 70 | # Temporary auto-generated Android Assets 71 | /[Aa]ssets/[Ss]treamingAssets/aa.meta 72 | /[Aa]ssets/[Ss]treamingAssets/aa/* 73 | -------------------------------------------------------------------------------- /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: 2 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 | accuratePlacement: 0 88 | debug: 89 | m_Flags: 0 90 | m_SettingNames: 91 | - Humanoid 92 | -------------------------------------------------------------------------------- /Packages/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "com.unity.collab-proxy": "2.3.1", 4 | "com.unity.ide.rider": "3.0.24", 5 | "com.unity.ide.visualstudio": "2.0.18", 6 | "com.unity.ide.vscode": "1.2.5", 7 | "com.unity.render-pipelines.universal": "14.0.8", 8 | "com.unity.test-framework": "1.1.33", 9 | "com.unity.textmeshpro": "3.0.6", 10 | "com.unity.timeline": "1.7.5", 11 | "com.unity.ugui": "1.0.0", 12 | "com.unity.visualscripting": "1.9.0", 13 | "com.unity.modules.ai": "1.0.0", 14 | "com.unity.modules.androidjni": "1.0.0", 15 | "com.unity.modules.animation": "1.0.0", 16 | "com.unity.modules.assetbundle": "1.0.0", 17 | "com.unity.modules.audio": "1.0.0", 18 | "com.unity.modules.cloth": "1.0.0", 19 | "com.unity.modules.director": "1.0.0", 20 | "com.unity.modules.imageconversion": "1.0.0", 21 | "com.unity.modules.imgui": "1.0.0", 22 | "com.unity.modules.jsonserialize": "1.0.0", 23 | "com.unity.modules.particlesystem": "1.0.0", 24 | "com.unity.modules.physics": "1.0.0", 25 | "com.unity.modules.physics2d": "1.0.0", 26 | "com.unity.modules.screencapture": "1.0.0", 27 | "com.unity.modules.terrain": "1.0.0", 28 | "com.unity.modules.terrainphysics": "1.0.0", 29 | "com.unity.modules.tilemap": "1.0.0", 30 | "com.unity.modules.ui": "1.0.0", 31 | "com.unity.modules.uielements": "1.0.0", 32 | "com.unity.modules.umbra": "1.0.0", 33 | "com.unity.modules.unityanalytics": "1.0.0", 34 | "com.unity.modules.unitywebrequest": "1.0.0", 35 | "com.unity.modules.unitywebrequestassetbundle": "1.0.0", 36 | "com.unity.modules.unitywebrequestaudio": "1.0.0", 37 | "com.unity.modules.unitywebrequesttexture": "1.0.0", 38 | "com.unity.modules.unitywebrequestwww": "1.0.0", 39 | "com.unity.modules.vehicles": "1.0.0", 40 | "com.unity.modules.video": "1.0.0", 41 | "com.unity.modules.vr": "1.0.0", 42 | "com.unity.modules.wind": "1.0.0", 43 | "com.unity.modules.xr": "1.0.0" 44 | } 45 | } 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: 4 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_AutoSimulation: 1 42 | m_QueriesHitTriggers: 1 43 | m_QueriesStartInColliders: 1 44 | m_CallbacksOnDisable: 1 45 | m_ReuseCollisionCallbacks: 0 46 | m_AutoSyncTransforms: 0 47 | m_AlwaysShowColliders: 0 48 | m_ShowColliderSleep: 1 49 | m_ShowColliderContacts: 0 50 | m_ShowColliderAABB: 0 51 | m_ContactArrowScale: 0.2 52 | m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} 53 | m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} 54 | m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} 55 | m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} 56 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 57 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Models/LeaderboardSearchQuery.cs: -------------------------------------------------------------------------------- 1 | using Dan.Enums; 2 | 3 | namespace Dan.Models 4 | { 5 | public struct LeaderboardSearchQuery 6 | { 7 | public int Skip { get; set; } 8 | public int Take { get; set; } 9 | public string Username { get; set; } 10 | public TimePeriodType TimePeriod { get; set; } 11 | 12 | private string Query => $"skip={Skip}&take={Take}&username={Username}&timePeriod={(int) TimePeriod}"; 13 | 14 | public string GetQuery() => "?" + Query; 15 | 16 | public string ChainQuery() => "&" + Query; 17 | 18 | public static LeaderboardSearchQuery Default => new LeaderboardSearchQuery 19 | { 20 | Skip = 0, 21 | Take = 0, 22 | Username = "", 23 | TimePeriod = TimePeriodType.AllTime 24 | }; 25 | 26 | public static LeaderboardSearchQuery Paginated(int skip, int take) => 27 | ByUsernameAndTimePaginated("", TimePeriodType.AllTime, skip, take); 28 | 29 | public static LeaderboardSearchQuery ByUsername(string username) => 30 | ByUsernamePaginated(username, 5, 5); 31 | 32 | public static LeaderboardSearchQuery ByUsernamePaginated(string username, int prev, int next) => 33 | ByUsernameAndTimePaginated(username, TimePeriodType.AllTime, prev, next); 34 | 35 | public static LeaderboardSearchQuery ByTimePeriod(TimePeriodType timePeriod) => 36 | ByTimePeriodPaginated(timePeriod, 0, 0); 37 | 38 | public static LeaderboardSearchQuery ByTimePeriodPaginated(TimePeriodType timePeriod, int skip, int take) => 39 | ByUsernameAndTimePaginated("", timePeriod, skip, take); 40 | 41 | public static LeaderboardSearchQuery ByUsernameAndTime(string username, TimePeriodType timePeriod) => 42 | ByUsernameAndTimePaginated(username, timePeriod, 0, 0); 43 | 44 | public static LeaderboardSearchQuery ByUsernameAndTimePaginated(string username, TimePeriodType timePeriod, int skip, int take) => new LeaderboardSearchQuery 45 | { 46 | Skip = skip, 47 | Take = take, 48 | Username = username, 49 | TimePeriod = timePeriod 50 | }; 51 | } 52 | } -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Main/LeaderboardReference.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Dan.Models; 3 | 4 | namespace Dan.Main 5 | { 6 | public class LeaderboardReference 7 | { 8 | public string PublicKey { get; } 9 | 10 | public LeaderboardReference(string publicKey) => PublicKey = publicKey; 11 | 12 | public void UploadNewEntry(string username, int score, Action callback = null, Action errorCallback = null) => 13 | LeaderboardCreator.UploadNewEntry(PublicKey, username, score, callback, errorCallback); 14 | 15 | public void UploadNewEntry(string username, int score, string extraData, Action callback = null, Action errorCallback = null) => 16 | LeaderboardCreator.UploadNewEntry(PublicKey, username, score, extraData, callback, errorCallback); 17 | 18 | public void GetEntries(Action callback, Action errorCallback = null) => 19 | LeaderboardCreator.GetLeaderboard(PublicKey, callback, errorCallback); 20 | 21 | public void GetEntries(bool isAscending, Action callback, Action errorCallback = null) => 22 | LeaderboardCreator.GetLeaderboard(PublicKey, isAscending, callback, errorCallback); 23 | 24 | public void GetEntries(LeaderboardSearchQuery query, Action callback, Action errorCallback = null) => 25 | LeaderboardCreator.GetLeaderboard(PublicKey, query, callback, errorCallback); 26 | 27 | public void GetEntries(bool isAscending, LeaderboardSearchQuery query, Action callback, Action errorCallback = null) => 28 | LeaderboardCreator.GetLeaderboard(PublicKey, isAscending, query, callback, errorCallback); 29 | 30 | public void GetPersonalEntry(Action callback, Action errorCallback = null) => 31 | LeaderboardCreator.GetPersonalEntry(PublicKey, callback, errorCallback); 32 | 33 | public void GetEntryCount(Action callback, Action errorCallback = null) => 34 | LeaderboardCreator.GetEntryCount(PublicKey, callback, errorCallback); 35 | 36 | public void DeleteEntry(Action callback = null, Action errorCallback = null) => 37 | LeaderboardCreator.DeleteEntry(PublicKey, callback, errorCallback); 38 | 39 | public void ResetPlayer(Action onReset = null) => LeaderboardCreator.ResetPlayer(onReset); 40 | } 41 | } -------------------------------------------------------------------------------- /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: 14 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_LegacyDeferred: 17 | m_Mode: 1 18 | m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} 19 | m_DepthNormals: 20 | m_Mode: 1 21 | m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} 22 | m_MotionVectors: 23 | m_Mode: 1 24 | m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} 25 | m_LightHalo: 26 | m_Mode: 1 27 | m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} 28 | m_LensFlare: 29 | m_Mode: 1 30 | m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} 31 | m_VideoShadersIncludeMode: 2 32 | m_AlwaysIncludedShaders: 33 | - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} 34 | - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} 35 | - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} 36 | - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} 37 | - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} 38 | - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} 39 | - {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0} 40 | m_PreloadedShaders: [] 41 | m_PreloadShadersBatchTimeLimit: -1 42 | m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, 43 | type: 0} 44 | m_CustomRenderPipeline: {fileID: 11400000, guid: 7b7fd9122c28c4d15b667c7040e3b3fd, 45 | type: 2} 46 | m_TransparencySortMode: 0 47 | m_TransparencySortAxis: {x: 0, y: 0, z: 1} 48 | m_DefaultRenderingPath: 1 49 | m_DefaultMobileRenderingPath: 1 50 | m_TierSettings: [] 51 | m_LightmapStripping: 0 52 | m_FogStripping: 0 53 | m_InstancingStripping: 0 54 | m_LightmapKeepPlain: 1 55 | m_LightmapKeepDirCombined: 1 56 | m_LightmapKeepDynamicPlain: 1 57 | m_LightmapKeepDynamicDirCombined: 1 58 | m_LightmapKeepShadowMask: 1 59 | m_LightmapKeepSubtractive: 1 60 | m_FogKeepLinear: 1 61 | m_FogKeepExp: 1 62 | m_FogKeepExp2: 1 63 | m_AlbedoSwatchInfos: [] 64 | m_LightsUseLinearIntensity: 1 65 | m_LightsUseColorTemperature: 1 66 | m_DefaultRenderingLayerMask: 1 67 | m_LogWhenShaderIsCompiled: 0 68 | m_SRPDefaultSettings: 69 | UnityEngine.Rendering.Universal.UniversalRenderPipeline: {fileID: 11400000, guid: 18dc0cd2c080841dea60987a38ce93fa, 70 | type: 2} 71 | -------------------------------------------------------------------------------- /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: 2 8 | m_QualitySettings: 9 | - serializedVersion: 2 10 | name: Performant 11 | pixelLightCount: 0 12 | shadows: 0 13 | shadowResolution: 0 14 | shadowProjection: 1 15 | shadowCascades: 1 16 | shadowDistance: 20 17 | shadowNearPlaneOffset: 3 18 | shadowCascade2Split: 0.33333334 19 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 20 | shadowmaskMode: 0 21 | skinWeights: 2 22 | textureQuality: 0 23 | anisotropicTextures: 0 24 | antiAliasing: 0 25 | softParticles: 0 26 | softVegetation: 0 27 | realtimeReflectionProbes: 0 28 | billboardsFaceCameraPosition: 0 29 | vSyncCount: 0 30 | lodBias: 0.4 31 | maximumLODLevel: 0 32 | streamingMipmapsActive: 0 33 | streamingMipmapsAddAllCameras: 1 34 | streamingMipmapsMemoryBudget: 512 35 | streamingMipmapsRenderersPerFrame: 512 36 | streamingMipmapsMaxLevelReduction: 2 37 | streamingMipmapsMaxFileIORequests: 1024 38 | particleRaycastBudget: 4 39 | asyncUploadTimeSlice: 2 40 | asyncUploadBufferSize: 16 41 | asyncUploadPersistentBuffer: 1 42 | resolutionScalingFixedDPIFactor: 1 43 | customRenderPipeline: {fileID: 11400000, guid: d0e2fc18fe036412f8223b3b3d9ad574, 44 | type: 2} 45 | excludedTargetPlatforms: [] 46 | - serializedVersion: 2 47 | name: Balanced 48 | pixelLightCount: 1 49 | shadows: 1 50 | shadowResolution: 0 51 | shadowProjection: 1 52 | shadowCascades: 1 53 | shadowDistance: 20 54 | shadowNearPlaneOffset: 3 55 | shadowCascade2Split: 0.33333334 56 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 57 | shadowmaskMode: 0 58 | skinWeights: 4 59 | textureQuality: 0 60 | anisotropicTextures: 1 61 | antiAliasing: 0 62 | softParticles: 0 63 | softVegetation: 0 64 | realtimeReflectionProbes: 0 65 | billboardsFaceCameraPosition: 0 66 | vSyncCount: 1 67 | lodBias: 1 68 | maximumLODLevel: 0 69 | streamingMipmapsActive: 0 70 | streamingMipmapsAddAllCameras: 1 71 | streamingMipmapsMemoryBudget: 512 72 | streamingMipmapsRenderersPerFrame: 512 73 | streamingMipmapsMaxLevelReduction: 2 74 | streamingMipmapsMaxFileIORequests: 1024 75 | particleRaycastBudget: 64 76 | asyncUploadTimeSlice: 2 77 | asyncUploadBufferSize: 16 78 | asyncUploadPersistentBuffer: 1 79 | resolutionScalingFixedDPIFactor: 1 80 | customRenderPipeline: {fileID: 11400000, guid: e1260c1148f6143b28bae5ace5e9c5d1, 81 | type: 2} 82 | excludedTargetPlatforms: [] 83 | - serializedVersion: 2 84 | name: High Fidelity 85 | pixelLightCount: 2 86 | shadows: 2 87 | shadowResolution: 1 88 | shadowProjection: 1 89 | shadowCascades: 2 90 | shadowDistance: 40 91 | shadowNearPlaneOffset: 3 92 | shadowCascade2Split: 0.33333334 93 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 94 | shadowmaskMode: 1 95 | skinWeights: 255 96 | textureQuality: 0 97 | anisotropicTextures: 2 98 | antiAliasing: 4 99 | softParticles: 0 100 | softVegetation: 1 101 | realtimeReflectionProbes: 1 102 | billboardsFaceCameraPosition: 1 103 | vSyncCount: 1 104 | lodBias: 2 105 | maximumLODLevel: 0 106 | streamingMipmapsActive: 0 107 | streamingMipmapsAddAllCameras: 1 108 | streamingMipmapsMemoryBudget: 512 109 | streamingMipmapsRenderersPerFrame: 512 110 | streamingMipmapsMaxLevelReduction: 2 111 | streamingMipmapsMaxFileIORequests: 1024 112 | particleRaycastBudget: 2048 113 | asyncUploadTimeSlice: 2 114 | asyncUploadBufferSize: 16 115 | asyncUploadPersistentBuffer: 1 116 | resolutionScalingFixedDPIFactor: 1 117 | customRenderPipeline: {fileID: 11400000, guid: 7b7fd9122c28c4d15b667c7040e3b3fd, 118 | type: 2} 119 | excludedTargetPlatforms: [] 120 | m_PerPlatformDefaultQuality: 121 | Android: 1 122 | CloudRendering: 2 123 | Lumin: 2 124 | GameCoreScarlett: 2 125 | GameCoreXboxOne: 2 126 | Nintendo Switch: 2 127 | PS4: 2 128 | PS5: 2 129 | Server: 0 130 | Stadia: 2 131 | Standalone: 2 132 | WebGL: 1 133 | Windows Store Apps: 2 134 | XboxOne: 2 135 | iPhone: 1 136 | tvOS: 1 137 | -------------------------------------------------------------------------------- /ProjectSettings/SceneTemplateSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "templatePinStates": [], 3 | "dependencyTypeInfos": [ 4 | { 5 | "userAdded": false, 6 | "type": "UnityEngine.AnimationClip", 7 | "ignore": false, 8 | "defaultInstantiationMode": 0, 9 | "supportsModification": true 10 | }, 11 | { 12 | "userAdded": false, 13 | "type": "UnityEditor.Animations.AnimatorController", 14 | "ignore": false, 15 | "defaultInstantiationMode": 0, 16 | "supportsModification": true 17 | }, 18 | { 19 | "userAdded": false, 20 | "type": "UnityEngine.AnimatorOverrideController", 21 | "ignore": false, 22 | "defaultInstantiationMode": 0, 23 | "supportsModification": true 24 | }, 25 | { 26 | "userAdded": false, 27 | "type": "UnityEditor.Audio.AudioMixerController", 28 | "ignore": false, 29 | "defaultInstantiationMode": 0, 30 | "supportsModification": true 31 | }, 32 | { 33 | "userAdded": false, 34 | "type": "UnityEngine.ComputeShader", 35 | "ignore": true, 36 | "defaultInstantiationMode": 1, 37 | "supportsModification": true 38 | }, 39 | { 40 | "userAdded": false, 41 | "type": "UnityEngine.Cubemap", 42 | "ignore": false, 43 | "defaultInstantiationMode": 0, 44 | "supportsModification": true 45 | }, 46 | { 47 | "userAdded": false, 48 | "type": "UnityEngine.GameObject", 49 | "ignore": false, 50 | "defaultInstantiationMode": 0, 51 | "supportsModification": true 52 | }, 53 | { 54 | "userAdded": false, 55 | "type": "UnityEditor.LightingDataAsset", 56 | "ignore": false, 57 | "defaultInstantiationMode": 0, 58 | "supportsModification": false 59 | }, 60 | { 61 | "userAdded": false, 62 | "type": "UnityEngine.LightingSettings", 63 | "ignore": false, 64 | "defaultInstantiationMode": 0, 65 | "supportsModification": true 66 | }, 67 | { 68 | "userAdded": false, 69 | "type": "UnityEngine.Material", 70 | "ignore": false, 71 | "defaultInstantiationMode": 0, 72 | "supportsModification": true 73 | }, 74 | { 75 | "userAdded": false, 76 | "type": "UnityEditor.MonoScript", 77 | "ignore": true, 78 | "defaultInstantiationMode": 1, 79 | "supportsModification": true 80 | }, 81 | { 82 | "userAdded": false, 83 | "type": "UnityEngine.PhysicMaterial", 84 | "ignore": false, 85 | "defaultInstantiationMode": 0, 86 | "supportsModification": true 87 | }, 88 | { 89 | "userAdded": false, 90 | "type": "UnityEngine.PhysicsMaterial2D", 91 | "ignore": false, 92 | "defaultInstantiationMode": 0, 93 | "supportsModification": true 94 | }, 95 | { 96 | "userAdded": false, 97 | "type": "UnityEngine.Rendering.PostProcessing.PostProcessProfile", 98 | "ignore": false, 99 | "defaultInstantiationMode": 0, 100 | "supportsModification": true 101 | }, 102 | { 103 | "userAdded": false, 104 | "type": "UnityEngine.Rendering.PostProcessing.PostProcessResources", 105 | "ignore": false, 106 | "defaultInstantiationMode": 0, 107 | "supportsModification": true 108 | }, 109 | { 110 | "userAdded": false, 111 | "type": "UnityEngine.Rendering.VolumeProfile", 112 | "ignore": false, 113 | "defaultInstantiationMode": 0, 114 | "supportsModification": true 115 | }, 116 | { 117 | "userAdded": false, 118 | "type": "UnityEditor.SceneAsset", 119 | "ignore": false, 120 | "defaultInstantiationMode": 0, 121 | "supportsModification": false 122 | }, 123 | { 124 | "userAdded": false, 125 | "type": "UnityEngine.Shader", 126 | "ignore": true, 127 | "defaultInstantiationMode": 1, 128 | "supportsModification": true 129 | }, 130 | { 131 | "userAdded": false, 132 | "type": "UnityEngine.ShaderVariantCollection", 133 | "ignore": true, 134 | "defaultInstantiationMode": 1, 135 | "supportsModification": true 136 | }, 137 | { 138 | "userAdded": false, 139 | "type": "UnityEngine.Texture", 140 | "ignore": false, 141 | "defaultInstantiationMode": 0, 142 | "supportsModification": true 143 | }, 144 | { 145 | "userAdded": false, 146 | "type": "UnityEngine.Texture2D", 147 | "ignore": false, 148 | "defaultInstantiationMode": 0, 149 | "supportsModification": true 150 | }, 151 | { 152 | "userAdded": false, 153 | "type": "UnityEngine.Timeline.TimelineAsset", 154 | "ignore": false, 155 | "defaultInstantiationMode": 0, 156 | "supportsModification": true 157 | } 158 | ], 159 | "defaultDependencyTypeInfo": { 160 | "userAdded": false, 161 | "type": "", 162 | "ignore": false, 163 | "defaultInstantiationMode": 1, 164 | "supportsModification": true 165 | }, 166 | "newSceneOverride": 0 167 | } -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Demo/LeaderboardShowcase.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using Dan.Main; 3 | using Dan.Models; 4 | using TMPro; 5 | using UnityEngine; 6 | 7 | namespace Dan.Demo 8 | { 9 | public class LeaderboardShowcase : MonoBehaviour 10 | { 11 | [Header("Gameplay:")] 12 | [SerializeField] private TextMeshProUGUI _playerScoreText; 13 | 14 | [Header("Leaderboard Essentials:")] 15 | [SerializeField] private TMP_InputField _playerUsernameInput; 16 | [SerializeField] private Transform _entryDisplayParent; 17 | [SerializeField] private EntryDisplay _entryDisplayPrefab; 18 | [SerializeField] private CanvasGroup _leaderboardLoadingPanel; 19 | 20 | [Header("Search Query Essentials:")] 21 | [SerializeField] private TMP_Dropdown _timePeriodDropdown; 22 | [SerializeField] private TMP_InputField _pageInput, _entriesToTakeInput; 23 | [SerializeField] private int _defaultPageNumber = 1, _defaultEntriesToTake = 100; 24 | 25 | [Header("Personal Entry:")] 26 | [SerializeField] private RectTransform _personalEntryPanel; 27 | [SerializeField] private TextMeshProUGUI _personalEntryText; 28 | 29 | private int _playerScore; 30 | 31 | private Coroutine _personalEntryMoveCoroutine; 32 | 33 | public void AddPlayerScore() 34 | { 35 | _playerScore++; 36 | _playerScoreText.text = $"Your score: {_playerScore}"; 37 | } 38 | 39 | public void Load() 40 | { 41 | var timePeriod = 42 | _timePeriodDropdown.value == 1 ? Dan.Enums.TimePeriodType.Today : 43 | _timePeriodDropdown.value == 2 ? Dan.Enums.TimePeriodType.ThisWeek : 44 | _timePeriodDropdown.value == 3 ? Dan.Enums.TimePeriodType.ThisMonth : 45 | _timePeriodDropdown.value == 4 ? Dan.Enums.TimePeriodType.ThisYear : Dan.Enums.TimePeriodType.AllTime; 46 | 47 | var pageNumber = int.TryParse(_pageInput.text, out var pageValue) ? pageValue : _defaultPageNumber; 48 | pageNumber = Mathf.Max(1, pageNumber); 49 | _pageInput.text = pageNumber.ToString(); 50 | 51 | var take = int.TryParse(_entriesToTakeInput.text, out var takeValue) ? takeValue : _defaultEntriesToTake; 52 | take = Mathf.Clamp(take, 1, 100); 53 | _entriesToTakeInput.text = take.ToString(); 54 | 55 | var searchQuery = new LeaderboardSearchQuery 56 | { 57 | Skip = (pageNumber - 1) * take, 58 | Take = take, 59 | TimePeriod = timePeriod 60 | }; 61 | 62 | _pageInput.image.color = Color.white; 63 | _entriesToTakeInput.image.color = Color.white; 64 | 65 | Leaderboards.DemoSceneLeaderboard.GetEntries(searchQuery, OnLeaderboardLoaded, ErrorCallback); 66 | ToggleLoadingPanel(true); 67 | } 68 | 69 | public void ChangePageBy(int amount) 70 | { 71 | var pageNumber = int.TryParse(_pageInput.text, out var pageValue) ? pageValue : _defaultPageNumber; 72 | pageNumber += amount; 73 | if (pageNumber < 1) return; 74 | _pageInput.text = pageNumber.ToString(); 75 | } 76 | 77 | private void OnLeaderboardLoaded(Entry[] entries) 78 | { 79 | foreach (Transform t in _entryDisplayParent) 80 | Destroy(t.gameObject); 81 | 82 | foreach (var t in entries) 83 | CreateEntryDisplay(t); 84 | 85 | ToggleLoadingPanel(false); 86 | } 87 | 88 | private void ToggleLoadingPanel(bool isOn) 89 | { 90 | _leaderboardLoadingPanel.alpha = isOn ? 1f : 0f; 91 | _leaderboardLoadingPanel.interactable = isOn; 92 | _leaderboardLoadingPanel.blocksRaycasts = isOn; 93 | } 94 | 95 | public void MovePersonalEntryMenu(float xPos) 96 | { 97 | if (_personalEntryMoveCoroutine != null) 98 | StopCoroutine(_personalEntryMoveCoroutine); 99 | _personalEntryMoveCoroutine = StartCoroutine(MoveMenuCoroutine(_personalEntryPanel, 100 | new Vector2(xPos, _personalEntryPanel.anchoredPosition.y))); 101 | } 102 | 103 | private IEnumerator MoveMenuCoroutine(RectTransform rectTransform, Vector2 anchoredPosition) 104 | { 105 | const float duration = 0.25f; 106 | var time = 0f; 107 | var startPosition = rectTransform.anchoredPosition; 108 | while (time < duration) 109 | { 110 | time += Time.deltaTime; 111 | rectTransform.anchoredPosition = Vector2.Lerp(startPosition, anchoredPosition, time / duration); 112 | yield return null; 113 | } 114 | 115 | rectTransform.anchoredPosition = anchoredPosition; 116 | _personalEntryMoveCoroutine = null; 117 | } 118 | 119 | private void CreateEntryDisplay(Entry entry) 120 | { 121 | var entryDisplay = Instantiate(_entryDisplayPrefab.gameObject, _entryDisplayParent); 122 | entryDisplay.GetComponent().SetEntry(entry); 123 | } 124 | 125 | private IEnumerator LoadingTextCoroutine(TMP_Text text) 126 | { 127 | var loadingText = "Loading"; 128 | for (int i = 0; i < 3; i++) 129 | { 130 | loadingText += "."; 131 | text.text = loadingText; 132 | yield return new WaitForSeconds(0.25f); 133 | } 134 | 135 | StartCoroutine(LoadingTextCoroutine(text)); 136 | } 137 | 138 | private void InitializeComponents() 139 | { 140 | StartCoroutine(LoadingTextCoroutine(_leaderboardLoadingPanel.GetComponentInChildren())); 141 | 142 | _pageInput.onValueChanged.AddListener(_ => _pageInput.image.color = Color.yellow); 143 | _entriesToTakeInput.onValueChanged.AddListener(_ => _entriesToTakeInput.image.color = Color.yellow); 144 | 145 | _pageInput.placeholder.GetComponent().text = _defaultPageNumber.ToString(); 146 | _entriesToTakeInput.placeholder.GetComponent().text = _defaultEntriesToTake.ToString(); 147 | } 148 | 149 | private void Start() 150 | { 151 | InitializeComponents(); 152 | Load(); 153 | } 154 | 155 | public void Submit() 156 | { 157 | Leaderboards.DemoSceneLeaderboard.UploadNewEntry(_playerUsernameInput.text, _playerScore, Callback, ErrorCallback); 158 | } 159 | 160 | public void DeleteEntry() 161 | { 162 | Leaderboards.DemoSceneLeaderboard.DeleteEntry(Callback, ErrorCallback); 163 | } 164 | 165 | public void ResetPlayer() 166 | { 167 | LeaderboardCreator.ResetPlayer(); 168 | } 169 | 170 | public void GetPersonalEntry() 171 | { 172 | Leaderboards.DemoSceneLeaderboard.GetPersonalEntry(OnPersonalEntryLoaded, ErrorCallback); 173 | } 174 | 175 | private void OnPersonalEntryLoaded(Entry entry) 176 | { 177 | _personalEntryText.text = $"{entry.RankSuffix()}. {entry.Username} : {entry.Score}"; 178 | MovePersonalEntryMenu(0f); 179 | } 180 | 181 | private void Callback(bool success) 182 | { 183 | if (success) 184 | Load(); 185 | } 186 | 187 | private void ErrorCallback(string error) 188 | { 189 | Debug.LogError(error); 190 | } 191 | } 192 | } 193 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Main/LeaderboardCreatorBehaviour.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using Dan.Enums; 5 | using Dan.Models; 6 | using UnityEngine; 7 | using UnityEngine.Networking; 8 | 9 | using static Dan.ConstantVariables; 10 | 11 | namespace Dan.Main 12 | { 13 | public sealed class LeaderboardCreatorBehaviour : MonoBehaviour 14 | { 15 | [Serializable] 16 | private struct EntryResponse 17 | { 18 | public Entry[] entries; 19 | } 20 | 21 | internal static LeaderboardCreatorConfig Config => 22 | Resources.Load("LeaderboardCreatorConfig"); 23 | 24 | private static string GetError(UnityWebRequest request) => 25 | $"{request.responseCode}: {request.downloadHandler.text}"; 26 | 27 | internal void Authorize(Action callback) 28 | { 29 | var loadedGuid = LoadGuid(); 30 | if (!string.IsNullOrEmpty(loadedGuid)) 31 | { 32 | callback?.Invoke(loadedGuid); 33 | return; 34 | } 35 | 36 | var request = UnityWebRequest.Get(GetServerURL(Routes.Authorize)); 37 | StartCoroutine(HandleRequest(request, isSuccessful => 38 | { 39 | if (!isSuccessful) 40 | { 41 | HandleError(request); 42 | callback?.Invoke(null); 43 | return; 44 | } 45 | 46 | var guid = request.downloadHandler.text; 47 | SaveGuid(guid); 48 | callback?.Invoke(guid); 49 | })); 50 | } 51 | 52 | internal void ResetAndAuthorize(Action callback, Action onFinish) 53 | { 54 | callback += guid => 55 | { 56 | if (string.IsNullOrEmpty(guid)) 57 | return; 58 | onFinish?.Invoke(); 59 | }; 60 | DeleteGuid(); 61 | Authorize(callback); 62 | } 63 | 64 | internal void SendGetRequest(string url, Action callback, Action errorCallback) 65 | { 66 | var request = UnityWebRequest.Get(url); 67 | StartCoroutine(HandleRequest(request, isSuccessful => 68 | { 69 | if (!isSuccessful) 70 | { 71 | HandleError(request); 72 | callback?.Invoke(false); 73 | errorCallback?.Invoke(GetError(request)); 74 | return; 75 | } 76 | callback?.Invoke(true); 77 | LeaderboardCreator.Log("Successfully retrieved leaderboard data!"); 78 | })); 79 | } 80 | 81 | internal void SendGetRequest(string url, Action callback, Action errorCallback) 82 | { 83 | var request = UnityWebRequest.Get(url); 84 | StartCoroutine(HandleRequest(request, isSuccessful => 85 | { 86 | if (!isSuccessful) 87 | { 88 | HandleError(request); 89 | callback?.Invoke(0); 90 | errorCallback?.Invoke(GetError(request)); 91 | return; 92 | } 93 | callback?.Invoke(int.Parse(request.downloadHandler.text)); 94 | LeaderboardCreator.Log("Successfully retrieved leaderboard data!"); 95 | })); 96 | } 97 | 98 | internal void SendGetRequest(string url, Action callback, Action errorCallback) 99 | { 100 | var request = UnityWebRequest.Get(url); 101 | StartCoroutine(HandleRequest(request, isSuccessful => 102 | { 103 | if (!isSuccessful) 104 | { 105 | HandleError(request); 106 | callback?.Invoke(new Entry()); 107 | errorCallback?.Invoke(GetError(request)); 108 | return; 109 | } 110 | var response = JsonUtility.FromJson(request.downloadHandler.text); 111 | callback?.Invoke(response); 112 | LeaderboardCreator.Log("Successfully retrieved leaderboard data!"); 113 | })); 114 | } 115 | 116 | internal void SendGetRequest(string url, Action callback, Action errorCallback) 117 | { 118 | var request = UnityWebRequest.Get(url); 119 | StartCoroutine(HandleRequest(request, isSuccessful => 120 | { 121 | if (!isSuccessful) 122 | { 123 | HandleError(request); 124 | callback?.Invoke(Array.Empty()); 125 | errorCallback?.Invoke(GetError(request)); 126 | return; 127 | } 128 | var response = JsonUtility.FromJson($"{{\"entries\":{request.downloadHandler.text}}}"); 129 | callback?.Invoke(response.entries); 130 | LeaderboardCreator.Log("Successfully retrieved leaderboard data!"); 131 | })); 132 | } 133 | 134 | internal void SendPostRequest(string url, List form, Action callback = null, Action errorCallback = null) 135 | { 136 | var request = UnityWebRequest.Post(url, form); 137 | StartCoroutine(HandleRequest(request, callback, errorCallback)); 138 | } 139 | 140 | #if UNITY_ANDROID 141 | private class ForceAcceptAll : CertificateHandler 142 | { 143 | protected override bool ValidateCertificate(byte[] certificateData) => true; 144 | } 145 | #endif 146 | private static IEnumerator HandleRequest(UnityWebRequest request, Action onComplete, Action errorCallback = null) 147 | { 148 | #if UNITY_ANDROID 149 | request.certificateHandler = new ForceAcceptAll(); 150 | #endif 151 | yield return request.SendWebRequest(); 152 | 153 | if (request.responseCode != 200) 154 | { 155 | onComplete.Invoke(false); 156 | errorCallback?.Invoke(GetError(request)); 157 | request.downloadHandler.Dispose(); 158 | request.Dispose(); 159 | yield break; 160 | } 161 | 162 | onComplete.Invoke(true); 163 | request.downloadHandler.Dispose(); 164 | request.Dispose(); 165 | } 166 | 167 | private static void HandleError(UnityWebRequest request) 168 | { 169 | var message = Enum.GetName(typeof(StatusCode), (StatusCode) request.responseCode); 170 | message = string.IsNullOrEmpty(message) ? "Unknown" : message.SplitByUppercase(); 171 | 172 | var downloadHandler = request.downloadHandler; 173 | var text = downloadHandler.text; 174 | if (!string.IsNullOrEmpty(text)) 175 | message = $"{message}: {text}"; 176 | LeaderboardCreator.LogError(message); 177 | } 178 | 179 | private static void SaveGuid(string guid) 180 | { 181 | switch (Config.authSaveMode) 182 | { 183 | case AuthSaveMode.PlayerPrefs: 184 | PlayerPrefs.SetString(GUID_KEY, guid); 185 | PlayerPrefs.Save(); 186 | break; 187 | case AuthSaveMode.PersistentDataPath: 188 | var path = System.IO.Path.Combine(Application.persistentDataPath, Config.fileName); 189 | if (string.IsNullOrEmpty(path)) 190 | return; 191 | System.IO.File.WriteAllText(path, guid); 192 | break; 193 | } 194 | LeaderboardCreator.UserGuid = guid; 195 | } 196 | 197 | private static string LoadGuid() 198 | { 199 | switch (Config.authSaveMode) 200 | { 201 | case AuthSaveMode.PlayerPrefs: 202 | return PlayerPrefs.GetString(GUID_KEY, ""); 203 | case AuthSaveMode.PersistentDataPath: 204 | var path = System.IO.Path.Combine(Application.persistentDataPath, Config.fileName); 205 | return System.IO.File.Exists(path) ? System.IO.File.ReadAllText(path) : ""; 206 | default: 207 | return ""; 208 | } 209 | } 210 | 211 | private static void DeleteGuid() 212 | { 213 | switch (Config.authSaveMode) 214 | { 215 | case AuthSaveMode.PlayerPrefs: 216 | PlayerPrefs.DeleteKey(GUID_KEY); 217 | PlayerPrefs.Save(); 218 | break; 219 | case AuthSaveMode.PersistentDataPath: 220 | var path = System.IO.Path.Combine(Application.persistentDataPath, Config.fileName); 221 | if (string.IsNullOrEmpty(path) || !System.IO.File.Exists(path)) 222 | return; 223 | System.IO.File.Delete(path); 224 | break; 225 | } 226 | LeaderboardCreator.UserGuid = ""; 227 | } 228 | } 229 | } -------------------------------------------------------------------------------- /Packages/packages-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "com.unity.burst": { 4 | "version": "1.8.8", 5 | "depth": 1, 6 | "source": "registry", 7 | "dependencies": { 8 | "com.unity.mathematics": "1.2.1" 9 | }, 10 | "url": "https://packages.unity.com" 11 | }, 12 | "com.unity.collab-proxy": { 13 | "version": "2.3.1", 14 | "depth": 0, 15 | "source": "registry", 16 | "dependencies": {}, 17 | "url": "https://packages.unity.com" 18 | }, 19 | "com.unity.ext.nunit": { 20 | "version": "1.0.6", 21 | "depth": 1, 22 | "source": "registry", 23 | "dependencies": {}, 24 | "url": "https://packages.unity.com" 25 | }, 26 | "com.unity.ide.rider": { 27 | "version": "3.0.24", 28 | "depth": 0, 29 | "source": "registry", 30 | "dependencies": { 31 | "com.unity.ext.nunit": "1.0.6" 32 | }, 33 | "url": "https://packages.unity.com" 34 | }, 35 | "com.unity.ide.visualstudio": { 36 | "version": "2.0.18", 37 | "depth": 0, 38 | "source": "registry", 39 | "dependencies": { 40 | "com.unity.test-framework": "1.1.9" 41 | }, 42 | "url": "https://packages.unity.com" 43 | }, 44 | "com.unity.ide.vscode": { 45 | "version": "1.2.5", 46 | "depth": 0, 47 | "source": "registry", 48 | "dependencies": {}, 49 | "url": "https://packages.unity.com" 50 | }, 51 | "com.unity.mathematics": { 52 | "version": "1.2.6", 53 | "depth": 1, 54 | "source": "registry", 55 | "dependencies": {}, 56 | "url": "https://packages.unity.com" 57 | }, 58 | "com.unity.render-pipelines.core": { 59 | "version": "14.0.8", 60 | "depth": 1, 61 | "source": "builtin", 62 | "dependencies": { 63 | "com.unity.ugui": "1.0.0", 64 | "com.unity.modules.physics": "1.0.0", 65 | "com.unity.modules.terrain": "1.0.0", 66 | "com.unity.modules.jsonserialize": "1.0.0" 67 | } 68 | }, 69 | "com.unity.render-pipelines.universal": { 70 | "version": "14.0.8", 71 | "depth": 0, 72 | "source": "builtin", 73 | "dependencies": { 74 | "com.unity.mathematics": "1.2.1", 75 | "com.unity.burst": "1.8.4", 76 | "com.unity.render-pipelines.core": "14.0.8", 77 | "com.unity.shadergraph": "14.0.8" 78 | } 79 | }, 80 | "com.unity.searcher": { 81 | "version": "4.9.2", 82 | "depth": 2, 83 | "source": "registry", 84 | "dependencies": {}, 85 | "url": "https://packages.unity.com" 86 | }, 87 | "com.unity.shadergraph": { 88 | "version": "14.0.8", 89 | "depth": 1, 90 | "source": "builtin", 91 | "dependencies": { 92 | "com.unity.render-pipelines.core": "14.0.8", 93 | "com.unity.searcher": "4.9.2" 94 | } 95 | }, 96 | "com.unity.test-framework": { 97 | "version": "1.1.33", 98 | "depth": 0, 99 | "source": "registry", 100 | "dependencies": { 101 | "com.unity.ext.nunit": "1.0.6", 102 | "com.unity.modules.imgui": "1.0.0", 103 | "com.unity.modules.jsonserialize": "1.0.0" 104 | }, 105 | "url": "https://packages.unity.com" 106 | }, 107 | "com.unity.textmeshpro": { 108 | "version": "3.0.6", 109 | "depth": 0, 110 | "source": "registry", 111 | "dependencies": { 112 | "com.unity.ugui": "1.0.0" 113 | }, 114 | "url": "https://packages.unity.com" 115 | }, 116 | "com.unity.timeline": { 117 | "version": "1.7.5", 118 | "depth": 0, 119 | "source": "registry", 120 | "dependencies": { 121 | "com.unity.modules.director": "1.0.0", 122 | "com.unity.modules.animation": "1.0.0", 123 | "com.unity.modules.audio": "1.0.0", 124 | "com.unity.modules.particlesystem": "1.0.0" 125 | }, 126 | "url": "https://packages.unity.com" 127 | }, 128 | "com.unity.ugui": { 129 | "version": "1.0.0", 130 | "depth": 0, 131 | "source": "builtin", 132 | "dependencies": { 133 | "com.unity.modules.ui": "1.0.0", 134 | "com.unity.modules.imgui": "1.0.0" 135 | } 136 | }, 137 | "com.unity.visualscripting": { 138 | "version": "1.9.0", 139 | "depth": 0, 140 | "source": "registry", 141 | "dependencies": { 142 | "com.unity.ugui": "1.0.0", 143 | "com.unity.modules.jsonserialize": "1.0.0" 144 | }, 145 | "url": "https://packages.unity.com" 146 | }, 147 | "com.unity.modules.ai": { 148 | "version": "1.0.0", 149 | "depth": 0, 150 | "source": "builtin", 151 | "dependencies": {} 152 | }, 153 | "com.unity.modules.androidjni": { 154 | "version": "1.0.0", 155 | "depth": 0, 156 | "source": "builtin", 157 | "dependencies": {} 158 | }, 159 | "com.unity.modules.animation": { 160 | "version": "1.0.0", 161 | "depth": 0, 162 | "source": "builtin", 163 | "dependencies": {} 164 | }, 165 | "com.unity.modules.assetbundle": { 166 | "version": "1.0.0", 167 | "depth": 0, 168 | "source": "builtin", 169 | "dependencies": {} 170 | }, 171 | "com.unity.modules.audio": { 172 | "version": "1.0.0", 173 | "depth": 0, 174 | "source": "builtin", 175 | "dependencies": {} 176 | }, 177 | "com.unity.modules.cloth": { 178 | "version": "1.0.0", 179 | "depth": 0, 180 | "source": "builtin", 181 | "dependencies": { 182 | "com.unity.modules.physics": "1.0.0" 183 | } 184 | }, 185 | "com.unity.modules.director": { 186 | "version": "1.0.0", 187 | "depth": 0, 188 | "source": "builtin", 189 | "dependencies": { 190 | "com.unity.modules.audio": "1.0.0", 191 | "com.unity.modules.animation": "1.0.0" 192 | } 193 | }, 194 | "com.unity.modules.imageconversion": { 195 | "version": "1.0.0", 196 | "depth": 0, 197 | "source": "builtin", 198 | "dependencies": {} 199 | }, 200 | "com.unity.modules.imgui": { 201 | "version": "1.0.0", 202 | "depth": 0, 203 | "source": "builtin", 204 | "dependencies": {} 205 | }, 206 | "com.unity.modules.jsonserialize": { 207 | "version": "1.0.0", 208 | "depth": 0, 209 | "source": "builtin", 210 | "dependencies": {} 211 | }, 212 | "com.unity.modules.particlesystem": { 213 | "version": "1.0.0", 214 | "depth": 0, 215 | "source": "builtin", 216 | "dependencies": {} 217 | }, 218 | "com.unity.modules.physics": { 219 | "version": "1.0.0", 220 | "depth": 0, 221 | "source": "builtin", 222 | "dependencies": {} 223 | }, 224 | "com.unity.modules.physics2d": { 225 | "version": "1.0.0", 226 | "depth": 0, 227 | "source": "builtin", 228 | "dependencies": {} 229 | }, 230 | "com.unity.modules.screencapture": { 231 | "version": "1.0.0", 232 | "depth": 0, 233 | "source": "builtin", 234 | "dependencies": { 235 | "com.unity.modules.imageconversion": "1.0.0" 236 | } 237 | }, 238 | "com.unity.modules.subsystems": { 239 | "version": "1.0.0", 240 | "depth": 1, 241 | "source": "builtin", 242 | "dependencies": { 243 | "com.unity.modules.jsonserialize": "1.0.0" 244 | } 245 | }, 246 | "com.unity.modules.terrain": { 247 | "version": "1.0.0", 248 | "depth": 0, 249 | "source": "builtin", 250 | "dependencies": {} 251 | }, 252 | "com.unity.modules.terrainphysics": { 253 | "version": "1.0.0", 254 | "depth": 0, 255 | "source": "builtin", 256 | "dependencies": { 257 | "com.unity.modules.physics": "1.0.0", 258 | "com.unity.modules.terrain": "1.0.0" 259 | } 260 | }, 261 | "com.unity.modules.tilemap": { 262 | "version": "1.0.0", 263 | "depth": 0, 264 | "source": "builtin", 265 | "dependencies": { 266 | "com.unity.modules.physics2d": "1.0.0" 267 | } 268 | }, 269 | "com.unity.modules.ui": { 270 | "version": "1.0.0", 271 | "depth": 0, 272 | "source": "builtin", 273 | "dependencies": {} 274 | }, 275 | "com.unity.modules.uielements": { 276 | "version": "1.0.0", 277 | "depth": 0, 278 | "source": "builtin", 279 | "dependencies": { 280 | "com.unity.modules.ui": "1.0.0", 281 | "com.unity.modules.imgui": "1.0.0", 282 | "com.unity.modules.jsonserialize": "1.0.0" 283 | } 284 | }, 285 | "com.unity.modules.umbra": { 286 | "version": "1.0.0", 287 | "depth": 0, 288 | "source": "builtin", 289 | "dependencies": {} 290 | }, 291 | "com.unity.modules.unityanalytics": { 292 | "version": "1.0.0", 293 | "depth": 0, 294 | "source": "builtin", 295 | "dependencies": { 296 | "com.unity.modules.unitywebrequest": "1.0.0", 297 | "com.unity.modules.jsonserialize": "1.0.0" 298 | } 299 | }, 300 | "com.unity.modules.unitywebrequest": { 301 | "version": "1.0.0", 302 | "depth": 0, 303 | "source": "builtin", 304 | "dependencies": {} 305 | }, 306 | "com.unity.modules.unitywebrequestassetbundle": { 307 | "version": "1.0.0", 308 | "depth": 0, 309 | "source": "builtin", 310 | "dependencies": { 311 | "com.unity.modules.assetbundle": "1.0.0", 312 | "com.unity.modules.unitywebrequest": "1.0.0" 313 | } 314 | }, 315 | "com.unity.modules.unitywebrequestaudio": { 316 | "version": "1.0.0", 317 | "depth": 0, 318 | "source": "builtin", 319 | "dependencies": { 320 | "com.unity.modules.unitywebrequest": "1.0.0", 321 | "com.unity.modules.audio": "1.0.0" 322 | } 323 | }, 324 | "com.unity.modules.unitywebrequesttexture": { 325 | "version": "1.0.0", 326 | "depth": 0, 327 | "source": "builtin", 328 | "dependencies": { 329 | "com.unity.modules.unitywebrequest": "1.0.0", 330 | "com.unity.modules.imageconversion": "1.0.0" 331 | } 332 | }, 333 | "com.unity.modules.unitywebrequestwww": { 334 | "version": "1.0.0", 335 | "depth": 0, 336 | "source": "builtin", 337 | "dependencies": { 338 | "com.unity.modules.unitywebrequest": "1.0.0", 339 | "com.unity.modules.unitywebrequestassetbundle": "1.0.0", 340 | "com.unity.modules.unitywebrequestaudio": "1.0.0", 341 | "com.unity.modules.audio": "1.0.0", 342 | "com.unity.modules.assetbundle": "1.0.0", 343 | "com.unity.modules.imageconversion": "1.0.0" 344 | } 345 | }, 346 | "com.unity.modules.vehicles": { 347 | "version": "1.0.0", 348 | "depth": 0, 349 | "source": "builtin", 350 | "dependencies": { 351 | "com.unity.modules.physics": "1.0.0" 352 | } 353 | }, 354 | "com.unity.modules.video": { 355 | "version": "1.0.0", 356 | "depth": 0, 357 | "source": "builtin", 358 | "dependencies": { 359 | "com.unity.modules.audio": "1.0.0", 360 | "com.unity.modules.ui": "1.0.0", 361 | "com.unity.modules.unitywebrequest": "1.0.0" 362 | } 363 | }, 364 | "com.unity.modules.vr": { 365 | "version": "1.0.0", 366 | "depth": 0, 367 | "source": "builtin", 368 | "dependencies": { 369 | "com.unity.modules.jsonserialize": "1.0.0", 370 | "com.unity.modules.physics": "1.0.0", 371 | "com.unity.modules.xr": "1.0.0" 372 | } 373 | }, 374 | "com.unity.modules.wind": { 375 | "version": "1.0.0", 376 | "depth": 0, 377 | "source": "builtin", 378 | "dependencies": {} 379 | }, 380 | "com.unity.modules.xr": { 381 | "version": "1.0.0", 382 | "depth": 0, 383 | "source": "builtin", 384 | "dependencies": { 385 | "com.unity.modules.physics": "1.0.0", 386 | "com.unity.modules.jsonserialize": "1.0.0", 387 | "com.unity.modules.subsystems": "1.0.0" 388 | } 389 | } 390 | } 391 | } 392 | -------------------------------------------------------------------------------- /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 | - serializedVersion: 3 297 | m_Name: Enable Debug Button 1 298 | descriptiveName: 299 | descriptiveNegativeName: 300 | negativeButton: 301 | positiveButton: left ctrl 302 | altNegativeButton: 303 | altPositiveButton: joystick button 8 304 | gravity: 0 305 | dead: 0 306 | sensitivity: 0 307 | snap: 0 308 | invert: 0 309 | type: 0 310 | axis: 0 311 | joyNum: 0 312 | - serializedVersion: 3 313 | m_Name: Enable Debug Button 2 314 | descriptiveName: 315 | descriptiveNegativeName: 316 | negativeButton: 317 | positiveButton: backspace 318 | altNegativeButton: 319 | altPositiveButton: joystick button 9 320 | gravity: 0 321 | dead: 0 322 | sensitivity: 0 323 | snap: 0 324 | invert: 0 325 | type: 0 326 | axis: 0 327 | joyNum: 0 328 | - serializedVersion: 3 329 | m_Name: Debug Reset 330 | descriptiveName: 331 | descriptiveNegativeName: 332 | negativeButton: 333 | positiveButton: left alt 334 | altNegativeButton: 335 | altPositiveButton: joystick button 1 336 | gravity: 0 337 | dead: 0 338 | sensitivity: 0 339 | snap: 0 340 | invert: 0 341 | type: 0 342 | axis: 0 343 | joyNum: 0 344 | - serializedVersion: 3 345 | m_Name: Debug Next 346 | descriptiveName: 347 | descriptiveNegativeName: 348 | negativeButton: 349 | positiveButton: page down 350 | altNegativeButton: 351 | altPositiveButton: joystick button 5 352 | gravity: 0 353 | dead: 0 354 | sensitivity: 0 355 | snap: 0 356 | invert: 0 357 | type: 0 358 | axis: 0 359 | joyNum: 0 360 | - serializedVersion: 3 361 | m_Name: Debug Previous 362 | descriptiveName: 363 | descriptiveNegativeName: 364 | negativeButton: 365 | positiveButton: page up 366 | altNegativeButton: 367 | altPositiveButton: joystick button 4 368 | gravity: 0 369 | dead: 0 370 | sensitivity: 0 371 | snap: 0 372 | invert: 0 373 | type: 0 374 | axis: 0 375 | joyNum: 0 376 | - serializedVersion: 3 377 | m_Name: Debug Validate 378 | descriptiveName: 379 | descriptiveNegativeName: 380 | negativeButton: 381 | positiveButton: return 382 | altNegativeButton: 383 | altPositiveButton: joystick button 0 384 | gravity: 0 385 | dead: 0 386 | sensitivity: 0 387 | snap: 0 388 | invert: 0 389 | type: 0 390 | axis: 0 391 | joyNum: 0 392 | - serializedVersion: 3 393 | m_Name: Debug Persistent 394 | descriptiveName: 395 | descriptiveNegativeName: 396 | negativeButton: 397 | positiveButton: right shift 398 | altNegativeButton: 399 | altPositiveButton: joystick button 2 400 | gravity: 0 401 | dead: 0 402 | sensitivity: 0 403 | snap: 0 404 | invert: 0 405 | type: 0 406 | axis: 0 407 | joyNum: 0 408 | - serializedVersion: 3 409 | m_Name: Debug Multiplier 410 | descriptiveName: 411 | descriptiveNegativeName: 412 | negativeButton: 413 | positiveButton: left shift 414 | altNegativeButton: 415 | altPositiveButton: joystick button 3 416 | gravity: 0 417 | dead: 0 418 | sensitivity: 0 419 | snap: 0 420 | invert: 0 421 | type: 0 422 | axis: 0 423 | joyNum: 0 424 | - serializedVersion: 3 425 | m_Name: Debug Horizontal 426 | descriptiveName: 427 | descriptiveNegativeName: 428 | negativeButton: left 429 | positiveButton: right 430 | altNegativeButton: 431 | altPositiveButton: 432 | gravity: 1000 433 | dead: 0.001 434 | sensitivity: 1000 435 | snap: 0 436 | invert: 0 437 | type: 0 438 | axis: 0 439 | joyNum: 0 440 | - serializedVersion: 3 441 | m_Name: Debug Vertical 442 | descriptiveName: 443 | descriptiveNegativeName: 444 | negativeButton: down 445 | positiveButton: up 446 | altNegativeButton: 447 | altPositiveButton: 448 | gravity: 1000 449 | dead: 0.001 450 | sensitivity: 1000 451 | snap: 0 452 | invert: 0 453 | type: 0 454 | axis: 0 455 | joyNum: 0 456 | - serializedVersion: 3 457 | m_Name: Debug Vertical 458 | descriptiveName: 459 | descriptiveNegativeName: 460 | negativeButton: down 461 | positiveButton: up 462 | altNegativeButton: 463 | altPositiveButton: 464 | gravity: 1000 465 | dead: 0.001 466 | sensitivity: 1000 467 | snap: 0 468 | invert: 0 469 | type: 2 470 | axis: 6 471 | joyNum: 0 472 | - serializedVersion: 3 473 | m_Name: Debug Horizontal 474 | descriptiveName: 475 | descriptiveNegativeName: 476 | negativeButton: left 477 | positiveButton: right 478 | altNegativeButton: 479 | altPositiveButton: 480 | gravity: 1000 481 | dead: 0.001 482 | sensitivity: 1000 483 | snap: 0 484 | invert: 0 485 | type: 2 486 | axis: 5 487 | joyNum: 0 488 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Editor/LeaderboardCreatorWindow.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using System.Text.RegularExpressions; 4 | using Dan; 5 | using UnityEditor; 6 | using UnityEngine; 7 | 8 | namespace LeaderboardCreatorEditor 9 | { 10 | public class LeaderboardCreatorWindow : EditorWindow 11 | { 12 | [System.Serializable] 13 | private class SavedLeaderboard 14 | { 15 | public string name, publicKey, secretKey; 16 | 17 | public SavedLeaderboard(string name, string publicKey, string secretKey) 18 | { 19 | this.name = name; 20 | this.publicKey = publicKey; 21 | this.secretKey = secretKey; 22 | } 23 | } 24 | 25 | [System.Serializable] 26 | private struct SavedLeaderboardList 27 | { 28 | public List leaderboards; 29 | } 30 | 31 | private const string ITCH_PAGE_URL = "https://danqzq.itch.io/leaderboard-creator"; 32 | private const string AUTHOR_URL = "https://www.danqzq.games"; 33 | private const string VERSION = "2.8"; 34 | 35 | private static bool _isAddLeaderboardMenuOpen; 36 | private static string _name, _publicKey, _secretKey; 37 | private static Vector2 _scrollPos; 38 | 39 | private static SavedLeaderboardList _savedLeaderboardList; 40 | 41 | private static GUIStyle _titleStyle; 42 | 43 | private static int _menuOpened; 44 | 45 | private static LeaderboardCreatorConfig Config => Resources.Load("LeaderboardCreatorConfig"); 46 | 47 | [MenuItem("Leaderboard Creator/My Leaderboards")] 48 | private static void ShowWindow() 49 | { 50 | var window = GetWindow(); 51 | window.minSize = new Vector2(400, 475); 52 | window.titleContent = new GUIContent("Leaderboard Creator"); 53 | window.Show(); 54 | 55 | CheckVersion(); 56 | } 57 | 58 | private static void CheckVersion() 59 | { 60 | var request = UnityEngine.Networking.UnityWebRequest.Get("https://lcv2-server.danqzq.games/version"); 61 | var operation = request.SendWebRequest(); 62 | Log("Checking for updates..."); 63 | operation.completed += _ => 64 | { 65 | if (request.responseCode != 200) return; 66 | var response = request.downloadHandler.text; 67 | if (response == VERSION) 68 | { 69 | Log("Leaderboard Creator is up to date!"); 70 | return; 71 | } 72 | 73 | Log("There is a new version of Leaderboard Creator available!"); 74 | 75 | var dialog = EditorUtility.DisplayDialog("Leaderboard Creator", 76 | "There is a new version of Leaderboard Creator available. Download it now?", "Yes", "No"); 77 | if (!dialog) return; 78 | 79 | Application.OpenURL(ITCH_PAGE_URL); 80 | }; 81 | } 82 | 83 | private void OnBecameVisible() 84 | { 85 | _titleStyle = new GUIStyle 86 | { 87 | fontSize = 20, 88 | fontStyle = FontStyle.Bold, 89 | normal = new GUIStyleState {textColor = Color.white} 90 | }; 91 | _savedLeaderboardList = GetSavedLeaderboardList(); 92 | } 93 | 94 | private static SavedLeaderboardList GetSavedLeaderboardList() 95 | { 96 | var path = AssetDatabase.GetAssetPath(Config.editorOnlyLeaderboardsFile); 97 | var file = new System.IO.StreamReader(path); 98 | var json = file.ReadToEnd(); 99 | file.Close(); 100 | 101 | if (string.IsNullOrEmpty(json)) 102 | { 103 | SaveLeaderboardList(); 104 | return new SavedLeaderboardList {leaderboards = new List()}; 105 | } 106 | 107 | var savedLeaderboardList = JsonUtility.FromJson(json); 108 | return savedLeaderboardList; 109 | } 110 | 111 | private static void SaveLeaderboardList() 112 | { 113 | _savedLeaderboardList.leaderboards ??= new List(); 114 | 115 | var path = AssetDatabase.GetAssetPath(Config.editorOnlyLeaderboardsFile); 116 | var json = JsonUtility.ToJson(_savedLeaderboardList); 117 | 118 | System.IO.File.WriteAllText(path, json); 119 | AssetDatabase.Refresh(); 120 | } 121 | 122 | private void OnGUI() 123 | { 124 | _menuOpened = GUILayout.Toolbar(_menuOpened, new[] {"My Leaderboards", "Settings"}); 125 | 126 | switch (_menuOpened) 127 | { 128 | case 0: 129 | OnMyLeaderboardsGUI(); 130 | break; 131 | case 1: 132 | OnSettingsGUI(); 133 | break; 134 | } 135 | 136 | DrawSeparator(); 137 | 138 | if (GUILayout.Button("Made by @danqzq", 139 | new GUIStyle{alignment = TextAnchor.LowerRight, richText = true})) 140 | Application.OpenURL(AUTHOR_URL); 141 | 142 | GUILayout.Label($"v{VERSION}", new GUIStyle{alignment = TextAnchor.LowerRight}); 143 | } 144 | 145 | private void OnMyLeaderboardsGUI() 146 | { 147 | DisplayLeaderboardsMenu(); 148 | 149 | if (!_isAddLeaderboardMenuOpen && GUILayout.Button("Enter New Leaderboard")) 150 | _isAddLeaderboardMenuOpen = true; 151 | 152 | if (_isAddLeaderboardMenuOpen) DisplayEnterNewLeaderboardMenu(); 153 | 154 | if (GUILayout.Button("Save to C# Script")) 155 | SaveLeaderboardsToScript(); 156 | 157 | if (GUILayout.Button("Manage Leaderboards")) 158 | Application.OpenURL(ITCH_PAGE_URL); 159 | } 160 | 161 | private void OnSettingsGUI() 162 | { 163 | GUILayout.Space(10); 164 | GUILayout.Label("Settings", _titleStyle); 165 | GUILayout.Space(10); 166 | 167 | var oldAuthSaveMode = Config.authSaveMode; 168 | Config.authSaveMode = (AuthSaveMode) EditorGUILayout.EnumPopup("Authorization Save Mode", Config.authSaveMode); 169 | if (oldAuthSaveMode != Config.authSaveMode) 170 | EditorUtility.SetDirty(Config); 171 | 172 | if (Config.authSaveMode == AuthSaveMode.PersistentDataPath) 173 | { 174 | var oldFileName = Config.fileName; 175 | Config.fileName = EditorGUILayout.TextField("File Name", Config.fileName); 176 | if (Config.fileName.Contains("/")) 177 | Config.fileName = Config.fileName.Replace("/", ""); 178 | if (oldFileName != Config.fileName) 179 | EditorUtility.SetDirty(Config); 180 | if (Application.platform == RuntimePlatform.WebGLPlayer) 181 | EditorGUILayout.HelpBox("Saving to persistent data path may not work on WebGL builds.", MessageType.Warning); 182 | } 183 | 184 | GUILayout.Space(20); 185 | 186 | var oldIsUpdateLogsEnabled = Config.isUpdateLogsEnabled; 187 | Config.isUpdateLogsEnabled = GUILayout.Toggle(Config.isUpdateLogsEnabled, "Enable Update Logs"); 188 | if (oldIsUpdateLogsEnabled != Config.isUpdateLogsEnabled) 189 | EditorUtility.SetDirty(Config); 190 | } 191 | 192 | private static void DrawSeparator() 193 | { 194 | GUILayout.Space(10); 195 | var rect = EditorGUILayout.BeginHorizontal(); 196 | Handles.color = Color.gray; 197 | Handles.DrawLine(new Vector2(rect.x - 15, rect.y), new Vector2(rect.width + 15, rect.y)); 198 | EditorGUILayout.EndHorizontal(); 199 | GUILayout.Space(10); 200 | } 201 | 202 | private static void DisplayLeaderboardsMenu() 203 | { 204 | if (_savedLeaderboardList.leaderboards.Count == 0) 205 | { 206 | GUILayout.Label("You don't have any saved leaderboards."); 207 | return; 208 | } 209 | 210 | _scrollPos = GUILayout.BeginScrollView(_scrollPos, GUILayout.Height(200)); 211 | for (var i = 0; i < _savedLeaderboardList.leaderboards.Count; i++) 212 | { 213 | GUILayout.Space(10); 214 | GUILayout.Label("Leaderboard #" + (i + 1), EditorStyles.boldLabel); 215 | 216 | var savedLeaderboard = _savedLeaderboardList.leaderboards[i]; 217 | savedLeaderboard.name = EditorGUILayout.TextField("Name", savedLeaderboard.name); 218 | 219 | GUILayout.BeginHorizontal(); 220 | if (GUILayout.Button("Copy Public Key")) 221 | EditorGUIUtility.systemCopyBuffer = savedLeaderboard.publicKey; 222 | if (GUILayout.Button("Copy Secret Key")) 223 | EditorGUIUtility.systemCopyBuffer = savedLeaderboard.secretKey; 224 | GUILayout.EndHorizontal(); 225 | 226 | if (!GUILayout.Button("Forget Leaderboard")) 227 | continue; 228 | 229 | _savedLeaderboardList.leaderboards.Remove(savedLeaderboard); 230 | SaveLeaderboardList(); 231 | break; 232 | } 233 | 234 | GUILayout.EndScrollView(); 235 | } 236 | 237 | private static void DisplayEnterNewLeaderboardMenu() 238 | { 239 | DrawSeparator(); 240 | GUILayout.Label("Enter New Leaderboard", _titleStyle); 241 | 242 | _name = EditorGUILayout.TextField("Name", _name); 243 | _publicKey = EditorGUILayout.TextField("Public Key", _publicKey); 244 | _secretKey = EditorGUILayout.TextField("Secret Key", _secretKey); 245 | 246 | if (GUILayout.Button("Add Leaderboard")) 247 | EnterNewLeaderboard(); 248 | 249 | if (GUILayout.Button("Cancel")) 250 | _isAddLeaderboardMenuOpen = false; 251 | 252 | DrawSeparator(); 253 | } 254 | 255 | private static void EnterNewLeaderboard() 256 | { 257 | if (string.IsNullOrEmpty(_publicKey) || string.IsNullOrEmpty(_secretKey)) 258 | { 259 | EditorUtility.DisplayDialog("Leaderboard Creator Error", "Please fill all the fields.", "OK"); 260 | return; 261 | } 262 | 263 | if (!ValidateLeaderboardName(_name)) return; 264 | 265 | _savedLeaderboardList = GetSavedLeaderboardList(); 266 | if (_savedLeaderboardList.leaderboards.Exists(l => l.name == _name)) 267 | { 268 | EditorUtility.DisplayDialog("Leaderboard Creator Error", "You already have a leaderboard with that name.", "OK"); 269 | return; 270 | } 271 | 272 | _savedLeaderboardList.leaderboards.Add(new SavedLeaderboard(_name, _publicKey, _secretKey)); 273 | SaveLeaderboardList(); 274 | 275 | _name = _publicKey = _secretKey = ""; 276 | } 277 | 278 | private static bool ValidateLeaderboardName(string leaderboardName) 279 | { 280 | if (string.IsNullOrEmpty(leaderboardName)) 281 | { 282 | EditorUtility.DisplayDialog("Leaderboard Creator Error", "Please enter a name.", "OK"); 283 | return false; 284 | } 285 | 286 | if (!Regex.IsMatch(leaderboardName, @"^[a-zA-Z0-9_]+$")) 287 | { 288 | EditorUtility.DisplayDialog("Leaderboard Creator Error", "The name can only contain alphabetical letters, numbers and underscores.", "OK"); 289 | return false; 290 | } 291 | 292 | if (!Regex.IsMatch(leaderboardName, @"^[0-9]")) 293 | return true; 294 | 295 | EditorUtility.DisplayDialog("Leaderboard Creator Error", "The name cannot start with a number.", "OK"); 296 | return false; 297 | } 298 | 299 | private static void SaveLeaderboardsToScript() 300 | { 301 | if (_savedLeaderboardList.leaderboards.Any(savedLeaderboard => !ValidateLeaderboardName(savedLeaderboard.name))) 302 | return; 303 | 304 | SaveLeaderboardList(); 305 | 306 | var path = AssetDatabase.GetAssetPath(Config.leaderboardsFile); 307 | var file = new System.IO.StreamWriter(path); 308 | 309 | file.WriteLine("namespace Dan.Main"); 310 | file.WriteLine("{"); 311 | file.WriteLine(" public static class Leaderboards"); 312 | file.WriteLine(" {"); 313 | 314 | foreach (var savedLeaderboard in _savedLeaderboardList.leaderboards) 315 | { 316 | file.WriteLine($" public static LeaderboardReference {savedLeaderboard.name} = " + 317 | $"new LeaderboardReference(\"{savedLeaderboard.publicKey}\");"); 318 | } 319 | 320 | file.WriteLine(" }"); 321 | file.WriteLine("}"); 322 | file.Close(); 323 | AssetDatabase.Refresh(); 324 | } 325 | 326 | private static void Log(string message) 327 | { 328 | if (!Config.isUpdateLogsEnabled) return; 329 | Debug.Log($"[Leaderboard Creator] {message}"); 330 | } 331 | } 332 | } -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Scripts/Main/LeaderboardCreator.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using Dan.Enums; 4 | using Dan.Models; 5 | using UnityEngine; 6 | 7 | using static Dan.ConstantVariables; 8 | 9 | namespace Dan.Main 10 | { 11 | public static class LeaderboardCreator 12 | { 13 | public static bool LoggingEnabled { get; set; } = true; 14 | 15 | private static LeaderboardCreatorBehaviour _behaviour; 16 | 17 | internal static string UserGuid; 18 | 19 | private const string FORM_PUBLIC_KEY = "publicKey", FORM_USERNAME = "username", FORM_SCORE = "score", 20 | FORM_EXTRA = "extra", FORM_USER_GUID = "userGuid"; 21 | 22 | [RuntimeInitializeOnLoadMethod] 23 | private static void Initialize() 24 | { 25 | Log("Initializing..."); 26 | _behaviour = new GameObject("[LeaderboardCreator]").AddComponent(); 27 | UnityEngine.Object.DontDestroyOnLoad(_behaviour.gameObject); 28 | 29 | if (LeaderboardCreatorBehaviour.Config.authSaveMode != AuthSaveMode.Unhandled) 30 | _behaviour.Authorize(OnAuthorizationAttempted); 31 | } 32 | 33 | private static void OnAuthorizationAttempted(string guid) 34 | { 35 | if (string.IsNullOrEmpty(guid)) 36 | { 37 | Log("Failed to connect to server, trying again..."); 38 | 39 | IEnumerator Co() 40 | { 41 | yield return new WaitForSeconds(5f); 42 | _behaviour.Authorize(OnAuthorizationAttempted); 43 | } 44 | 45 | _behaviour.StartCoroutine(Co()); 46 | return; 47 | } 48 | SetUserGuid(guid); 49 | } 50 | 51 | /// 52 | /// Requests a new unique identifier for the user from the server. 53 | /// NOTE: Use this function if you want to manually handle the user's unique identifier. 54 | /// IMPORTANT: Set the "Authorization Save Mode" to "Unhandled" in the Settings menu of the Leaderboard Creator window. 55 | /// 56 | /// A callback that returns the user's unique identifier. 57 | public static void RequestUserGuid(Action userGuidCallback) 58 | { 59 | _behaviour.Authorize(userGuidCallback); 60 | } 61 | 62 | /// 63 | /// Sets the user's unique identifier to the given string value. 64 | /// 65 | /// The user's unique identifier. 66 | public static void SetUserGuid(string userGuid) 67 | { 68 | UserGuid = userGuid; 69 | Log("Initialized!"); 70 | } 71 | 72 | /// 73 | /// Pings the server to check if a connection can be established. 74 | /// 75 | /// If true, the server is online, else connection failed. 76 | public static void Ping(Action isOnline) => _behaviour.SendGetRequest(GetServerURL(), isOnline, null); 77 | 78 | /// 79 | /// Fetches a leaderboard with the given public key. 80 | /// 81 | /// The public key of the leaderboard 82 | /// (retrieve from https://danqzq.itch.io/leaderboard-creator). 83 | /// Returns entries of the leaderboard if the request was successful. 84 | /// Returns an error message if the request failed. 85 | public static void GetLeaderboard(string publicKey, Action callback, Action errorCallback = null) => 86 | GetLeaderboard(publicKey, LeaderboardSearchQuery.Default, callback, errorCallback); 87 | 88 | /// 89 | /// Fetches a leaderboard with the given public key. 90 | /// 91 | /// The public key of the leaderboard 92 | /// (retrieve from https://danqzq.itch.io/leaderboard-creator). 93 | /// If true, the leaderboard will be sorted in ascending order. 94 | /// Returns entries of the leaderboard if the request was successful. 95 | /// Returns an error message if the request failed. 96 | public static void GetLeaderboard(string publicKey, bool isInAscendingOrder, Action callback, Action errorCallback = null) => 97 | GetLeaderboard(publicKey, isInAscendingOrder, LeaderboardSearchQuery.Default, callback, errorCallback); 98 | 99 | /// 100 | /// Fetches a leaderboard with the given public key. 101 | /// 102 | /// The public key of the leaderboard 103 | /// (retrieve from https://danqzq.itch.io/leaderboard-creator). 104 | /// A struct with additional search parameters for filtering entries. 105 | /// Returns entries of the leaderboard if the request was successful. 106 | /// Returns an error message if the request failed. 107 | public static void GetLeaderboard(string publicKey, LeaderboardSearchQuery searchQuery, Action callback, Action errorCallback = null) 108 | { 109 | if (string.IsNullOrEmpty(publicKey)) 110 | { 111 | LogError("Public key cannot be null or empty!"); 112 | return; 113 | } 114 | 115 | var query = $"?publicKey={publicKey}&userGuid={UserGuid}"; 116 | query += searchQuery.ChainQuery(); 117 | 118 | _behaviour.SendGetRequest(GetServerURL(Routes.Get, query), callback, errorCallback); 119 | } 120 | 121 | /// 122 | /// Fetches a leaderboard with the given public key. 123 | /// 124 | /// The public key of the leaderboard 125 | /// (retrieve from https://danqzq.itch.io/leaderboard-creator). 126 | /// If true, the leaderboard will be sorted in ascending order. 127 | /// A struct with additional search parameters for filtering entries. 128 | /// Returns entries of the leaderboard if the request was successful. 129 | /// Returns an error message if the request failed. 130 | public static void GetLeaderboard(string publicKey, bool isInAscendingOrder, LeaderboardSearchQuery searchQuery, Action callback, Action errorCallback = null) 131 | { 132 | if (string.IsNullOrEmpty(publicKey)) 133 | { 134 | LogError("Public key cannot be null or empty!"); 135 | return; 136 | } 137 | 138 | var query = $"?publicKey={publicKey}&userGuid={UserGuid}&isInAscendingOrder={(isInAscendingOrder ? 1 : 0)}"; 139 | query += searchQuery.ChainQuery(); 140 | 141 | _behaviour.SendGetRequest(GetServerURL(Routes.Get, query), callback, errorCallback); 142 | } 143 | 144 | /// 145 | /// Uploads a new entry to the leaderboard with the given public key. 146 | /// 147 | /// The public key of the leaderboard 148 | /// The username of the player 149 | /// The highscore of the player 150 | /// Returns true if the request was successful. 151 | /// Returns an error message if the request failed. 152 | public static void UploadNewEntry(string publicKey, string username, int score, Action callback = null, Action errorCallback = null) => 153 | UploadNewEntry(publicKey, username, score, " ", callback, errorCallback); 154 | 155 | /// 156 | /// Uploads a new entry to the leaderboard with the given public key. 157 | /// 158 | /// The public key of the leaderboard 159 | /// The username of the player 160 | /// The highscore of the player 161 | /// Extra data to be stored with the entry (max length of 100, unless using an advanced leaderboard) 162 | /// Returns true if the request was successful. 163 | /// Returns an error message if the request failed. 164 | public static void UploadNewEntry(string publicKey, string username, int score, string extra, Action callback = null, Action errorCallback = null) 165 | { 166 | if (string.IsNullOrEmpty(publicKey)) 167 | { 168 | LogError("Public key cannot be null or empty!"); 169 | return; 170 | } 171 | 172 | if (string.IsNullOrEmpty(username)) 173 | { 174 | LogError("Username cannot be null or empty!"); 175 | return; 176 | } 177 | 178 | if (username.Length > 127) 179 | { 180 | LogError("Username cannot be longer than 127 characters!"); 181 | return; 182 | } 183 | 184 | if (string.IsNullOrEmpty(UserGuid)) 185 | { 186 | LogError("User GUID is null or empty! Please authorize the user before uploading an entry."); 187 | return; 188 | } 189 | 190 | callback += isSuccessful => 191 | { 192 | if (!isSuccessful) 193 | LogError("Uploading entry data failed!"); 194 | else 195 | Log("Successfully uploaded entry data to leaderboard!"); 196 | }; 197 | 198 | _behaviour.SendPostRequest(GetServerURL(Routes.Upload), Requests.Form( 199 | Requests.Field(FORM_PUBLIC_KEY, publicKey), 200 | Requests.Field(FORM_USERNAME, username), 201 | Requests.Field(FORM_SCORE, score.ToString()), 202 | Requests.Field(FORM_EXTRA, extra), 203 | Requests.Field(FORM_USER_GUID, UserGuid)), callback, errorCallback); 204 | } 205 | 206 | [Obsolete("This function is deprecated and will be removed in the future.")] 207 | public static void UpdateEntryUsername(string publicKey, string username, Action callback = null, Action errorCallback = null) 208 | { 209 | if (string.IsNullOrEmpty(publicKey)) 210 | { 211 | LogError("Public key cannot be null or empty!"); 212 | return; 213 | } 214 | 215 | if (string.IsNullOrEmpty(username)) 216 | { 217 | LogError("Username cannot be null or empty!"); 218 | return; 219 | } 220 | 221 | if (username.Length > 127) 222 | { 223 | LogError("Username cannot be longer than 127 characters!"); 224 | return; 225 | } 226 | 227 | callback += isSuccessful => 228 | { 229 | if (!isSuccessful) 230 | LogError("Updating entry's username failed!"); 231 | else 232 | Log("Successfully updated player's username!"); 233 | }; 234 | 235 | _behaviour.SendPostRequest(GetServerURL(Routes.UpdateUsername), Requests.Form( 236 | Requests.Field(FORM_PUBLIC_KEY, publicKey), 237 | Requests.Field(FORM_USERNAME, username), 238 | Requests.Field(FORM_USER_GUID, UserGuid)), callback, errorCallback); 239 | } 240 | 241 | /// 242 | /// Deletes the entry in a leaderboard, with the given public key. 243 | /// 244 | /// Public key of the leaderboard. 245 | /// Returns true if the request was successful. 246 | /// Returns an error message if the request failed. 247 | public static void DeleteEntry(string publicKey, Action callback = null, Action errorCallback = null) 248 | { 249 | if (string.IsNullOrEmpty(publicKey)) 250 | { 251 | LogError("Public key cannot be null or empty!"); 252 | return; 253 | } 254 | 255 | callback += isSuccessful => 256 | { 257 | if (!isSuccessful) 258 | LogError("Deleting entry failed!"); 259 | else 260 | Log("Successfully deleted player's entry!"); 261 | }; 262 | 263 | _behaviour.SendPostRequest(GetServerURL(Routes.DeleteEntry), Requests.Form( 264 | Requests.Field(FORM_PUBLIC_KEY, publicKey), 265 | Requests.Field(FORM_USER_GUID, UserGuid)), callback, errorCallback); 266 | } 267 | 268 | /// 269 | /// Gets the entry data of the player in a leaderboard, with the given public key. 270 | /// 271 | /// Public key of the leaderboard. 272 | /// Returns the entry data if request is successful 273 | /// Returns an error message if the request failed. 274 | public static void GetPersonalEntry(string publicKey, Action callback, Action errorCallback = null) 275 | { 276 | if (string.IsNullOrEmpty(publicKey)) 277 | { 278 | LogError("Public key cannot be null or empty!"); 279 | return; 280 | } 281 | 282 | _behaviour.SendGetRequest(GetServerURL(Routes.GetPersonalEntry, 283 | $"?publicKey={publicKey}&userGuid={UserGuid}"), callback, errorCallback); 284 | } 285 | 286 | /// 287 | /// Gets the total number of entries in a leaderboard, with the given public key. 288 | /// 289 | /// Public key of the leaderboard. 290 | /// Returns the total number of entries in the leaderboard. 291 | /// Returns an error message if the request failed. 292 | public static void GetEntryCount(string publicKey, Action callback, Action errorCallback = null) 293 | { 294 | if (string.IsNullOrEmpty(publicKey)) 295 | { 296 | LogError("Public key cannot be null or empty!"); 297 | return; 298 | } 299 | 300 | _behaviour.SendGetRequest(GetServerURL(Routes.GetEntryCount) + $"?publicKey={publicKey}", callback, errorCallback); 301 | } 302 | 303 | /// 304 | /// Resets a player's unique identifier and allows them to submit a new entry to the leaderboard. 305 | /// 306 | public static void ResetPlayer(Action onReset = null) 307 | { 308 | _behaviour.ResetAndAuthorize(OnAuthorizationAttempted, onReset); 309 | } 310 | 311 | internal static void Log(string message) 312 | { 313 | if (!LoggingEnabled) return; 314 | Debug.Log($"[LeaderboardCreator] {message}"); 315 | } 316 | 317 | internal static void LogError(string message) 318 | { 319 | if (!LoggingEnabled) return; 320 | Debug.LogError($"[LeaderboardCreator] {message}"); 321 | } 322 | } 323 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Official Documentation for Leaderboard Creator 2 | 3 | Current latest **stable** version of **Leaderboard Creator** is v2.81 4 | 5 | ## Table of Contents 6 | 7 | - [Integration Video Tutorial](#integration-video-tutorial) 8 | - [Importing Leaderboard Creator into your project](#importing-leaderboard-creator-into-your-project) 9 | - [Include this `using` statement in your script where you want to handle leaderboards](#include-this-using-statement-in-your-script-where-you-want-to-handle-leaderboards) 10 | - [Adding your leaderboard to your project](#adding-your-leaderboard-to-your-project) 11 | - [Getting your leaderboard](#getting-your-leaderboard) 12 | - [Uploading and modifying leaderboard entries](#uploading-and-modifying-leaderboard-entries) 13 | - [Display entries](#display-entries) 14 | - [Displaying entries in a list](#displaying-entries-in-a-list) 15 | - [Identifying the player's entry](#identifying-the-players-entry) 16 | - [Rank suffixes](#rank-suffixes) 17 | - [More functions](#more-functions) 18 | - [Get the player's personal entry](#get-the-players-personal-entry) 19 | - [Get the total count of entries in the leaderboard](#get-the-total-count-of-entries-in-the-leaderboard) 20 | - [Reset the player's entry](#reset-the-players-entry) 21 | - [Toggle Logging](#toggle-logging) 22 | - [Understanding the behaviour of the leaderboard entries](#understanding-the-behaviour-of-the-leaderboard-entries) 23 | - [Authorization](#authorization) 24 | - [The Purpose of Unique Identifiers](#the-purpose-of-unique-identifiers) 25 | - [FAQ](#faq) 26 | - [Where is the data of the leaderboards stored?](#where-is-the-data-of-the-leaderboards-stored) 27 | - [What if I lost my leaderboard or its secret key?](#what-if-i-lost-my-leaderboard-or-its-secret-key) 28 | - [My leaderboard entry keeps getting overridden / I can only upload one entry. Why is that?](#my-leaderboard-entry-keeps-getting-overridden--i-can-only-upload-one-entry-why-is-that) 29 | - [Does the score field in the entry store integers only?](#does-the-score-field-in-the-entry-store-integers-only) 30 | - [Why is my leaderboard "frozen"?](#why-is-my-leaderboard-frozen) 31 | 32 | 33 | --- 34 | 35 | ## Integration Video Tutorial 36 | 37 | If you prefer to watch a video tutorial on how to integrate your leaderboard into your project, click the image below to watch it on YouTube: 38 | 39 | [![Watch the video](https://img.youtube.com/vi/v0aWwSkC-4o/0.jpg)](https://www.youtube.com/watch?v=v0aWwSkC-4o) 40 | 41 | --- 42 | 43 | ## Importing Leaderboard Creator into your project 44 | 45 | Visit the [itch.io page](https://danqzq.itch.io/leaderboard-creator) to download the Unity package containing Leaderboard Creator. 46 | 47 | --- 48 | 49 | ## Include this `using` statement in your script where you want to handle leaderboards 50 | ```c# 51 | using Dan.Main; 52 | ``` 53 | --- 54 | 55 | ## Adding your leaderboard to your project 56 | 57 | To add your leaderboard to your project, follow these steps: 58 | 59 | 1. Once you import the Unity package, click the **Leaderboard Creator** button on the toolbar 60 | 2. Press **Enter New Leaderboard** and enter the credentials for your leaderboard 61 | 3. Click **Add Leaderboard** then **Save to C# Script** 62 | 4. You will now have a new C# script in your project that contains a reference to your leaderboard by its name 63 | 64 | > [!NOTE] 65 | > For the rest of this documentation, we will refer to your leaderboard as **YourLeaderboard**. Replace this with the name of your actual leaderboard. 66 | 67 | --- 68 | 69 | ## Getting your leaderboard 70 | • To **get** the entries in your leaderboard, call this function: 71 | ```c# 72 | Leaderboards.YourLeaderboard.GetEntries(string publicKey, Action callback, Action errorCallback[optional]) 73 | ``` 74 | 75 | • If the function is called and the request is successful, the callback is called, an array of `Entry` objects is returned. 76 | 77 | An `Entry` object contains: 78 | ```c# 79 | [System.Serializable] 80 | public struct Entry 81 | { 82 | public string Username { get; set; } 83 | public int Score { get; set; } 84 | public int Rank { get; set; } 85 | public ulong Date { get; set; } 86 | public string Extra { get; set; } 87 | ... 88 | } 89 | ``` 90 | > [!NOTE] 91 | > - **Date** - Unix timestamp of the last time the entry was uploaded/modified 92 | > - **Extra** - A string value for metadata, you can use this however you like depending on your game. But make sure that the length of the string does not go over 100, otherwise it will get truncated and not all your data will be saved. 93 | 94 | --- 95 | 96 | • This function also has other overloads that can give you more control over the querying of your leaderboard's entries: 97 | ```c# 98 | Leaderboards.YourLeaderboard.GetEntries(string publicKey, bool isInAscendingOrder, Action callback, Action errorCallback[optional]) 99 | Leaderboards.YourLeaderboard.GetEntries(string publicKey, LeaderboardSearchQuery searchQuery, Action callback, Action errorCallback[optional]) 100 | Leaderboards.YourLeaderboard.GetEntries(string publicKey, bool isInAscendingOrder, LeaderboardSearchQuery searchQuery, Action callback, Action errorCallback[optional]) 101 | ``` 102 | 103 | > [!NOTE] 104 | > - **isInAscendingOrder** - If true, the entries are sorted in ascending order, otherwise they are sorted in descending order. 105 | > - **searchQuery** - A `LeaderboardSearchQuery` object that can be used to filter the entries you want to get. 106 | > - **callback** - A function that is called when the request is successful, returning an array of Entry objects. 107 | > - **errorCallback** - A function that is called when the request is unsuccessful. 108 | 109 | --- 110 | 111 | • A `LeaderboardSearchQuery` object consists of: 112 | ```c# 113 | public struct LeaderboardSearchQuery 114 | { 115 | public int Skip { get; set; } //amount of entries to skip 116 | public int Take { get; set; } //amount of entries to take 117 | public string Username { get; set; } 118 | public TimePeriodType TimePeriod { get; set; } 119 | } 120 | ``` 121 | > [!IMPORTANT] 122 | > - You do not have to fill out all of these fields in the query. 123 | > - There are several functions that can generate a `LeaderboardSearchQuery` for your exact needs: 124 | > ```c# 125 | > LeaderboardSearchQuery.Paginated(int skip, int take) 126 | > 127 | > LeaderboardSearchQuery.ByUsername(string username) 128 | > 129 | > LeaderboardSearchQuery.ByUsernamePaginated(string username, int prev, int next) 130 | > 131 | > LeaderboardSearchQuery.ByTimePeriod(TimePeriodType timePeriod) 132 | > 133 | > LeaderboardSearchQuery.ByTimePeriodPaginated(TimePeriodType timePeriod, int skip, int take) 134 | > 135 | > LeaderboardSearchQuery.ByUsernameAndTime(string username, TimePeriodType timePeriod) 136 | > ``` 137 | 138 | > [!NOTE] 139 | > **TimePeriodType** is an enum that consists of the following values: 140 | > - **AllTime** - All entries 141 | > - **Today** - Entries from today 142 | > - **ThisWeek** - Entries from this week 143 | > - **ThisMonth** - Entries from this month 144 | > - **ThisYear** - Entries from this year 145 | > 146 | > This enum comes from a namespace called `Dan.Enums`, so you will need to include it in your script. 147 | 148 | --- 149 | 150 | ## Uploading and modifying leaderboard entries 151 | • To **upload** a new entry into your leaderboard, call this function: 152 | ```c# 153 | Leaderboards.YourLeaderboard.UploadNewEntry(string username, int score, Action callback, Action errorCallback[optional]) 154 | ``` 155 | • To **upload** a new entry, with an extra field, into your leaderboard, call this function: 156 | ```c# 157 | Leaderboards.YourLeaderboard.UploadNewEntry(string username, int score, string extra, Action callback, Action errorCallback[optional]) 158 | ``` 159 | • To **delete** the player's entry, call this function: 160 | ```c# 161 | Leaderboards.YourLeaderboard.DeleteEntry(Action callback[optional], Action errorCallback[optional]) 162 | ``` 163 | 164 | > [!NOTE] 165 | > Here are some of the parameter descriptions: 166 | > - callback - A function that is called when the request is successful, returning a boolean value. 167 | > - errorCallback - An optional function that is called when the request is unsuccessful. 168 | 169 | > [!IMPORTANT] 170 | > - If the player previously uploaded an entry, the new uploaded entry should override the old one **if it has a higher score**. This is intended behaviour, as it prevents players from spamming the leaderboard with lower scores. Read more about this in the FAQ section. 171 | 172 | --- 173 | 174 | ## Display entries 175 | 176 | ### Displaying entries in a list 177 | 178 | Here is an example of how you can display the entries in a list using Unity's UI system: 179 | 180 | ```c# 181 | ... 182 | 183 | // A prefab containing a TextMeshPro component: 184 | [SerializeField] private GameObject entryPrefab; 185 | 186 | // This transform will be the parent of the instantiated prefabs 187 | // Typically, this would be the "Content" object of a ScrollView 188 | // You may want to add a VerticalLayoutGroup component to this object for easy and automatic alignment 189 | [SerializeField] private Transform entryParent; 190 | 191 | private void Start() 192 | { 193 | LoadEntries(); 194 | } 195 | 196 | private void LoadEntries() 197 | { 198 | Leaderboards.YourLeaderboard.GetEntries(OnEntriesLoaded, OnError); 199 | } 200 | 201 | private void OnEntriesLoaded(Entry[] entries) 202 | { 203 | foreach (Entry entry in entries) 204 | { 205 | GameObject entryObject = Instantiate(entryPrefab, entryParent); 206 | TextMeshProUGUI textObject = entryObject.GetComponent(); 207 | textObject.text = $"{entry.Rank}. {entry.Username} - {entry.Score}"; 208 | } 209 | } 210 | 211 | private void OnError(string error) 212 | { 213 | Debug.LogError(error); 214 | } 215 | 216 | ... 217 | ``` 218 | 219 | ### Identifying the player's entry 220 | 221 | The `Entry` object contains a built-in method that can be used to check if the entry belongs to the player. We will build on the previous example to show how you can identify the player's entry: 222 | 223 | ```c# 224 | private void OnEntriesLoaded(Entry[] entries) 225 | { 226 | foreach (Entry entry in entries) 227 | { 228 | GameObject entryObject = Instantiate(entryPrefab, entryParent); 229 | TextMeshProUGUI textObject = entryObject.GetComponent(); 230 | textObject.text = $"{entry.Rank}. {entry.Username} - {entry.Score}"; 231 | 232 | // Returns true if the entry belongs to the player 233 | bool isMine = entry.IsMine(); 234 | 235 | if (isMine) 236 | { 237 | textObject.color = Color.green; 238 | } 239 | } 240 | } 241 | ``` 242 | 243 | 244 | ### Rank suffixes 245 | 246 | If you want to add suffixes to the rank numbers (e.g. 1st, 2nd, 3rd, 4th, etc.), the `Entry` object has a built-in utility method that can be used to get the rank suffix. Here is an example of how you can use it: 247 | 248 | 249 | ```c# 250 | private void OnEntriesLoaded(Entry[] entries) 251 | { 252 | foreach (Entry entry in entries) 253 | { 254 | GameObject entryObject = Instantiate(entryPrefab, entryParent); 255 | TextMeshProUGUI textObject = entryObject.GetComponent(); 256 | 257 | string rankSuffix = entry.GetRankSuffix(); 258 | textObject.text = $"{rankSuffix}. {entry.Username} - {entry.Score}"; 259 | 260 | // Returns true if the entry belongs to the player 261 | bool isMine = entry.IsMine(); 262 | 263 | if (isMine) 264 | { 265 | textObject.color = Color.green; 266 | } 267 | } 268 | } 269 | ``` 270 | 271 | --- 272 | 273 | ## More functions 274 | 275 | ### Get the player's personal entry 276 | 277 | ```c# 278 | Leaderboards.YourLeaderboard.GetPersonalEntry(Action callback, Action errorCallback[optional]) 279 | ``` 280 | 281 | > [!NOTE] 282 | > Here are the parameter descriptions: 283 | > - callback - A function that is called when the request is successful, returning an Entry object. 284 | > - errorCallback - A function that is called when the request is unsuccessful. 285 | 286 | > [!IMPORTANT] 287 | > - If the player has not uploaded their entry, the callback will return an Entry object with a rank and score of 0. 288 | 289 | ### Get the total count of entries in the leaderboard 290 | 291 | ```c# 292 | Leaderboards.YourLeaderboard.GetEntryCount(Action callback, Action errorCallback[optional]) 293 | ``` 294 | 295 | > [!NOTE] 296 | > Here are the parameter descriptions: 297 | > - callback - A function that is called when the request is successful, returning the total count of entries in the leaderboard. 298 | > - errorCallback - A function that is called when the request is unsuccessful. 299 | 300 | ### Reset the player's entry 301 | 302 | Want players to be able to submit more than one entry? Use this function to reset the player's entry, so they can submit a new one: 303 | 304 | ```c# 305 | Leaderboards.YourLeaderboard.ResetPlayer(Action callback, Action errorCallback[optional]) 306 | ``` 307 | 308 | > [!NOTE] 309 | > Here are the parameter descriptions: 310 | > - callback - A function that is called when the request is successful, returning the total count of entries in the leaderboard. 311 | > - errorCallback - A function that is called when the request is unsuccessful. 312 | 313 | > [!IMPORTANT] 314 | > - This function will only work correctly if the leaderboard's "Unique Usernames" setting is disabled. 315 | > - After this function is called, a player's previous entry cannot be edited nor deleted by the player themselves. 316 | 317 | ### Toggle Logging 318 | Want to disable logging for your leaderboard? Use the following line of code: 319 | ```c# 320 | LeaderboardCreator.LoggingEnabled = false; 321 | ``` 322 | 323 | --- 324 | 325 | ## Understanding the behaviour of the leaderboard entries 326 | 327 | ### Authorization 328 | Each entry in the leaderboard is identified by a unique identifier, which is assigned to the player upon authorization. By default, authorization occurs automatically upon the initialization of your game. 329 | 330 | ### The Purpose of Unique Identifiers 331 | 332 | Using this identifier, the player can upload, edit, and delete their entry in the leaderboard. Without this identifier, the player will not be able to perform any of these actions. For security reasons, the player only has access to their own unique identifier, so they can only modify their own entry in the leaderboard. 333 | 334 | --- 335 | 336 |
337 | Alternative way to use Leaderboard Creator functions 338 | 339 | ## Getting your leaderboard 340 | • To **get** the entries in your leaderboard, call this function: 341 | ```c# 342 | LeaderboardCreator.GetLeaderboard(string publicKey, Action callback) 343 | ``` 344 | 345 | --- 346 | 347 | • This function also has other overloads that can give you more control over the querying of your leaderboard's entries: 348 | ```c# 349 | LeaderboardCreator.GetLeaderboard(string publicKey, bool isInAscendingOrder, Action callback, Action errorCallback[optional]) 350 | LeaderboardCreator.GetLeaderboard(string publicKey, LeaderboardSearchQuery searchQuery, Action callback, Action errorCallback[optional]) 351 | LeaderboardCreator.GetLeaderboard(string publicKey, bool isInAscendingOrder, LeaderboardSearchQuery searchQuery, Action callback, Action errorCallback[optional]) 352 | ``` 353 | 354 | --- 355 | 356 | ## Uploading and modifying leaderboard entries 357 | • To **upload** a new entry into your leaderboard, call this function: 358 | ```c# 359 | LeaderboardCreator.UploadNewEntry(string publicKey, string username, int score, Action callback, Action errorCallback[optional]) 360 | ``` 361 | • To **upload** a new entry, with an extra field, into your leaderboard, call this function: 362 | ```c# 363 | LeaderboardCreator.UploadNewEntry(string publicKey, string username, int score, string extra, Action callback, Action errorCallback[optional]) 364 | ``` 365 | • To **delete** the player's entry, call this function: 366 | ```c# 367 | LeaderboardCreator.DeleteEntry(string publicKey, Action optionalCallback) 368 | ``` 369 | 370 | ## More functions 371 | 372 | ### Get the player's personal entry 373 | 374 | ```c# 375 | LeaderboardCreator.GetPersonalEntry(string publicKey, Action callback, Action errorCallback[optional]) 376 | ``` 377 | 378 | ### Get the total count of entries in the leaderboard 379 | 380 | ```c# 381 | LeaderboardCreator.GetEntryCount(string publicKey, Action callback, Action errorCallback[optional]) 382 | ``` 383 | 384 | ### Reset the player's entry 385 | 386 | ```c# 387 | LeaderboardCreator.ResetPlayer(string publicKey, Action callback, Action errorCallback[optional]) 388 | ``` 389 | 390 | --- 391 | 392 |
393 | 394 | ## FAQ 395 | 396 | ### Where is the data of the leaderboards stored? 397 | All the data is stored in a cloud-based database. 398 | 399 | ### What if I lost my leaderboard or its secret key? 400 | If you lose your leaderboard's secret key by accident but you still have your public key, contact me on Discord: @danqzq 401 | 402 | Alternatively, you can email me at: dan@danqzq.games 403 | 404 | ### My leaderboard entry keeps getting overridden / I can only upload one entry. Why is that? 405 | There may only be one entry per one player. This is done to support features like name editing and deleting an entry in a safe way, such that other people don't mess around with other people's entries. If you do not want this, then disable "Unique Usernames" for your leaderboard and make use of the `Leaderboards.YourLeaderboard.ResetPlayer()` function during the callback from uploading an entry. Note that after this, a player's previous entry cannot be edited nor deleted by the player themselves. 406 | 407 | ### Does the score field in the entry store integers only? 408 | Yes. If you want to store decimal numbers as the scores, you can either: 409 | 410 | A. Before submitting an entry, multiply the score of the entry by 100, 1000 or etc. depending on amount of precision you want. When receiving entry data, divide each score by the same amount you multiplied the scores, and only then display the score for each entry. 411 | 412 | B. Make use of the Extra field, for storing extra data, and perform manual sorting of the entries appropriately to your liking. 413 | 414 | ### Why is my leaderboard "frozen"? 415 | If an error is shown saying that your leaderboard is frozen, it is likely due to a high number of requests at the same time. You will be able to fetch the leaderboard entries, but new entries will not be submitted until the leaderboard will unfreeze, which should happen within 24 hours from the moment it entered a frozen state. 416 | -------------------------------------------------------------------------------- /Assets/LeaderboardCreator/Prefabs/Entry.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &6023303935372300595 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 6023303935372300594} 12 | - component: {fileID: 6023303935372300596} 13 | - component: {fileID: 6023303935372300597} 14 | m_Layer: 5 15 | m_Name: ScoreText (TMP) 16 | m_TagString: Untagged 17 | m_Icon: {fileID: 0} 18 | m_NavMeshLayer: 0 19 | m_StaticEditorFlags: 0 20 | m_IsActive: 1 21 | --- !u!224 &6023303935372300594 22 | RectTransform: 23 | m_ObjectHideFlags: 0 24 | m_CorrespondingSourceObject: {fileID: 0} 25 | m_PrefabInstance: {fileID: 0} 26 | m_PrefabAsset: {fileID: 0} 27 | m_GameObject: {fileID: 6023303935372300595} 28 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 29 | m_LocalPosition: {x: 0, y: 0, z: 0} 30 | m_LocalScale: {x: 1, y: 1, z: 1} 31 | m_ConstrainProportionsScale: 0 32 | m_Children: [] 33 | m_Father: {fileID: 6023303935805426700} 34 | m_RootOrder: 2 35 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 36 | m_AnchorMin: {x: 0, y: 0} 37 | m_AnchorMax: {x: 0, y: 0} 38 | m_AnchoredPosition: {x: 0, y: 0} 39 | m_SizeDelta: {x: 250, y: 50} 40 | m_Pivot: {x: 0.5, y: 0.5} 41 | --- !u!222 &6023303935372300596 42 | CanvasRenderer: 43 | m_ObjectHideFlags: 0 44 | m_CorrespondingSourceObject: {fileID: 0} 45 | m_PrefabInstance: {fileID: 0} 46 | m_PrefabAsset: {fileID: 0} 47 | m_GameObject: {fileID: 6023303935372300595} 48 | m_CullTransparentMesh: 1 49 | --- !u!114 &6023303935372300597 50 | MonoBehaviour: 51 | m_ObjectHideFlags: 0 52 | m_CorrespondingSourceObject: {fileID: 0} 53 | m_PrefabInstance: {fileID: 0} 54 | m_PrefabAsset: {fileID: 0} 55 | m_GameObject: {fileID: 6023303935372300595} 56 | m_Enabled: 1 57 | m_EditorHideFlags: 0 58 | m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} 59 | m_Name: 60 | m_EditorClassIdentifier: 61 | m_Material: {fileID: 0} 62 | m_Color: {r: 1, g: 1, b: 1, a: 1} 63 | m_RaycastTarget: 1 64 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 65 | m_Maskable: 1 66 | m_OnCullStateChanged: 67 | m_PersistentCalls: 68 | m_Calls: [] 69 | m_text: 1000000 70 | m_isRightToLeft: 0 71 | m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} 72 | m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} 73 | m_fontSharedMaterials: [] 74 | m_fontMaterial: {fileID: 0} 75 | m_fontMaterials: [] 76 | m_fontColor32: 77 | serializedVersion: 2 78 | rgba: 4278190080 79 | m_fontColor: {r: 0, g: 0, b: 0, a: 1} 80 | m_enableVertexGradient: 0 81 | m_colorMode: 3 82 | m_fontColorGradient: 83 | topLeft: {r: 1, g: 1, b: 1, a: 1} 84 | topRight: {r: 1, g: 1, b: 1, a: 1} 85 | bottomLeft: {r: 1, g: 1, b: 1, a: 1} 86 | bottomRight: {r: 1, g: 1, b: 1, a: 1} 87 | m_fontColorGradientPreset: {fileID: 0} 88 | m_spriteAsset: {fileID: 0} 89 | m_tintAllSprites: 0 90 | m_StyleSheet: {fileID: 0} 91 | m_TextStyleHashCode: -1183493901 92 | m_overrideHtmlColors: 0 93 | m_faceColor: 94 | serializedVersion: 2 95 | rgba: 4294967295 96 | m_fontSize: 36 97 | m_fontSizeBase: 36 98 | m_fontWeight: 400 99 | m_enableAutoSizing: 0 100 | m_fontSizeMin: 18 101 | m_fontSizeMax: 72 102 | m_fontStyle: 0 103 | m_HorizontalAlignment: 1 104 | m_VerticalAlignment: 256 105 | m_textAlignment: 65535 106 | m_characterSpacing: 0 107 | m_wordSpacing: 0 108 | m_lineSpacing: 0 109 | m_lineSpacingMax: 0 110 | m_paragraphSpacing: 0 111 | m_charWidthMaxAdj: 0 112 | m_enableWordWrapping: 1 113 | m_wordWrappingRatios: 0.4 114 | m_overflowMode: 0 115 | m_linkedTextComponent: {fileID: 0} 116 | parentLinkedComponent: {fileID: 0} 117 | m_enableKerning: 1 118 | m_enableExtraPadding: 0 119 | checkPaddingRequired: 0 120 | m_isRichText: 1 121 | m_parseCtrlCharacters: 1 122 | m_isOrthographic: 1 123 | m_isCullingEnabled: 0 124 | m_horizontalMapping: 0 125 | m_verticalMapping: 0 126 | m_uvLineOffset: 0 127 | m_geometrySortingOrder: 0 128 | m_IsTextObjectScaleStatic: 0 129 | m_VertexBufferAutoSizeReduction: 0 130 | m_useMaxVisibleDescender: 1 131 | m_pageToDisplay: 1 132 | m_margin: {x: 0, y: 0, z: 0, w: 0} 133 | m_isUsingLegacyAnimationComponent: 0 134 | m_isVolumetricText: 0 135 | m_hasFontAssetChanged: 0 136 | m_baseMaterial: {fileID: 0} 137 | m_maskOffset: {x: 0, y: 0, z: 0, w: 0} 138 | --- !u!1 &6023303935615813719 139 | GameObject: 140 | m_ObjectHideFlags: 0 141 | m_CorrespondingSourceObject: {fileID: 0} 142 | m_PrefabInstance: {fileID: 0} 143 | m_PrefabAsset: {fileID: 0} 144 | serializedVersion: 6 145 | m_Component: 146 | - component: {fileID: 6023303935615813718} 147 | - component: {fileID: 6023303935615813704} 148 | - component: {fileID: 6023303935615813705} 149 | m_Layer: 5 150 | m_Name: RankText (TMP) 151 | m_TagString: Untagged 152 | m_Icon: {fileID: 0} 153 | m_NavMeshLayer: 0 154 | m_StaticEditorFlags: 0 155 | m_IsActive: 1 156 | --- !u!224 &6023303935615813718 157 | RectTransform: 158 | m_ObjectHideFlags: 0 159 | m_CorrespondingSourceObject: {fileID: 0} 160 | m_PrefabInstance: {fileID: 0} 161 | m_PrefabAsset: {fileID: 0} 162 | m_GameObject: {fileID: 6023303935615813719} 163 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 164 | m_LocalPosition: {x: 0, y: 0, z: 0} 165 | m_LocalScale: {x: 1, y: 1, z: 1} 166 | m_ConstrainProportionsScale: 0 167 | m_Children: [] 168 | m_Father: {fileID: 6023303935805426700} 169 | m_RootOrder: 0 170 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 171 | m_AnchorMin: {x: 0, y: 0} 172 | m_AnchorMax: {x: 0, y: 0} 173 | m_AnchoredPosition: {x: 0, y: 0} 174 | m_SizeDelta: {x: 100, y: 50} 175 | m_Pivot: {x: 0.5, y: 0.5} 176 | --- !u!222 &6023303935615813704 177 | CanvasRenderer: 178 | m_ObjectHideFlags: 0 179 | m_CorrespondingSourceObject: {fileID: 0} 180 | m_PrefabInstance: {fileID: 0} 181 | m_PrefabAsset: {fileID: 0} 182 | m_GameObject: {fileID: 6023303935615813719} 183 | m_CullTransparentMesh: 1 184 | --- !u!114 &6023303935615813705 185 | MonoBehaviour: 186 | m_ObjectHideFlags: 0 187 | m_CorrespondingSourceObject: {fileID: 0} 188 | m_PrefabInstance: {fileID: 0} 189 | m_PrefabAsset: {fileID: 0} 190 | m_GameObject: {fileID: 6023303935615813719} 191 | m_Enabled: 1 192 | m_EditorHideFlags: 0 193 | m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} 194 | m_Name: 195 | m_EditorClassIdentifier: 196 | m_Material: {fileID: 0} 197 | m_Color: {r: 1, g: 1, b: 1, a: 1} 198 | m_RaycastTarget: 1 199 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 200 | m_Maskable: 1 201 | m_OnCullStateChanged: 202 | m_PersistentCalls: 203 | m_Calls: [] 204 | m_text: 1. 205 | m_isRightToLeft: 0 206 | m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} 207 | m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} 208 | m_fontSharedMaterials: [] 209 | m_fontMaterial: {fileID: 0} 210 | m_fontMaterials: [] 211 | m_fontColor32: 212 | serializedVersion: 2 213 | rgba: 4278190080 214 | m_fontColor: {r: 0, g: 0, b: 0, a: 1} 215 | m_enableVertexGradient: 0 216 | m_colorMode: 3 217 | m_fontColorGradient: 218 | topLeft: {r: 1, g: 1, b: 1, a: 1} 219 | topRight: {r: 1, g: 1, b: 1, a: 1} 220 | bottomLeft: {r: 1, g: 1, b: 1, a: 1} 221 | bottomRight: {r: 1, g: 1, b: 1, a: 1} 222 | m_fontColorGradientPreset: {fileID: 0} 223 | m_spriteAsset: {fileID: 0} 224 | m_tintAllSprites: 0 225 | m_StyleSheet: {fileID: 0} 226 | m_TextStyleHashCode: -1183493901 227 | m_overrideHtmlColors: 0 228 | m_faceColor: 229 | serializedVersion: 2 230 | rgba: 4294967295 231 | m_fontSize: 36 232 | m_fontSizeBase: 36 233 | m_fontWeight: 400 234 | m_enableAutoSizing: 0 235 | m_fontSizeMin: 18 236 | m_fontSizeMax: 72 237 | m_fontStyle: 0 238 | m_HorizontalAlignment: 1 239 | m_VerticalAlignment: 256 240 | m_textAlignment: 65535 241 | m_characterSpacing: 0 242 | m_wordSpacing: 0 243 | m_lineSpacing: 0 244 | m_lineSpacingMax: 0 245 | m_paragraphSpacing: 0 246 | m_charWidthMaxAdj: 0 247 | m_enableWordWrapping: 1 248 | m_wordWrappingRatios: 0.4 249 | m_overflowMode: 0 250 | m_linkedTextComponent: {fileID: 0} 251 | parentLinkedComponent: {fileID: 0} 252 | m_enableKerning: 1 253 | m_enableExtraPadding: 0 254 | checkPaddingRequired: 0 255 | m_isRichText: 1 256 | m_parseCtrlCharacters: 1 257 | m_isOrthographic: 1 258 | m_isCullingEnabled: 0 259 | m_horizontalMapping: 0 260 | m_verticalMapping: 0 261 | m_uvLineOffset: 0 262 | m_geometrySortingOrder: 0 263 | m_IsTextObjectScaleStatic: 0 264 | m_VertexBufferAutoSizeReduction: 0 265 | m_useMaxVisibleDescender: 1 266 | m_pageToDisplay: 1 267 | m_margin: {x: 0, y: 0, z: 0, w: 0} 268 | m_isUsingLegacyAnimationComponent: 0 269 | m_isVolumetricText: 0 270 | m_hasFontAssetChanged: 0 271 | m_baseMaterial: {fileID: 0} 272 | m_maskOffset: {x: 0, y: 0, z: 0, w: 0} 273 | --- !u!1 &6023303935689559442 274 | GameObject: 275 | m_ObjectHideFlags: 0 276 | m_CorrespondingSourceObject: {fileID: 0} 277 | m_PrefabInstance: {fileID: 0} 278 | m_PrefabAsset: {fileID: 0} 279 | serializedVersion: 6 280 | m_Component: 281 | - component: {fileID: 6023303935689559445} 282 | - component: {fileID: 6023303935689559447} 283 | - component: {fileID: 6023303935689559444} 284 | m_Layer: 5 285 | m_Name: TimeText (TMP) 286 | m_TagString: Untagged 287 | m_Icon: {fileID: 0} 288 | m_NavMeshLayer: 0 289 | m_StaticEditorFlags: 0 290 | m_IsActive: 1 291 | --- !u!224 &6023303935689559445 292 | RectTransform: 293 | m_ObjectHideFlags: 0 294 | m_CorrespondingSourceObject: {fileID: 0} 295 | m_PrefabInstance: {fileID: 0} 296 | m_PrefabAsset: {fileID: 0} 297 | m_GameObject: {fileID: 6023303935689559442} 298 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 299 | m_LocalPosition: {x: 0, y: 0, z: 0} 300 | m_LocalScale: {x: 1, y: 1, z: 1} 301 | m_ConstrainProportionsScale: 0 302 | m_Children: [] 303 | m_Father: {fileID: 6023303935805426700} 304 | m_RootOrder: 3 305 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 306 | m_AnchorMin: {x: 0, y: 0} 307 | m_AnchorMax: {x: 0, y: 0} 308 | m_AnchoredPosition: {x: 0, y: 0} 309 | m_SizeDelta: {x: 200, y: 50} 310 | m_Pivot: {x: 0.5, y: 0.5} 311 | --- !u!222 &6023303935689559447 312 | CanvasRenderer: 313 | m_ObjectHideFlags: 0 314 | m_CorrespondingSourceObject: {fileID: 0} 315 | m_PrefabInstance: {fileID: 0} 316 | m_PrefabAsset: {fileID: 0} 317 | m_GameObject: {fileID: 6023303935689559442} 318 | m_CullTransparentMesh: 1 319 | --- !u!114 &6023303935689559444 320 | MonoBehaviour: 321 | m_ObjectHideFlags: 0 322 | m_CorrespondingSourceObject: {fileID: 0} 323 | m_PrefabInstance: {fileID: 0} 324 | m_PrefabAsset: {fileID: 0} 325 | m_GameObject: {fileID: 6023303935689559442} 326 | m_Enabled: 1 327 | m_EditorHideFlags: 0 328 | m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} 329 | m_Name: 330 | m_EditorClassIdentifier: 331 | m_Material: {fileID: 0} 332 | m_Color: {r: 1, g: 1, b: 1, a: 1} 333 | m_RaycastTarget: 1 334 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 335 | m_Maskable: 1 336 | m_OnCullStateChanged: 337 | m_PersistentCalls: 338 | m_Calls: [] 339 | m_text: Time 340 | m_isRightToLeft: 0 341 | m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} 342 | m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} 343 | m_fontSharedMaterials: [] 344 | m_fontMaterial: {fileID: 0} 345 | m_fontMaterials: [] 346 | m_fontColor32: 347 | serializedVersion: 2 348 | rgba: 4278190080 349 | m_fontColor: {r: 0, g: 0, b: 0, a: 1} 350 | m_enableVertexGradient: 0 351 | m_colorMode: 3 352 | m_fontColorGradient: 353 | topLeft: {r: 1, g: 1, b: 1, a: 1} 354 | topRight: {r: 1, g: 1, b: 1, a: 1} 355 | bottomLeft: {r: 1, g: 1, b: 1, a: 1} 356 | bottomRight: {r: 1, g: 1, b: 1, a: 1} 357 | m_fontColorGradientPreset: {fileID: 0} 358 | m_spriteAsset: {fileID: 0} 359 | m_tintAllSprites: 0 360 | m_StyleSheet: {fileID: 0} 361 | m_TextStyleHashCode: -1183493901 362 | m_overrideHtmlColors: 0 363 | m_faceColor: 364 | serializedVersion: 2 365 | rgba: 4294967295 366 | m_fontSize: 24 367 | m_fontSizeBase: 24 368 | m_fontWeight: 400 369 | m_enableAutoSizing: 0 370 | m_fontSizeMin: 18 371 | m_fontSizeMax: 72 372 | m_fontStyle: 0 373 | m_HorizontalAlignment: 2 374 | m_VerticalAlignment: 512 375 | m_textAlignment: 65535 376 | m_characterSpacing: 0 377 | m_wordSpacing: 0 378 | m_lineSpacing: 0 379 | m_lineSpacingMax: 0 380 | m_paragraphSpacing: 0 381 | m_charWidthMaxAdj: 0 382 | m_enableWordWrapping: 1 383 | m_wordWrappingRatios: 0.4 384 | m_overflowMode: 0 385 | m_linkedTextComponent: {fileID: 0} 386 | parentLinkedComponent: {fileID: 0} 387 | m_enableKerning: 1 388 | m_enableExtraPadding: 0 389 | checkPaddingRequired: 0 390 | m_isRichText: 1 391 | m_parseCtrlCharacters: 1 392 | m_isOrthographic: 1 393 | m_isCullingEnabled: 0 394 | m_horizontalMapping: 0 395 | m_verticalMapping: 0 396 | m_uvLineOffset: 0 397 | m_geometrySortingOrder: 0 398 | m_IsTextObjectScaleStatic: 0 399 | m_VertexBufferAutoSizeReduction: 0 400 | m_useMaxVisibleDescender: 1 401 | m_pageToDisplay: 1 402 | m_margin: {x: 0, y: 0, z: 0, w: 0} 403 | m_isUsingLegacyAnimationComponent: 0 404 | m_isVolumetricText: 0 405 | m_hasFontAssetChanged: 0 406 | m_baseMaterial: {fileID: 0} 407 | m_maskOffset: {x: 0, y: 0, z: 0, w: 0} 408 | --- !u!1 &6023303935805426701 409 | GameObject: 410 | m_ObjectHideFlags: 0 411 | m_CorrespondingSourceObject: {fileID: 0} 412 | m_PrefabInstance: {fileID: 0} 413 | m_PrefabAsset: {fileID: 0} 414 | serializedVersion: 6 415 | m_Component: 416 | - component: {fileID: 6023303935805426700} 417 | - component: {fileID: 6023303935805426702} 418 | - component: {fileID: 6023303935805426703} 419 | - component: {fileID: -295299235028769080} 420 | - component: {fileID: 8119997905076683049} 421 | m_Layer: 5 422 | m_Name: Entry 423 | m_TagString: Untagged 424 | m_Icon: {fileID: 0} 425 | m_NavMeshLayer: 0 426 | m_StaticEditorFlags: 0 427 | m_IsActive: 1 428 | --- !u!224 &6023303935805426700 429 | RectTransform: 430 | m_ObjectHideFlags: 0 431 | m_CorrespondingSourceObject: {fileID: 0} 432 | m_PrefabInstance: {fileID: 0} 433 | m_PrefabAsset: {fileID: 0} 434 | m_GameObject: {fileID: 6023303935805426701} 435 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 436 | m_LocalPosition: {x: 0, y: 0, z: 0} 437 | m_LocalScale: {x: 1, y: 1, z: 1} 438 | m_ConstrainProportionsScale: 0 439 | m_Children: 440 | - {fileID: 6023303935615813718} 441 | - {fileID: 6023303936464745720} 442 | - {fileID: 6023303935372300594} 443 | - {fileID: 6023303935689559445} 444 | m_Father: {fileID: 0} 445 | m_RootOrder: 0 446 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 447 | m_AnchorMin: {x: 0, y: 0} 448 | m_AnchorMax: {x: 0, y: 0} 449 | m_AnchoredPosition: {x: 0, y: 0} 450 | m_SizeDelta: {x: 1000, y: 100} 451 | m_Pivot: {x: 0.5, y: 0.5} 452 | --- !u!222 &6023303935805426702 453 | CanvasRenderer: 454 | m_ObjectHideFlags: 0 455 | m_CorrespondingSourceObject: {fileID: 0} 456 | m_PrefabInstance: {fileID: 0} 457 | m_PrefabAsset: {fileID: 0} 458 | m_GameObject: {fileID: 6023303935805426701} 459 | m_CullTransparentMesh: 1 460 | --- !u!114 &6023303935805426703 461 | MonoBehaviour: 462 | m_ObjectHideFlags: 0 463 | m_CorrespondingSourceObject: {fileID: 0} 464 | m_PrefabInstance: {fileID: 0} 465 | m_PrefabAsset: {fileID: 0} 466 | m_GameObject: {fileID: 6023303935805426701} 467 | m_Enabled: 1 468 | m_EditorHideFlags: 0 469 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 470 | m_Name: 471 | m_EditorClassIdentifier: 472 | m_Material: {fileID: 0} 473 | m_Color: {r: 1, g: 1, b: 1, a: 1} 474 | m_RaycastTarget: 1 475 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 476 | m_Maskable: 1 477 | m_OnCullStateChanged: 478 | m_PersistentCalls: 479 | m_Calls: [] 480 | m_Sprite: {fileID: 0} 481 | m_Type: 0 482 | m_PreserveAspect: 0 483 | m_FillCenter: 1 484 | m_FillMethod: 4 485 | m_FillAmount: 1 486 | m_FillClockwise: 1 487 | m_FillOrigin: 0 488 | m_UseSpriteMesh: 0 489 | m_PixelsPerUnitMultiplier: 0.75 490 | --- !u!114 &-295299235028769080 491 | MonoBehaviour: 492 | m_ObjectHideFlags: 0 493 | m_CorrespondingSourceObject: {fileID: 0} 494 | m_PrefabInstance: {fileID: 0} 495 | m_PrefabAsset: {fileID: 0} 496 | m_GameObject: {fileID: 6023303935805426701} 497 | m_Enabled: 1 498 | m_EditorHideFlags: 0 499 | m_Script: {fileID: 11500000, guid: 9c1d101096214144bd4e0f906a9ec5b6, type: 3} 500 | m_Name: 501 | m_EditorClassIdentifier: 502 | _rankText: {fileID: 6023303935615813705} 503 | _usernameText: {fileID: 6023303936464745723} 504 | _scoreText: {fileID: 6023303935372300597} 505 | _timeText: {fileID: 6023303935689559444} 506 | --- !u!114 &8119997905076683049 507 | MonoBehaviour: 508 | m_ObjectHideFlags: 0 509 | m_CorrespondingSourceObject: {fileID: 0} 510 | m_PrefabInstance: {fileID: 0} 511 | m_PrefabAsset: {fileID: 0} 512 | m_GameObject: {fileID: 6023303935805426701} 513 | m_Enabled: 1 514 | m_EditorHideFlags: 0 515 | m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} 516 | m_Name: 517 | m_EditorClassIdentifier: 518 | m_Padding: 519 | m_Left: 10 520 | m_Right: 10 521 | m_Top: 10 522 | m_Bottom: 10 523 | m_ChildAlignment: 3 524 | m_Spacing: 10 525 | m_ChildForceExpandWidth: 1 526 | m_ChildForceExpandHeight: 1 527 | m_ChildControlWidth: 0 528 | m_ChildControlHeight: 0 529 | m_ChildScaleWidth: 0 530 | m_ChildScaleHeight: 0 531 | m_ReverseArrangement: 0 532 | --- !u!1 &6023303936464745721 533 | GameObject: 534 | m_ObjectHideFlags: 0 535 | m_CorrespondingSourceObject: {fileID: 0} 536 | m_PrefabInstance: {fileID: 0} 537 | m_PrefabAsset: {fileID: 0} 538 | serializedVersion: 6 539 | m_Component: 540 | - component: {fileID: 6023303936464745720} 541 | - component: {fileID: 6023303936464745722} 542 | - component: {fileID: 6023303936464745723} 543 | m_Layer: 5 544 | m_Name: UsernameText (TMP) 545 | m_TagString: Untagged 546 | m_Icon: {fileID: 0} 547 | m_NavMeshLayer: 0 548 | m_StaticEditorFlags: 0 549 | m_IsActive: 1 550 | --- !u!224 &6023303936464745720 551 | RectTransform: 552 | m_ObjectHideFlags: 0 553 | m_CorrespondingSourceObject: {fileID: 0} 554 | m_PrefabInstance: {fileID: 0} 555 | m_PrefabAsset: {fileID: 0} 556 | m_GameObject: {fileID: 6023303936464745721} 557 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 558 | m_LocalPosition: {x: 0, y: 0, z: 0} 559 | m_LocalScale: {x: 1, y: 1, z: 1} 560 | m_ConstrainProportionsScale: 0 561 | m_Children: [] 562 | m_Father: {fileID: 6023303935805426700} 563 | m_RootOrder: 1 564 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 565 | m_AnchorMin: {x: 0, y: 0} 566 | m_AnchorMax: {x: 0, y: 0} 567 | m_AnchoredPosition: {x: 0, y: 0} 568 | m_SizeDelta: {x: 400, y: 50} 569 | m_Pivot: {x: 0.5, y: 0.5} 570 | --- !u!222 &6023303936464745722 571 | CanvasRenderer: 572 | m_ObjectHideFlags: 0 573 | m_CorrespondingSourceObject: {fileID: 0} 574 | m_PrefabInstance: {fileID: 0} 575 | m_PrefabAsset: {fileID: 0} 576 | m_GameObject: {fileID: 6023303936464745721} 577 | m_CullTransparentMesh: 1 578 | --- !u!114 &6023303936464745723 579 | MonoBehaviour: 580 | m_ObjectHideFlags: 0 581 | m_CorrespondingSourceObject: {fileID: 0} 582 | m_PrefabInstance: {fileID: 0} 583 | m_PrefabAsset: {fileID: 0} 584 | m_GameObject: {fileID: 6023303936464745721} 585 | m_Enabled: 1 586 | m_EditorHideFlags: 0 587 | m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} 588 | m_Name: 589 | m_EditorClassIdentifier: 590 | m_Material: {fileID: 0} 591 | m_Color: {r: 1, g: 1, b: 1, a: 1} 592 | m_RaycastTarget: 1 593 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 594 | m_Maskable: 1 595 | m_OnCullStateChanged: 596 | m_PersistentCalls: 597 | m_Calls: [] 598 | m_text: Username 599 | m_isRightToLeft: 0 600 | m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} 601 | m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} 602 | m_fontSharedMaterials: [] 603 | m_fontMaterial: {fileID: 0} 604 | m_fontMaterials: [] 605 | m_fontColor32: 606 | serializedVersion: 2 607 | rgba: 4278190080 608 | m_fontColor: {r: 0, g: 0, b: 0, a: 1} 609 | m_enableVertexGradient: 0 610 | m_colorMode: 3 611 | m_fontColorGradient: 612 | topLeft: {r: 1, g: 1, b: 1, a: 1} 613 | topRight: {r: 1, g: 1, b: 1, a: 1} 614 | bottomLeft: {r: 1, g: 1, b: 1, a: 1} 615 | bottomRight: {r: 1, g: 1, b: 1, a: 1} 616 | m_fontColorGradientPreset: {fileID: 0} 617 | m_spriteAsset: {fileID: 0} 618 | m_tintAllSprites: 0 619 | m_StyleSheet: {fileID: 0} 620 | m_TextStyleHashCode: -1183493901 621 | m_overrideHtmlColors: 0 622 | m_faceColor: 623 | serializedVersion: 2 624 | rgba: 4294967295 625 | m_fontSize: 36 626 | m_fontSizeBase: 36 627 | m_fontWeight: 400 628 | m_enableAutoSizing: 0 629 | m_fontSizeMin: 18 630 | m_fontSizeMax: 72 631 | m_fontStyle: 0 632 | m_HorizontalAlignment: 1 633 | m_VerticalAlignment: 256 634 | m_textAlignment: 65535 635 | m_characterSpacing: 0 636 | m_wordSpacing: 0 637 | m_lineSpacing: 0 638 | m_lineSpacingMax: 0 639 | m_paragraphSpacing: 0 640 | m_charWidthMaxAdj: 0 641 | m_enableWordWrapping: 1 642 | m_wordWrappingRatios: 0.4 643 | m_overflowMode: 0 644 | m_linkedTextComponent: {fileID: 0} 645 | parentLinkedComponent: {fileID: 0} 646 | m_enableKerning: 1 647 | m_enableExtraPadding: 0 648 | checkPaddingRequired: 0 649 | m_isRichText: 1 650 | m_parseCtrlCharacters: 1 651 | m_isOrthographic: 1 652 | m_isCullingEnabled: 0 653 | m_horizontalMapping: 0 654 | m_verticalMapping: 0 655 | m_uvLineOffset: 0 656 | m_geometrySortingOrder: 0 657 | m_IsTextObjectScaleStatic: 0 658 | m_VertexBufferAutoSizeReduction: 0 659 | m_useMaxVisibleDescender: 1 660 | m_pageToDisplay: 1 661 | m_margin: {x: 0, y: 0, z: 0, w: 0} 662 | m_isUsingLegacyAnimationComponent: 0 663 | m_isVolumetricText: 0 664 | m_hasFontAssetChanged: 0 665 | m_baseMaterial: {fileID: 0} 666 | m_maskOffset: {x: 0, y: 0, z: 0, w: 0} 667 | -------------------------------------------------------------------------------- /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: 874771c2364d78a4aac6b4efbdb0d526 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: portfolio-website 17 | defaultCursor: {fileID: 0} 18 | cursorHotspot: {x: 0, y: 0} 19 | m_SplashScreenBackgroundColor: {r: 0.13725491, 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: 1024 46 | defaultScreenHeight: 768 47 | defaultScreenWidthWeb: 960 48 | defaultScreenHeightWeb: 600 49 | m_StereoRenderingPath: 0 50 | m_ActiveColorSpace: 1 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: 0 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 | dedicatedServerOptimizations: 0 90 | bakeCollisionMeshes: 0 91 | forceSingleInstance: 0 92 | useFlipModelSwapchain: 1 93 | resizableWindow: 0 94 | useMacAppStoreValidation: 0 95 | macAppStoreCategory: public.app-category.games 96 | gpuSkinning: 1 97 | xboxPIXTextureCapture: 0 98 | xboxEnableAvatar: 0 99 | xboxEnableKinect: 0 100 | xboxEnableKinectAutoTracking: 0 101 | xboxEnableFitness: 0 102 | visibleInBackground: 1 103 | allowFullscreenSwitch: 1 104 | fullscreenMode: 1 105 | xboxSpeechDB: 0 106 | xboxEnableHeadOrientation: 0 107 | xboxEnableGuest: 0 108 | xboxEnablePIXSampling: 0 109 | metalFramebufferOnly: 0 110 | xboxOneResolution: 0 111 | xboxOneSResolution: 0 112 | xboxOneXResolution: 3 113 | xboxOneMonoLoggingLevel: 0 114 | xboxOneLoggingLevel: 1 115 | xboxOneDisableEsram: 0 116 | xboxOneEnableTypeOptimization: 0 117 | xboxOnePresentImmediateThreshold: 0 118 | switchQueueCommandMemory: 1048576 119 | switchQueueControlMemory: 16384 120 | switchQueueComputeMemory: 262144 121 | switchNVNShaderPoolsGranularity: 33554432 122 | switchNVNDefaultPoolsGranularity: 16777216 123 | switchNVNOtherPoolsGranularity: 16777216 124 | switchGpuScratchPoolGranularity: 2097152 125 | switchAllowGpuScratchShrinking: 0 126 | switchNVNMaxPublicTextureIDCount: 0 127 | switchNVNMaxPublicSamplerIDCount: 0 128 | switchNVNGraphicsFirmwareMemory: 32 129 | switchMaxWorkerMultiple: 8 130 | stadiaPresentMode: 0 131 | stadiaTargetFramerate: 0 132 | vulkanNumSwapchainBuffers: 3 133 | vulkanEnableSetSRGBWrite: 0 134 | vulkanEnablePreTransform: 1 135 | vulkanEnableLateAcquireNextImage: 0 136 | vulkanEnableCommandBufferRecycling: 1 137 | loadStoreDebugModeEnabled: 0 138 | bundleVersion: 0.1.0 139 | preloadedAssets: [] 140 | metroInputSource: 0 141 | wsaTransparentSwapchain: 0 142 | m_HolographicPauseOnTrackingLoss: 1 143 | xboxOneDisableKinectGpuReservation: 1 144 | xboxOneEnable7thCore: 1 145 | vrSettings: 146 | enable360StereoCapture: 0 147 | isWsaHolographicRemotingEnabled: 0 148 | enableFrameTimingStats: 0 149 | enableOpenGLProfilerGPURecorders: 1 150 | useHDRDisplay: 0 151 | hdrBitDepth: 0 152 | m_ColorGamuts: 00000000 153 | targetPixelDensity: 30 154 | resolutionScalingMode: 0 155 | resetResolutionOnWindowResize: 0 156 | androidSupportedAspectRatio: 1 157 | androidMaxAspectRatio: 2.1 158 | applicationIdentifier: 159 | Android: com.UnityTechnologies.com.unity.template.urpblank 160 | Standalone: com.Unity-Technologies.com.unity.template.urp-blank 161 | iPhone: com.Unity-Technologies.com.unity.template.urp-blank 162 | buildNumber: 163 | Standalone: 0 164 | VisionOS: 0 165 | iPhone: 0 166 | tvOS: 0 167 | overrideDefaultApplicationIdentifier: 1 168 | AndroidBundleVersionCode: 1 169 | AndroidMinSdkVersion: 22 170 | AndroidTargetSdkVersion: 0 171 | AndroidPreferredInstallLocation: 1 172 | aotOptions: 173 | stripEngineCode: 1 174 | iPhoneStrippingLevel: 0 175 | iPhoneScriptCallOptimization: 0 176 | ForceInternetPermission: 0 177 | ForceSDCardPermission: 0 178 | CreateWallpaper: 0 179 | APKExpansionFiles: 0 180 | keepLoadedShadersAlive: 0 181 | StripUnusedMeshComponents: 0 182 | strictShaderVariantMatching: 0 183 | VertexChannelCompressionMask: 4054 184 | iPhoneSdkVersion: 988 185 | iOSTargetOSVersionString: 12.0 186 | tvOSSdkVersion: 0 187 | tvOSRequireExtendedGameController: 0 188 | tvOSTargetOSVersionString: 12.0 189 | VisionOSSdkVersion: 0 190 | VisionOSTargetOSVersionString: 1.0 191 | uIPrerenderedIcon: 0 192 | uIRequiresPersistentWiFi: 0 193 | uIRequiresFullScreen: 1 194 | uIStatusBarHidden: 1 195 | uIExitOnSuspend: 0 196 | uIStatusBarStyle: 0 197 | appleTVSplashScreen: {fileID: 0} 198 | appleTVSplashScreen2x: {fileID: 0} 199 | tvOSSmallIconLayers: [] 200 | tvOSSmallIconLayers2x: [] 201 | tvOSLargeIconLayers: [] 202 | tvOSLargeIconLayers2x: [] 203 | tvOSTopShelfImageLayers: [] 204 | tvOSTopShelfImageLayers2x: [] 205 | tvOSTopShelfImageWideLayers: [] 206 | tvOSTopShelfImageWideLayers2x: [] 207 | iOSLaunchScreenType: 0 208 | iOSLaunchScreenPortrait: {fileID: 0} 209 | iOSLaunchScreenLandscape: {fileID: 0} 210 | iOSLaunchScreenBackgroundColor: 211 | serializedVersion: 2 212 | rgba: 0 213 | iOSLaunchScreenFillPct: 100 214 | iOSLaunchScreenSize: 100 215 | iOSLaunchScreenCustomXibPath: 216 | iOSLaunchScreeniPadType: 0 217 | iOSLaunchScreeniPadImage: {fileID: 0} 218 | iOSLaunchScreeniPadBackgroundColor: 219 | serializedVersion: 2 220 | rgba: 0 221 | iOSLaunchScreeniPadFillPct: 100 222 | iOSLaunchScreeniPadSize: 100 223 | iOSLaunchScreeniPadCustomXibPath: 224 | iOSLaunchScreenCustomStoryboardPath: 225 | iOSLaunchScreeniPadCustomStoryboardPath: 226 | iOSDeviceRequirements: [] 227 | iOSURLSchemes: [] 228 | macOSURLSchemes: [] 229 | iOSBackgroundModes: 0 230 | iOSMetalForceHardShadows: 0 231 | metalEditorSupport: 1 232 | metalAPIValidation: 1 233 | iOSRenderExtraFrameOnPause: 0 234 | iosCopyPluginsCodeInsteadOfSymlink: 0 235 | appleDeveloperTeamID: 236 | iOSManualSigningProvisioningProfileID: 237 | tvOSManualSigningProvisioningProfileID: 238 | VisionOSManualSigningProvisioningProfileID: 239 | iOSManualSigningProvisioningProfileType: 0 240 | tvOSManualSigningProvisioningProfileType: 0 241 | VisionOSManualSigningProvisioningProfileType: 0 242 | appleEnableAutomaticSigning: 0 243 | iOSRequireARKit: 0 244 | iOSAutomaticallyDetectAndAddCapabilities: 1 245 | appleEnableProMotion: 0 246 | shaderPrecisionModel: 0 247 | clonedFromGUID: 3c72c65a16f0acb438eed22b8b16c24a 248 | templatePackageId: com.unity.template.urp-blank@3.0.2 249 | templateDefaultScene: Assets/Scenes/SampleScene.unity 250 | useCustomMainManifest: 0 251 | useCustomLauncherManifest: 0 252 | useCustomMainGradleTemplate: 0 253 | useCustomLauncherGradleManifest: 0 254 | useCustomBaseGradleTemplate: 0 255 | useCustomGradlePropertiesTemplate: 0 256 | useCustomGradleSettingsTemplate: 0 257 | useCustomProguardFile: 0 258 | AndroidTargetArchitectures: 1 259 | AndroidTargetDevices: 0 260 | AndroidSplashScreenScale: 0 261 | androidSplashScreen: {fileID: 0} 262 | AndroidKeystoreName: 263 | AndroidKeyaliasName: 264 | AndroidEnableArmv9SecurityFeatures: 0 265 | AndroidBuildApkPerCpuArchitecture: 0 266 | AndroidTVCompatibility: 0 267 | AndroidIsGame: 1 268 | AndroidEnableTango: 0 269 | androidEnableBanner: 1 270 | androidUseLowAccuracyLocation: 0 271 | androidUseCustomKeystore: 0 272 | m_AndroidBanners: 273 | - width: 320 274 | height: 180 275 | banner: {fileID: 0} 276 | androidGamepadSupportLevel: 0 277 | chromeosInputEmulation: 1 278 | AndroidMinifyRelease: 0 279 | AndroidMinifyDebug: 0 280 | AndroidValidateAppBundleSize: 1 281 | AndroidAppBundleSizeToValidate: 150 282 | m_BuildTargetIcons: [] 283 | m_BuildTargetPlatformIcons: 284 | - m_BuildTarget: iPhone 285 | m_Icons: 286 | - m_Textures: [] 287 | m_Width: 180 288 | m_Height: 180 289 | m_Kind: 0 290 | m_SubKind: iPhone 291 | - m_Textures: [] 292 | m_Width: 120 293 | m_Height: 120 294 | m_Kind: 0 295 | m_SubKind: iPhone 296 | - m_Textures: [] 297 | m_Width: 167 298 | m_Height: 167 299 | m_Kind: 0 300 | m_SubKind: iPad 301 | - m_Textures: [] 302 | m_Width: 152 303 | m_Height: 152 304 | m_Kind: 0 305 | m_SubKind: iPad 306 | - m_Textures: [] 307 | m_Width: 76 308 | m_Height: 76 309 | m_Kind: 0 310 | m_SubKind: iPad 311 | - m_Textures: [] 312 | m_Width: 120 313 | m_Height: 120 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: iPhone 321 | - m_Textures: [] 322 | m_Width: 80 323 | m_Height: 80 324 | m_Kind: 3 325 | m_SubKind: iPad 326 | - m_Textures: [] 327 | m_Width: 40 328 | m_Height: 40 329 | m_Kind: 3 330 | m_SubKind: iPad 331 | - m_Textures: [] 332 | m_Width: 87 333 | m_Height: 87 334 | m_Kind: 1 335 | m_SubKind: iPhone 336 | - m_Textures: [] 337 | m_Width: 58 338 | m_Height: 58 339 | m_Kind: 1 340 | m_SubKind: iPhone 341 | - m_Textures: [] 342 | m_Width: 29 343 | m_Height: 29 344 | m_Kind: 1 345 | m_SubKind: iPhone 346 | - m_Textures: [] 347 | m_Width: 58 348 | m_Height: 58 349 | m_Kind: 1 350 | m_SubKind: iPad 351 | - m_Textures: [] 352 | m_Width: 29 353 | m_Height: 29 354 | m_Kind: 1 355 | m_SubKind: iPad 356 | - m_Textures: [] 357 | m_Width: 60 358 | m_Height: 60 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: iPhone 366 | - m_Textures: [] 367 | m_Width: 40 368 | m_Height: 40 369 | m_Kind: 2 370 | m_SubKind: iPad 371 | - m_Textures: [] 372 | m_Width: 20 373 | m_Height: 20 374 | m_Kind: 2 375 | m_SubKind: iPad 376 | - m_Textures: [] 377 | m_Width: 1024 378 | m_Height: 1024 379 | m_Kind: 4 380 | m_SubKind: App Store 381 | - m_BuildTarget: Android 382 | m_Icons: 383 | - m_Textures: [] 384 | m_Width: 432 385 | m_Height: 432 386 | m_Kind: 2 387 | m_SubKind: 388 | - m_Textures: [] 389 | m_Width: 324 390 | m_Height: 324 391 | m_Kind: 2 392 | m_SubKind: 393 | - m_Textures: [] 394 | m_Width: 216 395 | m_Height: 216 396 | m_Kind: 2 397 | m_SubKind: 398 | - m_Textures: [] 399 | m_Width: 162 400 | m_Height: 162 401 | m_Kind: 2 402 | m_SubKind: 403 | - m_Textures: [] 404 | m_Width: 108 405 | m_Height: 108 406 | m_Kind: 2 407 | m_SubKind: 408 | - m_Textures: [] 409 | m_Width: 81 410 | m_Height: 81 411 | m_Kind: 2 412 | m_SubKind: 413 | - m_Textures: [] 414 | m_Width: 192 415 | m_Height: 192 416 | m_Kind: 1 417 | m_SubKind: 418 | - m_Textures: [] 419 | m_Width: 144 420 | m_Height: 144 421 | m_Kind: 1 422 | m_SubKind: 423 | - m_Textures: [] 424 | m_Width: 96 425 | m_Height: 96 426 | m_Kind: 1 427 | m_SubKind: 428 | - m_Textures: [] 429 | m_Width: 72 430 | m_Height: 72 431 | m_Kind: 1 432 | m_SubKind: 433 | - m_Textures: [] 434 | m_Width: 48 435 | m_Height: 48 436 | m_Kind: 1 437 | m_SubKind: 438 | - m_Textures: [] 439 | m_Width: 36 440 | m_Height: 36 441 | m_Kind: 1 442 | m_SubKind: 443 | - m_Textures: [] 444 | m_Width: 192 445 | m_Height: 192 446 | m_Kind: 0 447 | m_SubKind: 448 | - m_Textures: [] 449 | m_Width: 144 450 | m_Height: 144 451 | m_Kind: 0 452 | m_SubKind: 453 | - m_Textures: [] 454 | m_Width: 96 455 | m_Height: 96 456 | m_Kind: 0 457 | m_SubKind: 458 | - m_Textures: [] 459 | m_Width: 72 460 | m_Height: 72 461 | m_Kind: 0 462 | m_SubKind: 463 | - m_Textures: [] 464 | m_Width: 48 465 | m_Height: 48 466 | m_Kind: 0 467 | m_SubKind: 468 | - m_Textures: [] 469 | m_Width: 36 470 | m_Height: 36 471 | m_Kind: 0 472 | m_SubKind: 473 | - m_BuildTarget: tvOS 474 | m_Icons: 475 | - m_Textures: [] 476 | m_Width: 1280 477 | m_Height: 768 478 | m_Kind: 0 479 | m_SubKind: 480 | - m_Textures: [] 481 | m_Width: 800 482 | m_Height: 480 483 | m_Kind: 0 484 | m_SubKind: 485 | - m_Textures: [] 486 | m_Width: 400 487 | m_Height: 240 488 | m_Kind: 0 489 | m_SubKind: 490 | - m_Textures: [] 491 | m_Width: 4640 492 | m_Height: 1440 493 | m_Kind: 1 494 | m_SubKind: 495 | - m_Textures: [] 496 | m_Width: 2320 497 | m_Height: 720 498 | m_Kind: 1 499 | m_SubKind: 500 | - m_Textures: [] 501 | m_Width: 3840 502 | m_Height: 1440 503 | m_Kind: 1 504 | m_SubKind: 505 | - m_Textures: [] 506 | m_Width: 1920 507 | m_Height: 720 508 | m_Kind: 1 509 | m_SubKind: 510 | m_BuildTargetBatching: [] 511 | m_BuildTargetShaderSettings: [] 512 | m_BuildTargetGraphicsJobs: [] 513 | m_BuildTargetGraphicsJobMode: [] 514 | m_BuildTargetGraphicsAPIs: 515 | - m_BuildTarget: iOSSupport 516 | m_APIs: 10000000 517 | m_Automatic: 1 518 | - m_BuildTarget: AndroidPlayer 519 | m_APIs: 150000000b000000 520 | m_Automatic: 0 521 | m_BuildTargetVRSettings: [] 522 | m_DefaultShaderChunkSizeInMB: 16 523 | m_DefaultShaderChunkCount: 0 524 | openGLRequireES31: 0 525 | openGLRequireES31AEP: 0 526 | openGLRequireES32: 0 527 | m_TemplateCustomTags: {} 528 | mobileMTRendering: 529 | Android: 1 530 | iPhone: 1 531 | tvOS: 1 532 | m_BuildTargetGroupLightmapEncodingQuality: 533 | - m_BuildTarget: Android 534 | m_EncodingQuality: 1 535 | m_BuildTargetGroupHDRCubemapEncodingQuality: 536 | - m_BuildTarget: Android 537 | m_EncodingQuality: 1 538 | m_BuildTargetGroupLightmapSettings: [] 539 | m_BuildTargetGroupLoadStoreDebugModeSettings: [] 540 | m_BuildTargetNormalMapEncoding: 541 | - m_BuildTarget: Android 542 | m_Encoding: 1 543 | m_BuildTargetDefaultTextureCompressionFormat: 544 | - m_BuildTarget: Android 545 | m_Format: 3 546 | playModeTestRunnerEnabled: 0 547 | runPlayModeTestAsEditModeTest: 0 548 | actionOnDotNetUnhandledException: 1 549 | enableInternalProfiler: 0 550 | logObjCUncaughtExceptions: 1 551 | enableCrashReportAPI: 0 552 | cameraUsageDescription: 553 | locationUsageDescription: 554 | microphoneUsageDescription: 555 | bluetoothUsageDescription: 556 | macOSTargetOSVersion: 10.13.0 557 | switchNMETAOverride: 558 | switchNetLibKey: 559 | switchSocketMemoryPoolSize: 6144 560 | switchSocketAllocatorPoolSize: 128 561 | switchSocketConcurrencyLimit: 14 562 | switchScreenResolutionBehavior: 2 563 | switchUseCPUProfiler: 0 564 | switchUseGOLDLinker: 0 565 | switchLTOSetting: 0 566 | switchApplicationID: 0x01004b9000490000 567 | switchNSODependencies: 568 | switchCompilerFlags: 569 | switchTitleNames_0: 570 | switchTitleNames_1: 571 | switchTitleNames_2: 572 | switchTitleNames_3: 573 | switchTitleNames_4: 574 | switchTitleNames_5: 575 | switchTitleNames_6: 576 | switchTitleNames_7: 577 | switchTitleNames_8: 578 | switchTitleNames_9: 579 | switchTitleNames_10: 580 | switchTitleNames_11: 581 | switchTitleNames_12: 582 | switchTitleNames_13: 583 | switchTitleNames_14: 584 | switchTitleNames_15: 585 | switchPublisherNames_0: 586 | switchPublisherNames_1: 587 | switchPublisherNames_2: 588 | switchPublisherNames_3: 589 | switchPublisherNames_4: 590 | switchPublisherNames_5: 591 | switchPublisherNames_6: 592 | switchPublisherNames_7: 593 | switchPublisherNames_8: 594 | switchPublisherNames_9: 595 | switchPublisherNames_10: 596 | switchPublisherNames_11: 597 | switchPublisherNames_12: 598 | switchPublisherNames_13: 599 | switchPublisherNames_14: 600 | switchPublisherNames_15: 601 | switchIcons_0: {fileID: 0} 602 | switchIcons_1: {fileID: 0} 603 | switchIcons_2: {fileID: 0} 604 | switchIcons_3: {fileID: 0} 605 | switchIcons_4: {fileID: 0} 606 | switchIcons_5: {fileID: 0} 607 | switchIcons_6: {fileID: 0} 608 | switchIcons_7: {fileID: 0} 609 | switchIcons_8: {fileID: 0} 610 | switchIcons_9: {fileID: 0} 611 | switchIcons_10: {fileID: 0} 612 | switchIcons_11: {fileID: 0} 613 | switchIcons_12: {fileID: 0} 614 | switchIcons_13: {fileID: 0} 615 | switchIcons_14: {fileID: 0} 616 | switchIcons_15: {fileID: 0} 617 | switchSmallIcons_0: {fileID: 0} 618 | switchSmallIcons_1: {fileID: 0} 619 | switchSmallIcons_2: {fileID: 0} 620 | switchSmallIcons_3: {fileID: 0} 621 | switchSmallIcons_4: {fileID: 0} 622 | switchSmallIcons_5: {fileID: 0} 623 | switchSmallIcons_6: {fileID: 0} 624 | switchSmallIcons_7: {fileID: 0} 625 | switchSmallIcons_8: {fileID: 0} 626 | switchSmallIcons_9: {fileID: 0} 627 | switchSmallIcons_10: {fileID: 0} 628 | switchSmallIcons_11: {fileID: 0} 629 | switchSmallIcons_12: {fileID: 0} 630 | switchSmallIcons_13: {fileID: 0} 631 | switchSmallIcons_14: {fileID: 0} 632 | switchSmallIcons_15: {fileID: 0} 633 | switchManualHTML: 634 | switchAccessibleURLs: 635 | switchLegalInformation: 636 | switchMainThreadStackSize: 1048576 637 | switchPresenceGroupId: 638 | switchLogoHandling: 0 639 | switchReleaseVersion: 0 640 | switchDisplayVersion: 1.0.0 641 | switchStartupUserAccount: 0 642 | switchSupportedLanguagesMask: 0 643 | switchLogoType: 0 644 | switchApplicationErrorCodeCategory: 645 | switchUserAccountSaveDataSize: 0 646 | switchUserAccountSaveDataJournalSize: 0 647 | switchApplicationAttribute: 0 648 | switchCardSpecSize: -1 649 | switchCardSpecClock: -1 650 | switchRatingsMask: 0 651 | switchRatingsInt_0: 0 652 | switchRatingsInt_1: 0 653 | switchRatingsInt_2: 0 654 | switchRatingsInt_3: 0 655 | switchRatingsInt_4: 0 656 | switchRatingsInt_5: 0 657 | switchRatingsInt_6: 0 658 | switchRatingsInt_7: 0 659 | switchRatingsInt_8: 0 660 | switchRatingsInt_9: 0 661 | switchRatingsInt_10: 0 662 | switchRatingsInt_11: 0 663 | switchRatingsInt_12: 0 664 | switchLocalCommunicationIds_0: 665 | switchLocalCommunicationIds_1: 666 | switchLocalCommunicationIds_2: 667 | switchLocalCommunicationIds_3: 668 | switchLocalCommunicationIds_4: 669 | switchLocalCommunicationIds_5: 670 | switchLocalCommunicationIds_6: 671 | switchLocalCommunicationIds_7: 672 | switchParentalControl: 0 673 | switchAllowsScreenshot: 1 674 | switchAllowsVideoCapturing: 1 675 | switchAllowsRuntimeAddOnContentInstall: 0 676 | switchDataLossConfirmation: 0 677 | switchUserAccountLockEnabled: 0 678 | switchSystemResourceMemory: 16777216 679 | switchSupportedNpadStyles: 22 680 | switchNativeFsCacheSize: 32 681 | switchIsHoldTypeHorizontal: 0 682 | switchSupportedNpadCount: 8 683 | switchEnableTouchScreen: 1 684 | switchSocketConfigEnabled: 0 685 | switchTcpInitialSendBufferSize: 32 686 | switchTcpInitialReceiveBufferSize: 64 687 | switchTcpAutoSendBufferSizeMax: 256 688 | switchTcpAutoReceiveBufferSizeMax: 256 689 | switchUdpSendBufferSize: 9 690 | switchUdpReceiveBufferSize: 42 691 | switchSocketBufferEfficiency: 4 692 | switchSocketInitializeEnabled: 1 693 | switchNetworkInterfaceManagerInitializeEnabled: 1 694 | switchPlayerConnectionEnabled: 1 695 | switchUseNewStyleFilepaths: 0 696 | switchUseLegacyFmodPriorities: 0 697 | switchUseMicroSleepForYield: 1 698 | switchEnableRamDiskSupport: 0 699 | switchMicroSleepForYieldTime: 25 700 | switchRamDiskSpaceSize: 12 701 | ps4NPAgeRating: 12 702 | ps4NPTitleSecret: 703 | ps4NPTrophyPackPath: 704 | ps4ParentalLevel: 11 705 | ps4ContentID: ED1633-NPXX51362_00-0000000000000000 706 | ps4Category: 0 707 | ps4MasterVersion: 01.00 708 | ps4AppVersion: 01.00 709 | ps4AppType: 0 710 | ps4ParamSfxPath: 711 | ps4VideoOutPixelFormat: 0 712 | ps4VideoOutInitialWidth: 1920 713 | ps4VideoOutBaseModeInitialWidth: 1920 714 | ps4VideoOutReprojectionRate: 60 715 | ps4PronunciationXMLPath: 716 | ps4PronunciationSIGPath: 717 | ps4BackgroundImagePath: 718 | ps4StartupImagePath: 719 | ps4StartupImagesFolder: 720 | ps4IconImagesFolder: 721 | ps4SaveDataImagePath: 722 | ps4SdkOverride: 723 | ps4BGMPath: 724 | ps4ShareFilePath: 725 | ps4ShareOverlayImagePath: 726 | ps4PrivacyGuardImagePath: 727 | ps4ExtraSceSysFile: 728 | ps4NPtitleDatPath: 729 | ps4RemotePlayKeyAssignment: -1 730 | ps4RemotePlayKeyMappingDir: 731 | ps4PlayTogetherPlayerCount: 0 732 | ps4EnterButtonAssignment: 2 733 | ps4ApplicationParam1: 0 734 | ps4ApplicationParam2: 0 735 | ps4ApplicationParam3: 0 736 | ps4ApplicationParam4: 0 737 | ps4DownloadDataSize: 0 738 | ps4GarlicHeapSize: 2048 739 | ps4ProGarlicHeapSize: 2560 740 | playerPrefsMaxSize: 32768 741 | ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ 742 | ps4pnSessions: 1 743 | ps4pnPresence: 1 744 | ps4pnFriends: 1 745 | ps4pnGameCustomData: 1 746 | playerPrefsSupport: 0 747 | enableApplicationExit: 0 748 | resetTempFolder: 1 749 | restrictedAudioUsageRights: 0 750 | ps4UseResolutionFallback: 0 751 | ps4ReprojectionSupport: 0 752 | ps4UseAudio3dBackend: 0 753 | ps4UseLowGarlicFragmentationMode: 1 754 | ps4SocialScreenEnabled: 0 755 | ps4ScriptOptimizationLevel: 2 756 | ps4Audio3dVirtualSpeakerCount: 14 757 | ps4attribCpuUsage: 0 758 | ps4PatchPkgPath: 759 | ps4PatchLatestPkgPath: 760 | ps4PatchChangeinfoPath: 761 | ps4PatchDayOne: 0 762 | ps4attribUserManagement: 0 763 | ps4attribMoveSupport: 0 764 | ps4attrib3DSupport: 0 765 | ps4attribShareSupport: 0 766 | ps4attribExclusiveVR: 0 767 | ps4disableAutoHideSplash: 0 768 | ps4videoRecordingFeaturesUsed: 0 769 | ps4contentSearchFeaturesUsed: 0 770 | ps4CompatibilityPS5: 0 771 | ps4AllowPS5Detection: 0 772 | ps4GPU800MHz: 1 773 | ps4attribEyeToEyeDistanceSettingVR: 0 774 | ps4IncludedModules: [] 775 | ps4attribVROutputEnabled: 0 776 | monoEnv: 777 | splashScreenBackgroundSourceLandscape: {fileID: 0} 778 | splashScreenBackgroundSourcePortrait: {fileID: 0} 779 | blurSplashScreenBackground: 1 780 | spritePackerPolicy: 781 | webGLMemorySize: 32 782 | webGLExceptionSupport: 1 783 | webGLNameFilesAsHashes: 0 784 | webGLShowDiagnostics: 0 785 | webGLDataCaching: 1 786 | webGLDebugSymbols: 0 787 | webGLEmscriptenArgs: 788 | webGLModulesDirectory: 789 | webGLTemplate: APPLICATION:Default 790 | webGLAnalyzeBuildSize: 0 791 | webGLUseEmbeddedResources: 0 792 | webGLCompressionFormat: 0 793 | webGLWasmArithmeticExceptions: 0 794 | webGLLinkerTarget: 1 795 | webGLThreadsSupport: 0 796 | webGLDecompressionFallback: 0 797 | webGLInitialMemorySize: 32 798 | webGLMaximumMemorySize: 2048 799 | webGLMemoryGrowthMode: 2 800 | webGLMemoryLinearGrowthStep: 16 801 | webGLMemoryGeometricGrowthStep: 0.2 802 | webGLMemoryGeometricGrowthCap: 96 803 | webGLPowerPreference: 2 804 | scriptingDefineSymbols: {} 805 | additionalCompilerArguments: {} 806 | platformArchitecture: {} 807 | scriptingBackend: {} 808 | il2cppCompilerConfiguration: {} 809 | il2cppCodeGeneration: {} 810 | managedStrippingLevel: 811 | EmbeddedLinux: 1 812 | GameCoreScarlett: 1 813 | GameCoreXboxOne: 1 814 | Nintendo Switch: 1 815 | PS4: 1 816 | PS5: 1 817 | QNX: 1 818 | Stadia: 1 819 | VisionOS: 1 820 | WebGL: 1 821 | Windows Store Apps: 1 822 | XboxOne: 1 823 | iPhone: 1 824 | tvOS: 1 825 | incrementalIl2cppBuild: {} 826 | suppressCommonWarnings: 1 827 | allowUnsafeCode: 0 828 | useDeterministicCompilation: 1 829 | additionalIl2CppArgs: 830 | scriptingRuntimeVersion: 1 831 | gcIncremental: 0 832 | gcWBarrierValidation: 0 833 | apiCompatibilityLevelPerPlatform: {} 834 | m_RenderingPath: 1 835 | m_MobileRenderingPath: 1 836 | metroPackageName: portfolio-website 837 | metroPackageVersion: 838 | metroCertificatePath: 839 | metroCertificatePassword: 840 | metroCertificateSubject: 841 | metroCertificateIssuer: 842 | metroCertificateNotAfter: 0000000000000000 843 | metroApplicationDescription: portfolio-website 844 | wsaImages: {} 845 | metroTileShortName: 846 | metroTileShowName: 0 847 | metroMediumTileShowName: 0 848 | metroLargeTileShowName: 0 849 | metroWideTileShowName: 0 850 | metroSupportStreamingInstall: 0 851 | metroLastRequiredScene: 0 852 | metroDefaultTileSize: 1 853 | metroTileForegroundText: 2 854 | metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} 855 | metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, 856 | a: 1} 857 | metroSplashScreenUseBackgroundColor: 0 858 | platformCapabilities: {} 859 | metroTargetDeviceFamilies: {} 860 | metroFTAName: 861 | metroFTAFileTypes: [] 862 | metroProtocolName: 863 | vcxProjDefaultLanguage: 864 | XboxOneProductId: 865 | XboxOneUpdateKey: 866 | XboxOneSandboxId: 867 | XboxOneContentId: 868 | XboxOneTitleId: 869 | XboxOneSCId: 870 | XboxOneGameOsOverridePath: 871 | XboxOnePackagingOverridePath: 872 | XboxOneAppManifestOverridePath: 873 | XboxOneVersion: 1.0.0.0 874 | XboxOnePackageEncryption: 0 875 | XboxOnePackageUpdateGranularity: 2 876 | XboxOneDescription: 877 | XboxOneLanguage: 878 | - enus 879 | XboxOneCapability: [] 880 | XboxOneGameRating: {} 881 | XboxOneIsContentPackage: 0 882 | XboxOneEnhancedXboxCompatibilityMode: 0 883 | XboxOneEnableGPUVariability: 1 884 | XboxOneSockets: {} 885 | XboxOneSplashScreen: {fileID: 0} 886 | XboxOneAllowedProductIds: [] 887 | XboxOnePersistentLocalStorageSize: 0 888 | XboxOneXTitleMemory: 8 889 | XboxOneOverrideIdentityName: 890 | XboxOneOverrideIdentityPublisher: 891 | vrEditorSettings: {} 892 | cloudServicesEnabled: {} 893 | luminIcon: 894 | m_Name: 895 | m_ModelFolderPath: 896 | m_PortalFolderPath: 897 | luminCert: 898 | m_CertPath: 899 | m_SignPackage: 1 900 | luminIsChannelApp: 0 901 | luminVersion: 902 | m_VersionCode: 1 903 | m_VersionName: 904 | hmiPlayerDataPath: 905 | hmiForceSRGBBlit: 1 906 | embeddedLinuxEnableGamepadInput: 1 907 | hmiLogStartupTiming: 0 908 | hmiCpuConfiguration: 909 | apiCompatibilityLevel: 6 910 | activeInputHandler: 0 911 | windowsGamepadBackendHint: 0 912 | cloudProjectId: 913 | framebufferDepthMemorylessMode: 0 914 | qualitySettingsNames: [] 915 | projectName: 916 | organizationId: 917 | cloudEnabled: 0 918 | legacyClampBlendShapeWeights: 0 919 | hmiLoadingImage: {fileID: 0} 920 | platformRequiresReadableAssets: 0 921 | virtualTexturingSupportEnabled: 0 922 | insecureHttpOption: 0 923 | --------------------------------------------------------------------------------