├── 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 | [](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 |
--------------------------------------------------------------------------------