From f83e0562bff27c2ba0781283faa88f91c342e072 Mon Sep 17 00:00:00 2001 From: HoaTV Date: Tue, 19 Mar 2024 15:20:55 +0700 Subject: [PATCH] Add base template --- .vsconfig | 6 + Assets/WebGLTemplates.meta | 8 + Assets/WebGLTemplates/Better2020.meta | 8 + .../Better2020/TemplateData.meta | 8 + .../Better2020/TemplateData/favicon.ico | Bin 0 -> 13275 bytes .../Better2020/TemplateData/favicon.ico.meta | 7 + .../TemplateData/fullscreen-button.png | Bin 0 -> 175 bytes .../TemplateData/fullscreen-button.png.meta | 7 + .../Better2020/TemplateData/style.css | 105 ++ .../Better2020/TemplateData/style.css.meta | 7 + Assets/WebGLTemplates/Better2020/index.html | 101 ++ .../WebGLTemplates/Better2020/index.html.meta | 7 + Assets/WebGLTemplates/Better2020/logo.png | Bin 0 -> 12005 bytes .../WebGLTemplates/Better2020/logo.png.meta | 7 + .../WebGLTemplates/Better2020/thumbnail.png | Bin 0 -> 2288 bytes .../Better2020/thumbnail.png.meta | 7 + Assets/WebGLTemplates/Develop.meta | 8 + Assets/WebGLTemplates/Develop/LICENSE | 2 + Assets/WebGLTemplates/Develop/LICENSE.meta | 7 + .../WebGLTemplates/Develop/debug-console.css | 278 +++++ .../Develop/debug-console.css.meta | 7 + .../WebGLTemplates/Develop/debug-console.js | 628 ++++++++++++ .../Develop/debug-console.js.meta | 7 + Assets/WebGLTemplates/Develop/favicon.ico | Bin 0 -> 4286 bytes .../WebGLTemplates/Develop/favicon.ico.meta | 7 + Assets/WebGLTemplates/Develop/index.html | 179 ++++ Assets/WebGLTemplates/Develop/index.html.meta | 7 + Assets/WebGLTemplates/Develop/logo.svg | 2 + Assets/WebGLTemplates/Develop/logo.svg.meta | 7 + Assets/WebGLTemplates/Develop/thumbnail.png | Bin 0 -> 12764 bytes .../WebGLTemplates/Develop/thumbnail.png.meta | 7 + Assets/WebGLTemplates/Release.meta | 8 + Assets/WebGLTemplates/Release/LICENSE | 2 + Assets/WebGLTemplates/Release/LICENSE.meta | 7 + Assets/WebGLTemplates/Release/favicon.ico | Bin 0 -> 4286 bytes .../WebGLTemplates/Release/favicon.ico.meta | 7 + Assets/WebGLTemplates/Release/index.html | 177 ++++ Assets/WebGLTemplates/Release/index.html.meta | 7 + Assets/WebGLTemplates/Release/logo.svg | 2 + Assets/WebGLTemplates/Release/logo.svg.meta | 7 + .../WebGLTemplates/Release/pretty-console.js | 158 +++ .../Release/pretty-console.js.meta | 7 + Assets/WebGLTemplates/Release/thumbnail.png | Bin 0 -> 6798 bytes .../WebGLTemplates/Release/thumbnail.png.meta | 7 + Assets/_1Base.meta | 8 + Assets/_1Base/Materials.meta | 8 + Assets/_1Base/Materials/Default.mat | 78 ++ Assets/_1Base/Materials/Default.mat.meta | 8 + Assets/_1Base/Materials/Ground.mat | 124 +++ Assets/_1Base/Materials/Ground.mat.meta | 8 + Assets/_1Base/Plugins.meta | 8 + Assets/_1Base/Plugins/WebGL.meta | 8 + Assets/_1Base/Plugins/WebGL/WebBridge.meta | 8 + .../Plugins/WebGL/WebBridge/Attributes.meta | 3 + .../Attributes/WebCommandAttribute.cs | 22 + .../Attributes/WebCommandAttribute.cs.meta | 3 + .../Plugins/WebGL/WebBridge/CommonCommands.cs | 231 +++++ .../WebGL/WebBridge/CommonCommands.cs.meta | 3 + .../WebGL/WebBridge/Supyrb.WebBridge.asmdef | 19 + .../WebBridge/Supyrb.WebBridge.asmdef.meta | 7 + .../Plugins/WebGL/WebBridge/WebBridge.cs | 143 +++ .../Plugins/WebGL/WebBridge/WebBridge.cs.meta | 3 + .../Plugins/WebGL/WebBridge/WebCommands.cs | 22 + .../WebGL/WebBridge/WebCommands.cs.meta | 11 + Assets/_1Base/Plugins/WebGL/WebTools.meta | 8 + .../WebGL/WebTools/Supyrb.WebTools.asmdef | 17 + .../WebTools/Supyrb.WebTools.asmdef.meta | 7 + .../Plugins/WebGL/WebTools/WebToolPlugins.cs | 259 +++++ .../WebGL/WebTools/WebToolPlugins.cs.meta | 3 + .../WebGL/WebTools/WebToolPlugins.jslib | 130 +++ .../WebGL/WebTools/WebToolPlugins.jslib.meta | 32 + .../WebGL/WebTools/WebToolTimeTracker.cs | 103 ++ .../WebGL/WebTools/WebToolTimeTracker.cs.meta | 3 + Assets/_1Base/Prefabs.meta | 8 + Assets/_1Base/Prefabs/RigidbodyCube.prefab | 138 +++ .../_1Base/Prefabs/RigidbodyCube.prefab.meta | 8 + Assets/_1Base/Prefabs/Spawner.prefab | 50 + Assets/_1Base/Prefabs/Spawner.prefab.meta | 7 + Assets/_1Base/Scenes.meta | 8 + .../_1Base/Scenes/LightingSettings.lighting | 63 ++ .../Scenes/LightingSettings.lighting.meta | 8 + Assets/_1Base/Scenes/Main.unity | 949 ++++++++++++++++++ Assets/_1Base/Scenes/Main.unity.meta | 7 + Assets/_1Base/Scripts.meta | 8 + Assets/_1Base/Scripts/ConstantRotation.cs | 117 +++ .../_1Base/Scripts/ConstantRotation.cs.meta | 11 + Assets/_1Base/Scripts/Editor.meta | 8 + Assets/_1Base/Scripts/Editor/BuildScript.cs | 397 ++++++++ .../_1Base/Scripts/Editor/BuildScript.cs.meta | 11 + .../_1Base/Scripts/Editor/BuildScriptMenu.cs | 144 +++ .../Scripts/Editor/BuildScriptMenu.cs.meta | 3 + .../RemoveMobileSupportWarningWebBuild.cs | 50 + ...RemoveMobileSupportWarningWebBuild.cs.meta | 11 + .../Scripts/Editor/UnityPackageScripts.cs | 260 +++++ .../Editor/UnityPackageScripts.cs.meta | 3 + .../_1Base/Scripts/ObjectSpawnController.cs | 100 ++ .../Scripts/ObjectSpawnController.cs.meta | 11 + Assets/_1Base/Scripts/ObjectSpawner.cs | 117 +++ Assets/_1Base/Scripts/ObjectSpawner.cs.meta | 11 + .../_1Base/Scripts/ObjectSpawnerCommands.cs | 75 ++ .../Scripts/ObjectSpawnerCommands.cs.meta | 11 + Packages/manifest.json | 45 + Packages/packages-lock.json | 463 +++++++++ ProjectSettings/AudioManager.asset | 19 + ProjectSettings/ClusterInputManager.asset | 6 + ProjectSettings/DynamicsManager.asset | 37 + ProjectSettings/EditorBuildSettings.asset | 8 + ProjectSettings/EditorSettings.asset | 40 + ProjectSettings/GraphicsSettings.asset | 64 ++ ProjectSettings/InputManager.asset | 487 +++++++++ ProjectSettings/MemorySettings.asset | 35 + ProjectSettings/NavMeshAreas.asset | 93 ++ ProjectSettings/NetworkManager.asset | 8 + ProjectSettings/PackageManagerSettings.asset | 44 + ProjectSettings/Physics2DSettings.asset | 56 ++ ProjectSettings/PresetManager.asset | 7 + ProjectSettings/ProjectSettings.asset | 789 +++++++++++++++ ProjectSettings/ProjectVersion.txt | 2 + ProjectSettings/QualitySettings.asset | 239 +++++ ProjectSettings/TagManager.asset | 43 + ProjectSettings/TimeManager.asset | 9 + ProjectSettings/UnityConnectSettings.asset | 36 + ProjectSettings/VFXManager.asset | 14 + ProjectSettings/VersionControlSettings.asset | 8 + ProjectSettings/XRSettings.asset | 10 + ProjectSettings/boot.config | 0 upgrade-unity-pr-body.md | 5 +- 127 files changed, 8258 insertions(+), 3 deletions(-) create mode 100644 .vsconfig create mode 100644 Assets/WebGLTemplates.meta create mode 100644 Assets/WebGLTemplates/Better2020.meta create mode 100644 Assets/WebGLTemplates/Better2020/TemplateData.meta create mode 100644 Assets/WebGLTemplates/Better2020/TemplateData/favicon.ico create mode 100644 Assets/WebGLTemplates/Better2020/TemplateData/favicon.ico.meta create mode 100644 Assets/WebGLTemplates/Better2020/TemplateData/fullscreen-button.png create mode 100644 Assets/WebGLTemplates/Better2020/TemplateData/fullscreen-button.png.meta create mode 100644 Assets/WebGLTemplates/Better2020/TemplateData/style.css create mode 100644 Assets/WebGLTemplates/Better2020/TemplateData/style.css.meta create mode 100644 Assets/WebGLTemplates/Better2020/index.html create mode 100644 Assets/WebGLTemplates/Better2020/index.html.meta create mode 100644 Assets/WebGLTemplates/Better2020/logo.png create mode 100644 Assets/WebGLTemplates/Better2020/logo.png.meta create mode 100644 Assets/WebGLTemplates/Better2020/thumbnail.png create mode 100644 Assets/WebGLTemplates/Better2020/thumbnail.png.meta create mode 100644 Assets/WebGLTemplates/Develop.meta create mode 100644 Assets/WebGLTemplates/Develop/LICENSE create mode 100644 Assets/WebGLTemplates/Develop/LICENSE.meta create mode 100644 Assets/WebGLTemplates/Develop/debug-console.css create mode 100644 Assets/WebGLTemplates/Develop/debug-console.css.meta create mode 100644 Assets/WebGLTemplates/Develop/debug-console.js create mode 100644 Assets/WebGLTemplates/Develop/debug-console.js.meta create mode 100644 Assets/WebGLTemplates/Develop/favicon.ico create mode 100644 Assets/WebGLTemplates/Develop/favicon.ico.meta create mode 100644 Assets/WebGLTemplates/Develop/index.html create mode 100644 Assets/WebGLTemplates/Develop/index.html.meta create mode 100644 Assets/WebGLTemplates/Develop/logo.svg create mode 100644 Assets/WebGLTemplates/Develop/logo.svg.meta create mode 100644 Assets/WebGLTemplates/Develop/thumbnail.png create mode 100644 Assets/WebGLTemplates/Develop/thumbnail.png.meta create mode 100644 Assets/WebGLTemplates/Release.meta create mode 100644 Assets/WebGLTemplates/Release/LICENSE create mode 100644 Assets/WebGLTemplates/Release/LICENSE.meta create mode 100644 Assets/WebGLTemplates/Release/favicon.ico create mode 100644 Assets/WebGLTemplates/Release/favicon.ico.meta create mode 100644 Assets/WebGLTemplates/Release/index.html create mode 100644 Assets/WebGLTemplates/Release/index.html.meta create mode 100644 Assets/WebGLTemplates/Release/logo.svg create mode 100644 Assets/WebGLTemplates/Release/logo.svg.meta create mode 100644 Assets/WebGLTemplates/Release/pretty-console.js create mode 100644 Assets/WebGLTemplates/Release/pretty-console.js.meta create mode 100644 Assets/WebGLTemplates/Release/thumbnail.png create mode 100644 Assets/WebGLTemplates/Release/thumbnail.png.meta create mode 100644 Assets/_1Base.meta create mode 100644 Assets/_1Base/Materials.meta create mode 100644 Assets/_1Base/Materials/Default.mat create mode 100644 Assets/_1Base/Materials/Default.mat.meta create mode 100644 Assets/_1Base/Materials/Ground.mat create mode 100644 Assets/_1Base/Materials/Ground.mat.meta create mode 100644 Assets/_1Base/Plugins.meta create mode 100644 Assets/_1Base/Plugins/WebGL.meta create mode 100644 Assets/_1Base/Plugins/WebGL/WebBridge.meta create mode 100644 Assets/_1Base/Plugins/WebGL/WebBridge/Attributes.meta create mode 100644 Assets/_1Base/Plugins/WebGL/WebBridge/Attributes/WebCommandAttribute.cs create mode 100644 Assets/_1Base/Plugins/WebGL/WebBridge/Attributes/WebCommandAttribute.cs.meta create mode 100644 Assets/_1Base/Plugins/WebGL/WebBridge/CommonCommands.cs create mode 100644 Assets/_1Base/Plugins/WebGL/WebBridge/CommonCommands.cs.meta create mode 100644 Assets/_1Base/Plugins/WebGL/WebBridge/Supyrb.WebBridge.asmdef create mode 100644 Assets/_1Base/Plugins/WebGL/WebBridge/Supyrb.WebBridge.asmdef.meta create mode 100644 Assets/_1Base/Plugins/WebGL/WebBridge/WebBridge.cs create mode 100644 Assets/_1Base/Plugins/WebGL/WebBridge/WebBridge.cs.meta create mode 100644 Assets/_1Base/Plugins/WebGL/WebBridge/WebCommands.cs create mode 100644 Assets/_1Base/Plugins/WebGL/WebBridge/WebCommands.cs.meta create mode 100644 Assets/_1Base/Plugins/WebGL/WebTools.meta create mode 100644 Assets/_1Base/Plugins/WebGL/WebTools/Supyrb.WebTools.asmdef create mode 100644 Assets/_1Base/Plugins/WebGL/WebTools/Supyrb.WebTools.asmdef.meta create mode 100644 Assets/_1Base/Plugins/WebGL/WebTools/WebToolPlugins.cs create mode 100644 Assets/_1Base/Plugins/WebGL/WebTools/WebToolPlugins.cs.meta create mode 100644 Assets/_1Base/Plugins/WebGL/WebTools/WebToolPlugins.jslib create mode 100644 Assets/_1Base/Plugins/WebGL/WebTools/WebToolPlugins.jslib.meta create mode 100644 Assets/_1Base/Plugins/WebGL/WebTools/WebToolTimeTracker.cs create mode 100644 Assets/_1Base/Plugins/WebGL/WebTools/WebToolTimeTracker.cs.meta create mode 100644 Assets/_1Base/Prefabs.meta create mode 100644 Assets/_1Base/Prefabs/RigidbodyCube.prefab create mode 100644 Assets/_1Base/Prefabs/RigidbodyCube.prefab.meta create mode 100644 Assets/_1Base/Prefabs/Spawner.prefab create mode 100644 Assets/_1Base/Prefabs/Spawner.prefab.meta create mode 100644 Assets/_1Base/Scenes.meta create mode 100644 Assets/_1Base/Scenes/LightingSettings.lighting create mode 100644 Assets/_1Base/Scenes/LightingSettings.lighting.meta create mode 100644 Assets/_1Base/Scenes/Main.unity create mode 100644 Assets/_1Base/Scenes/Main.unity.meta create mode 100644 Assets/_1Base/Scripts.meta create mode 100644 Assets/_1Base/Scripts/ConstantRotation.cs create mode 100644 Assets/_1Base/Scripts/ConstantRotation.cs.meta create mode 100644 Assets/_1Base/Scripts/Editor.meta create mode 100644 Assets/_1Base/Scripts/Editor/BuildScript.cs create mode 100644 Assets/_1Base/Scripts/Editor/BuildScript.cs.meta create mode 100644 Assets/_1Base/Scripts/Editor/BuildScriptMenu.cs create mode 100644 Assets/_1Base/Scripts/Editor/BuildScriptMenu.cs.meta create mode 100644 Assets/_1Base/Scripts/Editor/RemoveMobileSupportWarningWebBuild.cs create mode 100644 Assets/_1Base/Scripts/Editor/RemoveMobileSupportWarningWebBuild.cs.meta create mode 100644 Assets/_1Base/Scripts/Editor/UnityPackageScripts.cs create mode 100644 Assets/_1Base/Scripts/Editor/UnityPackageScripts.cs.meta create mode 100644 Assets/_1Base/Scripts/ObjectSpawnController.cs create mode 100644 Assets/_1Base/Scripts/ObjectSpawnController.cs.meta create mode 100644 Assets/_1Base/Scripts/ObjectSpawner.cs create mode 100644 Assets/_1Base/Scripts/ObjectSpawner.cs.meta create mode 100644 Assets/_1Base/Scripts/ObjectSpawnerCommands.cs create mode 100644 Assets/_1Base/Scripts/ObjectSpawnerCommands.cs.meta create mode 100644 Packages/manifest.json create mode 100644 Packages/packages-lock.json create mode 100644 ProjectSettings/AudioManager.asset create mode 100644 ProjectSettings/ClusterInputManager.asset create mode 100644 ProjectSettings/DynamicsManager.asset create mode 100644 ProjectSettings/EditorBuildSettings.asset create mode 100644 ProjectSettings/EditorSettings.asset create mode 100644 ProjectSettings/GraphicsSettings.asset create mode 100644 ProjectSettings/InputManager.asset create mode 100644 ProjectSettings/MemorySettings.asset create mode 100644 ProjectSettings/NavMeshAreas.asset create mode 100644 ProjectSettings/NetworkManager.asset create mode 100644 ProjectSettings/PackageManagerSettings.asset create mode 100644 ProjectSettings/Physics2DSettings.asset create mode 100644 ProjectSettings/PresetManager.asset create mode 100644 ProjectSettings/ProjectSettings.asset create mode 100644 ProjectSettings/ProjectVersion.txt create mode 100644 ProjectSettings/QualitySettings.asset create mode 100644 ProjectSettings/TagManager.asset create mode 100644 ProjectSettings/TimeManager.asset create mode 100644 ProjectSettings/UnityConnectSettings.asset create mode 100644 ProjectSettings/VFXManager.asset create mode 100644 ProjectSettings/VersionControlSettings.asset create mode 100644 ProjectSettings/XRSettings.asset create mode 100644 ProjectSettings/boot.config diff --git a/.vsconfig b/.vsconfig new file mode 100644 index 0000000..d70cd98 --- /dev/null +++ b/.vsconfig @@ -0,0 +1,6 @@ +{ + "version": "1.0", + "components": [ + "Microsoft.VisualStudio.Workload.ManagedGame" + ] +} diff --git a/Assets/WebGLTemplates.meta b/Assets/WebGLTemplates.meta new file mode 100644 index 0000000..74310b5 --- /dev/null +++ b/Assets/WebGLTemplates.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ff8ace981b92c5e4aad456809650dd73 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/Better2020.meta b/Assets/WebGLTemplates/Better2020.meta new file mode 100644 index 0000000..6188599 --- /dev/null +++ b/Assets/WebGLTemplates/Better2020.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0f4b37a4a517079498937641172663c6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/Better2020/TemplateData.meta b/Assets/WebGLTemplates/Better2020/TemplateData.meta new file mode 100644 index 0000000..7adb0f4 --- /dev/null +++ b/Assets/WebGLTemplates/Better2020/TemplateData.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9058e872412fc7f4cabc01e4305948e1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/Better2020/TemplateData/favicon.ico b/Assets/WebGLTemplates/Better2020/TemplateData/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..dd6bf7e9cec4d87389fad00e34cd385321d748e1 GIT binary patch literal 13275 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 b05ANO@4xyR$aLsufT!Qj{e3+6SMUEH(9pSK literal 0 HcmV?d00001 diff --git a/Assets/WebGLTemplates/Better2020/TemplateData/favicon.ico.meta b/Assets/WebGLTemplates/Better2020/TemplateData/favicon.ico.meta new file mode 100644 index 0000000..3e40b69 --- /dev/null +++ b/Assets/WebGLTemplates/Better2020/TemplateData/favicon.ico.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 067a83d33a9eaba4b9b8808e63c8d03e +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/Better2020/TemplateData/fullscreen-button.png b/Assets/WebGLTemplates/Better2020/TemplateData/fullscreen-button.png new file mode 100644 index 0000000000000000000000000000000000000000..e7b6496fc9c99bf761524e2b962b6de8bfca90d7 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P3?%12mYf5mqyv0HT;`!cG1M + + + + + + {{{ PRODUCT_NAME }}} + + + + +
+ +
+ + + + + diff --git a/Assets/WebGLTemplates/Better2020/index.html.meta b/Assets/WebGLTemplates/Better2020/index.html.meta new file mode 100644 index 0000000..8230ed3 --- /dev/null +++ b/Assets/WebGLTemplates/Better2020/index.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 010cecec326b7164b93ad1e497c198ce +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/Better2020/logo.png b/Assets/WebGLTemplates/Better2020/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a2fb15c3260bad9422f0773d5df2690c30f2bcd9 GIT binary patch literal 12005 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 literal 0 HcmV?d00001 diff --git a/Assets/WebGLTemplates/Better2020/logo.png.meta b/Assets/WebGLTemplates/Better2020/logo.png.meta new file mode 100644 index 0000000..2198839 --- /dev/null +++ b/Assets/WebGLTemplates/Better2020/logo.png.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f830e170412fc8a46a0bc72ecad57f1a +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/Better2020/thumbnail.png b/Assets/WebGLTemplates/Better2020/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..48e1dca64a5ccafa1d88ced1ce4ee0d9cd1ca8d7 GIT binary patch literal 2288 zcmc&$dr%a096wBwFb5lz@qxIkybSMl?+LeZI&jD1ltaP`kr8okcMn$XZr9y~yF(Cl zY?M&bF$|3IL1_*k8KsPlKxq)BmQkLDnkH(=9H$b5=?v}hxKXp5{G)c}_x}7o-^cI! z{mz!8BqxmXo$4zP2*zm>HL3i##@&2I@qN9z3 zbS_<&gkY3egyNKe5ZTN$j}{1`=ho1 zLo6yt)?)>^m=Xu)%>|-u2v1-pI25p%O%@ihslY*AgrB>&ArKgZaJecl#w`#?*QEez ziXi}n2o_>6ECC{wBC$dyQ^2zU2`qsjSPqFLLa_pYWr#Qu82&(B8iN~=R89P_EPkZ| zb2yGhAjoR9imXx*#biTbrBVsO5=bHu@(3Yow{WOUXkllLFlY!CV@R4KDGT6cL=99P zrviCRhfFZj9$E`K>?Yn}kPW3Fu?TjXGzi2o501`bOoPI43?fW~nXqsyj}?2cbPmN) zY!3A|)SlzV1n{oa={z!?s*Bm|5y5hC`Mep!4tXk?)!S(TN+nn-kHLtzd|u6&Zfj^n z%@8O@F?xzJjXYG!h{}LOERq1>i%APkS=m{STp%qI&xn_VR`Nl7`c!C%liu%l21X@^xQn| z#B|3Fl1Q@rtJ;TCXA!Y-cxEDj!EixP%$)`*5OcpjfrG=_0j+mi<2xr#5G|FheKBHkTab_Um<3SO;oJ==;oP>wgpOKl z)MTshC+2d-~wF;KMENJ;(x)W~}Us-XezyE4;R^9&8+`G0T@0FIFG8_nw92;ah z(I2=u|KSd^&vjNDYMO9M9U-(7R-vw88~=@0z2qPWSCd?cP5og;u}PASf-HUz5@6*s|~bTieDP)Q%JN_4nFVJ9^fmTt{JmZ*BQaV0+yS zYgaJsb@S}m&H~6kxA9jtsxr66Wm|USj5FKb0jDL^*R`D*-7NfUcXG&VY@K!oAk7nPby0n_B4h@OlT0y zsj9lSw)FLC*HnklFL~jv&K{;CGSk&y-@Eej`i$8vqPb@t?5sJx_2=R%m+uyB?QF_0 zs$5@ocZaA0bgMr7_-ft2(Is1)1lxnlM_EVv1Sz;8RoU(Q>M9btb!*k7+3PRN54{mW zW^Mn$=MwP|B@FzjM3XW1(ETYTg%y>ifs^~L8wZ3JjItl^or}%dJ}IThcdvg;wD;xk zzXaI%_Bq#_PG?u+jDbT*p=?`i^r+^^f=ymecKu;mIMD0A4A8!5t2V{XD}cr}xc^DC Mamkv4vCG%}37vB>ZvX%Q literal 0 HcmV?d00001 diff --git a/Assets/WebGLTemplates/Better2020/thumbnail.png.meta b/Assets/WebGLTemplates/Better2020/thumbnail.png.meta new file mode 100644 index 0000000..1482ff2 --- /dev/null +++ b/Assets/WebGLTemplates/Better2020/thumbnail.png.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f626db55f3501504c8c6b7602441112d +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/Develop.meta b/Assets/WebGLTemplates/Develop.meta new file mode 100644 index 0000000..a44412a --- /dev/null +++ b/Assets/WebGLTemplates/Develop.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e248de0093835d64c8045ab444771f76 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/Develop/LICENSE b/Assets/WebGLTemplates/Develop/LICENSE new file mode 100644 index 0000000..639f6b0 --- /dev/null +++ b/Assets/WebGLTemplates/Develop/LICENSE @@ -0,0 +1,2 @@ +Licensed under MIT, Copyright Johannes Deml 2021-2023 +Template from https://github.com/JohannesDeml/UnityWebGL-LoadingTest \ No newline at end of file diff --git a/Assets/WebGLTemplates/Develop/LICENSE.meta b/Assets/WebGLTemplates/Develop/LICENSE.meta new file mode 100644 index 0000000..ae152d8 --- /dev/null +++ b/Assets/WebGLTemplates/Develop/LICENSE.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3b2e08798da90d4419cae79311b29b9e +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/Develop/debug-console.css b/Assets/WebGLTemplates/Develop/debug-console.css new file mode 100644 index 0000000..728075a --- /dev/null +++ b/Assets/WebGLTemplates/Develop/debug-console.css @@ -0,0 +1,278 @@ +/* Debug console styling */ +#debugConsole { + position: absolute; + top: 0px; + left: 0px; + width: 100%; + height: 90vh; + z-index: 100; + flex-direction: column; + text-align: left; + font-family: "Lucida Console", "Courier New", monospace; + font-size: small; + word-break: break-all; +} + +#debugConsole .console-top-bar { + flex-shrink: 0; + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; + overflow: auto; + height: 30px; + padding: 10px 42px 10px 10px; + background-color: rgb(243, 243, 243); +} + +#debugConsole .console-top-bar .element { + position: relative; + flex-shrink: 0; + height: 24px; + margin: 0px 4px; + border: 0; +} + +#debugConsole .console-top-bar button { + width: 24px; + cursor: pointer; + background: none; +} + +#debugConsole .console-top-bar .separator { + width: 1px; + background: black; +} + +#debugConsole .console-top-bar .log-counter .counter { + cursor: pointer; + padding: 8px; + background-color: rgba(255, 255, 255, 0.5); +} + +#debugConsole .console-top-bar .log-counter input[type='checkbox']:checked+.counter { + border-bottom: 3px solid yellowgreen; +} + +#debugConsole .console-top-bar .log-counter .counter::before { + padding-right: 2px; +} + +.log-counter.info .counter::before { + content: 'ℹ️'; +} + +.log-counter.warn .counter::before { + content: '⚠️'; +} + +.log-counter.error .counter::before { + content: '🛑'; +} + +.timestamp-button .icon::before { + content: '🕰️'; +} + +.to-bottom-button .icon::before { + content: '⬇️'; +} + +.clear-button .icon::before { + content: '🗑️'; +} + +.copy-button .icon::before { + content: '📋'; +} + + +#debugConsole .log-entries { + overflow-y: scroll; +} + +#debugConsole .console-input { + flex-shrink: 0; + height: 24px; +} + +#debugConsole .entry { + padding: 8px 4px; + color: rgb(41, 41, 41); + background-color: rgba(230, 230, 230, 0.9); + display: flex; + justify-content: space-between; + border-bottom: 1px solid #3d3d3d; +} + +#debugConsole .entry.info { + color: rgb(41, 50, 60); + background-color: rgba(178, 216, 239, 0.9); +} + +#debugConsole.hidelogs-info .entry.info, +#debugConsole.hidelogs-info .entry.debug, +#debugConsole.hidelogs-info .entry.log, +#debugConsole.hidelogs-warn .entry.warn, +#debugConsole.hidelogs-error .entry.error { + display: none; +} + +#debugConsole.hidelogtimestamps .timestamplog { + display: none; +} + +#debugConsole .entry.warn { + color: rgb(82, 70, 3); + background-color: rgba(234, 209, 101, 0.9); +} + +#debugConsole .entry.error { + color: rgb(75, 10, 5); + background-color: rgba(233, 91, 91, 0.9); +} + +#debugConsole .copy-button { + position: relative; + flex-shrink: 0; + width: 20px; + height: 20px; + cursor: pointer; + border: 0; + background: none; +} + +#debugConsole .to-bottom-button.locked { + border-bottom: 3px solid yellowgreen; +} + +#debugConsole .timestamp-button.show { + border-bottom: 3px solid yellowgreen; +} + +#debugConsole .bubble-click-indicator:before { + content: attr(data-before); + ; + position: absolute; + bottom: 0; + right: 10px; + width: 60px; + height: 20px; + padding-top: 4px; + text-align: center; + color: white; + background: #333; + border-radius: 10px; + opacity: 0; + transition: all 0.3s ease-out; + pointer-events: none; +} + +#debugConsole .bubble-click-indicator.active:before { + opacity: 1; + right: 30px; + transition: all 0.2s ease-out; +} + +/* Debug console toggle button */ +#debugToggleMenu { + z-index: 101; + position: absolute; + top: 8px; + right: 8px; + display: block; + width: 30px; + height: 30px; + cursor: pointer; + border-radius: 50%; + box-shadow: 0px 1px 3px 2px #CDD9ED; + background: #fff; + transition: all .2s ease; +} + +#debugToggleMenu.unseen-error { + background: rgb(189, 40, 40); + animation: error-background 1.0s ease 3; +} + +@keyframes error-background { + 0% { + background: rgb(189, 40, 40); + } + + 50% { + background: rgb(231, 39, 39); + } + + 100% { + background: rgb(189, 40, 40); + } +} + +#debugToggleMenu .icon { + position: absolute; + top: 25%; + left: 25%; + width: 50%; + height: 50%; + background: rgb(128, 128, 128); + border-radius: 50%; + display: none; +} + +#debugToggle { + display: none; +} + +#debugToggle:checked~#debugConsole { + display: flex; +} + +#debugToggle:checked~#debugToggleMenu .icon { + display: block; +} + +#debugToggle:not(:checked)~#debugConsole { + display: none; +} + +/* Startup Time interface */ +#infoPanel { + z-index: 10; + position: absolute; + top: 0; + left: 0; + padding: 8px; + font-family: "Lucida Console", "Courier New", monospace; + text-align: left; + color: black; + background: rgba(255, 255, 255, 0.4); +} + +dt, +dd { + display: inline; +} + +dt:after { + content: ':'; +} + +.tracking-seconds:after { + content: 's'; +} + +.tracking-milliseconds:after { + content: 'ms'; +} + +/* Hide Milliseconds value, still useful for CI to get exact values */ +.tracking-milliseconds, +.tracking-milliseconds:after { + display: none; +} + +dl div:after { + display: block; + content: ''; +} \ No newline at end of file diff --git a/Assets/WebGLTemplates/Develop/debug-console.css.meta b/Assets/WebGLTemplates/Develop/debug-console.css.meta new file mode 100644 index 0000000..1275530 --- /dev/null +++ b/Assets/WebGLTemplates/Develop/debug-console.css.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 277cb4520213c994aa08fcc92915e29a +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/Develop/debug-console.js b/Assets/WebGLTemplates/Develop/debug-console.js new file mode 100644 index 0000000..06549bf --- /dev/null +++ b/Assets/WebGLTemplates/Develop/debug-console.js @@ -0,0 +1,628 @@ +/// Processes all unity log messages and converts unity rich text to css styled console messages & adds a debug html debug console +/// from https://github.com/JohannesDeml/UnityWebGL-LoadingTest + +let consoleDiv; +let debugToggle; +let logCounterDivs = {}; +let logCounter = { + "log": 0, + "info": 0, + "debug": 0, + "warn": 0, + "error": 0 +}; + +let scrollToBottom = true; +if (getCookie("scrollToBottom") === "false") { + scrollToBottom = false; +} +let addTimestamp = true; +if (getCookie("addTimestamp") === "false") { + addTimestamp = false; +} + +function setCookie(cname, cvalue, exdays) { + const d = new Date(); + d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000)); + let expires = "expires=" + d.toUTCString(); + document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/"; +} + +function getCookie(cname) { + let name = cname + "="; + let ca = document.cookie.split(';'); + for (let i = 0; i < ca.length; i++) { + let c = ca[i]; + while (c.charAt(0) == ' ') { + c = c.substring(1); + } + if (c.indexOf(name) == 0) { + return c.substring(name.length, c.length); + } + } + return ""; +} + +function initializeDebugConsole() { + let debugConsole = document.createElement('div'); + debugConsole.id = 'debugConsole'; + document.body.appendChild(debugConsole); + consoleDiv = document.createElement('div'); + consoleDiv.className = 'log-entries'; + + addDebugConsoleTopBar(debugConsole); + + debugConsole.appendChild(consoleDiv); + + var consoleInput = document.createElement("input"); + consoleInput.className = 'console-input'; + consoleInput.type = "text"; + consoleInput.value = 'runUnityCommand("Help");'; + debugConsole.appendChild(consoleInput); + + consoleInput.onkeydown = function (e) { + if (['Enter', 'NumpadEnter'].includes(e.key)) { + console.log(`Evaluating ${consoleInput.value}`); + eval(consoleInput.value); + } + }; + + setupConsoleLogPipe(); +} + +function runUnityCommand(...command) { + unityGame.SendMessage("WebBridge", ...command); +} + +function addDebugConsoleTopBar(debugConsole) { + var consoleTopBar = document.createElement('div'); + consoleTopBar.className = 'console-top-bar'; + debugConsole.appendChild(consoleTopBar); + + addTopBarLogCounter(consoleTopBar); + + var separator = document.createElement('div'); + separator.classList.add('separator', 'element'); + consoleTopBar.appendChild(separator); + + // Add timestamp toggle + var timestampButton = document.createElement('button'); + timestampButton.classList.add('timestamp-button', 'bubble-click-indicator', 'element'); + timestampButton.title = 'Add timestamp to logs'; + consoleTopBar.appendChild(timestampButton); + + var timestampIcon = document.createElement('div'); + timestampIcon.classList.add('icon'); + timestampButton.appendChild(timestampIcon); + applyTimestamp(timestampButton); + + timestampButton.addEventListener('click', function () { + addTimestamp = !addTimestamp; + setCookie("addTimestamp", addTimestamp, 365); + applyTimestamp(timestampButton); + // Show feedback to the user + timestampButton.classList.add('active'); + setTimeout(function () { + timestampButton.classList.remove('active'); + }, 1500); + }); + + // Lock scrolling to bottom button + var toBottomButton = document.createElement('button'); + toBottomButton.classList.add('to-bottom-button', 'bubble-click-indicator', 'element'); + toBottomButton.title = 'lock scrolling to bottom'; + consoleTopBar.appendChild(toBottomButton); + + var arrowDownIcon = document.createElement('div'); + arrowDownIcon.classList.add('icon'); + toBottomButton.appendChild(arrowDownIcon); + applyScrollToBottom(toBottomButton); + + toBottomButton.addEventListener('click', function () { + scrollToBottom = !scrollToBottom; + setCookie("scrollToBottom", scrollToBottom, 365); + applyScrollToBottom(toBottomButton); + // Show feedback to the user + toBottomButton.classList.add('active'); + setTimeout(function () { + toBottomButton.classList.remove('active'); + }, 1500); + }); + + // Clear logs button + var clearButton = document.createElement('button'); + clearButton.classList.add('clear-button', 'bubble-click-indicator', 'element'); + clearButton.title = 'clear logs'; + consoleTopBar.appendChild(clearButton); + + var trashIcon = document.createElement('div'); + trashIcon.classList.add('icon'); + clearButton.appendChild(trashIcon); + clearButton.addEventListener('click', function () { + consoleDiv.innerHTML = ''; + clearButton.setAttribute('data-before', 'cleared'); + // Show feedback to the user + clearButton.classList.add('active'); + setTimeout(function () { + clearButton.classList.remove('active'); + }, 1500); + }); + + + // Copy all logs button + var copyButton = document.createElement('button'); + copyButton.classList.add('copy-button', 'bubble-click-indicator', 'element'); + copyButton.title = 'copy to clipboard'; + consoleTopBar.appendChild(copyButton); + + var copyIcon = document.createElement('div'); + copyIcon.classList.add('icon'); + copyButton.appendChild(copyIcon); + + copyButton.addEventListener('click', function () { + if (navigator.clipboard) { + var clipboardText = consoleDiv.innerText; + navigator.clipboard.writeText(clipboardText).then(function () { + copyButton.setAttribute('data-before', 'copied'); + }).catch(function () { + copyButton.setAttribute('data-before', 'copy with navigator.clipboard failed'); + }); + } else { + copyButton.setAttribute('data-before', 'copy failed - navigator.clipboard not supported'); + } + + // Show copy feedback to the user + copyButton.classList.add('active'); + setTimeout(function () { + copyButton.classList.remove('active'); + }, 1500); + }); +} + +function addTopBarLogCounter(consoleTopBar) { + + addLogToggle = (logLevels) => { + var counter = document.createElement('div'); + const logLevelsArray = logLevels.split(','); + counter.classList.add('log-counter', 'bubble-click-indicator', 'element', ...logLevelsArray); + counter.setAttribute('data-loglevels', logLevels); + counter.title = logLevels; + let count = 0; + logLevelsArray.forEach(logLevel => { + count += logCounter[logLevel]; + logCounterDivs[logLevel] = counter; + }); + consoleTopBar.appendChild(counter); + + var checkbox = document.createElement('input'); + checkbox.type = 'checkbox'; + checkbox.id = `counter-${logLevels}`; + checkbox.name = checkbox.id; + checkbox.checked = true; + checkbox.setAttribute('hidden', 'true'); + counter.appendChild(checkbox); + + var counterText = document.createElement('label'); + counterText.className = 'counter'; + counterText.htmlFor = checkbox.id; + counterText.innerHTML = count; + counter.appendChild(counterText); + + checkbox.addEventListener('change', (event) => { + var logLevels = event.currentTarget.parentNode.getAttribute('data-loglevels'); + const logLevelsArray = logLevels.split(','); + var debugConsole = document.getElementById('debugConsole'); + if (event.currentTarget.checked) { + logLevelsArray.forEach(element => { + debugConsole.classList.remove(`hidelogs-${element}`); + }); + } else { + logLevelsArray.forEach(element => { + debugConsole.classList.add(`hidelogs-${element}`); + }); + } + }) + } + + addLogToggle('debug,log,info'); + addLogToggle('warn'); + addLogToggle('error'); +} + +function applyScrollToBottom(toBottomButton) { + toBottomButton.setAttribute('data-before', scrollToBottom ? 'locked' : 'unlocked'); + if (scrollToBottom) { + toBottomButton.classList.add("locked"); + } else { + toBottomButton.classList.remove("locked"); + } + applyScrollToBottomSetting(); +} + +function applyScrollToBottomSetting() { + if (scrollToBottom) { + consoleDiv.scrollTo(0, consoleDiv.scrollHeight); + } +} + +function applyTimestamp(timestampButton) { + timestampButton.setAttribute('data-before', addTimestamp ? 'Show' : 'Hide'); + if (addTimestamp) { + timestampButton.classList.add("show"); + } else { + timestampButton.classList.remove("show"); + } + applyTimestampSetting(); +} + +function applyTimestampSetting() { + var debugConsole = document.getElementById('debugConsole'); + if (addTimestamp) { + debugConsole.classList.remove("hidelogtimestamps"); + } else { + debugConsole.classList.add("hidelogtimestamps"); + } +} + +function setupConsoleLogPipe() { + // Store actual console log functions + let defaultConsoleLog = console.log; + let defaultConsoleInfo = console.info; + let defaultConsoleDebug = console.debug; + let defaultConsoleWarn = console.warn; + let defaultConsoleError = console.error; + + // Overwrite log functions to parse and pipe to debug html console + console.log = (message) => { handleLog(message, 'log', defaultConsoleLog); }; + console.info = (message) => { handleLog(message, 'info', defaultConsoleInfo); }; + console.debug = (message) => { handleLog(message, 'debug', defaultConsoleDebug); }; + console.warn = (message) => { handleLog(message, 'warn', defaultConsoleWarn); }; + console.error = (message) => { handleLog(message, 'error', defaultConsoleError); errorReceived(); }; + + + handleLog = (message, logLevel, consoleLogFunction) => { + updateLogCounter(logLevel); + if (typeof message === 'string') { + // Only parse messages that are actual strings + parseMessageAndLog(message, logLevel, consoleLogFunction); + } + else { + consoleLogFunction(message); + // Try to also log the object to the html console (does not always work in a meaningful manner) + var htmlMessage; + try { + htmlMessage = JSON.stringify(message); + } catch (error) { + htmlMessage = `Can't convert message to JSON: ${error}`; + } + htmlLog(htmlMessage, logLevel); + } + }; + + parseMessageAndLog = (message, logLevel, consoleLogFunction) => { + let styledTextParts = parseUnityRichText(message); + + let consoleText = ''; + let consoleStyle = []; + let htmlText = ''; + styledTextParts.forEach(textPart => { + consoleText += textPart.toConsoleTextString(); + consoleStyle.push(textPart.toConsoleStyleString()); + htmlText += textPart.toHTML(); + }); + htmlLog(htmlText.trim(), logLevel); + consoleLogFunction(consoleText, ...consoleStyle); + }; +} + +class StyledTextPart { + constructor(text, styles) { + this.text = text; + this.styles = styles; + } + + toHTML() { + if (this.styles.length > 0) { + return `${this.text}`; + } + return this.text; + } + + toConsoleStyleString() { + if (this.styles.length > 0) { + return this.styles.join(';'); + } + // Return some styling that does not change anything to support unstyled text + return 'color:inherit'; + } + + toConsoleTextString() { + return `%c${this.text}`; + } +} + +function parseUnityRichText(message) { + // Mapping for unity tags to css style tags + // Unity rich text tags, see https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/StyledText.html + const tagMap = { + 'color': { startTag: '', styleTag: 'color:', postfix: '', hasParameter: true }, + 'size': { startTag: '', styleTag: 'font-size:', postfix: 'px', hasParameter: true }, + 'bold': { startTag: '', styleTag: 'font-weight:', styleValue: 'bold', hasParameter: false }, + 'italic': { startTag: '', styleTag: 'font-style:', styleValue: 'italic', hasParameter: false } + }; + + let index = 0; + const styledTextParts = []; + + // Stack of applied styles, so we can also nest styling + let styleStack = []; + // next start index for each tag + let nextStartIndex = []; + // next end index for each tag + let nextEndIndex = []; + Object.keys(tagMap).forEach(key => { + nextStartIndex[key] = message.indexOf(tagMap[key].startTag, index); + nextEndIndex[key] = message.indexOf(tagMap[key].closeTag, index); + }); + + while (index < message.length) { + let nextTagFound = false; + let nextKey; + let fromArray = []; + let nextIndex = message.length; + + // find the next tag start or end + Object.keys(tagMap).forEach(key => { + if (nextStartIndex[key] >= 0 && nextStartIndex[key] < nextIndex) { + nextIndex = nextStartIndex[key]; + nextKey = key; + fromArray = nextStartIndex; + nextTagFound = true; + } + + if (nextEndIndex[key] >= 0 && nextEndIndex[key] < nextIndex) { + nextIndex = nextEndIndex[key]; + nextKey = key; + fromArray = nextEndIndex; + nextTagFound = true; + } + }); + + // write the text in before the next tag to our style text part array + if (nextIndex > index) { + let messageToNextTag = message.substring(index, nextIndex); + let styles = [...styleStack]; + styledTextParts.push(new StyledTextPart(messageToNextTag, styles)); + } + + // end if no more tags exist + if (nextTagFound === false) { + index = message.length; + break; + } + + let closeTagIndex = message.indexOf('>', nextIndex + 1); + + // Process start tag + if (fromArray === nextStartIndex) { + let styleValue; + if (tagMap[nextKey].hasParameter) { + styleValue = message.substring(nextIndex + tagMap[nextKey].startTag.length, closeTagIndex); + styleValue += tagMap[nextKey].postfix; + } else { + styleValue = tagMap[nextKey].styleValue; + } + styleStack.push(`${tagMap[nextKey].styleTag}${styleValue}`); + + // Update list entry to next unprocessed start tag of type nextKey + nextStartIndex[nextKey] = message.indexOf(tagMap[nextKey].startTag, nextIndex + 1); + } + // process end tag + else if (fromArray === nextEndIndex) { + styleStack.pop(); + + // Update list entry to next unprocessed end tag of type nextKey + nextEndIndex[nextKey] = message.indexOf(tagMap[nextKey].closeTag, nextIndex + 1); + } + + // Update index to position after the tag closes + index = closeTagIndex + 1; + } + return styledTextParts; +} + +function updateLogCounter(logLevel) { + logCounter[logLevel]++; + + counter = logCounterDivs[logLevel]; + const logLevels = counter.getAttribute('data-loglevels'); + const logLevelsArray = logLevels.split(','); + let count = 0; + logLevelsArray.forEach(logLevel => { + count += logCounter[logLevel]; + }); + + counter.querySelector(".counter").innerHTML = count; +} + +function htmlLog(message, className) { + var entry = document.createElement('div'); + entry.classList.add('entry', className); + consoleDiv.appendChild(entry); + + var text = document.createElement('p'); + var time = new Date().toLocaleTimeString('en-US', { + hour12: false, + hour: "numeric", + minute: "numeric", + second: "numeric" + }); + message = "[" + time + "] " + message; + message = message.replaceAll("\n", "
"); + text.innerHTML = message; + entry.appendChild(text); + + var copyButton = document.createElement('button'); + copyButton.classList.add('copy-button', 'bubble-click-indicator'); + copyButton.title = 'copy to clipboard'; + entry.appendChild(copyButton); + + var copyIcon = document.createElement('div'); + copyIcon.classList.add('icon'); + copyButton.appendChild(copyIcon); + + copyButton.addEventListener('click', function () { + if (navigator.clipboard) { + var clipboardText = text.innerText; + navigator.clipboard.writeText(clipboardText).then(function () { + copyButton.setAttribute('data-before', 'copied'); + }).catch(function () { + copyButton.setAttribute('data-before', 'copy with navigator.clipboard failed'); + }); + } else { + copyButton.setAttribute('data-before', 'copy failed - navigator.clipboard not supported'); + } + + // Show copy feedback to the user + copyButton.classList.add('active'); + setTimeout(function () { + copyButton.classList.remove('active'); + }, 1500); + }); + + + if (scrollToBottom) { + consoleDiv.scrollTo(0, consoleDiv.scrollHeight); + } +} + +function errorReceived() { + if (debugToggle.checked === false) { + let debugToggleMenu = document.getElementById('debugToggleMenu'); + debugToggleMenu.classList.remove('unseen-error'); + // trigger reflow + debugToggleMenu.offsetWidth; + debugToggleMenu.classList.add('unseen-error'); + } +} + +function initializeToggleButton(startActive) { + debugToggle = document.createElement('input'); + debugToggle.type = 'checkbox'; + debugToggle.id = 'debugToggle'; + debugToggle.name = 'debugToggle'; + debugToggle.checked = startActive; + document.body.appendChild(debugToggle); + + var debugLabel = document.createElement('label'); + debugLabel.id = 'debugToggleMenu'; + debugLabel.htmlFor = 'debugToggle'; + document.body.appendChild(debugLabel); + var iconDiv = document.createElement('div'); + iconDiv.classList = 'icon'; + debugLabel.appendChild(iconDiv); + + debugToggle.addEventListener('change', (event) => { + if (event.currentTarget.checked) { + applyScrollToBottomSetting(); + debugLabel.classList.remove('unseen-error'); + } + + if (typeof unityGame === 'undefined') { + return; + } + if (event.currentTarget.checked) { + runUnityCommand("DisableCaptureAllKeyboardInput"); + return; + } + + if (typeof unityCaptureAllKeyboardInputDefault !== 'undefined' && unityCaptureAllKeyboardInputDefault === 'false') { + runUnityCommand("DisableCaptureAllKeyboardInput"); + } + else { + runUnityCommand("EnableCaptureAllKeyboardInput"); + } + }) +} + +function getInfoPanel() { + let infoPanel = document.getElementById('infoPanel'); + + if (infoPanel == null || infoPanel == 'undefined') { + infoPanel = document.createElement('div'); + infoPanel.id = 'infoPanel'; + document.body.appendChild(infoPanel); + var infoHeader = document.createElement('h3'); + if (typeof unityVersion != `undefined` && typeof webGlVersion != `undefined`) { + // Set by WebGlBridge in Unity + infoHeader.textContent = `Unity ${unityVersion} (${webGlVersion})`; + } else { + infoHeader.textContent = `Unity InfoPanel`; + } + infoPanel.appendChild(infoHeader); + } + + return infoPanel; +} + +function setInfoPanelVisible(visible) { + const infoPanel = getInfoPanel(); + if (visible) { + infoPanel.style.visibility = 'visible'; + } + else { + infoPanel.style.visibility = 'hidden'; + } +} + +function getOrCreateInfoEntry(id) { + const infoPanel = getInfoPanel(); + var entry = infoPanel.querySelector(':scope > #' + id); + + if (entry == null || entry == 'undefined') { + entry = document.createElement('div'); + entry.id = id; + infoPanel.appendChild(entry); + } + + return entry; +} + +function onAddTimeTracker(eventName) { + refreshTrackingDiv(); +} + +function onFpsTrackingEvent(fps) { + const fpsDiv = getOrCreateInfoEntry('fps'); + fpsDiv.textContent = `FPS: ${fps.toFixed(1)}`; +} + +function refreshTrackingDiv() { + const trackingDiv = getOrCreateInfoEntry('tracking'); + let innerHtml = '
'; + unityTimeTrackers.forEach((value, key, map) => { + innerHtml += `
+
${key}
+
${(value / 1000.0).toFixed(2)}
+
${value}
+
`; + }); + innerHtml += '
'; + trackingDiv.innerHTML = innerHtml; +} + +// Polyfill for older browsers +if (!String.prototype.replaceAll) { + String.prototype.replaceAll = function(str, newStr) { + if (str === '?') + str = '\\\\?'; + return this.replace(str instanceof RegExp ? str : new RegExp(str, 'g'), newStr); + } +} + +const urlParams = new URLSearchParams(window.location.search); +const debugParam = urlParams.get('debug'); +const debug = debugParam === 'true'; + +initializeToggleButton(debug); +initializeDebugConsole(); \ No newline at end of file diff --git a/Assets/WebGLTemplates/Develop/debug-console.js.meta b/Assets/WebGLTemplates/Develop/debug-console.js.meta new file mode 100644 index 0000000..758ce20 --- /dev/null +++ b/Assets/WebGLTemplates/Develop/debug-console.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 056d74a354899704ab8bdad10fdcce2b +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/Develop/favicon.ico b/Assets/WebGLTemplates/Develop/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..28894a4bb494583d93727e136111b1d905df10cb GIT binary patch literal 4286 zcmc(jSx*!}5P;kG;G6j5GmriNFvj?xi4O_{O^Asi5;a~JR`7@@B(QRcs8JIYK@J5I z4znmnP!Iz_P&eH7A?kuGmmI6GunJgqb+((GotfPs5o}UBGu2h~Rrhw+PD98#`se9M z@RQ_iB4jfmWD6ClB0H&|UTf3&cyFWmVGI&1>4VYkQX~`KWdG71%koYNZ`2KchC+Tl8zL#)*S}f4n(gdHnIwblz zt5xEsz~?o>rCr2fKPZ1`fQq6*sCrcj(~}d7SDcpv*Uz6~z7c`GF!RI0_}|AyMII^F zV_d~XKGrl<8)T0ReG~EO-j*xc8f&VUjctA&u7wwKS%BB#5_14<5*{BVSdgEQO5#gefAtA<6q9pi`5sN1LhOvw@oodN@5H* zgW}w5VUv;=E%cdpl7xPl!N#P*r+suEVNK<&x1$Zt@7tjmr@gVBnOSFM#9pg=TfuZT z+q~xW=ad^`bu>5f6rjJm6D|bolI0M6@(^I%!`ATr9qY&M1Ka1`9+|xZM}7PbHJOhO z<9+Gt0sU$DTCXTFU^gr-E<*aP1a^-fydF9*9rHmx{suVe6z{PHV13EDn+!OolXPD< z8$W>IX*$H53S@K4>jthn-mnh2h_C7Q&)L7SPKfVhUWTryX$2#_%IOb81@krIr&O|o81G=-* z+#h>37z%STp}na=>_r#x*_nv;|F`#V`x)TBoj>e+Jcnetm?zEiuQ3Kae<_{;BdPzI zpFeR9c%yuNCgNuUUL$y|)OzK9e2=lU#yR|IA;iN($cAb{*6Z + + + + + + {{{ PRODUCT_NAME }}} + + + + + +
+ +
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/Assets/WebGLTemplates/Develop/index.html.meta b/Assets/WebGLTemplates/Develop/index.html.meta new file mode 100644 index 0000000..8b8b4cd --- /dev/null +++ b/Assets/WebGLTemplates/Develop/index.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 510dcfb8b68d5b94594aeba2bb2394f0 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/Develop/logo.svg b/Assets/WebGLTemplates/Develop/logo.svg new file mode 100644 index 0000000..39d31e0 --- /dev/null +++ b/Assets/WebGLTemplates/Develop/logo.svg @@ -0,0 +1,2 @@ + + diff --git a/Assets/WebGLTemplates/Develop/logo.svg.meta b/Assets/WebGLTemplates/Develop/logo.svg.meta new file mode 100644 index 0000000..3576316 --- /dev/null +++ b/Assets/WebGLTemplates/Develop/logo.svg.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a1848e23bf684e547a1e7f722eb13e6c +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/Develop/thumbnail.png b/Assets/WebGLTemplates/Develop/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..88f5bca0306a11c4017ec773fcadeda4c28140f4 GIT binary patch literal 12764 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

0?_`iB>lfM{l)PAjq?TP3Cj;~iYHpo SW)}Ml1W;AfR4A0Q3i>Yvv#Cu0 literal 0 HcmV?d00001 diff --git a/Assets/WebGLTemplates/Develop/thumbnail.png.meta b/Assets/WebGLTemplates/Develop/thumbnail.png.meta new file mode 100644 index 0000000..9968641 --- /dev/null +++ b/Assets/WebGLTemplates/Develop/thumbnail.png.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: fe944584e7ae614409c0997e1797ff37 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/Release.meta b/Assets/WebGLTemplates/Release.meta new file mode 100644 index 0000000..fecfef4 --- /dev/null +++ b/Assets/WebGLTemplates/Release.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b982cafe715f14f4c87cd4c5fe9aa12b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/Release/LICENSE b/Assets/WebGLTemplates/Release/LICENSE new file mode 100644 index 0000000..639f6b0 --- /dev/null +++ b/Assets/WebGLTemplates/Release/LICENSE @@ -0,0 +1,2 @@ +Licensed under MIT, Copyright Johannes Deml 2021-2023 +Template from https://github.com/JohannesDeml/UnityWebGL-LoadingTest \ No newline at end of file diff --git a/Assets/WebGLTemplates/Release/LICENSE.meta b/Assets/WebGLTemplates/Release/LICENSE.meta new file mode 100644 index 0000000..84774e3 --- /dev/null +++ b/Assets/WebGLTemplates/Release/LICENSE.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6f658e3fb5e4e3e44a4a56dfd740a92b +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/Release/favicon.ico b/Assets/WebGLTemplates/Release/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..28894a4bb494583d93727e136111b1d905df10cb GIT binary patch literal 4286 zcmc(jSx*!}5P;kG;G6j5GmriNFvj?xi4O_{O^Asi5;a~JR`7@@B(QRcs8JIYK@J5I z4znmnP!Iz_P&eH7A?kuGmmI6GunJgqb+((GotfPs5o}UBGu2h~Rrhw+PD98#`se9M z@RQ_iB4jfmWD6ClB0H&|UTf3&cyFWmVGI&1>4VYkQX~`KWdG71%koYNZ`2KchC+Tl8zL#)*S}f4n(gdHnIwblz zt5xEsz~?o>rCr2fKPZ1`fQq6*sCrcj(~}d7SDcpv*Uz6~z7c`GF!RI0_}|AyMII^F zV_d~XKGrl<8)T0ReG~EO-j*xc8f&VUjctA&u7wwKS%BB#5_14<5*{BVSdgEQO5#gefAtA<6q9pi`5sN1LhOvw@oodN@5H* zgW}w5VUv;=E%cdpl7xPl!N#P*r+suEVNK<&x1$Zt@7tjmr@gVBnOSFM#9pg=TfuZT z+q~xW=ad^`bu>5f6rjJm6D|bolI0M6@(^I%!`ATr9qY&M1Ka1`9+|xZM}7PbHJOhO z<9+Gt0sU$DTCXTFU^gr-E<*aP1a^-fydF9*9rHmx{suVe6z{PHV13EDn+!OolXPD< z8$W>IX*$H53S@K4>jthn-mnh2h_C7Q&)L7SPKfVhUWTryX$2#_%IOb81@krIr&O|o81G=-* z+#h>37z%STp}na=>_r#x*_nv;|F`#V`x)TBoj>e+Jcnetm?zEiuQ3Kae<_{;BdPzI zpFeR9c%yuNCgNuUUL$y|)OzK9e2=lU#yR|IA;iN($cAb{*6Z + + + + + + {{{ PRODUCT_NAME }}} + + + + +

+ +
+
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/Assets/WebGLTemplates/Release/index.html.meta b/Assets/WebGLTemplates/Release/index.html.meta new file mode 100644 index 0000000..d1feb13 --- /dev/null +++ b/Assets/WebGLTemplates/Release/index.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 26e67c3f0fc0c8f49be0d958eebc65bc +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/Release/logo.svg b/Assets/WebGLTemplates/Release/logo.svg new file mode 100644 index 0000000..39d31e0 --- /dev/null +++ b/Assets/WebGLTemplates/Release/logo.svg @@ -0,0 +1,2 @@ + + diff --git a/Assets/WebGLTemplates/Release/logo.svg.meta b/Assets/WebGLTemplates/Release/logo.svg.meta new file mode 100644 index 0000000..f2e00ee --- /dev/null +++ b/Assets/WebGLTemplates/Release/logo.svg.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d93790cb62f37944095e9b618a28ebe3 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/Release/pretty-console.js b/Assets/WebGLTemplates/Release/pretty-console.js new file mode 100644 index 0000000..c00c95d --- /dev/null +++ b/Assets/WebGLTemplates/Release/pretty-console.js @@ -0,0 +1,158 @@ +/// Processes all unity log messages and converts unity rich text to css styled console messages +/// from https://github.com/JohannesDeml/UnityWebGL-LoadingTest + +function setupConsoleLogPipe() { + // Store actual console log functions + let defaultConsoleLog = console.log; + let defaultConsoleInfo = console.info; + let defaultConsoleDebug = console.debug; + let defaultConsoleWarn = console.warn; + let defaultConsoleError = console.error; + + // Overwrite log functions to parse and pipe to debug html console + console.log = (message) => { handleLog(message, 'log', defaultConsoleLog); }; + console.info = (message) => { handleLog(message, 'info', defaultConsoleInfo); }; + console.debug = (message) => { handleLog(message, 'debug', defaultConsoleDebug); }; + console.warn = (message) => { handleLog(message, 'warn', defaultConsoleWarn); }; + console.error = (message) => { handleLog(message, 'error', defaultConsoleError); }; + + + handleLog = (message, logLevel, consoleLogFunction) => { + if (typeof message === 'string') { + // Only parse messages that are actual strings + parseMessageAndLog(message, logLevel, consoleLogFunction); + } + else { + consoleLogFunction(message); + } + }; + + parseMessageAndLog = (message, logLevel, consoleLogFunction) => { + let styledTextParts = parseUnityRichText(message); + let consoleText = ''; + let consoleStyle = []; + styledTextParts.forEach(textPart => { + consoleText += textPart.toConsoleTextString(); + consoleStyle.push(textPart.toConsoleStyleString()); + }); + consoleLogFunction(consoleText, ...consoleStyle); + }; +} + +class StyledTextPart { + constructor(text, styles) { + this.text = text; + this.styles = styles; + } + + toHTML() { + if (this.styles.length > 0) { + return `${this.text}`; + } + return this.text; + } + + toConsoleStyleString() { + if (this.styles.length > 0) { + return this.styles.join(';'); + } + // Return some styling that does not change anything to support unstyled text + return 'color:inherit'; + } + + toConsoleTextString() { + return `%c${this.text}`; + } +} + +function parseUnityRichText(message) { + // Mapping for unity tags to css style tags + // Unity rich text tags, see https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/StyledText.html + const tagMap = { + 'color': { startTag: '', styleTag: 'color:', postfix: '', hasParameter: true }, + 'size': { startTag: '', styleTag: 'font-size:', postfix: 'px', hasParameter: true }, + 'bold': { startTag: '', styleTag: 'font-weight:', styleValue: 'bold', hasParameter: false }, + 'italic': { startTag: '', styleTag: 'font-style:', styleValue: 'italic', hasParameter: false } + }; + + let index = 0; + const styledTextParts = []; + + // Stack of applied styles, so we can also nest styling + let styleStack = []; + // next start index for each tag + let nextStartIndex = []; + // next end index for each tag + let nextEndIndex = []; + Object.keys(tagMap).forEach(key => { + nextStartIndex[key] = message.indexOf(tagMap[key].startTag, index); + nextEndIndex[key] = message.indexOf(tagMap[key].closeTag, index); + }); + + while (index < message.length) { + let nextTagFound = false; + let nextKey; + let fromArray = []; + let nextIndex = message.length; + + // find the next tag start or end + Object.keys(tagMap).forEach(key => { + if (nextStartIndex[key] >= 0 && nextStartIndex[key] < nextIndex) { + nextIndex = nextStartIndex[key]; + nextKey = key; + fromArray = nextStartIndex; + nextTagFound = true; + } + + if (nextEndIndex[key] >= 0 && nextEndIndex[key] < nextIndex) { + nextIndex = nextEndIndex[key]; + nextKey = key; + fromArray = nextEndIndex; + nextTagFound = true; + } + }); + + // write the text in before the next tag to our style text part array + if (nextIndex > index) { + let messageToNextTag = message.substring(index, nextIndex); + let styles = [...styleStack]; + styledTextParts.push(new StyledTextPart(messageToNextTag, styles)); + } + + // end if no more tags exist + if (nextTagFound === false) { + index = message.length; + break; + } + + let closeTagIndex = message.indexOf('>', nextIndex + 1); + + // Process start tag + if (fromArray === nextStartIndex) { + let styleValue; + if (tagMap[nextKey].hasParameter) { + styleValue = message.substring(nextIndex + tagMap[nextKey].startTag.length, closeTagIndex); + styleValue += tagMap[nextKey].postfix; + } else { + styleValue = tagMap[nextKey].styleValue; + } + styleStack.push(`${tagMap[nextKey].styleTag}${styleValue}`); + + // Update list entry to next unprocessed start tag of type nextKey + nextStartIndex[nextKey] = message.indexOf(tagMap[nextKey].startTag, nextIndex + 1); + } + // process end tag + else if (fromArray === nextEndIndex) { + styleStack.pop(); + + // Update list entry to next unprocessed end tag of type nextKey + nextEndIndex[nextKey] = message.indexOf(tagMap[nextKey].closeTag, nextIndex + 1); + } + + // Update index to position after the tag closes + index = closeTagIndex + 1; + } + return styledTextParts; +} + +setupConsoleLogPipe(); \ No newline at end of file diff --git a/Assets/WebGLTemplates/Release/pretty-console.js.meta b/Assets/WebGLTemplates/Release/pretty-console.js.meta new file mode 100644 index 0000000..0ecf3eb --- /dev/null +++ b/Assets/WebGLTemplates/Release/pretty-console.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1bb29680b90349948874bd0b0db94698 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/Release/thumbnail.png b/Assets/WebGLTemplates/Release/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..39ca2381798ec49326542edfcaa29b091bab3a9a GIT binary patch literal 6798 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 literal 0 HcmV?d00001 diff --git a/Assets/WebGLTemplates/Release/thumbnail.png.meta b/Assets/WebGLTemplates/Release/thumbnail.png.meta new file mode 100644 index 0000000..e650d91 --- /dev/null +++ b/Assets/WebGLTemplates/Release/thumbnail.png.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3ba27f8ff96fc4942a416e4bd1cc0480 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base.meta b/Assets/_1Base.meta new file mode 100644 index 0000000..4b4d083 --- /dev/null +++ b/Assets/_1Base.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 829c7bd97ac1a764db6482cd28769c05 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Materials.meta b/Assets/_1Base/Materials.meta new file mode 100644 index 0000000..4f1841a --- /dev/null +++ b/Assets/_1Base/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 501eb6dbf9350df48865e29e799a96da +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Materials/Default.mat b/Assets/_1Base/Materials/Default.mat new file mode 100644 index 0000000..36588ac --- /dev/null +++ b/Assets/_1Base/Materials/Default.mat @@ -0,0 +1,78 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Default + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 1 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.5754717, g: 0.5754717, b: 0.5754717, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/_1Base/Materials/Default.mat.meta b/Assets/_1Base/Materials/Default.mat.meta new file mode 100644 index 0000000..bc5e35d --- /dev/null +++ b/Assets/_1Base/Materials/Default.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f48a05f95e67127419aae8746e7fcba2 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Materials/Ground.mat b/Assets/_1Base/Materials/Ground.mat new file mode 100644 index 0000000..7c555ac --- /dev/null +++ b/Assets/_1Base/Materials/Ground.mat @@ -0,0 +1,124 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-1457071237182138477 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 3 +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Ground + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _GLOSSINESS_FROM_BASE_ALPHA _SPECULARHIGHLIGHTS_OFF _SPECULAR_COLOR + m_LightmapFlags: 4 + m_EnableInstancingVariants: 1 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _AlphaClip: 0 + - _Blend: 0 + - _BumpScale: 1 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0 + - _GlossinessSource: 0 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _Shininess: 0 + - _Smoothness: 0 + - _SmoothnessSource: 1 + - _SmoothnessTextureChannel: 0 + - _SpecSource: 0 + - _SpecularHighlights: 0 + - _SrcBlend: 1 + - _Surface: 0 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {r: 1, g: 1, b: 1, a: 0} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecColor: {r: 0.5, g: 0.5, b: 0.5, a: 0.5} + m_BuildTextureStacks: [] diff --git a/Assets/_1Base/Materials/Ground.mat.meta b/Assets/_1Base/Materials/Ground.mat.meta new file mode 100644 index 0000000..36f0cb4 --- /dev/null +++ b/Assets/_1Base/Materials/Ground.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f22f13907502ac441ba947b33c8621d8 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Plugins.meta b/Assets/_1Base/Plugins.meta new file mode 100644 index 0000000..181e2ba --- /dev/null +++ b/Assets/_1Base/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9edc4b62d4b1449448ca2ca260816203 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Plugins/WebGL.meta b/Assets/_1Base/Plugins/WebGL.meta new file mode 100644 index 0000000..cf73754 --- /dev/null +++ b/Assets/_1Base/Plugins/WebGL.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 72da360fe7b5a2c4ea62c9e65e0286b5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Plugins/WebGL/WebBridge.meta b/Assets/_1Base/Plugins/WebGL/WebBridge.meta new file mode 100644 index 0000000..1d2e472 --- /dev/null +++ b/Assets/_1Base/Plugins/WebGL/WebBridge.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9129c0034e11cff48a70c6e7c5a17df3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Plugins/WebGL/WebBridge/Attributes.meta b/Assets/_1Base/Plugins/WebGL/WebBridge/Attributes.meta new file mode 100644 index 0000000..1a2acc7 --- /dev/null +++ b/Assets/_1Base/Plugins/WebGL/WebBridge/Attributes.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4afcbad3db10436f9e4cc055c97b6b0e +timeCreated: 1663694905 \ No newline at end of file diff --git a/Assets/_1Base/Plugins/WebGL/WebBridge/Attributes/WebCommandAttribute.cs b/Assets/_1Base/Plugins/WebGL/WebBridge/Attributes/WebCommandAttribute.cs new file mode 100644 index 0000000..53a9fc3 --- /dev/null +++ b/Assets/_1Base/Plugins/WebGL/WebBridge/Attributes/WebCommandAttribute.cs @@ -0,0 +1,22 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 Johannes Deml. All rights reserved. +// +// +// Johannes Deml +// public@deml.io +// +// -------------------------------------------------------------------------------------------------------------------- + +using System; +using JetBrains.Annotations; + +namespace Supyrb.Attributes +{ + [AttributeUsage(AttributeTargets.Method)] + [MeansImplicitUse] + public class WebCommandAttribute : Attribute + { + public string Description { get; set; } + } +} \ No newline at end of file diff --git a/Assets/_1Base/Plugins/WebGL/WebBridge/Attributes/WebCommandAttribute.cs.meta b/Assets/_1Base/Plugins/WebGL/WebBridge/Attributes/WebCommandAttribute.cs.meta new file mode 100644 index 0000000..967bd2c --- /dev/null +++ b/Assets/_1Base/Plugins/WebGL/WebBridge/Attributes/WebCommandAttribute.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4adedaccd12f40b4b2879372b0bdd118 +timeCreated: 1663694946 \ No newline at end of file diff --git a/Assets/_1Base/Plugins/WebGL/WebBridge/CommonCommands.cs b/Assets/_1Base/Plugins/WebGL/WebBridge/CommonCommands.cs new file mode 100644 index 0000000..1e4408a --- /dev/null +++ b/Assets/_1Base/Plugins/WebGL/WebBridge/CommonCommands.cs @@ -0,0 +1,231 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 Johannes Deml. All rights reserved. +// +// +// Johannes Deml +// public@deml.io +// +// -------------------------------------------------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using Supyrb.Attributes; +using UnityEngine; +using UnityEngine.Rendering; + +namespace Supyrb +{ + /// + /// Add commands to the WebGL bridge to expose them to the browser console + /// + public class CommonCommands : WebCommands + { + /// + /// Disable capturing all keyboard input, e.g. for using native html input fields + /// Browser Usage: unityGame.SendMessage("WebGL","DisableCaptureAllKeyboardInput"); + /// + [WebCommand(Description = "Disable unity from consuming all keyboard input")] + public void DisableCaptureAllKeyboardInput() + { +#if !UNITY_EDITOR && UNITY_WEBGL + WebGLInput.captureAllKeyboardInput = false; + Debug.Log($"WebGLInput.captureAllKeyboardInput: {WebGLInput.captureAllKeyboardInput}"); +#endif + } + + /// + /// Enable capturing all keyboard input, to make sure the game does not miss any key strokes + /// Browser Usage: unityGame.SendMessage("WebGL","EnableCaptureAllKeyboardInput"); + /// + [WebCommand(Description = "Enable unity from consuming all keyboard input")] + public void EnableCaptureAllKeyboardInput() + { +#if !UNITY_EDITOR && UNITY_WEBGL + WebGLInput.captureAllKeyboardInput = true; + Debug.Log($"WebGLInput.captureAllKeyboardInput: {WebGLInput.captureAllKeyboardInput}"); +#endif + } + + /// + /// Logs the current memory usage + /// Browser Usage: unityGame.SendMessage("WebGL","LogMemory"); + /// + [WebCommand(Description = "Logs the current memory")] + [ContextMenu(nameof(LogMemory))] + public void LogMemory() + { + WebToolPlugins.LogMemory(); + } + + /// + /// Unloads all unused assets + /// Browser Usage: unityGame.SendMessage("WebGL","UnloadUnusedAssets"); + /// + [WebCommand(Description = "Resources.UnloadUnusedAssets")] + [ContextMenu(nameof(UnloadUnusedAssets))] + public void UnloadUnusedAssets() + { + Resources.UnloadUnusedAssets(); + } + + /// + /// Sets if the application should run while not focused. + /// It is in background while another tab is focused or the console is focused + /// Browser Usage: unityGame.SendMessage("WebGL", "SetApplicationRunInBackground", 1); + /// + /// 1 if it should run in background + [WebCommand(Description = "Application.runInBackground")] + public void SetApplicationRunInBackground(int runInBackground) + { + Application.runInBackground = runInBackground == 1; + } + + /// + /// Sets the rendering frame rate, see + /// Browser Usage: unityGame.SendMessage("WebGL", "SetApplicationTargetFrameRate", 15); + /// + /// frame rate to render in + [WebCommand(Description = "Application.targetFrameRate")] + public void SetApplicationTargetFrameRate(int targetFrameRate) + { + Application.targetFrameRate = targetFrameRate; + } + + /// + /// Sets the interval for fixed time updates, see + /// Browser Usage: unityGame.SendMessage("WebGL", "SetTimeFixedDeltaTime", 0.02); + /// + /// + [WebCommand(Description = "Time.fixedDeltaTime")] + public void SetTimeFixedDeltaTime(float fixedDeltaTime) + { + Time.fixedDeltaTime = fixedDeltaTime; + } + + /// + /// Sets the global timeScale, see + /// Somehow the timescale also affects the physics refresh rate on WebGL + /// Browser Usage: unityGame.SendMessage("WebGL", "SetTimeTimeScale", 0.2); + /// + /// new timescale value + [WebCommand(Description = "Time.timeScale")] + public void SetTimeTimeScale(float timeScale) + { + Time.timeScale = timeScale; + } + + /// + /// Toggle the visibility of the info panel in the top right corner + /// Browser Usage: unityGame.SendMessage("WebGL", "ToggleInfoPanel"); + /// + [WebCommand(Description = "Toggle develop ui visibility of InfoPanel")] + public void ToggleInfoPanel() + { + WebToolPlugins.ToggleInfoPanel(); + } + + /// + /// Log the user agent of the browser and if this agent is classified as mobile + /// Browser Usage: unityGame.SendMessage("WebGL", "LogUserAgent"); + /// + [WebCommand(Description = "Log User Agent and isMobileDevice")] + public void LogUserAgent() + { + string userAgent = WebToolPlugins.GetUserAgent(); + bool isMobileDevice = WebToolPlugins.IsMobileDevice(); + Debug.Log($"User Agent: '{userAgent}', IsMobileDevice: '{isMobileDevice}'"); + } + + /// + /// Log example messages to show off unity rich text parsing to html & console styling + /// + [WebCommand(Description = "Log example messages for Log, warning and error")] + [ContextMenu(nameof(LogExampleMessages))] + public void LogExampleMessages() + { + Debug.Log("Example unity rich text example with red and nested blue color tags and bold + italic tags, and custom size with bold italic nesting tag."); + Debug.LogWarning("This is an example warning message!"); + Debug.LogError("This is an example error message!"); + } + + /// + /// Log a custom message to test Debug.Log in general + /// + /// Message that will be logged + [WebCommand(Description = "Log a custom message")] + public void LogMessage(string message) + { + Debug.Log(message); + } + + /// + /// Throw an exception from System namespace to see how stack traces look for that + /// + [WebCommand(Description = "Throw a dictionary key not found exception")] + [ContextMenu(nameof(ThrowDictionaryException))] + public void ThrowDictionaryException() + { + Dictionary testDictionary = new Dictionary(); + // this will throw a KeyNotFoundException because the key does not exist + Debug.Log(testDictionary[10]); + } + + /// + /// Log information of all texture formats that Unity supports, which ones are supported by + /// the current platform and browser, and which ones are not supported + /// + [WebCommand(Description = "Log supported and unsupported texture formats")] + [ContextMenu(nameof(LogTextureSupport))] + public void LogTextureSupport() + { + List supportedFormats = new List(); + List unsupportedFormats = new List(); + + foreach (TextureFormat textureFormat in Enum.GetValues(typeof(TextureFormat))) + { + var memberInfos = typeof(TextureFormat).GetMember(textureFormat.ToString()); + object[] obsoleteAttributes = memberInfos[0].GetCustomAttributes(typeof(ObsoleteAttribute), false); + if (obsoleteAttributes.Length > 0) + { + // don't evaluate obsolete enum values + continue; + } + + if (SystemInfo.SupportsTextureFormat(textureFormat)) + { + supportedFormats.Add(textureFormat); + } + else + { + unsupportedFormats.Add(textureFormat); + } + } + + Debug.Log($"Supported Texture formats: \n{string.Join(", ", supportedFormats)}"); + Debug.Log($"Unsupported Texture formats: \n{string.Join(", ", unsupportedFormats)}"); + } + + /// + /// Deletes all player prefs + /// + [WebCommand(Description = "PlayerPrefs.DeleteAll")] + [ContextMenu(nameof(DeleteAllPlayerPrefs))] + public void DeleteAllPlayerPrefs() + { + PlayerPrefs.DeleteAll(); + } + + /// + /// Log shader compilation in debug builds (no effect in release builds) + /// + /// + /// 1 if it should run in background + [WebCommand(Description = "GraphicsSettings.logWhenShaderIsCompiled")] + [ContextMenu(nameof(LogShaderCompilation))] + public void LogShaderCompilation(int enabled) + { + GraphicsSettings.logWhenShaderIsCompiled = enabled == 1; + } + } +} \ No newline at end of file diff --git a/Assets/_1Base/Plugins/WebGL/WebBridge/CommonCommands.cs.meta b/Assets/_1Base/Plugins/WebGL/WebBridge/CommonCommands.cs.meta new file mode 100644 index 0000000..4f27d21 --- /dev/null +++ b/Assets/_1Base/Plugins/WebGL/WebBridge/CommonCommands.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a607faf85f83488d973cdb69730f4aa6 +timeCreated: 1663943852 \ No newline at end of file diff --git a/Assets/_1Base/Plugins/WebGL/WebBridge/Supyrb.WebBridge.asmdef b/Assets/_1Base/Plugins/WebGL/WebBridge/Supyrb.WebBridge.asmdef new file mode 100644 index 0000000..390a17d --- /dev/null +++ b/Assets/_1Base/Plugins/WebGL/WebBridge/Supyrb.WebBridge.asmdef @@ -0,0 +1,19 @@ +{ + "name": "Supyrb.WebBridge", + "rootNamespace": "", + "references": [ + "GUID:e6be6bd2cac63ce49a95472c9d6e313a" + ], + "includePlatforms": [ + "Editor", + "WebGL" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/_1Base/Plugins/WebGL/WebBridge/Supyrb.WebBridge.asmdef.meta b/Assets/_1Base/Plugins/WebGL/WebBridge/Supyrb.WebBridge.asmdef.meta new file mode 100644 index 0000000..16b825b --- /dev/null +++ b/Assets/_1Base/Plugins/WebGL/WebBridge/Supyrb.WebBridge.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e3e069904a912bf48b82847e6703e31d +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Plugins/WebGL/WebBridge/WebBridge.cs b/Assets/_1Base/Plugins/WebGL/WebBridge/WebBridge.cs new file mode 100644 index 0000000..b41ff0f --- /dev/null +++ b/Assets/_1Base/Plugins/WebGL/WebBridge/WebBridge.cs @@ -0,0 +1,143 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2021 Johannes Deml. All rights reserved. +// +// +// Johannes Deml +// public@deml.io +// +// -------------------------------------------------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; +using Supyrb.Attributes; +using UnityEngine; +using UnityEngine.Rendering; + +namespace Supyrb +{ + /// + /// Bridge to Unity to access unity logic through the browser console + /// You can extend your commands by creating a partial class for WebBridge, see WebBridge.Commands as an example + /// + public class WebBridge : WebCommands + { + private const string WebBridgeGameObjectName = "WebBridge"; + + private static GameObject bridgeInstance; +#if UNITY_WEBGL + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] + private static void OnBeforeSceneLoadRuntimeMethod() + { + SetGlobalVariables(); + bridgeInstance = new GameObject(WebBridgeGameObjectName); + DontDestroyOnLoad(bridgeInstance); + AddAllWebCommands(); + } +#endif + + private static void AddAllWebCommands() + { + Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); + List webCommandTypes = new List(); + foreach (var assembly in assemblies) + { + Type[] types = assembly.GetTypes(); + foreach (var type in types) + { + if (type.IsSubclassOf(typeof(WebCommands))) + { + webCommandTypes.Add(type); + } + } + } + + // Sort the commands to make the output deterministic + webCommandTypes.Sort((a, b) => a.Name.CompareTo(b.Name)); + foreach (var webCommandType in webCommandTypes) + { + bridgeInstance.AddComponent(webCommandType); + } + } + + private static void SetGlobalVariables() + { + var graphicsDevice = SystemInfo.graphicsDeviceType; + string webGraphics = string.Empty; + switch (graphicsDevice) + { + case GraphicsDeviceType.OpenGLES2: + webGraphics = "WebGL 1"; + break; + case GraphicsDeviceType.OpenGLES3: + webGraphics = "WebGL 2"; + break; +#if UNITY_2023_2_OR_NEWER + case GraphicsDeviceType.WebGPU: + webGraphics = "WebGPU"; + break; +#endif + default: + webGraphics = graphicsDevice.ToString(); + break; + } + WebToolPlugins.SetVariable("webGlVersion", webGraphics); + WebToolPlugins.SetVariable("unityVersion", Application.unityVersion); +#if !UNITY_EDITOR && UNITY_WEBGL + WebToolPlugins.SetVariable("unityCaptureAllKeyboardInputDefault", WebGLInput.captureAllKeyboardInput?"true":"false"); +#endif + } + + private void Start() + { +#if (!UNITY_EDITOR && UNITY_WEBGL) || UNITY_EDITOR && WEBTOOLS_LOG_CALLS + Debug.Log($"Unity WebGL Bridge ready -> Run 'runUnityCommand(\"Help\")' in the browser console to see usage"); +#endif + } + + [WebCommand(Description = "Log all available commands")] + [ContextMenu(nameof(Help))] + public void Help() + { + StringBuilder sb = new StringBuilder(); + sb.AppendLine("Available commands:"); + + foreach (var webCommand in gameObject.GetComponents()) + { + sb.AppendLine($"---{webCommand.GetType().Name}---"); + MethodInfo[] methods = webCommand.GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance); + + for (int i = 0; i < methods.Length; i++) + { + var method = methods[i]; + WebCommandAttribute commandAttribute = method.GetCustomAttribute(); + if (commandAttribute != null) + { + sb.Append($"runUnityCommand(\"{method.Name}\""); + ParameterInfo[] parameters = method.GetParameters(); + for (int j = 0; j < parameters.Length; j++) + { + var parameter = parameters[j]; + if (parameter.ParameterType == typeof(string)) + { + sb.Append($", \"{parameter.ParameterType} {parameter.Name}\""); + } + else + { + sb.Append($", {parameter.ParameterType} {parameter.Name}"); + } + } + + sb.AppendLine($"); -> {commandAttribute.Description}"); + } + } + + } + + sb.AppendLine($"\nRun a command with 'runUnityCommand(\"COMMAND_NAME\",PARAMETER);'"); + Debug.Log(sb.ToString()); + } + } +} \ No newline at end of file diff --git a/Assets/_1Base/Plugins/WebGL/WebBridge/WebBridge.cs.meta b/Assets/_1Base/Plugins/WebGL/WebBridge/WebBridge.cs.meta new file mode 100644 index 0000000..14a6f2d --- /dev/null +++ b/Assets/_1Base/Plugins/WebGL/WebBridge/WebBridge.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 194d23b423f94013b96808d97e99604e +timeCreated: 1637525493 \ No newline at end of file diff --git a/Assets/_1Base/Plugins/WebGL/WebBridge/WebCommands.cs b/Assets/_1Base/Plugins/WebGL/WebBridge/WebCommands.cs new file mode 100644 index 0000000..f1dbc1f --- /dev/null +++ b/Assets/_1Base/Plugins/WebGL/WebBridge/WebCommands.cs @@ -0,0 +1,22 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2021 Johannes Deml. All rights reserved. +// +// +// Johannes Deml +// public@deml.io +// +// -------------------------------------------------------------------------------------------------------------------- + +using UnityEngine; + +namespace Supyrb +{ + /// + /// Inherit from this class to create commands that can be called from the browser console + /// + public abstract class WebCommands : MonoBehaviour + { + + } +} \ No newline at end of file diff --git a/Assets/_1Base/Plugins/WebGL/WebBridge/WebCommands.cs.meta b/Assets/_1Base/Plugins/WebGL/WebBridge/WebCommands.cs.meta new file mode 100644 index 0000000..35481a8 --- /dev/null +++ b/Assets/_1Base/Plugins/WebGL/WebBridge/WebCommands.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 59a73ca380a16274db71081280d94265 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Plugins/WebGL/WebTools.meta b/Assets/_1Base/Plugins/WebGL/WebTools.meta new file mode 100644 index 0000000..8747ba0 --- /dev/null +++ b/Assets/_1Base/Plugins/WebGL/WebTools.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 039a8ffcf22dc8d4b8177667e1be714e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Plugins/WebGL/WebTools/Supyrb.WebTools.asmdef b/Assets/_1Base/Plugins/WebGL/WebTools/Supyrb.WebTools.asmdef new file mode 100644 index 0000000..a144fcc --- /dev/null +++ b/Assets/_1Base/Plugins/WebGL/WebTools/Supyrb.WebTools.asmdef @@ -0,0 +1,17 @@ +{ + "name": "Supyrb.WebTools", + "rootNamespace": "", + "references": [], + "includePlatforms": [ + "Editor", + "WebGL" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/_1Base/Plugins/WebGL/WebTools/Supyrb.WebTools.asmdef.meta b/Assets/_1Base/Plugins/WebGL/WebTools/Supyrb.WebTools.asmdef.meta new file mode 100644 index 0000000..320e713 --- /dev/null +++ b/Assets/_1Base/Plugins/WebGL/WebTools/Supyrb.WebTools.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e6be6bd2cac63ce49a95472c9d6e313a +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Plugins/WebGL/WebTools/WebToolPlugins.cs b/Assets/_1Base/Plugins/WebGL/WebTools/WebToolPlugins.cs new file mode 100644 index 0000000..8b3c0cd --- /dev/null +++ b/Assets/_1Base/Plugins/WebGL/WebTools/WebToolPlugins.cs @@ -0,0 +1,259 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2021 Johannes Deml. All rights reserved. +// +// +// Johannes Deml +// public@deml.io +// +// -------------------------------------------------------------------------------------------------------------------- + +using System; +using System.Runtime.InteropServices; +using UnityEngine; +#if UNITY_WEBGL && !UNITY_EDITOR +using UnityEngine.Rendering; +#endif + +namespace Supyrb +{ + public static class WebToolPlugins + { +#if UNITY_WEBGL + [DllImport("__Internal")] + private static extern void _SetStringVariable(string variableName, string variableValue); + [DllImport("__Internal")] + private static extern void _AddTimeTrackingEvent(string eventName); + [DllImport("__Internal")] + private static extern void _AddFpsTrackingEvent(float fps); + [DllImport("__Internal")] + private static extern void _ShowInfoPanel(); + [DllImport("__Internal")] + private static extern void _HideInfoPanel(); + [DllImport("__Internal")] + private static extern string _GetUserAgent(); + [DllImport("__Internal")] + private static extern uint _GetTotalMemorySize(); + [DllImport("__Internal")] + private static extern uint _GetStaticMemorySize(); + [DllImport("__Internal")] + private static extern uint _GetDynamicMemorySize(); +#endif + + private static bool _infoPanelVisible = false; + + /// + /// Sets a global string variable in JavaScript. + /// This variable can be accessed by the console and other javascript functions + /// + /// Name of the variable + /// Value of the variable + public static void SetVariable(string variableName, string value) + { +#if UNITY_WEBGL && !UNITY_EDITOR + _SetStringVariable(variableName, value); +#elif UNITY_EDITOR && WEBTOOLS_LOG_CALLS + Debug.Log($"{nameof(WebToolPlugins)}.{nameof(SetVariable)} set {variableName}: {value}"); +#endif + } + + /// + /// Adds a time marker at the call time to the javascript map "unityTimeTrackers" + /// The mapped value is performance.now() at the time of the call + /// + /// Name of the tracking event, e.g. "Awake" + public static void AddTimeTrackingEvent(string eventName) + { +#if UNITY_WEBGL && !UNITY_EDITOR + _AddTimeTrackingEvent(eventName); +#elif UNITY_EDITOR && WEBTOOLS_LOG_CALLS + Debug.Log($"{nameof(WebToolPlugins)}.{nameof(AddTimeTrackingEvent)} called with {eventName}"); +#endif + } + + public static void AddFpsTrackingEvent(float fps) + { +#if UNITY_WEBGL && !UNITY_EDITOR + _AddFpsTrackingEvent(fps); +#elif UNITY_EDITOR && WEBTOOLS_LOG_CALLS + Debug.Log($"{nameof(WebToolPlugins)}.{nameof(AddFpsTrackingEvent)} called with {fps:0.00}"); +#endif + } + + /// + /// Show the info panel in the top right corner + /// By default triggered by in Awake + /// Needs the Develop WebGL Template to provide the logic + /// + public static void ShowInfoPanel() + { + _infoPanelVisible = true; +#if UNITY_WEBGL && !UNITY_EDITOR + _ShowInfoPanel(); +#elif UNITY_EDITOR && WEBTOOLS_LOG_CALLS + Debug.Log($"{nameof(WebToolPlugins)}.{nameof(ShowInfoPanel)} called"); +#endif + } + + /// + /// Hide the info panel in the top right corner + /// By default triggered by in Awake + /// Needs the Develop WebGL Template to provide the logic + /// + public static void HideInfoPanel() + { + _infoPanelVisible = false; +#if UNITY_WEBGL && !UNITY_EDITOR + _HideInfoPanel(); +#elif UNITY_EDITOR && WEBTOOLS_LOG_CALLS + Debug.Log($"{nameof(WebToolPlugins)}.{nameof(HideInfoPanel)} called"); +#endif + } + + /// + /// Toggle the visibility of the info panel + /// + public static void ToggleInfoPanel() + { + if (_infoPanelVisible) + { + HideInfoPanel(); + } + else + { + ShowInfoPanel(); + } + } + + /// + /// Get navigator.userAgent from the browser + /// + /// navigator.userAgent + public static string GetUserAgent() + { +#if UNITY_WEBGL && !UNITY_EDITOR + return _GetUserAgent(); +#elif UNITY_EDITOR && WEBTOOLS_LOG_CALLS + Debug.Log($"{nameof(WebToolPlugins)}.{nameof(GetUserAgent)} called"); + return "undefined"; +#else + return "undefined"; +#endif + } + + /// + /// Check user agent to determine if the game runs on a mobile device + /// + /// true if on phone or tablet + public static bool IsMobileDevice() + { + string userAgent = GetUserAgent(); + return userAgent.Contains("iPhone") || + userAgent.Contains("iPad") || + userAgent.Contains("iPod") || + userAgent.Contains("Android"); + } + + /// + /// Get the total memory size used by the application in MB + /// + /// Size in MB + public static float GetTotalMemorySize() + { +#if UNITY_WEBGL && !UNITY_EDITOR + var bytes = _GetTotalMemorySize(); + return GetMegaBytes(bytes); +#elif UNITY_EDITOR && WEBTOOLS_LOG_CALLS + Debug.Log($"{nameof(WebToolPlugins)}.{nameof(GetTotalMemorySize)} called"); + return -1f; +#else + return -1f; +#endif + } + + /// + /// Log all current memory data in MB + /// + public static void LogMemory() + { +#if UNITY_WEBGL && !UNITY_EDITOR + var managed = GetManagedMemorySize(); + var native = GetNativeMemorySize(); + var total = GetTotalMemorySize(); + Debug.Log($"Memory stats:\nManaged: {managed:0.00}MB\nNative: {native:0.00}MB\nTotal: {total:0.00}MB"); +#elif UNITY_EDITOR && WEBTOOLS_LOG_CALLS + Debug.Log($"{nameof(WebToolPlugins)}.{nameof(LogMemory)} called"); +#endif + } + + /// + /// Get the static memory size used by the application in MB + /// + /// Size in MB + public static float GetStaticMemorySize() + { +#if UNITY_WEBGL && !UNITY_EDITOR + var bytes = _GetStaticMemorySize(); + return GetMegaBytes(bytes); +#elif UNITY_EDITOR && WEBTOOLS_LOG_CALLS + Debug.Log($"{nameof(WebToolPlugins)}.{nameof(GetStaticMemorySize)} called"); + return -1f; +#else + return -1f; +#endif + } + + /// + /// Get the dynamic memory size used by the application in MB + /// + /// Size in MB + public static float GetDynamicMemorySize() + { +#if UNITY_WEBGL && !UNITY_EDITOR + var bytes = _GetStaticMemorySize(); + return GetMegaBytes(bytes); +#elif UNITY_EDITOR && WEBTOOLS_LOG_CALLS + Debug.Log($"{nameof(WebToolPlugins)}.{nameof(GetDynamicMemorySize)} called"); + return -1f; +#else + return -1f; +#endif + } + + /// + /// Get the native memory size used by the application in MB (Static + Dynamic memory) + /// + /// Size in MB + public static float GetNativeMemorySize() + { +#if UNITY_WEBGL && !UNITY_EDITOR + return GetDynamicMemorySize() + GetStaticMemorySize(); +#elif UNITY_EDITOR && WEBTOOLS_LOG_CALLS + Debug.Log($"{nameof(WebToolPlugins)}.{nameof(GetNativeMemorySize)} called"); + return -1f; +#else + return -1f; +#endif + } + + /// + /// Get the managed memory size used by the application in MB + /// + /// Size in MB + public static float GetManagedMemorySize() + { + var bytes = (uint)GC.GetTotalMemory(false); + return GetMegaBytes(bytes); + } + + /// + /// Converts bytes (B) to mega bytes (MB) + /// + /// bytes to convert + /// bytes / (1024 * 1024) + private static float GetMegaBytes(uint bytes) + { + return (float)bytes / (1024 * 1024); + } + } +} \ No newline at end of file diff --git a/Assets/_1Base/Plugins/WebGL/WebTools/WebToolPlugins.cs.meta b/Assets/_1Base/Plugins/WebGL/WebTools/WebToolPlugins.cs.meta new file mode 100644 index 0000000..4cac6b4 --- /dev/null +++ b/Assets/_1Base/Plugins/WebGL/WebTools/WebToolPlugins.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1debafe614ff40cc88523adf8f2d731b +timeCreated: 1623160706 \ No newline at end of file diff --git a/Assets/_1Base/Plugins/WebGL/WebTools/WebToolPlugins.jslib b/Assets/_1Base/Plugins/WebGL/WebTools/WebToolPlugins.jslib new file mode 100644 index 0000000..3140d6e --- /dev/null +++ b/Assets/_1Base/Plugins/WebGL/WebTools/WebToolPlugins.jslib @@ -0,0 +1,130 @@ +var WebGlPlugins = +{ + _SetStringVariable: function(variableName, variableValue) { + //convert the string from unity to javascript strings + function toString(unityString) { + if(typeof UTF8ToString !== 'undefined') { + return UTF8ToString(unityString); + } + + if (typeof Pointer_stringify !== 'undefined') { + return Pointer_stringify(unityString); + } + + return unityString; + } + + const variableNameText = toString(variableName); + const variableValueText = toString(variableValue); + window[variableNameText] = variableValueText; + }, + + _AddTimeTrackingEvent: function(eventName) { + //convert the string from unity to javascript strings + function toString(unityString) { + if(typeof UTF8ToString !== 'undefined') { + return UTF8ToString(unityString); + } + + if (typeof Pointer_stringify !== 'undefined') { + return Pointer_stringify(unityString); + } + + return unityString; + } + + if(typeof unityTimeTrackers == 'undefined') { + unityTimeTrackers = new Map(); + } + + const eventNameText = toString(eventName); + const currentTime = performance.now(); + unityTimeTrackers.set(eventNameText, currentTime); + + if(typeof onAddTimeTracker !== 'undefined') { + onAddTimeTracker(eventNameText); + } + + var currentTimeRounded = currentTime.toFixed(2); + console.log('Time tracker event ' +eventNameText +': ' + currentTimeRounded + 'ms'); + }, + + _AddFpsTrackingEvent: function(fps) { + if(typeof onFpsTrackingEvent !== 'undefined') { + onFpsTrackingEvent(fps); + } + }, + + _ShowInfoPanel: function () { + if(typeof setInfoPanelVisible !== 'undefined') { + setInfoPanelVisible(true); + } + }, + + _HideInfoPanel: function () { + if(typeof setInfoPanelVisible !== 'undefined') { + setInfoPanelVisible(false); + } + }, + + _GetUserAgent: function () { + var userAgent = navigator.userAgent; + + //Get size of the string + var bufferSize = lengthBytesUTF8(userAgent) + 1; + //Allocate memory space + var buffer = _malloc(bufferSize); + + //Copy old data to the new one then return it + if(typeof stringToUTF8 !== 'undefined') { + stringToUTF8(userAgent, buffer, bufferSize); + } + else if(typeof writeStringToMemory !== 'undefined') { + writeStringToMemory(userAgent, buffer); + } + + return buffer; + }, + + _GetTotalMemorySize: function() + { + if(typeof TOTAL_MEMORY !== 'undefined') { + return TOTAL_MEMORY; + } + + console.warn("Problem with retrieving unity value. TOTAL_MEMORY: " + typeof TOTAL_MEMORY); + return -1; + }, + + _GetTotalStackSize: function() + { + if(typeof TOTAL_STACK !== 'undefined') { + return TOTAL_STACK; + } + + console.warn("Problem with retrieving unity value. TOTAL_STACK: " + typeof TOTAL_STACK); + return -1; + }, + + _GetStaticMemorySize: function() + { + if(typeof STATICTOP !== 'undefined' && typeof STATIC_BASE !== 'undefined') { + return STATICTOP - STATIC_BASE; + } + + console.warn("Problem with retrieving unity value. STATICTOP: " + typeof STATICTOP + ", STATIC_BASE: " + typeof STATIC_BASE); + return -1; + }, + + _GetDynamicMemorySize: function() + { + if(typeof HEAP32 !== 'undefined' && typeof DYNAMICTOP_PTR !== 'undefined' && typeof DYNAMIC_BASE !== 'undefined') { + return HEAP32[DYNAMICTOP_PTR >> 2] - DYNAMIC_BASE; + } + + console.warn("Problem with retrieving unity value. HEAP32: " + typeof HEAP32 + ", DYNAMICTOP_PTR: " + typeof DYNAMICTOP_PTR + ", DYNAMIC_BASE: " + typeof DYNAMIC_BASE); + return -1; + } +}; + +mergeInto(LibraryManager.library, WebGlPlugins); diff --git a/Assets/_1Base/Plugins/WebGL/WebTools/WebToolPlugins.jslib.meta b/Assets/_1Base/Plugins/WebGL/WebTools/WebToolPlugins.jslib.meta new file mode 100644 index 0000000..a4aabbf --- /dev/null +++ b/Assets/_1Base/Plugins/WebGL/WebTools/WebToolPlugins.jslib.meta @@ -0,0 +1,32 @@ +fileFormatVersion: 2 +guid: 20f63a9c0e921964897945352987b8c3 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Plugins/WebGL/WebTools/WebToolTimeTracker.cs b/Assets/_1Base/Plugins/WebGL/WebTools/WebToolTimeTracker.cs new file mode 100644 index 0000000..3bc6bd8 --- /dev/null +++ b/Assets/_1Base/Plugins/WebGL/WebTools/WebToolTimeTracker.cs @@ -0,0 +1,103 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2021 Johannes Deml. All rights reserved. +// +// +// Johannes Deml +// public@deml.io +// +// -------------------------------------------------------------------------------------------------------------------- + +using System; +using System.Diagnostics; +using UnityEngine; + +namespace Supyrb +{ + /// + /// Tracks timing events for startup of the application + /// Runs with early execution order so the timing + /// is before other scripts with that event function + /// + [DefaultExecutionOrder(-100)] + public class WebToolTimeTracker : MonoBehaviour + { + [SerializeField] + private bool showInfoPanelByDefault = true; + + [SerializeField] + private bool trackAwakeTime = true; + + [SerializeField] + private bool trackStartTime = true; + + [Header("FPS Tracking")] + [SerializeField] + private bool trackFps = true; + + [SerializeField] + private float updateInterval = 0.5f; + + private Stopwatch stopWatch; + private int lastFrameCount; + + private void Awake() + { + if (showInfoPanelByDefault) + { + WebToolPlugins.ShowInfoPanel(); + } + else + { + WebToolPlugins.HideInfoPanel(); + } + + if(trackFps) + { + WebToolPlugins.AddFpsTrackingEvent(0); + } + + if (trackAwakeTime) + { + WebToolPlugins.AddTimeTrackingEvent("Awake"); + } + + stopWatch = Stopwatch.StartNew(); + } + + private void Start() + { + if (trackStartTime) + { + WebToolPlugins.AddTimeTrackingEvent("Start"); + } + } + + private void Update() + { + if(!trackFps) + { + this.enabled = false; + return; + } + + if(stopWatch.Elapsed.TotalSeconds > updateInterval) + { + var currentFrameCount = Time.frameCount; + var frameCount = currentFrameCount - lastFrameCount; + float fps = (float)(frameCount / stopWatch.Elapsed.TotalSeconds); + WebToolPlugins.AddFpsTrackingEvent(fps); + stopWatch.Restart(); + lastFrameCount = currentFrameCount; + } + } + + private void OnApplicationPause(bool pauseStatus) { + if (pauseStatus) { + stopWatch.Stop(); + } else { + stopWatch.Start(); + } + } + } +} \ No newline at end of file diff --git a/Assets/_1Base/Plugins/WebGL/WebTools/WebToolTimeTracker.cs.meta b/Assets/_1Base/Plugins/WebGL/WebTools/WebToolTimeTracker.cs.meta new file mode 100644 index 0000000..e191a38 --- /dev/null +++ b/Assets/_1Base/Plugins/WebGL/WebTools/WebToolTimeTracker.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ce0fe334fc7f4c8f9c4b6e2d6d29b3d9 +timeCreated: 1619509934 \ No newline at end of file diff --git a/Assets/_1Base/Prefabs.meta b/Assets/_1Base/Prefabs.meta new file mode 100644 index 0000000..40d6f47 --- /dev/null +++ b/Assets/_1Base/Prefabs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fe893e1f78bf37d4d918df1a7533a276 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Prefabs/RigidbodyCube.prefab b/Assets/_1Base/Prefabs/RigidbodyCube.prefab new file mode 100644 index 0000000..631d88e --- /dev/null +++ b/Assets/_1Base/Prefabs/RigidbodyCube.prefab @@ -0,0 +1,138 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1293945906612296 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4201519827896160} + - component: {fileID: 33072516471425884} + - component: {fileID: 23875290202771946} + - component: {fileID: 65366149667932608} + - component: {fileID: 54003196623453922} + m_Layer: 0 + m_Name: RigidbodyCube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4201519827896160 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1293945906612296} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.4, y: 0.4, z: 0.4} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &33072516471425884 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1293945906612296} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &23875290202771946 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1293945906612296} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 4294967295 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: f48a05f95e67127419aae8746e7fcba2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &65366149667932608 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1293945906612296} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!54 &54003196623453922 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1293945906612296} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 1 diff --git a/Assets/_1Base/Prefabs/RigidbodyCube.prefab.meta b/Assets/_1Base/Prefabs/RigidbodyCube.prefab.meta new file mode 100644 index 0000000..49845aa --- /dev/null +++ b/Assets/_1Base/Prefabs/RigidbodyCube.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e07994d7938242b48abe0018f25aeff0 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 100100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Prefabs/Spawner.prefab b/Assets/_1Base/Prefabs/Spawner.prefab new file mode 100644 index 0000000..c4e8552 --- /dev/null +++ b/Assets/_1Base/Prefabs/Spawner.prefab @@ -0,0 +1,50 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &908901793903734906 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7735738908754292710} + - component: {fileID: 2847481321241552518} + m_Layer: 0 + m_Name: Spawner + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7735738908754292710 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 908901793903734906} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2847481321241552518 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 908901793903734906} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c8d7136b265e5354a9ea2f86c87bb979, type: 3} + m_Name: + m_EditorClassIdentifier: + prefab: {fileID: 1293945906612296, guid: e07994d7938242b48abe0018f25aeff0, type: 3} + spawnCoolDownSeconds: 0.4 + spawnOffsetSeconds: 0 + maxInstances: 1000 diff --git a/Assets/_1Base/Prefabs/Spawner.prefab.meta b/Assets/_1Base/Prefabs/Spawner.prefab.meta new file mode 100644 index 0000000..1a65184 --- /dev/null +++ b/Assets/_1Base/Prefabs/Spawner.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5f29a07902c9bdb49ad51ec06eeee5f3 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Scenes.meta b/Assets/_1Base/Scenes.meta new file mode 100644 index 0000000..7fe8e10 --- /dev/null +++ b/Assets/_1Base/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 131a6b21c8605f84396be9f6751fb6e3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Scenes/LightingSettings.lighting b/Assets/_1Base/Scenes/LightingSettings.lighting new file mode 100644 index 0000000..19c7a29 --- /dev/null +++ b/Assets/_1Base/Scenes/LightingSettings.lighting @@ -0,0 +1,63 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!850595691 &4890085278179872738 +LightingSettings: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: LightingSettings + serializedVersion: 3 + m_GIWorkflowMode: 1 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_RealtimeEnvironmentLighting: 1 + m_BounceScale: 1 + m_AlbedoBoost: 1 + m_IndirectOutputScale: 1 + m_UsingShadowmask: 1 + m_BakeBackend: 1 + m_LightmapMaxSize: 1024 + m_BakeResolution: 40 + m_Padding: 2 + m_TextureCompression: 1 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAO: 0 + m_MixedBakeMode: 2 + m_LightmapsBakeMode: 1 + m_FilterMode: 1 + m_LightmapParameters: {fileID: 15204, guid: 0000000000000000f000000000000000, type: 0} + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_RealtimeResolution: 2 + m_ForceWhiteAlbedo: 0 + m_ForceUpdates: 0 + m_FinalGather: 0 + m_FinalGatherRayCount: 256 + m_FinalGatherFiltering: 1 + m_PVRCulling: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_LightProbeSampleCountMultiplier: 4 + m_PVRBounces: 2 + m_PVRMinBounces: 1 + m_PVREnvironmentMIS: 1 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 diff --git a/Assets/_1Base/Scenes/LightingSettings.lighting.meta b/Assets/_1Base/Scenes/LightingSettings.lighting.meta new file mode 100644 index 0000000..949fb51 --- /dev/null +++ b/Assets/_1Base/Scenes/LightingSettings.lighting.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1f487bbe83549f6499da7f4262c9232d +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Scenes/Main.unity b/Assets/_1Base/Scenes/Main.unity new file mode 100644 index 0000000..ba4a061 --- /dev/null +++ b/Assets/_1Base/Scenes/Main.unity @@ -0,0 +1,949 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.9016172, g: 0.9379761, b: 1, a: 1} + m_AmbientEquatorColor: {r: 0.7011392, g: 0.7316701, b: 0.8584906, a: 1} + m_AmbientGroundColor: {r: 0.8396226, g: 0.6805916, b: 0.47186336, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 1 + m_SubtractiveShadowColor: {r: 0.33922213, g: 0.4114251, b: 0.5943396, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 1 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 10 + m_AtlasSize: 512 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 256 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 4890085278179872738, guid: 1f487bbe83549f6499da7f4262c9232d, + type: 2} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &10080508 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 10080510} + - component: {fileID: 10080509} + m_Layer: 0 + m_Name: CameraPivot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &10080509 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 10080508} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: eba3774e190848e4faf5b4903f2ec62b, type: 3} + m_Name: + m_EditorClassIdentifier: + space: 0 + rotationAxis: {x: 0, y: 1, z: 0} + degreePerSecond: 45 + updateType: 0 +--- !u!4 &10080510 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 10080508} + serializedVersion: 2 + m_LocalRotation: {x: 0.13052616, y: 0, z: 0, w: 0.9914449} + m_LocalPosition: {x: 0, y: 1, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 534669905} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 15, y: 0, z: 0} +--- !u!1 &170076733 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 170076735} + - component: {fileID: 170076734} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &170076734 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 170076733} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 0.99215686, g: 0.96962065, b: 0.85490197, a: 1} + m_Intensity: 0.7 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 1 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 0.8 + m_Bias: 0.1 + m_NormalBias: 0.4 + m_NearPlane: 0.56 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &170076735 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 170076733} + serializedVersion: 2 + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &534669902 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 534669905} + - component: {fileID: 534669904} + - component: {fileID: 534669903} + m_Layer: 0 + m_Name: Main Camera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &534669903 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 534669902} + m_Enabled: 1 +--- !u!20 &534669904 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 534669902} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 1, g: 1, b: 1, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 1 + far clip plane: 30 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &534669905 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 534669902} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 10080510} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &624999758 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 624999762} + - component: {fileID: 624999761} + - component: {fileID: 624999760} + - component: {fileID: 624999759} + m_Layer: 0 + m_Name: GroundPlane + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!64 &624999759 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 624999758} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &624999760 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 624999758} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 4294967295 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: f22f13907502ac441ba947b33c8621d8, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &624999761 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 624999758} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &624999762 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 624999758} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 2, y: 2, z: 2} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1116415927 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1116415928} + - component: {fileID: 1116415929} + m_Layer: 0 + m_Name: Spawners + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1116415928 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1116415927} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 10, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1116415929 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1116415927} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e38fa5b62b6072d4c94d3ebff5353cb6, type: 3} + m_Name: + m_EditorClassIdentifier: + objectSpawnerPrefab: {fileID: 2847481321241552518, guid: 5f29a07902c9bdb49ad51ec06eeee5f3, + type: 3} + spawnerCount: 5 + spawnerRadius: 0.5 + spawnerCoolDown: 0.5 +--- !u!1 &1530667640 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1530667642} + - component: {fileID: 1530667641} + m_Layer: 0 + m_Name: LoadingTimeTracker + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1530667641 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1530667640} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ce0fe334fc7f4c8f9c4b6e2d6d29b3d9, type: 3} + m_Name: + m_EditorClassIdentifier: + showInfoPanelByDefault: 1 + trackAwakeTime: 1 + trackStartTime: 1 + trackFps: 1 + updateInterval: 0.5 +--- !u!4 &1530667642 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1530667640} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1635208545 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1635208547} + - component: {fileID: 1635208546} + m_Layer: 0 + m_Name: BackPlane (4) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!64 &1635208546 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1635208545} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1635208547 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1635208545} + serializedVersion: 2 + m_LocalRotation: {x: -0.4999984, y: 0.49999818, z: -0.5000016, w: 0.5000019} + m_LocalPosition: {x: -0.000022401962, y: 4, z: 5} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1964540201} + m_LocalEulerAnglesHint: {x: 0, y: 90.00001, z: -90.00001} +--- !u!1 &1705658824 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1705658828} + - component: {fileID: 1705658825} + m_Layer: 0 + m_Name: FrontPlane (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!64 &1705658825 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1705658824} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1705658828 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1705658824} + serializedVersion: 2 + m_LocalRotation: {x: 0.5000001, y: -0.5000003, z: -0.4999998, w: 0.49999985} + m_LocalPosition: {x: 0, y: 4, z: -5} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1964540201} + m_LocalEulerAnglesHint: {x: 0, y: -90.00001, z: -90.00001} +--- !u!1 &1848706333 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1848706337} + - component: {fileID: 1848706334} + m_Layer: 0 + m_Name: LeftPlane (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!64 &1848706334 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1848706333} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1848706337 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1848706333} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0.7071068, w: 0.7071068} + m_LocalPosition: {x: -5, y: 4, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1964540201} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: -90} +--- !u!1 &1919512610 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1919512612} + - component: {fileID: 1919512611} + m_Layer: 0 + m_Name: RightPlane (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!64 &1919512611 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1919512610} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1919512612 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1919512610} + serializedVersion: 2 + m_LocalRotation: {x: -0.7071068, y: 0.7071068, z: -0.0000020489094, w: 0.0000020489094} + m_LocalPosition: {x: 5, y: 4, z: 0.000014466761} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1964540201} + m_LocalEulerAnglesHint: {x: 0, y: 180.00002, z: -90.00001} +--- !u!1 &1964540200 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1964540201} + m_Layer: 0 + m_Name: InvisibleColliders + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1964540201 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1964540200} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1848706337} + - {fileID: 1705658828} + - {fileID: 1919512612} + - {fileID: 1635208547} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2066011075 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2066011079} + - component: {fileID: 2066011078} + - component: {fileID: 2066011077} + - component: {fileID: 2066011076} + - component: {fileID: 2066011080} + m_Layer: 0 + m_Name: RotatingCube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!65 &2066011076 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2066011075} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &2066011077 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2066011075} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 4294967295 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: f48a05f95e67127419aae8746e7fcba2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &2066011078 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2066011075} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &2066011079 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2066011075} + serializedVersion: 2 + m_LocalRotation: {x: 0.35355338, y: 0.1464466, z: -0.35355338, w: 0.8535535} + m_LocalPosition: {x: 0, y: 0.8535534, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 45, y: 0, z: -45} +--- !u!114 &2066011080 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2066011075} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: eba3774e190848e4faf5b4903f2ec62b, type: 3} + m_Name: + m_EditorClassIdentifier: + space: 0 + rotationAxis: {x: 0, y: 1, z: 0} + degreePerSecond: 90 + updateType: 0 +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 10080510} + - {fileID: 2066011079} + - {fileID: 1116415928} + - {fileID: 624999762} + - {fileID: 1964540201} + - {fileID: 170076735} + - {fileID: 1530667642} diff --git a/Assets/_1Base/Scenes/Main.unity.meta b/Assets/_1Base/Scenes/Main.unity.meta new file mode 100644 index 0000000..9531828 --- /dev/null +++ b/Assets/_1Base/Scenes/Main.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 99c9720ab356a0642a771bea13969a05 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Scripts.meta b/Assets/_1Base/Scripts.meta new file mode 100644 index 0000000..dc3601e --- /dev/null +++ b/Assets/_1Base/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 34713708f4e90be43beb8225982b3873 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Scripts/ConstantRotation.cs b/Assets/_1Base/Scripts/ConstantRotation.cs new file mode 100644 index 0000000..7240dfa --- /dev/null +++ b/Assets/_1Base/Scripts/ConstantRotation.cs @@ -0,0 +1,117 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2020 Johannes Deml. All rights reserved. +// +// +// Johannes Deml +// public@deml.io +// +// -------------------------------------------------------------------------------------------------------------------- + +using System; +using UnityEngine; + +namespace Supyrb +{ + /// + /// Updates the transform with a constant rotation + /// + public class ConstantRotation : MonoBehaviour + { + public enum UpdateType + { + DeltaTime, + SmoothDeltaTime, + UnscaledDeltaTime, + Constant + } + + [Tooltip("Rotating absolute in world space or relative to the axes of the object\n" + + "For root objects use self, same effect but more performant.")] + [SerializeField] + private Space space = Space.World; + + [SerializeField] + private Vector3 rotationAxis = Vector3.up; + + [SerializeField] + private float degreePerSecond = 90f; + + [SerializeField] + private UpdateType updateType = UpdateType.DeltaTime; + + private Quaternion rotationPerUpdate; + + private float deltaTime + { + get + { + switch (updateType) + { + case UpdateType.DeltaTime: + return Time.deltaTime; + case UpdateType.SmoothDeltaTime: + return Time.smoothDeltaTime; + case UpdateType.UnscaledDeltaTime: + return Time.unscaledDeltaTime; + case UpdateType.Constant: + return 0.01666f; + default: + throw new ArgumentOutOfRangeException(); + } + } + } + + + private void LateUpdate() + { + CalculatePerFrameRotation(); + ApplyRotation(); + } + + private void ApplyRotation() + { + if (space == Space.World) + { + transform.rotation = rotationPerUpdate * transform.rotation; + } + else + { + transform.localRotation *= rotationPerUpdate; + } + } + + private void CalculatePerFrameRotation() + { + rotationPerUpdate = Quaternion.AngleAxis(degreePerSecond * deltaTime, rotationAxis); + } + + public void SetRotationPerSecond(float rotationPerSecond) + { + degreePerSecond = rotationPerSecond; + } + + public void SetXRotationAxis(float x) + { + rotationAxis.x = x; + } + + public void SetYRotationAxis(float y) + { + rotationAxis.y = y; + } + + public void SetZRotationAxis(float z) + { + rotationAxis.z = z; + } + + #if UNITY_EDITOR + private void OnDrawGizmosSelected() + { + Gizmos.color = Color.yellow; + Gizmos.DrawRay(transform.position, space == Space.Self ? transform.rotation * rotationAxis.normalized : rotationAxis.normalized); + } + #endif + } +} \ No newline at end of file diff --git a/Assets/_1Base/Scripts/ConstantRotation.cs.meta b/Assets/_1Base/Scripts/ConstantRotation.cs.meta new file mode 100644 index 0000000..d2a606b --- /dev/null +++ b/Assets/_1Base/Scripts/ConstantRotation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eba3774e190848e4faf5b4903f2ec62b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Scripts/Editor.meta b/Assets/_1Base/Scripts/Editor.meta new file mode 100644 index 0000000..1adef2e --- /dev/null +++ b/Assets/_1Base/Scripts/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 04f96ed3449397d4b90594951ce7daf8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Scripts/Editor/BuildScript.cs b/Assets/_1Base/Scripts/Editor/BuildScript.cs new file mode 100644 index 0000000..97abfb4 --- /dev/null +++ b/Assets/_1Base/Scripts/Editor/BuildScript.cs @@ -0,0 +1,397 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2023 Johannes Deml. All rights reserved. +// +// +// Johannes Deml +// public@deml.io +// +// -------------------------------------------------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using JetBrains.Annotations; +using UnityEditor; +using UnityEditor.Build.Reporting; +using UnityEngine; +using UnityEngine.Rendering; + +namespace UnityBuilderAction +{ + /// + /// Used for building the project through continuous integration (CI) or semi-automated through menu items + /// Supports logging in the editor and highly configurable WebGL + /// Modified version of + /// Tailored to the needs for + /// + public static class BuildScript + { + private static readonly string Eol = Environment.NewLine; + private static bool LogVerboseBatchMode = true; + private static bool LogVerboseInEditor = false; + + private static readonly string[] Secrets = + { "androidKeystorePass", "androidKeyaliasName", "androidKeyaliasPass" }; + + private static BuildPlayerOptions buildPlayerOptions; + + [UsedImplicitly] + public static void BuildWithCommandlineArgs() + { + string[] args = Environment.GetCommandLineArgs(); + Build(args); + } + + public static void Build(string[] args) + { + buildPlayerOptions = new BuildPlayerOptions(); + + // Gather values from args + Dictionary options = GetValidatedOptions(args); + + // Set version for this build + PlayerSettings.bundleVersion = options["buildVersion"]; + PlayerSettings.macOS.buildNumber = options["buildVersion"]; + PlayerSettings.Android.bundleVersionCode = int.Parse(options["androidVersionCode"]); + + // Apply build target + var buildTarget = (BuildTarget)Enum.Parse(typeof(BuildTarget), options["buildTarget"]); + switch (buildTarget) + { + case BuildTarget.Android: + { + EditorUserBuildSettings.buildAppBundle = options["customBuildPath"].EndsWith(".aab"); + if (options.TryGetValue("androidKeystoreName", out string keystoreName) && + !string.IsNullOrEmpty(keystoreName)) + PlayerSettings.Android.keystoreName = keystoreName; + if (options.TryGetValue("androidKeystorePass", out string keystorePass) && + !string.IsNullOrEmpty(keystorePass)) + PlayerSettings.Android.keystorePass = keystorePass; + if (options.TryGetValue("androidKeyaliasName", out string keyaliasName) && + !string.IsNullOrEmpty(keyaliasName)) + PlayerSettings.Android.keyaliasName = keyaliasName; + if (options.TryGetValue("androidKeyaliasPass", out string keyaliasPass) && + !string.IsNullOrEmpty(keyaliasPass)) + PlayerSettings.Android.keyaliasPass = keyaliasPass; + break; + } + case BuildTarget.StandaloneOSX: + PlayerSettings.SetScriptingBackend(BuildTargetGroup.Standalone, ScriptingImplementation.Mono2x); + break; + case BuildTarget.WebGL: +#if UNITY_2021_2_OR_NEWER + // Use ASTC texture compression, since we are also targeting mobile versions - Don't use this for desktop only targets + buildPlayerOptions.subtarget = (int)WebGLTextureSubtarget.ASTC; +#endif + + if (options.TryGetValue("tag", out string tagVersion) && + !string.IsNullOrEmpty(tagVersion)) + { + string[] tagParameters = tagVersion.Split('-'); + if (tagParameters.Contains("minsize")) + { + PlayerSettings.WebGL.template = "PROJECT:Release"; + SetWebGlOptimization("size"); + PlayerSettings.WebGL.exceptionSupport = WebGLExceptionSupport.None; + PlayerSettings.SetIl2CppCompilerConfiguration(BuildTargetGroup.WebGL, Il2CppCompilerConfiguration.Master); + } + else if (tagParameters.Contains("debug")) + { + PlayerSettings.WebGL.template = "PROJECT:Develop"; + SetWebGlOptimization("size"); + PlayerSettings.WebGL.exceptionSupport = WebGLExceptionSupport.FullWithStacktrace; + PlayerSettings.SetIl2CppCompilerConfiguration(BuildTargetGroup.WebGL, Il2CppCompilerConfiguration.Debug); +#if UNITY_2021_2_OR_NEWER + PlayerSettings.WebGL.debugSymbolMode = WebGLDebugSymbolMode.Embedded; +#else + PlayerSettings.WebGL.debugSymbols = true; +#endif + +#if UNITY_2022_2_OR_NEWER + PlayerSettings.WebGL.showDiagnostics = true; +#endif + buildPlayerOptions.options |= BuildOptions.Development; + } + else + { + PlayerSettings.WebGL.template = "PROJECT:Develop"; + // By default use the speed setting + SetWebGlOptimization("speed"); + } + + List graphicsAPIs = new List(); + if (tagParameters.Contains("webgl1")) + { + graphicsAPIs.Add(GraphicsDeviceType.OpenGLES2); + } + if(tagParameters.Contains("webgl2")) + { + graphicsAPIs.Add(GraphicsDeviceType.OpenGLES3); + } + if(tagParameters.Contains("webgpu")) + { +#if UNITY_2023_2_OR_NEWER + graphicsAPIs.Add(GraphicsDeviceType.WebGPU); +#else + LogError("WebGPU not supported yet"); +#endif + } + + PlayerSettings.SetGraphicsAPIs(BuildTarget.WebGL, graphicsAPIs.ToArray()); + +#if UNITY_2023_1_OR_NEWER + if (tagParameters.Contains("webgl1")) + { + Log("WebGL1 not supported anymore, choosing WebGL2 instead"); + } +#endif + } + + break; + } + + // Additional options for local builds + if (!Application.isBatchMode) + { + if (options.TryGetValue("autorunplayer", out string autorunplayer)) + { + buildPlayerOptions.options |= BuildOptions.AutoRunPlayer; + } + + var projectPath = Application.dataPath.Substring(0, Application.dataPath.Length - "/Assets".Length); + BackupLastBuild($"{projectPath}/{options["customBuildPath"]}"); + } + + // Custom build + Build(buildTarget, options["customBuildPath"]); + } + + private static void BackupLastBuild(string buildPath) + { + if (Directory.Exists(buildPath)) + { + string backupFolderPath = $"{buildPath}-Previous"; + if (Directory.Exists(backupFolderPath)) + { + Directory.Delete(backupFolderPath, true); + } + Log($"Moving current build folder to backup location: {backupFolderPath}"); + Directory.Move(buildPath, backupFolderPath); + } + else if (File.Exists(buildPath)) + { + string extension = Path.GetExtension(buildPath); + string pathWithoutExtension = buildPath.Substring(0, buildPath.Length - extension.Length); + string backupFilePath = $"{pathWithoutExtension}-Previous{extension}"; + if (File.Exists(backupFilePath)) + { + File.Delete(backupFilePath); + } + Log($"Moving current build file to backup location: {backupFilePath}"); + File.Move(buildPath, backupFilePath); + } + } + + private static void SetWebGlOptimization(string value) + { +#if UNITY_2019_4_OR_NEWER + EditorUserBuildSettings.SetPlatformSettings(BuildPipeline.GetBuildTargetName(BuildTarget.WebGL), + "CodeOptimization", value); +#else + Log($"Setting {nameof(SetWebGlOptimization)} not supported by this unity version"); +#endif + } + + private static Dictionary GetValidatedOptions(string[] args) + { + ParseCommandLineArguments(args, out Dictionary validatedOptions); + + if (!validatedOptions.TryGetValue("projectPath", out string _)) + { + LogError("Missing argument -projectPath"); + EndBuild(110); + } + + if (!validatedOptions.TryGetValue("buildTarget", out string buildTarget)) + { + LogError("Missing argument -buildTarget"); + EndBuild(120); + } + + if (!Enum.IsDefined(typeof(BuildTarget), buildTarget ?? string.Empty)) + { + EndBuild(121); + } + + if (!validatedOptions.TryGetValue("customBuildPath", out string _)) + { + LogError("Missing argument -customBuildPath"); + EndBuild(130); + } + + const string defaultCustomBuildName = "TestBuild"; + if (!validatedOptions.TryGetValue("customBuildName", out string customBuildName)) + { + LogError($"Missing argument -customBuildName, defaulting to {defaultCustomBuildName}."); + validatedOptions.Add("customBuildName", defaultCustomBuildName); + } + else if (customBuildName == "") + { + LogError($"Invalid argument -customBuildName, defaulting to {defaultCustomBuildName}."); + validatedOptions.Add("customBuildName", defaultCustomBuildName); + } + + return validatedOptions; + } + + private static void ParseCommandLineArguments(string[] args, out Dictionary providedArguments) + { + providedArguments = new Dictionary(); + + LogVerbose( + $"{Eol}" + + $"###########################{Eol}" + + $"# Parsing settings #{Eol}" + + $"###########################{Eol}" + + $"{Eol}" + ); + + // Extract flags with optional values + for (int current = 0, next = 1; current < args.Length; current++, next++) + { + // Parse flag + bool isFlag = args[current].StartsWith("-"); + if (!isFlag) continue; + string flag = args[current].TrimStart('-'); + + // Parse optional value + bool flagHasValue = next < args.Length && !args[next].StartsWith("-"); + string value = flagHasValue ? args[next].TrimStart('-') : ""; + bool secret = Secrets.Contains(flag); + string displayValue = secret ? "*HIDDEN*" : "\"" + value + "\""; + + // Assign + LogVerbose($"Found flag \"{flag}\" with value {displayValue}."); + providedArguments.Add(flag, value); + } + } + + private static void Build(BuildTarget buildTarget, string filePath) + { + string[] scenes = EditorBuildSettings.scenes.Where(scene => scene.enabled).Select(s => s.path).ToArray(); + buildPlayerOptions.scenes = scenes; + buildPlayerOptions.target = buildTarget; + buildPlayerOptions.locationPathName = filePath; + + BuildSummary buildSummary = BuildPipeline.BuildPlayer(buildPlayerOptions).summary; + ReportSummary(buildSummary); + ExitWithResult(buildSummary.result); + } + + private static void ReportSummary(BuildSummary summary) + { + string summaryText = $"{Eol}" + + $"###########################{Eol}" + + $"# Build results #{Eol}" + + $"###########################{Eol}" + + $"{Eol}" + + $"Duration: {summary.totalTime.ToString()}{Eol}" + + $"Warnings: {summary.totalWarnings.ToString()}{Eol}" + + $"Errors: {summary.totalErrors.ToString()}{Eol}" + + $"Size: {summary.totalSize.ToString()} bytes{Eol}" + + $"{Eol}"; + + if (summary.totalErrors == 0) + { + Log(summaryText); + } + else + { + LogError(summaryText); + } + } + + private static void ExitWithResult(BuildResult result) + { + switch (result) + { + case BuildResult.Succeeded: + Log("Build succeeded!"); + EndBuild(0); + break; + case BuildResult.Failed: + LogError("Build failed!"); + EndBuild(101); + break; + case BuildResult.Cancelled: + LogError("Build cancelled!"); + EndBuild(102); + break; + case BuildResult.Unknown: + default: + LogError("Build result is unknown!"); + EndBuild(103); + break; + } + } + + private static void EndBuild(int returnValue) + { + if (Application.isBatchMode) + { + EditorApplication.Exit(returnValue); + } + else + { + if (returnValue != 0) + { + throw new Exception($"BuildScript ended with non-zero exitCode: {returnValue}"); + } + } + } + + private static void LogVerbose(string message) + { + if(Application.isBatchMode) + { + if (LogVerboseBatchMode) + { + Console.WriteLine(message); + } + } + else + { + if (LogVerboseInEditor) + { + Debug.Log(message); + } + } + } + + private static void Log(string message) + { + if(Application.isBatchMode) + { + Console.WriteLine(message); + } + else + { + Debug.Log(message); + } + } + + private static void LogError(string message) + { + if(Application.isBatchMode) + { + Console.WriteLine(message); + } + else + { + Debug.LogError(message); + } + } + } +} \ No newline at end of file diff --git a/Assets/_1Base/Scripts/Editor/BuildScript.cs.meta b/Assets/_1Base/Scripts/Editor/BuildScript.cs.meta new file mode 100644 index 0000000..a74c31b --- /dev/null +++ b/Assets/_1Base/Scripts/Editor/BuildScript.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ebe0003449202264c978d2946f5eff6f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Scripts/Editor/BuildScriptMenu.cs b/Assets/_1Base/Scripts/Editor/BuildScriptMenu.cs new file mode 100644 index 0000000..b499735 --- /dev/null +++ b/Assets/_1Base/Scripts/Editor/BuildScriptMenu.cs @@ -0,0 +1,144 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2022 Johannes Deml. All rights reserved. +// +// +// Johannes Deml +// public@deml.io +// +// -------------------------------------------------------------------------------------------------------------------- + +using System.Collections.Generic; +using System.Globalization; +using UnityEditor; +using UnityEngine; + +namespace UnityBuilderAction +{ + /// + /// Menu items for to build the project in the editor + /// Helpful for testing the CI behavior and semi-automated builds + /// + public class BuildScriptMenu + { + private static readonly List baseParameters = new List() + { + "-projectPath", "", + "-buildVersion", PlayerSettings.bundleVersion, + "-androidVersionCode", PlayerSettings.Android.bundleVersionCode.ToString(CultureInfo.InvariantCulture), + }; + + // Unity 2023.1+ does not support webgl1 anymore + #if !UNITY_2023_1_OR_NEWER + [MenuItem("Tools/Build WebGL/webgl1")] + public static void BuildWebGL1() + { + var parameters = new List(baseParameters); + string tag = $"{Application.unityVersion}-webgl1-manualBuild"; + SetBuildTarget(BuildTarget.WebGL, ref parameters); + SetParameterValue("-autorunplayer", "true", ref parameters); + SetParameterValue("-tag", tag, ref parameters); + SetParameterValue("-customBuildPath", $"Builds/WebGL/{tag}", ref parameters); + SetParameterValue("-customBuildName", tag, ref parameters); + BuildWithParameters(parameters); + } + + [MenuItem("Tools/Build WebGL/minsize-webgl1")] + public static void BuildWebGL1MinSize() + { + var parameters = new List(baseParameters); + string tag = $"{Application.unityVersion}-minsize-webgl1-manualBuild"; + SetBuildTarget(BuildTarget.WebGL, ref parameters); + SetParameterValue("-autorunplayer", "true", ref parameters); + SetParameterValue("-tag", tag, ref parameters); + SetParameterValue("-customBuildPath", $"Builds/WebGL/{tag}", ref parameters); + SetParameterValue("-customBuildName", tag, ref parameters); + BuildWithParameters(parameters); + } + #endif + + [MenuItem("Tools/Build WebGL/webgl2")] + public static void BuildWebGL2() + { + var parameters = new List(baseParameters); + string tag = $"{Application.unityVersion}-webgl2-manualBuild"; + SetBuildTarget(BuildTarget.WebGL, ref parameters); + SetParameterValue("-autorunplayer", "true", ref parameters); + SetParameterValue("-tag", tag, ref parameters); + SetParameterValue("-customBuildPath", $"Builds/WebGL/{tag}", ref parameters); + SetParameterValue("-customBuildName", tag, ref parameters); + BuildWithParameters(parameters); + } + + [MenuItem("Tools/Build WebGL/minsize-webgl2")] + public static void BuildWebGL2MinSize() + { + var parameters = new List(baseParameters); + string tag = $"{Application.unityVersion}-minsize-webgl2-manualBuild"; + SetBuildTarget(BuildTarget.WebGL, ref parameters); + SetParameterValue("-autorunplayer", "true", ref parameters); + SetParameterValue("-tag", tag, ref parameters); + SetParameterValue("-customBuildPath", $"Builds/WebGL/{tag}", ref parameters); + SetParameterValue("-customBuildName", tag, ref parameters); + BuildWithParameters(parameters); + } + +#if UNITY_2023_2_OR_NEWER + [MenuItem("Tools/Build WebGL/webgpu")] + public static void BuildWebGpu() + { + var parameters = new List(baseParameters); + string tag = $"{Application.unityVersion}-webgpu-manualBuild"; + SetBuildTarget(BuildTarget.WebGL, ref parameters); + SetParameterValue("-autorunplayer", "true", ref parameters); + SetParameterValue("-tag", tag, ref parameters); + SetParameterValue("-customBuildPath", $"Builds/WebGL/{tag}", ref parameters); + SetParameterValue("-customBuildName", tag, ref parameters); + BuildWithParameters(parameters); + } + + [MenuItem("Tools/Build WebGL/minsize-webgpu")] + public static void BuildWebGpuMinSize() + { + var parameters = new List(baseParameters); + string tag = $"{Application.unityVersion}-minsize-webgpu-manualBuild"; + SetBuildTarget(BuildTarget.WebGL, ref parameters); + SetParameterValue("-autorunplayer", "true", ref parameters); + SetParameterValue("-tag", tag, ref parameters); + SetParameterValue("-customBuildPath", $"Builds/WebGL/{tag}", ref parameters); + SetParameterValue("-customBuildName", tag, ref parameters); + BuildWithParameters(parameters); + } +#endif + + [MenuItem("Tools/Build WebGL/debug")] + public static void BuildWebGLDebug() + { + var parameters = new List(baseParameters); + string tag = $"{Application.unityVersion}-debug-manualBuild"; + SetBuildTarget(BuildTarget.WebGL, ref parameters); + SetParameterValue("-autorunplayer", "true", ref parameters); + SetParameterValue("-tag", tag, ref parameters); + SetParameterValue("-customBuildPath", $"Builds/WebGL/{tag}", ref parameters); + SetParameterValue("-customBuildName", tag, ref parameters); + BuildWithParameters(parameters); + } + + private static void BuildWithParameters(List parameters) + { + Debug.Log($"Build project with parameters [{string.Join(" ", parameters)}]"); + BuildScript.Build(parameters.ToArray()); + } + + private static void SetBuildTarget(BuildTarget target, ref List parameters) + { + SetParameterValue("-buildTarget", target.ToString(), ref parameters); + } + + private static void SetParameterValue(string parameter, string value, ref List parameters) + { + parameters.Add(parameter); + parameters.Add(value); + } + } +} \ No newline at end of file diff --git a/Assets/_1Base/Scripts/Editor/BuildScriptMenu.cs.meta b/Assets/_1Base/Scripts/Editor/BuildScriptMenu.cs.meta new file mode 100644 index 0000000..5cdd07b --- /dev/null +++ b/Assets/_1Base/Scripts/Editor/BuildScriptMenu.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3050f84cca1a42018d4b391f484a1def +timeCreated: 1648390417 \ No newline at end of file diff --git a/Assets/_1Base/Scripts/Editor/RemoveMobileSupportWarningWebBuild.cs b/Assets/_1Base/Scripts/Editor/RemoveMobileSupportWarningWebBuild.cs new file mode 100644 index 0000000..cd8dc5f --- /dev/null +++ b/Assets/_1Base/Scripts/Editor/RemoveMobileSupportWarningWebBuild.cs @@ -0,0 +1,50 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2021 Johannes Deml. All rights reserved. +// +// +// Johannes Deml +// public@deml.io +// +// -------------------------------------------------------------------------------------------------------------------- + +#if !UNITY_2020_1_OR_NEWER //Not needed anymore in 2020 and above +using System.IO; +using UnityEditor; +using UnityEditor.Callbacks; +using UnityEngine; + +namespace Supyrb +{ + /// + /// Removes a warning popup for mobile builds, that this platform might not be supported: + /// "Please note that Unity WebGL is not currently supported on mobiles. Press OK if you wish to continue anyway." + /// This warning only shows up for unity versions prior to 2020.1 + /// + public class RemoveMobileSupportWarningWebBuild + { + [PostProcessBuild] + public static void OnPostProcessBuild(BuildTarget target, string targetPath) + { + if (target != BuildTarget.WebGL) + { + return; + } + + var buildFolderPath = Path.Combine(targetPath, "Build"); + var info = new DirectoryInfo(buildFolderPath); + var files = info.GetFiles("*.js"); + for (int i = 0; i < files.Length; i++) + { + var file = files[i]; + var filePath = file.FullName; + var text = File.ReadAllText(filePath); + text = text.Replace("UnityLoader.SystemInfo.mobile", "false"); + + Debug.Log("Removing mobile warning from " + filePath); + File.WriteAllText(filePath, text); + } + } + } +} +#endif \ No newline at end of file diff --git a/Assets/_1Base/Scripts/Editor/RemoveMobileSupportWarningWebBuild.cs.meta b/Assets/_1Base/Scripts/Editor/RemoveMobileSupportWarningWebBuild.cs.meta new file mode 100644 index 0000000..0b0a451 --- /dev/null +++ b/Assets/_1Base/Scripts/Editor/RemoveMobileSupportWarningWebBuild.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: acf9025b6279e6c43b89053cb8856a09 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Scripts/Editor/UnityPackageScripts.cs b/Assets/_1Base/Scripts/Editor/UnityPackageScripts.cs new file mode 100644 index 0000000..259f312 --- /dev/null +++ b/Assets/_1Base/Scripts/Editor/UnityPackageScripts.cs @@ -0,0 +1,260 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2023 Johannes Deml. All rights reserved. +// +// +// Johannes Deml +// public@deml.io +// +// -------------------------------------------------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEditor.PackageManager; +using UnityEditor.PackageManager.Requests; +using UnityEngine; + +namespace UnityBuilderAction +{ + /// + /// Editor script to automatically update all packages in the project to the newest version + /// Can be used in continuous integration (CI) or through menu items in the editor + /// Uses non-blocking tasks, so you can continue working until the packages recompile + /// + public static class UnityPackageScripts + { + private static int ProgressId; + private static ListRequest ListRequest; + #if UNITY_2021_2_OR_NEWER + private static AddAndRemoveRequest AddAndRemoveRequest; + #else + private static AddRequest AddRequest; + private static Queue PackagesToAdd; + #endif + + private static bool IncludePrereleases; + + [MenuItem("Tools/Packages/Update to verified version")] + public static void UpgradeAllPackagesToVerifiedVersion() + { + IncludePrereleases = false; + StartPackageListUpdate(); + } + + [MenuItem("Tools/Packages/Update to latest pre-release")] + public static void UpgradeAllPackagesToLatestCompatibleVersion() + { + IncludePrereleases = true; + StartPackageListUpdate(); + } + + private static void StartPackageListUpdate() + { +#if UNITY_2020_1_OR_NEWER + ProgressId = Progress.Start("Update Packages", + $"Update all packages to latest version (Include Pre-Releases: {IncludePrereleases})"); +#endif + ListRequest = Client.List(); + EditorApplication.update += OnWaitForPackageList; + } + + private static void OnWaitForPackageList() + { + if (!ListRequest.IsCompleted) + { +#if UNITY_2020_1_OR_NEWER + Progress.Report(ProgressId, 0.1f, "Update package list"); +#endif + return; + } + + EditorApplication.update -= OnWaitForPackageList; + + switch (ListRequest.Status) + { + case StatusCode.Success: + Console.WriteLine("Package list updated, checking for newer package versions"); + UpdatePackages(); + break; + case StatusCode.Failure: + Console.WriteLine($"Retrieving package list failed! {ListRequest.Error}"); + EndUpdate(101); + break; + case StatusCode.InProgress: + Console.WriteLine("Retrieving package list is still in progress!"); + EndUpdate(102); + break; + default: + Console.WriteLine($"Unsupported status {ListRequest.Status}!"); + EndUpdate(103); + break; + } + } + + private static void UpdatePackages() + { + List toAdd = new List(); + List toRemove = new List(); + foreach (var package in ListRequest.Result) + { + if (package.source == PackageSource.Embedded || + package.source == PackageSource.BuiltIn || + package.source == PackageSource.Local) + { + continue; + } + + + string latestVersion = IncludePrereleases ? + package.versions.latestCompatible : +#if UNITY_2022_3_OR_NEWER + package.versions.recommended; +#elif UNITY_2019_3_OR_NEWER + package.versions.verified; +#else + package.versions.recommended; +#endif + if (package.version == latestVersion || string.IsNullOrEmpty(latestVersion)) + { + continue; + } + + Debug.Log($"Update {package.name} from {package.version} to {latestVersion}"); + toAdd.Add($"{package.name}@{latestVersion}"); + } + + if (toRemove.Count == 0 && toAdd.Count == 0) + { + Console.WriteLine("All packages up to date"); + EndUpdate(0); + return; + } + +#if UNITY_2020_1_OR_NEWER + Progress.Report(ProgressId, 0.5f, $"Updating {toAdd.Count} packages: {string.Join(", ", toAdd)}"); +#endif + +#if UNITY_2021_2_OR_NEWER + AddAndRemoveRequest = Client.AddAndRemove(toAdd.ToArray(), toRemove.ToArray()); + EditorApplication.update += OnWaitForPackageUpdates; +#else + PackagesToAdd = new Queue(toAdd); + AddRequest = Client.Add(PackagesToAdd.Dequeue()); + EditorApplication.update += OnWaitForSinglePackageUpdate; +#endif + } + +#if UNITY_2021_2_OR_NEWER + private static void OnWaitForPackageUpdates() + { +#if UNITY_2020_1_OR_NEWER + Progress.Report(ProgressId, 0.5f, null); +#endif + if (!AddAndRemoveRequest.IsCompleted) + { + return; + } + + EditorApplication.update -= OnWaitForPackageUpdates; + + switch (AddAndRemoveRequest.Status) + { + case StatusCode.Success: + Console.WriteLine($"Packages updated successful: {AddAndRemoveRequest.Result}"); + EndUpdate(0); + break; + case StatusCode.Failure: + Console.WriteLine($"Updating package list failed! {AddAndRemoveRequest.Error}"); + EndUpdate(201); + break; + case StatusCode.InProgress: + Console.WriteLine("Retrieving package list is still in progress!"); + EndUpdate(202); + break; + default: + Console.WriteLine($"Unsupported status {AddAndRemoveRequest.Status}!"); + EndUpdate(203); + break; + } + } +#else + + private static void OnWaitForSinglePackageUpdate() + { +#if UNITY_2020_1_OR_NEWER + Progress.Report(ProgressId, 0.5f, null); +#endif + if (!AddRequest.IsCompleted) + { + return; + } + + if (AddRequest.Status == StatusCode.Success) + { + if (PackagesToAdd.Count > 0) + { + // Update the next package + AddRequest = Client.Add(PackagesToAdd.Dequeue()); + return; + } + } + EditorApplication.update -= OnWaitForSinglePackageUpdate; + + switch (AddRequest.Status) + { + case StatusCode.Success: + Console.WriteLine($"Packages updated successful: {AddRequest.Result}"); + EndUpdate(0); + break; + case StatusCode.Failure: + Console.WriteLine($"Updating package list failed! {AddRequest.Error}"); + EndUpdate(201); + break; + case StatusCode.InProgress: + Console.WriteLine("Retrieving package list is still in progress!"); + EndUpdate(202); + break; + default: + Console.WriteLine($"Unsupported status {AddRequest.Status}!"); + EndUpdate(203); + break; + } + } +#endif + + private static void EndUpdate(int returnValue) + { +#if UNITY_2020_1_OR_NEWER + Progress.Finish(ProgressId, returnValue == 0 ? Progress.Status.Succeeded : Progress.Status.Failed); +#endif + Debug.Log($"Updating unity packages finished with exit code {returnValue}"); + + if (Application.isBatchMode) + { + // Hack for unity-builder v3, since it is expecting a build result output + Console.WriteLine( + $"{Environment.NewLine}" + + $"###########################{Environment.NewLine}" + + $"# Build results #{Environment.NewLine}" + + $"###########################{Environment.NewLine}" + + $"{Environment.NewLine}" + + $"Duration: 0{Environment.NewLine}" + + $"Warnings: 0{Environment.NewLine}" + + $"Errors: 0{Environment.NewLine}" + + $"Size: 0 bytes{Environment.NewLine}" + + $"{Environment.NewLine}" + ); + + EditorApplication.Exit(returnValue); + } + else + { + if (returnValue != 0) + { + throw new Exception($"BuildScript ended with non-zero exitCode: {returnValue}"); + } + } + } + } +} \ No newline at end of file diff --git a/Assets/_1Base/Scripts/Editor/UnityPackageScripts.cs.meta b/Assets/_1Base/Scripts/Editor/UnityPackageScripts.cs.meta new file mode 100644 index 0000000..c5f5940 --- /dev/null +++ b/Assets/_1Base/Scripts/Editor/UnityPackageScripts.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4a85943ee5494b40a0adfea530697402 +timeCreated: 1672773733 \ No newline at end of file diff --git a/Assets/_1Base/Scripts/ObjectSpawnController.cs b/Assets/_1Base/Scripts/ObjectSpawnController.cs new file mode 100644 index 0000000..7354f4c --- /dev/null +++ b/Assets/_1Base/Scripts/ObjectSpawnController.cs @@ -0,0 +1,100 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2020 Johannes Deml. All rights reserved. +// +// +// Johannes Deml +// public@deml.io +// +// -------------------------------------------------------------------------------------------------------------------- + +using System.Collections.Generic; +using UnityEngine; + +namespace Supyrb +{ + public class ObjectSpawnController : MonoBehaviour + { + [SerializeField] + private ObjectSpawner objectSpawnerPrefab = null; + + [SerializeField] + private int spawnerCount = 4; + + [SerializeField] + private float spawnerRadius = 0.5f; + + [SerializeField] + private float spawnerCoolDown = 0.5f; + + private List spawners; + + private void Awake() + { + spawners = new List(); + for (int i = 0; i < spawnerCount; i++) + { + var spawner = Instantiate(objectSpawnerPrefab, transform); + spawners.Add(spawner); + } + + UpdateSpawners(); + } + + [ContextMenu("Add Spawner")] + public void AddSpawner() + { + var spawner = Instantiate(objectSpawnerPrefab, transform); + spawners.Add(spawner); + UpdateSpawners(); + } + + [ContextMenu("Remove Spawner")] + public void RemoveSpawner() + { + if (spawners.Count == 0) + { + return; + } + + var spawner = spawners[spawners.Count - 1]; + spawners.RemoveAt(spawners.Count - 1); + Destroy(spawner.gameObject); + UpdateSpawners(); + } + + [ContextMenu("Pause Spawning")] + public void PauseSpawning() + { + foreach (var spawner in spawners) + { + spawner.PauseSpawning(); + } + } + + [ContextMenu("Resume Spawning")] + public void ResumeSpawning() + { + foreach (var spawner in spawners) + { + spawner.ResumeSpawning(); + } + } + + private void UpdateSpawners() + { + int count = spawners.Count; + float angleStep = 360f / count; + float coolDownStep = spawnerCoolDown / count; + for (int i = 0; i < count; i++) + { + var spawner = spawners[i]; + float angle = i * angleStep; + Vector3 position = new Vector3(Mathf.Cos(angle * Mathf.Deg2Rad), 0f, Mathf.Sin(angle * Mathf.Deg2Rad)) * spawnerRadius; + spawner.transform.localPosition = position; + spawner.SpawnCoolDownSeconds = spawnerCoolDown; + spawner.SpawnOffsetSeconds = i * coolDownStep; + } + } + } +} \ No newline at end of file diff --git a/Assets/_1Base/Scripts/ObjectSpawnController.cs.meta b/Assets/_1Base/Scripts/ObjectSpawnController.cs.meta new file mode 100644 index 0000000..0b64e29 --- /dev/null +++ b/Assets/_1Base/Scripts/ObjectSpawnController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e38fa5b62b6072d4c94d3ebff5353cb6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Scripts/ObjectSpawner.cs b/Assets/_1Base/Scripts/ObjectSpawner.cs new file mode 100644 index 0000000..5eb72e7 --- /dev/null +++ b/Assets/_1Base/Scripts/ObjectSpawner.cs @@ -0,0 +1,117 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2020 Johannes Deml. All rights reserved. +// +// +// Johannes Deml +// public@deml.io +// +// -------------------------------------------------------------------------------------------------------------------- + +using System.Collections.Generic; +using UnityEngine; + +namespace Supyrb +{ + /// + /// Spawns an object in regular intervals + /// + public class ObjectSpawner : MonoBehaviour + { + [SerializeField] + private GameObject prefab = null; + + [SerializeField] + private float spawnCoolDownSeconds = 0.5f; + + [SerializeField] + private float spawnOffsetSeconds = 0f; + + [SerializeField] + private int maxInstances = 200; + + public float SpawnCoolDownSeconds + { + get => spawnCoolDownSeconds; + set + { + spawnTimeBase += (spawnCoolDownSeconds - value) * totalSpawnCount; + spawnCoolDownSeconds = value; + } + } + + public float SpawnOffsetSeconds + { + get => spawnOffsetSeconds; + set + { + spawnTimeBase += value - spawnOffsetSeconds; + spawnOffsetSeconds = value; + } + } + public int MaxInstances + { + get => maxInstances; + set => maxInstances = value; + } + + private Queue spawnedObjects = null; + /// + /// Time from which the spawn times are calculated + /// will be set on Awake and updated when the spawner is paused, or spawning values are changed + /// + private float spawnTimeBase; + private int totalSpawnCount = 0; + private float pauseTime = 0f; + + private void Awake() + { + spawnedObjects = new Queue(maxInstances + 5); + spawnTimeBase = Time.time + spawnOffsetSeconds; + } + + private void Update() + { + float relativeSpawnTime = Time.time - spawnTimeBase; + if (Mathf.FloorToInt(relativeSpawnTime / spawnCoolDownSeconds) > totalSpawnCount) + { + SpawnObject(); + } + } + + public void PauseSpawning() + { + enabled = false; + pauseTime = Time.time; + } + + public void ResumeSpawning() + { + enabled = true; + spawnTimeBase += Time.time - pauseTime; + } + + private void SpawnObject() + { + if (spawnedObjects.Count >= maxInstances) + { + var recycleGo = spawnedObjects.Dequeue(); + recycleGo.transform.localPosition = transform.position; + recycleGo.transform.localRotation = transform.localRotation; + spawnedObjects.Enqueue(recycleGo); + return; + } + + var newGo = Instantiate(prefab, transform.position, transform.rotation); + spawnedObjects.Enqueue(newGo); + totalSpawnCount++; + } + + #if UNITY_EDITOR + private void OnDrawGizmos() + { + Gizmos.DrawWireSphere(transform.position, 0.5f); + } + #endif + } +} \ No newline at end of file diff --git a/Assets/_1Base/Scripts/ObjectSpawner.cs.meta b/Assets/_1Base/Scripts/ObjectSpawner.cs.meta new file mode 100644 index 0000000..0696358 --- /dev/null +++ b/Assets/_1Base/Scripts/ObjectSpawner.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c8d7136b265e5354a9ea2f86c87bb979 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_1Base/Scripts/ObjectSpawnerCommands.cs b/Assets/_1Base/Scripts/ObjectSpawnerCommands.cs new file mode 100644 index 0000000..fb1baea --- /dev/null +++ b/Assets/_1Base/Scripts/ObjectSpawnerCommands.cs @@ -0,0 +1,75 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2020 Johannes Deml. All rights reserved. +// +// +// Johannes Deml +// public@deml.io +// +// -------------------------------------------------------------------------------------------------------------------- + +using Supyrb.Attributes; +using UnityEngine; + +namespace Supyrb +{ + /// + /// Browser commands for spawning cubes + /// + public class ObjectSpawnerCommands : WebCommands + { + private ObjectSpawnController _objectSpawnController; + private ObjectSpawnController ObjectSpawnController + { + get + { + if (_objectSpawnController == null) + { +#if UNITY_2023_2_OR_NEWER + _objectSpawnController = Object.FindFirstObjectByType(); +#else + _objectSpawnController = Object.FindObjectOfType(); +#endif + } + + return _objectSpawnController; + } + } + + [WebCommand(Description = "Pause spawning of cubes")] + public void PauseSpawning() + { + if (ObjectSpawnController != null) + { + ObjectSpawnController.PauseSpawning(); + } + } + + [WebCommand(Description = "Resume spawning of cubes")] + public void ResumeSpawning() + { + if (ObjectSpawnController != null) + { + ObjectSpawnController.ResumeSpawning(); + } + } + + [WebCommand(Description = "Add a spawner")] + public void AddSpawner() + { + if (ObjectSpawnController != null) + { + ObjectSpawnController.AddSpawner(); + } + } + + [WebCommand(Description = "Remove a spawner")] + public void RemoveSpawner() + { + if (ObjectSpawnController != null) + { + ObjectSpawnController.RemoveSpawner(); + } + } + } +} \ No newline at end of file diff --git a/Assets/_1Base/Scripts/ObjectSpawnerCommands.cs.meta b/Assets/_1Base/Scripts/ObjectSpawnerCommands.cs.meta new file mode 100644 index 0000000..bb0dedb --- /dev/null +++ b/Assets/_1Base/Scripts/ObjectSpawnerCommands.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3d98b6e2bb055a24d8e1f75e2e849fcd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/manifest.json b/Packages/manifest.json new file mode 100644 index 0000000..1da4c5b --- /dev/null +++ b/Packages/manifest.json @@ -0,0 +1,45 @@ +{ + "dependencies": { + "com.unity.collab-proxy": "2.0.4", + "com.unity.feature.2d": "1.0.0", + "com.unity.ide.rider": "3.0.21", + "com.unity.ide.visualstudio": "2.0.18", + "com.unity.ide.vscode": "1.2.5", + "com.unity.test-framework": "1.1.31", + "com.unity.textmeshpro": "3.0.6", + "com.unity.timeline": "1.6.5", + "com.unity.ugui": "1.0.0", + "com.unity.visualscripting": "1.8.0", + "com.unity.modules.ai": "1.0.0", + "com.unity.modules.androidjni": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.cloth": "1.0.0", + "com.unity.modules.director": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.screencapture": "1.0.0", + "com.unity.modules.terrain": "1.0.0", + "com.unity.modules.terrainphysics": "1.0.0", + "com.unity.modules.tilemap": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.umbra": "1.0.0", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.unitywebrequesttexture": "1.0.0", + "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vehicles": "1.0.0", + "com.unity.modules.video": "1.0.0", + "com.unity.modules.vr": "1.0.0", + "com.unity.modules.wind": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } +} diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json new file mode 100644 index 0000000..bc8ac88 --- /dev/null +++ b/Packages/packages-lock.json @@ -0,0 +1,463 @@ +{ + "dependencies": { + "com.unity.2d.animation": { + "version": "7.0.10", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.2d.common": "6.0.6", + "com.unity.2d.sprite": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.uielements": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.2d.common": { + "version": "6.0.6", + "depth": 2, + "source": "registry", + "dependencies": { + "com.unity.2d.sprite": "1.0.0", + "com.unity.mathematics": "1.1.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.burst": "1.5.1" + }, + "url": "https://packages.unity.com" + }, + "com.unity.2d.path": { + "version": "5.0.2", + "depth": 2, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.2d.pixel-perfect": { + "version": "5.0.3", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.2d.psdimporter": { + "version": "6.0.7", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.2d.animation": "7.0.9", + "com.unity.2d.common": "6.0.6", + "com.unity.2d.sprite": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.2d.sprite": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": {} + }, + "com.unity.2d.spriteshape": { + "version": "7.0.7", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.mathematics": "1.1.0", + "com.unity.2d.common": "6.0.6", + "com.unity.2d.path": "5.0.2", + "com.unity.modules.physics2d": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.2d.tilemap": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": {} + }, + "com.unity.2d.tilemap.extras": { + "version": "2.2.5", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.modules.tilemap": "1.0.0", + "com.unity.2d.tilemap": "1.0.0", + "com.unity.ugui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.burst": { + "version": "1.6.6", + "depth": 3, + "source": "registry", + "dependencies": { + "com.unity.mathematics": "1.2.1" + }, + "url": "https://packages.unity.com" + }, + "com.unity.collab-proxy": { + "version": "2.0.4", + "depth": 0, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.ext.nunit": { + "version": "1.0.6", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.feature.2d": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.2d.animation": "7.0.10", + "com.unity.2d.pixel-perfect": "5.0.3", + "com.unity.2d.psdimporter": "6.0.7", + "com.unity.2d.sprite": "1.0.0", + "com.unity.2d.spriteshape": "7.0.7", + "com.unity.2d.tilemap": "1.0.0", + "com.unity.2d.tilemap.extras": "2.2.5" + } + }, + "com.unity.ide.rider": { + "version": "3.0.21", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ext.nunit": "1.0.6" + }, + "url": "https://packages.unity.com" + }, + "com.unity.ide.visualstudio": { + "version": "2.0.18", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.test-framework": "1.1.9" + }, + "url": "https://packages.unity.com" + }, + "com.unity.ide.vscode": { + "version": "1.2.5", + "depth": 0, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.mathematics": { + "version": "1.2.6", + "depth": 2, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.test-framework": { + "version": "1.1.31", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ext.nunit": "1.0.6", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.textmeshpro": { + "version": "3.0.6", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ugui": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.timeline": { + "version": "1.6.5", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.modules.director": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.ugui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0" + } + }, + "com.unity.visualscripting": { + "version": "1.8.0", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ugui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.modules.ai": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.androidjni": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.animation": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.assetbundle": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.audio": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.cloth": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0" + } + }, + "com.unity.modules.director": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.animation": "1.0.0" + } + }, + "com.unity.modules.imageconversion": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.imgui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.jsonserialize": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.particlesystem": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.physics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.physics2d": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.screencapture": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.subsystems": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.terrain": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.terrainphysics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.terrain": "1.0.0" + } + }, + "com.unity.modules.tilemap": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics2d": "1.0.0" + } + }, + "com.unity.modules.ui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.uielements": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.uielementsnative": "1.0.0" + } + }, + "com.unity.modules.uielementsnative": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.umbra": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.unityanalytics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.unitywebrequest": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.unitywebrequestassetbundle": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" + } + }, + "com.unity.modules.unitywebrequestaudio": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.audio": "1.0.0" + } + }, + "com.unity.modules.unitywebrequesttexture": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.unitywebrequestwww": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.vehicles": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0" + } + }, + "com.unity.modules.video": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" + } + }, + "com.unity.modules.vr": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } + }, + "com.unity.modules.wind": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.xr": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.subsystems": "1.0.0" + } + } + } +} diff --git a/ProjectSettings/AudioManager.asset b/ProjectSettings/AudioManager.asset new file mode 100644 index 0000000..27287fe --- /dev/null +++ b/ProjectSettings/AudioManager.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!11 &1 +AudioManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Volume: 1 + Rolloff Scale: 1 + Doppler Factor: 1 + Default Speaker Mode: 2 + m_SampleRate: 0 + m_DSPBufferSize: 1024 + m_VirtualVoiceCount: 512 + m_RealVoiceCount: 32 + m_SpatializerPlugin: + m_AmbisonicDecoderPlugin: + m_DisableAudio: 0 + m_VirtualizeEffects: 1 + m_RequestedDSPBufferSize: 0 diff --git a/ProjectSettings/ClusterInputManager.asset b/ProjectSettings/ClusterInputManager.asset new file mode 100644 index 0000000..e7886b2 --- /dev/null +++ b/ProjectSettings/ClusterInputManager.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!236 &1 +ClusterInputManager: + m_ObjectHideFlags: 0 + m_Inputs: [] diff --git a/ProjectSettings/DynamicsManager.asset b/ProjectSettings/DynamicsManager.asset new file mode 100644 index 0000000..72d1430 --- /dev/null +++ b/ProjectSettings/DynamicsManager.asset @@ -0,0 +1,37 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!55 &1 +PhysicsManager: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_Gravity: {x: 0, y: -9.81, z: 0} + m_DefaultMaterial: {fileID: 0} + m_BounceThreshold: 2 + m_DefaultMaxDepenetrationVelocity: 10 + m_SleepThreshold: 0.005 + m_DefaultContactOffset: 0.01 + m_DefaultSolverIterations: 6 + m_DefaultSolverVelocityIterations: 1 + m_QueriesHitBackfaces: 0 + m_QueriesHitTriggers: 1 + m_EnableAdaptiveForce: 0 + m_ClothInterCollisionDistance: 0.1 + m_ClothInterCollisionStiffness: 0.2 + m_ContactsGeneration: 1 + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + m_AutoSimulation: 1 + m_AutoSyncTransforms: 0 + m_ReuseCollisionCallbacks: 1 + m_ClothInterCollisionSettingsToggle: 0 + m_ClothGravity: {x: 0, y: -9.81, z: 0} + m_ContactPairsMode: 0 + m_BroadphaseType: 0 + m_WorldBounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 250, y: 250, z: 250} + m_WorldSubdivisions: 8 + m_FrictionType: 0 + m_EnableEnhancedDeterminism: 0 + m_EnableUnifiedHeightmaps: 1 + m_SolverType: 0 + m_DefaultMaxAngularSpeed: 50 diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset new file mode 100644 index 0000000..0147887 --- /dev/null +++ b/ProjectSettings/EditorBuildSettings.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1045 &1 +EditorBuildSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Scenes: [] + m_configObjects: {} diff --git a/ProjectSettings/EditorSettings.asset b/ProjectSettings/EditorSettings.asset new file mode 100644 index 0000000..fa3ed49 --- /dev/null +++ b/ProjectSettings/EditorSettings.asset @@ -0,0 +1,40 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!159 &1 +EditorSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_SerializationMode: 2 + m_LineEndingsForNewScripts: 0 + m_DefaultBehaviorMode: 1 + m_PrefabRegularEnvironment: {fileID: 0} + m_PrefabUIEnvironment: {fileID: 0} + m_SpritePackerMode: 4 + m_SpritePackerPaddingPower: 1 + m_EtcTextureCompressorBehavior: 1 + m_EtcTextureFastCompressor: 1 + m_EtcTextureNormalCompressor: 2 + m_EtcTextureBestCompressor: 4 + m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;asmref;rsp + m_ProjectGenerationRootNamespace: + m_EnableTextureStreamingInEditMode: 1 + m_EnableTextureStreamingInPlayMode: 1 + m_AsyncShaderCompilation: 1 + m_CachingShaderPreprocessor: 1 + m_PrefabModeAllowAutoSave: 1 + m_EnterPlayModeOptionsEnabled: 0 + m_EnterPlayModeOptions: 3 + m_GameObjectNamingDigits: 1 + m_GameObjectNamingScheme: 0 + m_AssetNamingUsesSpace: 1 + m_UseLegacyProbeSampleCount: 0 + m_SerializeInlineMappingsOnOneLine: 1 + m_DisableCookiesInLightmapper: 1 + m_AssetPipelineMode: 1 + m_CacheServerMode: 0 + m_CacheServerEndpoint: + m_CacheServerNamespacePrefix: default + m_CacheServerEnableDownload: 1 + m_CacheServerEnableUpload: 1 + m_CacheServerEnableAuth: 0 + m_CacheServerEnableTls: 0 diff --git a/ProjectSettings/GraphicsSettings.asset b/ProjectSettings/GraphicsSettings.asset new file mode 100644 index 0000000..c165afb --- /dev/null +++ b/ProjectSettings/GraphicsSettings.asset @@ -0,0 +1,64 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!30 &1 +GraphicsSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_Deferred: + m_Mode: 1 + m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} + m_DeferredReflections: + m_Mode: 1 + m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} + m_ScreenSpaceShadows: + m_Mode: 1 + m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} + m_LegacyDeferred: + m_Mode: 1 + m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} + m_DepthNormals: + m_Mode: 1 + m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} + m_MotionVectors: + m_Mode: 1 + m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} + m_LightHalo: + m_Mode: 1 + m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} + m_LensFlare: + m_Mode: 1 + m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} + m_VideoShadersIncludeMode: 2 + m_AlwaysIncludedShaders: + - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0} + m_PreloadedShaders: [] + m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + m_CustomRenderPipeline: {fileID: 0} + m_TransparencySortMode: 0 + m_TransparencySortAxis: {x: 0, y: 0, z: 1} + m_DefaultRenderingPath: 1 + m_DefaultMobileRenderingPath: 1 + m_TierSettings: [] + m_LightmapStripping: 0 + m_FogStripping: 0 + m_InstancingStripping: 0 + m_LightmapKeepPlain: 1 + m_LightmapKeepDirCombined: 1 + m_LightmapKeepDynamicPlain: 1 + m_LightmapKeepDynamicDirCombined: 1 + m_LightmapKeepShadowMask: 1 + m_LightmapKeepSubtractive: 1 + m_FogKeepLinear: 1 + m_FogKeepExp: 1 + m_FogKeepExp2: 1 + m_AlbedoSwatchInfos: [] + m_LightsUseLinearIntensity: 0 + m_LightsUseColorTemperature: 0 + m_DefaultRenderingLayerMask: 1 + m_LogWhenShaderIsCompiled: 0 diff --git a/ProjectSettings/InputManager.asset b/ProjectSettings/InputManager.asset new file mode 100644 index 0000000..b16147e --- /dev/null +++ b/ProjectSettings/InputManager.asset @@ -0,0 +1,487 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!13 &1 +InputManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Axes: + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: a + altPositiveButton: d + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: s + altPositiveButton: w + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: mouse 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: mouse 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: mouse 2 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: space + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse X + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse Y + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse ScrollWheel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 2 + joyNum: 0 + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 0 + type: 2 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 1 + type: 2 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 0 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 1 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 2 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 3 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: enter + altNegativeButton: + altPositiveButton: space + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Cancel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: escape + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Enable Debug Button 1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: joystick button 8 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Enable Debug Button 2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: backspace + altNegativeButton: + altPositiveButton: joystick button 9 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Reset + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Next + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: page down + altNegativeButton: + altPositiveButton: joystick button 5 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Previous + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: page up + altNegativeButton: + altPositiveButton: joystick button 4 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Validate + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Persistent + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: right shift + altNegativeButton: + altPositiveButton: joystick button 2 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Multiplier + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: joystick button 3 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 2 + axis: 6 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 2 + axis: 5 + joyNum: 0 diff --git a/ProjectSettings/MemorySettings.asset b/ProjectSettings/MemorySettings.asset new file mode 100644 index 0000000..5b5face --- /dev/null +++ b/ProjectSettings/MemorySettings.asset @@ -0,0 +1,35 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!387306366 &1 +MemorySettings: + m_ObjectHideFlags: 0 + m_EditorMemorySettings: + m_MainAllocatorBlockSize: -1 + m_ThreadAllocatorBlockSize: -1 + m_MainGfxBlockSize: -1 + m_ThreadGfxBlockSize: -1 + m_CacheBlockSize: -1 + m_TypetreeBlockSize: -1 + m_ProfilerBlockSize: -1 + m_ProfilerEditorBlockSize: -1 + m_BucketAllocatorGranularity: -1 + m_BucketAllocatorBucketsCount: -1 + m_BucketAllocatorBlockSize: -1 + m_BucketAllocatorBlockCount: -1 + m_ProfilerBucketAllocatorGranularity: -1 + m_ProfilerBucketAllocatorBucketsCount: -1 + m_ProfilerBucketAllocatorBlockSize: -1 + m_ProfilerBucketAllocatorBlockCount: -1 + m_TempAllocatorSizeMain: -1 + m_JobTempAllocatorBlockSize: -1 + m_BackgroundJobTempAllocatorBlockSize: -1 + m_JobTempAllocatorReducedBlockSize: -1 + m_TempAllocatorSizeGIBakingWorker: -1 + m_TempAllocatorSizeNavMeshWorker: -1 + m_TempAllocatorSizeAudioWorker: -1 + m_TempAllocatorSizeCloudWorker: -1 + m_TempAllocatorSizeGfx: -1 + m_TempAllocatorSizeJobWorker: -1 + m_TempAllocatorSizeBackgroundWorker: -1 + m_TempAllocatorSizePreloadManager: -1 + m_PlatformMemorySettings: {} diff --git a/ProjectSettings/NavMeshAreas.asset b/ProjectSettings/NavMeshAreas.asset new file mode 100644 index 0000000..ad2654e --- /dev/null +++ b/ProjectSettings/NavMeshAreas.asset @@ -0,0 +1,93 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!126 &1 +NavMeshProjectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + areas: + - name: Walkable + cost: 1 + - name: Not Walkable + cost: 1 + - name: Jump + cost: 2 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + m_LastAgentTypeID: -887442657 + m_Settings: + - serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.75 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_SettingNames: + - Humanoid diff --git a/ProjectSettings/NetworkManager.asset b/ProjectSettings/NetworkManager.asset new file mode 100644 index 0000000..5dc6a83 --- /dev/null +++ b/ProjectSettings/NetworkManager.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!149 &1 +NetworkManager: + m_ObjectHideFlags: 0 + m_DebugLevel: 0 + m_Sendrate: 15 + m_AssetToPrefab: {} diff --git a/ProjectSettings/PackageManagerSettings.asset b/ProjectSettings/PackageManagerSettings.asset new file mode 100644 index 0000000..b3a65dd --- /dev/null +++ b/ProjectSettings/PackageManagerSettings.asset @@ -0,0 +1,44 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_EnablePreReleasePackages: 0 + m_EnablePackageDependencies: 0 + m_AdvancedSettingsExpanded: 1 + m_ScopedRegistriesSettingsExpanded: 1 + m_SeeAllPackageVersions: 0 + oneTimeWarningShown: 0 + m_Registries: + - m_Id: main + m_Name: + m_Url: https://packages.unity.com + m_Scopes: [] + m_IsDefault: 1 + m_Capabilities: 7 + m_UserSelectedRegistryName: + m_UserAddingNewScopedRegistry: 0 + m_RegistryInfoDraft: + m_ErrorMessage: + m_Original: + m_Id: + m_Name: + m_Url: + m_Scopes: [] + m_IsDefault: 0 + m_Capabilities: 0 + m_Modified: 0 + m_Name: + m_Url: + m_Scopes: + - + m_SelectedScopeIndex: 0 diff --git a/ProjectSettings/Physics2DSettings.asset b/ProjectSettings/Physics2DSettings.asset new file mode 100644 index 0000000..6cfcdda --- /dev/null +++ b/ProjectSettings/Physics2DSettings.asset @@ -0,0 +1,56 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!19 &1 +Physics2DSettings: + m_ObjectHideFlags: 0 + serializedVersion: 5 + m_Gravity: {x: 0, y: -9.81} + m_DefaultMaterial: {fileID: 0} + m_VelocityIterations: 8 + m_PositionIterations: 3 + m_VelocityThreshold: 1 + m_MaxLinearCorrection: 0.2 + m_MaxAngularCorrection: 8 + m_MaxTranslationSpeed: 100 + m_MaxRotationSpeed: 360 + m_BaumgarteScale: 0.2 + m_BaumgarteTimeOfImpactScale: 0.75 + m_TimeToSleep: 0.5 + m_LinearSleepTolerance: 0.01 + m_AngularSleepTolerance: 2 + m_DefaultContactOffset: 0.01 + m_JobOptions: + serializedVersion: 2 + useMultithreading: 0 + useConsistencySorting: 0 + m_InterpolationPosesPerJob: 100 + m_NewContactsPerJob: 30 + m_CollideContactsPerJob: 100 + m_ClearFlagsPerJob: 200 + m_ClearBodyForcesPerJob: 200 + m_SyncDiscreteFixturesPerJob: 50 + m_SyncContinuousFixturesPerJob: 50 + m_FindNearestContactsPerJob: 100 + m_UpdateTriggerContactsPerJob: 100 + m_IslandSolverCostThreshold: 100 + m_IslandSolverBodyCostScale: 1 + m_IslandSolverContactCostScale: 10 + m_IslandSolverJointCostScale: 10 + m_IslandSolverBodiesPerJob: 50 + m_IslandSolverContactsPerJob: 50 + m_SimulationMode: 0 + m_QueriesHitTriggers: 1 + m_QueriesStartInColliders: 1 + m_CallbacksOnDisable: 1 + m_ReuseCollisionCallbacks: 1 + m_AutoSyncTransforms: 0 + m_AlwaysShowColliders: 0 + m_ShowColliderSleep: 1 + m_ShowColliderContacts: 0 + m_ShowColliderAABB: 0 + m_ContactArrowScale: 0.2 + m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} + m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} + m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} + m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff diff --git a/ProjectSettings/PresetManager.asset b/ProjectSettings/PresetManager.asset new file mode 100644 index 0000000..67a94da --- /dev/null +++ b/ProjectSettings/PresetManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1386491679 &1 +PresetManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_DefaultPresets: {} diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset new file mode 100644 index 0000000..8451d17 --- /dev/null +++ b/ProjectSettings/ProjectSettings.asset @@ -0,0 +1,789 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!129 &1 +PlayerSettings: + m_ObjectHideFlags: 0 + serializedVersion: 24 + productGUID: 249b5a129dea1cc458aa2ac906d8580f + AndroidProfiler: 0 + AndroidFilterTouchesWhenObscured: 0 + AndroidEnableSustainedPerformanceMode: 0 + defaultScreenOrientation: 4 + targetDevice: 2 + useOnDemandResources: 0 + accelerometerFrequency: 60 + companyName: MAD + productName: Web_GL + defaultCursor: {fileID: 0} + cursorHotspot: {x: 0, y: 0} + m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} + m_ShowUnitySplashScreen: 1 + m_ShowUnitySplashLogo: 1 + m_SplashScreenOverlayOpacity: 1 + m_SplashScreenAnimation: 1 + m_SplashScreenLogoStyle: 1 + m_SplashScreenDrawMode: 0 + m_SplashScreenBackgroundAnimationZoom: 1 + m_SplashScreenLogoAnimationZoom: 1 + m_SplashScreenBackgroundLandscapeAspect: 1 + m_SplashScreenBackgroundPortraitAspect: 1 + m_SplashScreenBackgroundLandscapeUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenBackgroundPortraitUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenLogos: [] + m_VirtualRealitySplashScreen: {fileID: 0} + m_HolographicTrackingLossScreen: {fileID: 0} + defaultScreenWidth: 1920 + defaultScreenHeight: 1080 + defaultScreenWidthWeb: 960 + defaultScreenHeightWeb: 600 + m_StereoRenderingPath: 0 + m_ActiveColorSpace: 0 + m_MTRendering: 1 + mipStripping: 0 + numberOfMipsStripped: 0 + m_StackTraceTypes: 010000000100000001000000010000000100000001000000 + iosShowActivityIndicatorOnLoading: -1 + androidShowActivityIndicatorOnLoading: -1 + iosUseCustomAppBackgroundBehavior: 0 + iosAllowHTTPDownload: 1 + allowedAutorotateToPortrait: 1 + allowedAutorotateToPortraitUpsideDown: 1 + allowedAutorotateToLandscapeRight: 1 + allowedAutorotateToLandscapeLeft: 1 + useOSAutorotation: 1 + use32BitDisplayBuffer: 1 + preserveFramebufferAlpha: 0 + disableDepthAndStencilBuffers: 0 + androidStartInFullscreen: 1 + androidRenderOutsideSafeArea: 1 + androidUseSwappy: 1 + androidBlitType: 0 + androidResizableWindow: 0 + androidDefaultWindowWidth: 1920 + androidDefaultWindowHeight: 1080 + androidMinimumWindowWidth: 400 + androidMinimumWindowHeight: 300 + androidFullscreenMode: 1 + defaultIsNativeResolution: 1 + macRetinaSupport: 1 + runInBackground: 0 + captureSingleScreen: 0 + muteOtherAudioSources: 0 + Prepare IOS For Recording: 0 + Force IOS Speakers When Recording: 0 + deferSystemGesturesMode: 0 + hideHomeButton: 0 + submitAnalytics: 1 + usePlayerLog: 1 + bakeCollisionMeshes: 0 + forceSingleInstance: 0 + useFlipModelSwapchain: 1 + resizableWindow: 0 + useMacAppStoreValidation: 0 + macAppStoreCategory: public.app-category.games + gpuSkinning: 0 + xboxPIXTextureCapture: 0 + xboxEnableAvatar: 0 + xboxEnableKinect: 0 + xboxEnableKinectAutoTracking: 0 + xboxEnableFitness: 0 + visibleInBackground: 1 + allowFullscreenSwitch: 1 + fullscreenMode: 1 + xboxSpeechDB: 0 + xboxEnableHeadOrientation: 0 + xboxEnableGuest: 0 + xboxEnablePIXSampling: 0 + metalFramebufferOnly: 0 + xboxOneResolution: 0 + xboxOneSResolution: 0 + xboxOneXResolution: 3 + xboxOneMonoLoggingLevel: 0 + xboxOneLoggingLevel: 1 + xboxOneDisableEsram: 0 + xboxOneEnableTypeOptimization: 0 + xboxOnePresentImmediateThreshold: 0 + switchQueueCommandMemory: 1048576 + switchQueueControlMemory: 16384 + switchQueueComputeMemory: 262144 + switchNVNShaderPoolsGranularity: 33554432 + switchNVNDefaultPoolsGranularity: 16777216 + switchNVNOtherPoolsGranularity: 16777216 + switchNVNMaxPublicTextureIDCount: 0 + switchNVNMaxPublicSamplerIDCount: 0 + stadiaPresentMode: 0 + stadiaTargetFramerate: 0 + vulkanNumSwapchainBuffers: 3 + vulkanEnableSetSRGBWrite: 0 + vulkanEnablePreTransform: 0 + vulkanEnableLateAcquireNextImage: 0 + vulkanEnableCommandBufferRecycling: 1 + m_SupportedAspectRatios: + 4:3: 1 + 5:4: 1 + 16:10: 1 + 16:9: 1 + Others: 1 + bundleVersion: 1.0 + preloadedAssets: [] + metroInputSource: 0 + wsaTransparentSwapchain: 0 + m_HolographicPauseOnTrackingLoss: 1 + xboxOneDisableKinectGpuReservation: 1 + xboxOneEnable7thCore: 1 + vrSettings: + enable360StereoCapture: 0 + isWsaHolographicRemotingEnabled: 0 + enableFrameTimingStats: 0 + enableOpenGLProfilerGPURecorders: 1 + useHDRDisplay: 0 + D3DHDRBitDepth: 0 + m_ColorGamuts: 00000000 + targetPixelDensity: 30 + resolutionScalingMode: 0 + resetResolutionOnWindowResize: 0 + androidSupportedAspectRatio: 1 + androidMaxAspectRatio: 2.1 + applicationIdentifier: + Standalone: com.DefaultCompany.2DProject + buildNumber: + Standalone: 0 + iPhone: 0 + tvOS: 0 + overrideDefaultApplicationIdentifier: 1 + AndroidBundleVersionCode: 1 + AndroidMinSdkVersion: 22 + AndroidTargetSdkVersion: 0 + AndroidPreferredInstallLocation: 1 + aotOptions: + stripEngineCode: 1 + iPhoneStrippingLevel: 0 + iPhoneScriptCallOptimization: 0 + ForceInternetPermission: 0 + ForceSDCardPermission: 0 + CreateWallpaper: 0 + APKExpansionFiles: 0 + keepLoadedShadersAlive: 0 + StripUnusedMeshComponents: 0 + VertexChannelCompressionMask: 4054 + iPhoneSdkVersion: 988 + iOSTargetOSVersionString: 12.0 + tvOSSdkVersion: 0 + tvOSRequireExtendedGameController: 0 + tvOSTargetOSVersionString: 12.0 + uIPrerenderedIcon: 0 + uIRequiresPersistentWiFi: 0 + uIRequiresFullScreen: 1 + uIStatusBarHidden: 1 + uIExitOnSuspend: 0 + uIStatusBarStyle: 0 + appleTVSplashScreen: {fileID: 0} + appleTVSplashScreen2x: {fileID: 0} + tvOSSmallIconLayers: [] + tvOSSmallIconLayers2x: [] + tvOSLargeIconLayers: [] + tvOSLargeIconLayers2x: [] + tvOSTopShelfImageLayers: [] + tvOSTopShelfImageLayers2x: [] + tvOSTopShelfImageWideLayers: [] + tvOSTopShelfImageWideLayers2x: [] + iOSLaunchScreenType: 0 + iOSLaunchScreenPortrait: {fileID: 0} + iOSLaunchScreenLandscape: {fileID: 0} + iOSLaunchScreenBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreenFillPct: 100 + iOSLaunchScreenSize: 100 + iOSLaunchScreenCustomXibPath: + iOSLaunchScreeniPadType: 0 + iOSLaunchScreeniPadImage: {fileID: 0} + iOSLaunchScreeniPadBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreeniPadFillPct: 100 + iOSLaunchScreeniPadSize: 100 + iOSLaunchScreeniPadCustomXibPath: + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: + iOSDeviceRequirements: [] + iOSURLSchemes: [] + macOSURLSchemes: [] + iOSBackgroundModes: 0 + iOSMetalForceHardShadows: 0 + metalEditorSupport: 1 + metalAPIValidation: 1 + iOSRenderExtraFrameOnPause: 0 + iosCopyPluginsCodeInsteadOfSymlink: 0 + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + iOSManualSigningProvisioningProfileType: 0 + tvOSManualSigningProvisioningProfileType: 0 + appleEnableAutomaticSigning: 0 + iOSRequireARKit: 0 + iOSAutomaticallyDetectAndAddCapabilities: 1 + appleEnableProMotion: 0 + shaderPrecisionModel: 0 + clonedFromGUID: 10ad67313f4034357812315f3c407484 + templatePackageId: com.unity.template.2d@6.1.2 + templateDefaultScene: Assets/Scenes/SampleScene.unity + useCustomMainManifest: 0 + useCustomLauncherManifest: 0 + useCustomMainGradleTemplate: 0 + useCustomLauncherGradleManifest: 0 + useCustomBaseGradleTemplate: 0 + useCustomGradlePropertiesTemplate: 0 + useCustomProguardFile: 0 + AndroidTargetArchitectures: 1 + AndroidTargetDevices: 0 + AndroidSplashScreenScale: 0 + androidSplashScreen: {fileID: 0} + AndroidKeystoreName: + AndroidKeyaliasName: + AndroidBuildApkPerCpuArchitecture: 0 + AndroidTVCompatibility: 0 + AndroidIsGame: 1 + AndroidEnableTango: 0 + androidEnableBanner: 1 + androidUseLowAccuracyLocation: 0 + androidUseCustomKeystore: 0 + m_AndroidBanners: + - width: 320 + height: 180 + banner: {fileID: 0} + androidGamepadSupportLevel: 0 + chromeosInputEmulation: 1 + AndroidMinifyWithR8: 0 + AndroidMinifyRelease: 0 + AndroidMinifyDebug: 0 + AndroidValidateAppBundleSize: 1 + AndroidAppBundleSizeToValidate: 150 + m_BuildTargetIcons: [] + m_BuildTargetPlatformIcons: + - m_BuildTarget: Android + m_Icons: + - m_Textures: [] + m_Width: 432 + m_Height: 432 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 324 + m_Height: 324 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 216 + m_Height: 216 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 162 + m_Height: 162 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 108 + m_Height: 108 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 81 + m_Height: 81 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 192 + m_Height: 192 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 144 + m_Height: 144 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 96 + m_Height: 96 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 72 + m_Height: 72 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 48 + m_Height: 48 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 36 + m_Height: 36 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 192 + m_Height: 192 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 144 + m_Height: 144 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 96 + m_Height: 96 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 72 + m_Height: 72 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 48 + m_Height: 48 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 36 + m_Height: 36 + m_Kind: 0 + m_SubKind: + m_BuildTargetBatching: [] + m_BuildTargetShaderSettings: [] + m_BuildTargetGraphicsJobs: + - m_BuildTarget: MacStandaloneSupport + m_GraphicsJobs: 0 + - m_BuildTarget: Switch + m_GraphicsJobs: 0 + - m_BuildTarget: MetroSupport + m_GraphicsJobs: 0 + - m_BuildTarget: AppleTVSupport + m_GraphicsJobs: 0 + - m_BuildTarget: BJMSupport + m_GraphicsJobs: 0 + - m_BuildTarget: LinuxStandaloneSupport + m_GraphicsJobs: 0 + - m_BuildTarget: PS4Player + m_GraphicsJobs: 0 + - m_BuildTarget: iOSSupport + m_GraphicsJobs: 0 + - m_BuildTarget: WindowsStandaloneSupport + m_GraphicsJobs: 0 + - m_BuildTarget: XboxOnePlayer + m_GraphicsJobs: 0 + - m_BuildTarget: LuminSupport + m_GraphicsJobs: 0 + - m_BuildTarget: AndroidPlayer + m_GraphicsJobs: 0 + - m_BuildTarget: WebGLSupport + m_GraphicsJobs: 0 + m_BuildTargetGraphicsJobMode: [] + m_BuildTargetGraphicsAPIs: + - m_BuildTarget: AndroidPlayer + m_APIs: 150000000b000000 + m_Automatic: 1 + - m_BuildTarget: iOSSupport + m_APIs: 10000000 + m_Automatic: 1 + - m_BuildTarget: WebGLSupport + m_APIs: 0b00000008000000 + m_Automatic: 1 + m_BuildTargetVRSettings: [] + m_DefaultShaderChunkSizeInMB: 16 + m_DefaultShaderChunkCount: 0 + openGLRequireES31: 0 + openGLRequireES31AEP: 0 + openGLRequireES32: 0 + m_TemplateCustomTags: + CONTAINER_BACKGROUND_COLOR: + MAX_ASPECT_RATIO: + MIN_ASPECT_RATIO: + mobileMTRendering: + Android: 1 + iPhone: 1 + tvOS: 1 + m_BuildTargetGroupLightmapEncodingQuality: + - m_BuildTarget: WebGL + m_EncodingQuality: 1 + m_BuildTargetGroupLightmapSettings: [] + m_BuildTargetNormalMapEncoding: [] + m_BuildTargetDefaultTextureCompressionFormat: + - m_BuildTarget: Android + m_Format: 3 + playModeTestRunnerEnabled: 0 + runPlayModeTestAsEditModeTest: 0 + actionOnDotNetUnhandledException: 1 + enableInternalProfiler: 0 + logObjCUncaughtExceptions: 1 + enableCrashReportAPI: 0 + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: + switchNMETAOverride: + switchNetLibKey: + switchSocketMemoryPoolSize: 6144 + switchSocketAllocatorPoolSize: 128 + switchSocketConcurrencyLimit: 14 + switchScreenResolutionBehavior: 2 + switchUseCPUProfiler: 0 + switchUseGOLDLinker: 0 + switchLTOSetting: 0 + switchApplicationID: 0x01004b9000490000 + switchNSODependencies: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchTitleNames_15: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchPublisherNames_15: + switchIcons_0: {fileID: 0} + switchIcons_1: {fileID: 0} + switchIcons_2: {fileID: 0} + switchIcons_3: {fileID: 0} + switchIcons_4: {fileID: 0} + switchIcons_5: {fileID: 0} + switchIcons_6: {fileID: 0} + switchIcons_7: {fileID: 0} + switchIcons_8: {fileID: 0} + switchIcons_9: {fileID: 0} + switchIcons_10: {fileID: 0} + switchIcons_11: {fileID: 0} + switchIcons_12: {fileID: 0} + switchIcons_13: {fileID: 0} + switchIcons_14: {fileID: 0} + switchIcons_15: {fileID: 0} + switchSmallIcons_0: {fileID: 0} + switchSmallIcons_1: {fileID: 0} + switchSmallIcons_2: {fileID: 0} + switchSmallIcons_3: {fileID: 0} + switchSmallIcons_4: {fileID: 0} + switchSmallIcons_5: {fileID: 0} + switchSmallIcons_6: {fileID: 0} + switchSmallIcons_7: {fileID: 0} + switchSmallIcons_8: {fileID: 0} + switchSmallIcons_9: {fileID: 0} + switchSmallIcons_10: {fileID: 0} + switchSmallIcons_11: {fileID: 0} + switchSmallIcons_12: {fileID: 0} + switchSmallIcons_13: {fileID: 0} + switchSmallIcons_14: {fileID: 0} + switchSmallIcons_15: {fileID: 0} + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: + switchMainThreadStackSize: 1048576 + switchPresenceGroupId: + switchLogoHandling: 0 + switchReleaseVersion: 0 + switchDisplayVersion: 1.0.0 + switchStartupUserAccount: 0 + switchSupportedLanguagesMask: 0 + switchLogoType: 0 + switchApplicationErrorCodeCategory: + switchUserAccountSaveDataSize: 0 + switchUserAccountSaveDataJournalSize: 0 + switchApplicationAttribute: 0 + switchCardSpecSize: -1 + switchCardSpecClock: -1 + switchRatingsMask: 0 + switchRatingsInt_0: 0 + switchRatingsInt_1: 0 + switchRatingsInt_2: 0 + switchRatingsInt_3: 0 + switchRatingsInt_4: 0 + switchRatingsInt_5: 0 + switchRatingsInt_6: 0 + switchRatingsInt_7: 0 + switchRatingsInt_8: 0 + switchRatingsInt_9: 0 + switchRatingsInt_10: 0 + switchRatingsInt_11: 0 + switchRatingsInt_12: 0 + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: + switchParentalControl: 0 + switchAllowsScreenshot: 1 + switchAllowsVideoCapturing: 1 + switchAllowsRuntimeAddOnContentInstall: 0 + switchDataLossConfirmation: 0 + switchUserAccountLockEnabled: 0 + switchSystemResourceMemory: 16777216 + switchSupportedNpadStyles: 22 + switchNativeFsCacheSize: 32 + switchIsHoldTypeHorizontal: 0 + switchSupportedNpadCount: 8 + switchEnableTouchScreen: 1 + switchSocketConfigEnabled: 0 + switchTcpInitialSendBufferSize: 32 + switchTcpInitialReceiveBufferSize: 64 + switchTcpAutoSendBufferSizeMax: 256 + switchTcpAutoReceiveBufferSizeMax: 256 + switchUdpSendBufferSize: 9 + switchUdpReceiveBufferSize: 42 + switchSocketBufferEfficiency: 4 + switchSocketInitializeEnabled: 1 + switchNetworkInterfaceManagerInitializeEnabled: 1 + switchPlayerConnectionEnabled: 1 + switchUseNewStyleFilepaths: 0 + switchUseLegacyFmodPriorities: 1 + switchUseMicroSleepForYield: 1 + switchEnableRamDiskSupport: 0 + switchMicroSleepForYieldTime: 25 + switchRamDiskSpaceSize: 12 + ps4NPAgeRating: 12 + ps4NPTitleSecret: + ps4NPTrophyPackPath: + ps4ParentalLevel: 11 + ps4ContentID: ED1633-NPXX51362_00-0000000000000000 + ps4Category: 0 + ps4MasterVersion: 01.00 + ps4AppVersion: 01.00 + ps4AppType: 0 + ps4ParamSfxPath: + ps4VideoOutPixelFormat: 0 + ps4VideoOutInitialWidth: 1920 + ps4VideoOutBaseModeInitialWidth: 1920 + ps4VideoOutReprojectionRate: 60 + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: + ps4RemotePlayKeyAssignment: -1 + ps4RemotePlayKeyMappingDir: + ps4PlayTogetherPlayerCount: 0 + ps4EnterButtonAssignment: 2 + ps4ApplicationParam1: 0 + ps4ApplicationParam2: 0 + ps4ApplicationParam3: 0 + ps4ApplicationParam4: 0 + ps4DownloadDataSize: 0 + ps4GarlicHeapSize: 2048 + ps4ProGarlicHeapSize: 2560 + playerPrefsMaxSize: 32768 + ps4Passcode: bi9UOuSpM2Tlh01vOzwvSikHFswuzleh + ps4pnSessions: 1 + ps4pnPresence: 1 + ps4pnFriends: 1 + ps4pnGameCustomData: 1 + playerPrefsSupport: 0 + enableApplicationExit: 0 + resetTempFolder: 1 + restrictedAudioUsageRights: 0 + ps4UseResolutionFallback: 0 + ps4ReprojectionSupport: 0 + ps4UseAudio3dBackend: 0 + ps4UseLowGarlicFragmentationMode: 1 + ps4SocialScreenEnabled: 0 + ps4ScriptOptimizationLevel: 2 + ps4Audio3dVirtualSpeakerCount: 14 + ps4attribCpuUsage: 0 + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: + ps4PatchDayOne: 0 + ps4attribUserManagement: 0 + ps4attribMoveSupport: 0 + ps4attrib3DSupport: 0 + ps4attribShareSupport: 0 + ps4attribExclusiveVR: 0 + ps4disableAutoHideSplash: 0 + ps4videoRecordingFeaturesUsed: 0 + ps4contentSearchFeaturesUsed: 0 + ps4CompatibilityPS5: 0 + ps4AllowPS5Detection: 0 + ps4GPU800MHz: 1 + ps4attribEyeToEyeDistanceSettingVR: 0 + ps4IncludedModules: [] + ps4attribVROutputEnabled: 0 + monoEnv: + splashScreenBackgroundSourceLandscape: {fileID: 0} + splashScreenBackgroundSourcePortrait: {fileID: 0} + blurSplashScreenBackground: 1 + spritePackerPolicy: + webGLMemorySize: 32 + webGLExceptionSupport: 1 + webGLNameFilesAsHashes: 0 + webGLDataCaching: 1 + webGLDebugSymbols: 0 + webGLEmscriptenArgs: + webGLModulesDirectory: + webGLTemplate: PROJECT:Develop + webGLAnalyzeBuildSize: 0 + webGLUseEmbeddedResources: 0 + webGLCompressionFormat: 0 + webGLWasmArithmeticExceptions: 0 + webGLLinkerTarget: 1 + webGLThreadsSupport: 0 + webGLDecompressionFallback: 0 + webGLPowerPreference: 2 + scriptingDefineSymbols: {} + additionalCompilerArguments: {} + platformArchitecture: {} + scriptingBackend: {} + il2cppCompilerConfiguration: {} + managedStrippingLevel: + EmbeddedLinux: 1 + GameCoreScarlett: 1 + GameCoreXboxOne: 1 + Lumin: 1 + Nintendo Switch: 1 + PS4: 1 + PS5: 1 + Stadia: 1 + WebGL: 1 + Windows Store Apps: 1 + XboxOne: 1 + iPhone: 1 + tvOS: 1 + incrementalIl2cppBuild: {} + suppressCommonWarnings: 1 + allowUnsafeCode: 0 + useDeterministicCompilation: 1 + enableRoslynAnalyzers: 1 + selectedPlatform: 3 + additionalIl2CppArgs: + scriptingRuntimeVersion: 1 + gcIncremental: 1 + assemblyVersionValidation: 1 + gcWBarrierValidation: 0 + apiCompatibilityLevelPerPlatform: {} + m_RenderingPath: 1 + m_MobileRenderingPath: 1 + metroPackageName: 2D_BuiltInRenderer + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: + metroCertificateNotAfter: 0000000000000000 + metroApplicationDescription: 2D_BuiltInRenderer + wsaImages: {} + metroTileShortName: + metroTileShowName: 0 + metroMediumTileShowName: 0 + metroLargeTileShowName: 0 + metroWideTileShowName: 0 + metroSupportStreamingInstall: 0 + metroLastRequiredScene: 0 + metroDefaultTileSize: 1 + metroTileForegroundText: 2 + metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} + metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1} + metroSplashScreenUseBackgroundColor: 0 + platformCapabilities: {} + metroTargetDeviceFamilies: {} + metroFTAName: + metroFTAFileTypes: [] + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: + XboxOneVersion: 1.0.0.0 + XboxOnePackageEncryption: 0 + XboxOnePackageUpdateGranularity: 2 + XboxOneDescription: + XboxOneLanguage: + - enus + XboxOneCapability: [] + XboxOneGameRating: {} + XboxOneIsContentPackage: 0 + XboxOneEnhancedXboxCompatibilityMode: 0 + XboxOneEnableGPUVariability: 1 + XboxOneSockets: {} + XboxOneSplashScreen: {fileID: 0} + XboxOneAllowedProductIds: [] + XboxOnePersistentLocalStorageSize: 0 + XboxOneXTitleMemory: 8 + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: + vrEditorSettings: {} + cloudServicesEnabled: {} + luminIcon: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: + luminCert: + m_CertPath: + m_SignPackage: 1 + luminIsChannelApp: 0 + luminVersion: + m_VersionCode: 1 + m_VersionName: + apiCompatibilityLevel: 6 + activeInputHandler: 0 + windowsGamepadBackendHint: 0 + cloudProjectId: + framebufferDepthMemorylessMode: 0 + qualitySettingsNames: [] + projectName: + organizationId: + cloudEnabled: 0 + legacyClampBlendShapeWeights: 0 + playerDataPath: + forceSRGBBlit: 1 + virtualTexturingSupportEnabled: 0 diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt new file mode 100644 index 0000000..7b416d5 --- /dev/null +++ b/ProjectSettings/ProjectVersion.txt @@ -0,0 +1,2 @@ +m_EditorVersion: 2021.3.25f1 +m_EditorVersionWithRevision: 2021.3.25f1 (68ef2c4f8861) diff --git a/ProjectSettings/QualitySettings.asset b/ProjectSettings/QualitySettings.asset new file mode 100644 index 0000000..bcd6706 --- /dev/null +++ b/ProjectSettings/QualitySettings.asset @@ -0,0 +1,239 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!47 &1 +QualitySettings: + m_ObjectHideFlags: 0 + serializedVersion: 5 + m_CurrentQuality: 5 + m_QualitySettings: + - serializedVersion: 2 + name: Very Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 15 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + skinWeights: 1 + textureQuality: 1 + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 0 + lodBias: 0.3 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 4 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + skinWeights: 2 + textureQuality: 0 + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 0 + lodBias: 0.4 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 16 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Medium + pixelLightCount: 1 + shadows: 1 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + skinWeights: 2 + textureQuality: 0 + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 1 + lodBias: 0.7 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 64 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: High + pixelLightCount: 2 + shadows: 2 + shadowResolution: 1 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 40 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + skinWeights: 2 + textureQuality: 0 + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 1 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 256 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Very High + pixelLightCount: 3 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 70 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + skinWeights: 4 + textureQuality: 0 + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 1.5 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 1024 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Ultra + pixelLightCount: 4 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 4 + shadowDistance: 150 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + skinWeights: 255 + textureQuality: 0 + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 2 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 4096 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + m_PerPlatformDefaultQuality: + Android: 2 + Lumin: 5 + GameCoreScarlett: 5 + GameCoreXboxOne: 5 + Nintendo Switch: 5 + PS4: 5 + PS5: 5 + Stadia: 5 + Standalone: 5 + WebGL: 3 + Windows Store Apps: 5 + XboxOne: 5 + iPhone: 2 + tvOS: 2 diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset new file mode 100644 index 0000000..1c92a78 --- /dev/null +++ b/ProjectSettings/TagManager.asset @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!78 &1 +TagManager: + serializedVersion: 2 + tags: [] + layers: + - Default + - TransparentFX + - Ignore Raycast + - + - Water + - UI + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + m_SortingLayers: + - name: Default + uniqueID: 0 + locked: 0 diff --git a/ProjectSettings/TimeManager.asset b/ProjectSettings/TimeManager.asset new file mode 100644 index 0000000..558a017 --- /dev/null +++ b/ProjectSettings/TimeManager.asset @@ -0,0 +1,9 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!5 &1 +TimeManager: + m_ObjectHideFlags: 0 + Fixed Timestep: 0.02 + Maximum Allowed Timestep: 0.33333334 + m_TimeScale: 1 + Maximum Particle Timestep: 0.03 diff --git a/ProjectSettings/UnityConnectSettings.asset b/ProjectSettings/UnityConnectSettings.asset new file mode 100644 index 0000000..a88bee0 --- /dev/null +++ b/ProjectSettings/UnityConnectSettings.asset @@ -0,0 +1,36 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!310 &1 +UnityConnectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 1 + m_Enabled: 0 + m_TestMode: 0 + m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events + m_EventUrl: https://cdp.cloud.unity3d.com/v1/events + m_ConfigUrl: https://config.uca.cloud.unity3d.com + m_DashboardUrl: https://dashboard.unity3d.com + m_TestInitMode: 0 + CrashReportingSettings: + m_EventUrl: https://perf-events.cloud.unity3d.com + m_Enabled: 0 + m_LogBufferSize: 10 + m_CaptureEditorExceptions: 1 + UnityPurchasingSettings: + m_Enabled: 0 + m_TestMode: 0 + UnityAnalyticsSettings: + m_Enabled: 0 + m_TestMode: 0 + m_InitializeOnStartup: 1 + m_PackageRequiringCoreStatsPresent: 0 + UnityAdsSettings: + m_Enabled: 0 + m_InitializeOnStartup: 1 + m_TestMode: 0 + m_IosGameId: + m_AndroidGameId: + m_GameIds: {} + m_GameId: + PerformanceReportingSettings: + m_Enabled: 0 diff --git a/ProjectSettings/VFXManager.asset b/ProjectSettings/VFXManager.asset new file mode 100644 index 0000000..46f38e1 --- /dev/null +++ b/ProjectSettings/VFXManager.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!937362698 &1 +VFXManager: + m_ObjectHideFlags: 0 + m_IndirectShader: {fileID: 0} + m_CopyBufferShader: {fileID: 0} + m_SortShader: {fileID: 0} + m_StripUpdateShader: {fileID: 0} + m_RenderPipeSettingsPath: + m_FixedTimeStep: 0.016666668 + m_MaxDeltaTime: 0.05 + m_CompiledVersion: 0 + m_RuntimeVersion: 0 diff --git a/ProjectSettings/VersionControlSettings.asset b/ProjectSettings/VersionControlSettings.asset new file mode 100644 index 0000000..dca2881 --- /dev/null +++ b/ProjectSettings/VersionControlSettings.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!890905787 &1 +VersionControlSettings: + m_ObjectHideFlags: 0 + m_Mode: Visible Meta Files + m_CollabEditorSettings: + inProgressEnabled: 1 diff --git a/ProjectSettings/XRSettings.asset b/ProjectSettings/XRSettings.asset new file mode 100644 index 0000000..482590c --- /dev/null +++ b/ProjectSettings/XRSettings.asset @@ -0,0 +1,10 @@ +{ + "m_SettingKeys": [ + "VR Device Disabled", + "VR Device User Alert" + ], + "m_SettingValues": [ + "False", + "False" + ] +} \ No newline at end of file diff --git a/ProjectSettings/boot.config b/ProjectSettings/boot.config new file mode 100644 index 0000000..e69de29 diff --git a/upgrade-unity-pr-body.md b/upgrade-unity-pr-body.md index 1636658..cc38861 100644 --- a/upgrade-unity-pr-body.md +++ b/upgrade-unity-pr-body.md @@ -1,11 +1,10 @@ ## [Automated Workflow] Upgrade unity to {{ .unityversion }} -> [workflow file](https://github.com/JohannesDeml/UnityWebGL-LoadingTest/blob/master/.github/workflows/upgrade-unity.yml) using [create-pull-request](https://github.com/peter-evans/create-pull-request) & [render-template](https://github.com/chuhlomin/render-template) + ### Built version demos -* https://deml.io/experiments/unity-webgl/{{ .unityversion }}-webgl2 -* https://deml.io/experiments/unity-webgl/{{ .unityversion }}-webgl1 + ### Other links