From b235ed3cf822640f9cb6664137db4bc06b729f93 Mon Sep 17 00:00:00 2001 From: EmirHanMamak Date: Sat, 17 Jan 2026 18:33:28 +0300 Subject: [PATCH] chore(sdk) add hotreload --- .../Documentation.meta | 8 + .../Documentation/Documentation.pdf | Bin 0 -> 33649 bytes .../Documentation/Documentation.pdf.meta | 7 + .../Editor.meta | 8 + .../Editor/Attribution.meta | 3 + .../Editor/Attribution/Attribution.cs | 61 + .../Editor/Attribution/Attribution.cs.meta | 3 + .../Editor/Attribution/VSAttribution.cs | 68 + .../Editor/Attribution/VSAttribution.cs.meta | 3 + .../Editor/CLI.meta | 3 + .../Editor/CLI/CliUtils.cs | 100 + .../Editor/CLI/CliUtils.cs.meta | 3 + .../Editor/CLI/FallbackCliController.cs | 13 + .../Editor/CLI/FallbackCliController.cs.meta | 3 + .../Editor/CLI/HotReloadCli.cs | 182 + .../Editor/CLI/HotReloadCli.cs.meta | 3 + .../Editor/CLI/ICliController.cs | 13 + .../Editor/CLI/ICliController.cs.meta | 3 + .../Editor/CLI/LinuxCliController.cs | 73 + .../Editor/CLI/LinuxCliController.cs.meta | 3 + .../Editor/CLI/OsxCliController.cs | 190 + .../Editor/CLI/OsxCliController.cs.meta | 3 + .../Editor/CLI/StartArgs.cs | 12 + .../Editor/CLI/StartArgs.cs.meta | 11 + .../Editor/CLI/WindowsCliController.cs | 33 + .../Editor/CLI/WindowsCliController.cs.meta | 3 + .../Editor/CompileChecker.meta | 8 + .../CompileChecker/DefaultCompileChecker.cs | 71 + .../DefaultCompileChecker.cs.meta | 11 + .../Editor/CompileChecker/ICompileChecker.cs | 17 + .../CompileChecker/ICompileChecker.cs.meta | 11 + .../CompileChecker/LegacyCompileChecker.cs | 54 + .../LegacyCompileChecker.cs.meta | 11 + .../Editor/Constants.cs | 41 + .../Editor/Constants.cs.meta | 11 + .../Editor/Demo.meta | 8 + .../Editor/Demo/EditorDemo.cs | 26 + .../Editor/Demo/EditorDemo.cs.meta | 11 + .../Editor/EditorCodePatcher.cs | 907 ++ .../Editor/EditorCodePatcher.cs.meta | 11 + .../Editor/EditorIndicationState.cs | 164 + .../Editor/EditorIndicationState.cs.meta | 3 + .../Editor/GitUtil.cs | 87 + .../Editor/GitUtil.cs.meta | 11 + .../Editor/Helpers.meta | 8 + .../Editor/Helpers/AssemblyOmission.cs | 187 + .../Editor/Helpers/AssemblyOmission.cs.meta | 3 + .../Editor/Helpers/BuildInfoHelper.cs | 143 + .../Editor/Helpers/BuildInfoHelper.cs.meta | 3 + .../Editor/Helpers/EditorWindowHelper.cs | 101 + .../Editor/Helpers/EditorWindowHelper.cs.meta | 11 + .../Editor/Helpers/GUIHelper.cs | 162 + .../Editor/Helpers/GUIHelper.cs.meta | 3 + .../Helpers/HotReloadSuggestionsHelper.cs | 231 + .../HotReloadSuggestionsHelper.cs.meta | 3 + .../Editor/Helpers/HotReloadTimelineHelper.cs | 451 + .../Helpers/HotReloadTimelineHelper.cs.meta | 3 + .../Editor/Helpers/Spinner.cs | 80 + .../Editor/Helpers/Spinner.cs.meta | 3 + .../Editor/Helpers/UnitySettingsHelper.cs | 95 + .../Helpers/UnitySettingsHelper.cs.meta | 3 + .../Editor/HotReloadEventPopup.cs | 95 + .../Editor/HotReloadEventPopup.cs.meta | 3 + .../Editor/HotReloadOverlay.cs | 154 + .../Editor/HotReloadOverlay.cs.meta | 3 + .../Editor/HotReloadPrefs.cs | 423 + .../Editor/HotReloadPrefs.cs.meta | 11 + .../Editor/HotReloadSettingsEditor.cs | 70 + .../Editor/HotReloadSettingsEditor.cs.meta | 11 + .../Editor/HotReloadState.cs | 25 + .../Editor/HotReloadState.cs.meta | 3 + .../Editor/Icon_Player.png | Bin 0 -> 2621 bytes .../Editor/Icon_Player.png.meta | 147 + .../Editor/Installation.meta | 3 + .../Editor/Installation/DownloadUtility.cs | 98 + .../Installation/DownloadUtility.cs.meta | 3 + .../Editor/Installation/ExponentialBackoff.cs | 18 + .../Installation/ExponentialBackoff.cs.meta | 3 + .../Editor/Installation/InstallUtility.cs | 58 + .../Installation/InstallUtility.cs.meta | 11 + .../Editor/Installation/ServerDownloader.cs | 190 + .../Installation/ServerDownloader.cs.meta | 3 + .../Editor/Installation/UpdateUtility.cs | 94 + .../Editor/Installation/UpdateUtility.cs.meta | 3 + .../Editor/PlayerBuild.meta | 3 + .../PlayerBuild/BuildGenerateBuildInfo.cs | 42 + .../BuildGenerateBuildInfo.cs.meta | 3 + .../PlayerBuild/HotReloadBuildHelper.cs | 106 + .../PlayerBuild/HotReloadBuildHelper.cs.meta | 3 + .../PostbuildModifyAndroidManifest.cs | 133 + .../PostbuildModifyAndroidManifest.cs.meta | 3 + .../PlayerBuild/PostbuildSendProjectState.cs | 26 + .../PostbuildSendProjectState.cs.meta | 11 + .../PlayerBuild/PrebuildIncludeResources.cs | 60 + .../PrebuildIncludeResources.cs.meta | 11 + .../Editor/ProjectGeneration.meta | 8 + .../ProjectGeneration/FileIOProvider.cs | 44 + .../ProjectGeneration/FileIOProvider.cs.meta | 11 + .../Editor/ProjectGeneration/GUIDProvider.cs | 9 + .../ProjectGeneration/GUIDProvider.cs.meta | 11 + .../Editor/ProjectGeneration/IFileIO.cs | 12 + .../Editor/ProjectGeneration/IFileIO.cs.meta | 3 + .../ProjectGeneration/IGUIDGenerator.cs | 7 + .../ProjectGeneration/IGUIDGenerator.cs.meta | 3 + ...HotReloadProjectGenerationPostProcessor.cs | 43 + ...loadProjectGenerationPostProcessor.cs.meta | 3 + .../ProjectGenenerationPostProcessor.cs | 14 + .../ProjectGenenerationPostProcessor.cs.meta | 3 + .../ProjectGeneration/ProjectGeneration.cs | 893 ++ .../ProjectGeneration.cs.meta | 11 + .../ProjectGenerationFlag.cs | 18 + .../ProjectGenerationFlag.cs.meta | 3 + .../Editor/ProjectGeneration/ProjectPart.cs | 85 + .../ProjectGeneration/ProjectPart.cs.meta | 3 + .../SolutionGuidGenerator.cs | 29 + .../SolutionGuidGenerator.cs.meta | 3 + .../Editor/ProjectGeneration/Util.meta | 8 + .../ProjectGeneration/Util/FileSystemUtil.cs | 37 + .../Util/FileSystemUtil.cs.meta | 11 + .../ProjectGeneration/Util/StringUtils.cs | 14 + .../Util/StringUtils.cs.meta | 3 + .../Editor/RequiredSettings.meta | 3 + .../RequiredSettingChecker.cs | 270 + .../RequiredSettingChecker.cs.meta | 3 + .../Editor/Resources.meta | 3 + .../Editor/Resources/Icn_Stop.png | Bin 0 -> 117 bytes .../Editor/Resources/Icn_Stop.png.meta | 116 + .../Editor/Resources/Icn_play.png | Bin 0 -> 270 bytes .../Editor/Resources/Icn_play.png.meta | 116 + .../Resources/Logo_HotReload_DarkMode.png | Bin 0 -> 3927 bytes .../Logo_HotReload_DarkMode.png.meta | 88 + .../Resources/Logo_HotReload_LightMode.png | Bin 0 -> 3879 bytes .../Logo_HotReload_LightMode.png.meta | 88 + .../Editor/Resources/alert_info.png | Bin 0 -> 862 bytes .../Editor/Resources/alert_info.png.meta | 127 + .../Editor/Resources/applied_patch.png | Bin 0 -> 5463 bytes .../Editor/Resources/applied_patch.png.meta | 127 + .../Editor/Resources/blue.png | Bin 0 -> 6101 bytes .../Editor/Resources/blue.png.meta | 92 + .../Editor/Resources/close.png | Bin 0 -> 252 bytes .../Editor/Resources/close.png.meta | 127 + .../Editor/Resources/error.png | Bin 0 -> 5489 bytes .../Editor/Resources/error.png.meta | 127 + .../Editor/Resources/events.png | Bin 0 -> 4309 bytes .../Editor/Resources/events.png.meta | 127 + .../Editor/Resources/foldout_closed.png | Bin 0 -> 4865 bytes .../Editor/Resources/foldout_closed.png.meta | 127 + .../Editor/Resources/foldout_open.png | Bin 0 -> 4861 bytes .../Editor/Resources/foldout_open.png.meta | 127 + .../Editor/Resources/green.png | Bin 0 -> 352 bytes .../Editor/Resources/green.png.meta | 124 + .../Editor/Resources/grey.png | Bin 0 -> 493 bytes .../Editor/Resources/grey.png.meta | 124 + .../Editor/Resources/icon_check_circle.png | Bin 0 -> 916 bytes .../Resources/icon_check_circle.png.meta | 88 + .../Editor/Resources/icon_circle_black.png | Bin 0 -> 648 bytes .../Resources/icon_circle_black.png.meta | 147 + .../Editor/Resources/icon_circle_gray.png | Bin 0 -> 743 bytes .../Resources/icon_circle_gray.png.meta | 147 + .../icon_loading_star_light_mode_96.png | Bin 0 -> 822 bytes .../icon_loading_star_light_mode_96.png.meta | 124 + .../Editor/Resources/icon_warning_circle.png | Bin 0 -> 941 bytes .../Resources/icon_warning_circle.png.meta | 88 + .../Editor/Resources/infos.png | Bin 0 -> 5947 bytes .../Editor/Resources/infos.png.meta | 127 + .../Editor/Resources/logo.png | Bin 0 -> 455 bytes .../Editor/Resources/logo.png.meta | 127 + .../Editor/Resources/red.png | Bin 0 -> 345 bytes .../Editor/Resources/red.png.meta | 124 + .../Editor/Resources/red_dot.png | Bin 0 -> 4838 bytes .../Editor/Resources/red_dot.png.meta | 127 + .../Editor/Resources/refresh.png | Bin 0 -> 287 bytes .../Editor/Resources/refresh.png.meta | 127 + .../Editor/Resources/report_bug.png | Bin 0 -> 763 bytes .../Editor/Resources/report_bug.png.meta | 127 + .../Editor/Resources/warning.png | Bin 0 -> 5523 bytes .../Editor/Resources/warning.png.meta | 127 + .../Editor/Resources/yellow.png | Bin 0 -> 348 bytes .../Editor/Resources/yellow.png.meta | 124 + .../Editor/ServerHealthCheck.cs | 25 + .../Editor/ServerHealthCheck.cs.meta | 3 + .../SingularityGroup.HotReload.Editor.asmdef | 28 + ...gularityGroup.HotReload.Editor.asmdef.meta | 7 + ...rityGroup.HotReload.EditorDependencies.dll | Bin 0 -> 61440 bytes ...roup.HotReload.EditorDependencies.dll.meta | 86 + .../Editor/Versioning.meta | 8 + .../Editor/Versioning/PackageUpdateChecker.cs | 288 + .../Versioning/PackageUpdateChecker.cs.meta | 11 + .../Editor/Versioning/SemVer.cs | 536 + .../Editor/Versioning/SemVer.cs.meta | 11 + .../Editor/Window.meta | 8 + .../Editor/Window/GUI.meta | 8 + .../Editor/Window/GUI/Buttons.meta | 8 + .../Window/GUI/Buttons/OpenDialogueButton.cs | 42 + .../GUI/Buttons/OpenDialogueButton.cs.meta | 3 + .../Window/GUI/Buttons/OpenURLButton.cs | 29 + .../Window/GUI/Buttons/OpenURLButton.cs.meta | 11 + .../Editor/Window/GUI/EditorTextures.cs | 116 + .../Editor/Window/GUI/EditorTextures.cs.meta | 3 + .../Editor/Window/GUI/IGUIComponent.cs | 5 + .../Editor/Window/GUI/IGUIComponent.cs.meta | 11 + .../Editor/Window/GUI/Options.meta | 8 + ...AllowAndroidAppToMakeHttpRequestsOption.cs | 48 + ...AndroidAppToMakeHttpRequestsOption.cs.meta | 11 + .../Editor/Window/GUI/Options/Base.meta | 8 + .../GUI/Options/Base/HotReloadOptionBase.cs | 57 + .../Options/Base/HotReloadOptionBase.cs.meta | 11 + .../GUI/Options/Base/OptionInterfaces.cs | 34 + .../GUI/Options/Base/OptionInterfaces.cs.meta | 3 + .../Window/GUI/Options/ExposeServerOption.cs | 82 + .../GUI/Options/ExposeServerOption.cs.meta | 11 + .../GUI/Options/IncludeInBuildOption.cs | 24 + .../GUI/Options/IncludeInBuildOption.cs.meta | 11 + .../Editor/Window/GUI/Tabs.meta | 8 + .../Editor/Window/GUI/Tabs/Base.meta | 8 + .../Window/GUI/Tabs/Base/HotReloadTabBase.cs | 33 + .../GUI/Tabs/Base/HotReloadTabBase.cs.meta | 11 + .../Editor/Window/GUI/Tabs/Helpers.meta | 3 + .../GUI/Tabs/Helpers/RedeemLicenseHelper.cs | 308 + .../Tabs/Helpers/RedeemLicenseHelper.cs.meta | 3 + .../Window/GUI/Tabs/HotReloadAboutTab.cs | 311 + .../Window/GUI/Tabs/HotReloadAboutTab.cs.meta | 11 + .../GUI/Tabs/HotReloadOptionsSection.cs | 49 + .../GUI/Tabs/HotReloadOptionsSection.cs.meta | 11 + .../Editor/Window/GUI/Tabs/HotReloadRunTab.cs | 1362 +++ .../Window/GUI/Tabs/HotReloadRunTab.cs.meta | 11 + .../Window/GUI/Tabs/HotReloadSettingsTab.cs | 698 ++ .../GUI/Tabs/HotReloadSettingsTab.cs.meta | 3 + .../Editor/Window/HotReloadWindow.cs | 372 + .../Editor/Window/HotReloadWindow.cs.meta | 11 + .../Editor/Window/ShowOnStartupEnum.cs | 7 + .../Editor/Window/ShowOnStartupEnum.cs.meta | 11 + .../Editor/Window/Styles.meta | 8 + .../Window/Styles/HotReloadWindowStyles.cs | 777 ++ .../Styles/HotReloadWindowStyles.cs.meta | 11 + .../com.singularitygroup.hotreload/LICENSE.md | 45 + .../LICENSE.md.meta | 7 + .../com.singularitygroup.hotreload/README.md | 9 + .../README.md.meta | 3 + .../Runtime.meta | 8 + .../Runtime/AppCallbackListener.cs | 55 + .../Runtime/AppCallbackListener.cs.meta | 3 + .../Runtime/BuildInfo.cs | 166 + .../Runtime/BuildInfo.cs.meta | 3 + .../Runtime/Burst.meta | 3 + .../Runtime/Burst/JobHotReloadUtility.cs | 24 + .../Runtime/Burst/JobHotReloadUtility.cs.meta | 3 + .../Runtime/BurstChecker.cs | 41 + .../Runtime/BurstChecker.cs.meta | 3 + .../Runtime/CodePatcher.cs | 423 + .../Runtime/CodePatcher.cs.meta | 11 + .../Runtime/Demo.meta | 3 + .../Runtime/Demo/Scenes.meta | 8 + .../Demo/Scenes/HotReloadBasicDemo.unity | 1121 ++ .../Demo/Scenes/HotReloadBasicDemo.unity.meta | 7 + .../Demo/Scenes/HotReloadBurstDemo.unity | 9607 +++++++++++++++++ .../Demo/Scenes/HotReloadBurstDemo.unity.meta | 7 + .../HotReloadBurstDemoSettings.lighting | 66 + .../HotReloadBurstDemoSettings.lighting.meta | 8 + .../Runtime/Demo/Scripts.meta | 8 + .../Demo/Scripts/HotReloadBasicDemo.cs | 179 + .../Demo/Scripts/HotReloadBasicDemo.cs.meta | 11 + .../Demo/Scripts/HotReloadBurstJobsDemo.cs | 63 + .../Scripts/HotReloadBurstJobsDemo.cs.meta | 11 + .../Runtime/Demo/Scripts/IDemo.cs | 29 + .../Runtime/Demo/Scripts/IDemo.cs.meta | 3 + .../Runtime/HotReloadPrompts.prefab | 3018 ++++++ .../Runtime/HotReloadPrompts.prefab.meta | 7 + .../Runtime/HotReloadSettingsObject.cs | 140 + .../Runtime/HotReloadSettingsObject.cs.meta | 13 + .../Runtime/IServerHealthCheck.cs | 11 + .../Runtime/IServerHealthCheck.cs.meta | 3 + .../Runtime/InstallQRDialog.cs | 27 + .../Runtime/InstallQRDialog.cs.meta | 3 + .../Runtime/IpHelper.cs | 64 + .../Runtime/IpHelper.cs.meta | 3 + .../Runtime/Libs.meta | 8 + .../Runtime/Libs/EditorOnly.meta | 8 + ...ityGroup.HotReload.RuntimeDependencies.dll | Bin 0 -> 3010560 bytes ...oup.HotReload.RuntimeDependencies.dll.meta | 92 + ...roup.HotReload.RuntimeDependencies2019.dll | Bin 0 -> 40960 bytes ...HotReload.RuntimeDependencies2019.dll.meta | 88 + ...roup.HotReload.RuntimeDependencies2020.dll | Bin 0 -> 38912 bytes ...HotReload.RuntimeDependencies2020.dll.meta | 88 + ...roup.HotReload.RuntimeDependencies2022.dll | Bin 0 -> 480256 bytes ...HotReload.RuntimeDependencies2022.dll.meta | 88 + .../Runtime/Libs/OnDevice.meta | 8 + ...ityGroup.HotReload.RuntimeDependencies.dll | Bin 0 -> 3010560 bytes ...oup.HotReload.RuntimeDependencies.dll.meta | 88 + ...roup.HotReload.RuntimeDependencies2019.dll | Bin 0 -> 40960 bytes ...HotReload.RuntimeDependencies2019.dll.meta | 89 + ...roup.HotReload.RuntimeDependencies2020.dll | Bin 0 -> 38912 bytes ...HotReload.RuntimeDependencies2020.dll.meta | 89 + ...roup.HotReload.RuntimeDependencies2022.dll | Bin 0 -> 480256 bytes ...HotReload.RuntimeDependencies2022.dll.meta | 89 + .../Runtime/MethodCompatiblity.cs | 110 + .../Runtime/MethodCompatiblity.cs.meta | 11 + .../Runtime/MethodPatchResponsesConverter.cs | 500 + .../MethodPatchResponsesConverter.cs.meta | 3 + .../Runtime/MethodUtils.cs | 22 + .../Runtime/MethodUtils.cs.meta | 11 + .../Runtime/MonoBehaviours.meta | 3 + .../MonoBehaviours/ConnectionDialog.cs | 80 + .../MonoBehaviours/ConnectionDialog.cs.meta | 3 + .../Runtime/MonoBehaviours/Prompts.cs | 134 + .../Runtime/MonoBehaviours/Prompts.cs.meta | 3 + .../Runtime/MonoBehaviours/QuestionDialog.cs | 64 + .../MonoBehaviours/QuestionDialog.cs.meta | 3 + .../Runtime/MonoBehaviours/RetryDialog.cs | 98 + .../MonoBehaviours/RetryDialog.cs.meta | 3 + .../Runtime/MonoMethod.cs | 196 + .../Runtime/MonoMethod.cs.meta | 11 + .../Runtime/OSX.meta | 8 + .../Runtime/OSX/HotReloadNativeHelper.dylib | Bin 0 -> 152352 bytes .../OSX/HotReloadNativeHelper.dylib.meta | 80 + .../Runtime/OnHotReloadDispatch.cs | 187 + .../Runtime/OnHotReloadDispatch.cs.meta | 3 + .../Runtime/PackageConst.cs | 20 + .../Runtime/PackageConst.cs.meta | 11 + .../Runtime/PatchServerInfo.cs | 83 + .../Runtime/PatchServerInfo.cs.meta | 11 + .../Runtime/PersistencePaths.cs | 15 + .../Runtime/PersistencePaths.cs.meta | 11 + .../Runtime/PlayerCodePatcher.cs | 118 + .../Runtime/PlayerCodePatcher.cs.meta | 3 + .../Runtime/PlayerEntrypoint.cs | 153 + .../Runtime/PlayerEntrypoint.cs.meta | 3 + .../Runtime/Public.meta | 8 + .../Runtime/Public/HotReloadLogging.cs | 17 + .../Runtime/Public/HotReloadLogging.cs.meta | 11 + .../Runtime/Public/InvokeOnHotReload.cs | 17 + .../Runtime/Public/InvokeOnHotReload.cs.meta | 11 + .../Runtime/Public/InvokeOnHotReloadLocal.cs | 22 + .../Public/InvokeOnHotReloadLocal.cs.meta | 3 + .../Runtime/Public/Log.cs | 108 + .../Runtime/Public/Log.cs.meta | 3 + .../Runtime/Public/LogLevel.cs | 25 + .../Runtime/Public/LogLevel.cs.meta | 11 + ...arityGroup.HotReload.Runtime.Public.asmdef | 3 + ...Group.HotReload.Runtime.Public.asmdef.meta | 7 + .../Runtime/RequestHelper.cs | 387 + .../Runtime/RequestHelper.cs.meta | 11 + .../Runtime/ServerHandshake.cs | 245 + .../Runtime/ServerHandshake.cs.meta | 3 + .../Runtime/ServerHealthCheck.cs | 58 + .../Runtime/ServerHealthCheck.cs.meta | 3 + .../SingularityGroup.HotReload.Runtime.asmdef | 27 + ...ularityGroup.HotReload.Runtime.asmdef.meta | 7 + .../Runtime/SymbolResolver.cs | 90 + .../Runtime/SymbolResolver.cs.meta | 11 + .../Runtime/SymbolResolvingFailedException.cs | 14 + .../SymbolResolvingFailedException.cs.meta | 11 + .../Runtime/TaskExtensions.cs | 48 + .../Runtime/TaskExtensions.cs.meta | 11 + .../Runtime/ThreadUtility.cs | 226 + .../Runtime/ThreadUtility.cs.meta | 3 + .../Runtime/UnityHelper.cs | 42 + .../Runtime/UnityHelper.cs.meta | 3 + .../Server.meta | 8 + .../Server/hot-reload-config.graphql | 99 + .../Server/hot-reload-config.graphql.meta | 7 + .../Server/linux-x64.meta | 8 + .../linux-x64/hotreload-start-script.sh | 86 + .../linux-x64/hotreload-start-script.sh.meta | 7 + .../Server/linux-x64/terminal-run.sh | 39 + .../Server/linux-x64/terminal-run.sh.meta | 7 + .../Third Party Notices.md | 327 + .../Third Party Notices.md.meta | 7 + .../package.json | 20 + .../package.json.meta | 7 + Playvoi.Client/Packages/packages-lock.json | 9 + 371 files changed, 35986 insertions(+) create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Documentation.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Documentation/Documentation.pdf create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Documentation/Documentation.pdf.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Attribution.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Attribution/Attribution.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Attribution/Attribution.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Attribution/VSAttribution.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Attribution/VSAttribution.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/CliUtils.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/CliUtils.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/FallbackCliController.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/FallbackCliController.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/HotReloadCli.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/HotReloadCli.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/ICliController.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/ICliController.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/LinuxCliController.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/LinuxCliController.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/OsxCliController.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/OsxCliController.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/StartArgs.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/StartArgs.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/WindowsCliController.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/WindowsCliController.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/DefaultCompileChecker.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/DefaultCompileChecker.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/ICompileChecker.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/ICompileChecker.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/LegacyCompileChecker.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/LegacyCompileChecker.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Constants.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Constants.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Demo.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Demo/EditorDemo.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Demo/EditorDemo.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/EditorCodePatcher.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/EditorCodePatcher.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/EditorIndicationState.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/EditorIndicationState.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/GitUtil.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/GitUtil.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/AssemblyOmission.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/AssemblyOmission.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/BuildInfoHelper.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/BuildInfoHelper.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/EditorWindowHelper.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/EditorWindowHelper.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/GUIHelper.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/GUIHelper.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/HotReloadSuggestionsHelper.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/HotReloadSuggestionsHelper.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/HotReloadTimelineHelper.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/HotReloadTimelineHelper.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/Spinner.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/Spinner.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/UnitySettingsHelper.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/UnitySettingsHelper.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadEventPopup.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadEventPopup.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadOverlay.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadOverlay.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadPrefs.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadPrefs.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadSettingsEditor.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadSettingsEditor.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadState.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadState.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Icon_Player.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Icon_Player.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/DownloadUtility.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/DownloadUtility.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/ExponentialBackoff.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/ExponentialBackoff.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/InstallUtility.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/InstallUtility.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/ServerDownloader.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/ServerDownloader.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/UpdateUtility.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/UpdateUtility.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/BuildGenerateBuildInfo.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/BuildGenerateBuildInfo.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/HotReloadBuildHelper.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/HotReloadBuildHelper.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PostbuildModifyAndroidManifest.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PostbuildModifyAndroidManifest.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PostbuildSendProjectState.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PostbuildSendProjectState.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PrebuildIncludeResources.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PrebuildIncludeResources.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/FileIOProvider.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/FileIOProvider.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/GUIDProvider.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/GUIDProvider.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IFileIO.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IFileIO.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IGUIDGenerator.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IGUIDGenerator.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IHotReloadProjectGenerationPostProcessor.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IHotReloadProjectGenerationPostProcessor.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGenenerationPostProcessor.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGenenerationPostProcessor.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGeneration.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGeneration.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGenerationFlag.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGenerationFlag.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectPart.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectPart.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/SolutionGuidGenerator.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/SolutionGuidGenerator.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/Util.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/Util/FileSystemUtil.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/Util/FileSystemUtil.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/Util/StringUtils.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/Util/StringUtils.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/RequiredSettings.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/RequiredSettings/RequiredSettingChecker.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/RequiredSettings/RequiredSettingChecker.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Icn_Stop.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Icn_Stop.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Icn_play.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Icn_play.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Logo_HotReload_DarkMode.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Logo_HotReload_DarkMode.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Logo_HotReload_LightMode.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Logo_HotReload_LightMode.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/alert_info.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/alert_info.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/applied_patch.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/applied_patch.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/blue.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/blue.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/close.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/close.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/error.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/error.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/events.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/events.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/foldout_closed.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/foldout_closed.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/foldout_open.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/foldout_open.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/green.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/green.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/grey.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/grey.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_check_circle.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_check_circle.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_circle_black.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_circle_black.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_circle_gray.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_circle_gray.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_loading_star_light_mode_96.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_loading_star_light_mode_96.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_warning_circle.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_warning_circle.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/infos.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/infos.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/logo.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/logo.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/red.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/red.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/red_dot.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/red_dot.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/refresh.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/refresh.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/report_bug.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/report_bug.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/warning.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/warning.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/yellow.png create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/yellow.png.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ServerHealthCheck.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ServerHealthCheck.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/SingularityGroup.HotReload.Editor.asmdef create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/SingularityGroup.HotReload.Editor.asmdef.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/SingularityGroup.HotReload.EditorDependencies.dll create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/SingularityGroup.HotReload.EditorDependencies.dll.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Versioning.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Versioning/PackageUpdateChecker.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Versioning/PackageUpdateChecker.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Versioning/SemVer.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Versioning/SemVer.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Buttons.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Buttons/OpenDialogueButton.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Buttons/OpenDialogueButton.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Buttons/OpenURLButton.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Buttons/OpenURLButton.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/EditorTextures.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/EditorTextures.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/IGUIComponent.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/IGUIComponent.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/AllowAndroidAppToMakeHttpRequestsOption.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/AllowAndroidAppToMakeHttpRequestsOption.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/Base.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/Base/HotReloadOptionBase.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/Base/HotReloadOptionBase.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/Base/OptionInterfaces.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/Base/OptionInterfaces.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/ExposeServerOption.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/ExposeServerOption.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/IncludeInBuildOption.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/IncludeInBuildOption.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Base.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Base/HotReloadTabBase.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Base/HotReloadTabBase.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Helpers.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Helpers/RedeemLicenseHelper.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Helpers/RedeemLicenseHelper.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadAboutTab.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadAboutTab.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadOptionsSection.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadOptionsSection.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadRunTab.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadRunTab.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadSettingsTab.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadSettingsTab.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/HotReloadWindow.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/HotReloadWindow.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/ShowOnStartupEnum.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/ShowOnStartupEnum.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/Styles.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/Styles/HotReloadWindowStyles.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/Styles/HotReloadWindowStyles.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/LICENSE.md create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/LICENSE.md.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/README.md create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/README.md.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/AppCallbackListener.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/AppCallbackListener.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/BuildInfo.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/BuildInfo.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Burst.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Burst/JobHotReloadUtility.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Burst/JobHotReloadUtility.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/BurstChecker.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/BurstChecker.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/CodePatcher.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/CodePatcher.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBasicDemo.unity create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBasicDemo.unity.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBurstDemo.unity create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBurstDemo.unity.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBurstDemoSettings.lighting create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBurstDemoSettings.lighting.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/HotReloadBasicDemo.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/HotReloadBasicDemo.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/HotReloadBurstJobsDemo.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/HotReloadBurstJobsDemo.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/IDemo.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/IDemo.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/HotReloadPrompts.prefab create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/HotReloadPrompts.prefab.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/HotReloadSettingsObject.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/HotReloadSettingsObject.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/IServerHealthCheck.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/IServerHealthCheck.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/InstallQRDialog.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/InstallQRDialog.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/IpHelper.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/IpHelper.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs/EditorOnly.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs/EditorOnly/SingularityGroup.HotReload.RuntimeDependencies.dll create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs/EditorOnly/SingularityGroup.HotReload.RuntimeDependencies.dll.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs/EditorOnly/SingularityGroup.HotReload.RuntimeDependencies2019.dll create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs/EditorOnly/SingularityGroup.HotReload.RuntimeDependencies2019.dll.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs/EditorOnly/SingularityGroup.HotReload.RuntimeDependencies2020.dll create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs/EditorOnly/SingularityGroup.HotReload.RuntimeDependencies2020.dll.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs/EditorOnly/SingularityGroup.HotReload.RuntimeDependencies2022.dll create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs/EditorOnly/SingularityGroup.HotReload.RuntimeDependencies2022.dll.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs/OnDevice.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs/OnDevice/SingularityGroup.HotReload.RuntimeDependencies.dll create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs/OnDevice/SingularityGroup.HotReload.RuntimeDependencies.dll.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs/OnDevice/SingularityGroup.HotReload.RuntimeDependencies2019.dll create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs/OnDevice/SingularityGroup.HotReload.RuntimeDependencies2019.dll.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs/OnDevice/SingularityGroup.HotReload.RuntimeDependencies2020.dll create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs/OnDevice/SingularityGroup.HotReload.RuntimeDependencies2020.dll.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs/OnDevice/SingularityGroup.HotReload.RuntimeDependencies2022.dll create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs/OnDevice/SingularityGroup.HotReload.RuntimeDependencies2022.dll.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/MethodCompatiblity.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/MethodCompatiblity.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/MethodPatchResponsesConverter.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/MethodPatchResponsesConverter.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/MethodUtils.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/MethodUtils.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/MonoBehaviours.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/MonoBehaviours/ConnectionDialog.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/MonoBehaviours/ConnectionDialog.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/MonoBehaviours/Prompts.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/MonoBehaviours/Prompts.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/MonoBehaviours/QuestionDialog.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/MonoBehaviours/QuestionDialog.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/MonoBehaviours/RetryDialog.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/MonoBehaviours/RetryDialog.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/MonoMethod.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/MonoMethod.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/OSX.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/OSX/HotReloadNativeHelper.dylib create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/OSX/HotReloadNativeHelper.dylib.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/OnHotReloadDispatch.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/OnHotReloadDispatch.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/PackageConst.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/PackageConst.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/PatchServerInfo.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/PatchServerInfo.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/PersistencePaths.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/PersistencePaths.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/PlayerCodePatcher.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/PlayerCodePatcher.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/PlayerEntrypoint.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/PlayerEntrypoint.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Public.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Public/HotReloadLogging.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Public/HotReloadLogging.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Public/InvokeOnHotReload.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Public/InvokeOnHotReload.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Public/InvokeOnHotReloadLocal.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Public/InvokeOnHotReloadLocal.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Public/Log.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Public/Log.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Public/LogLevel.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Public/LogLevel.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Public/SingularityGroup.HotReload.Runtime.Public.asmdef create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Public/SingularityGroup.HotReload.Runtime.Public.asmdef.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/RequestHelper.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/RequestHelper.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/ServerHandshake.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/ServerHandshake.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/ServerHealthCheck.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/ServerHealthCheck.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/SingularityGroup.HotReload.Runtime.asmdef create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/SingularityGroup.HotReload.Runtime.asmdef.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/SymbolResolver.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/SymbolResolver.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/SymbolResolvingFailedException.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/SymbolResolvingFailedException.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/TaskExtensions.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/TaskExtensions.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/ThreadUtility.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/ThreadUtility.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/UnityHelper.cs create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/UnityHelper.cs.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Server.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Server/hot-reload-config.graphql create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Server/hot-reload-config.graphql.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Server/linux-x64.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Server/linux-x64/hotreload-start-script.sh create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Server/linux-x64/hotreload-start-script.sh.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Server/linux-x64/terminal-run.sh create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Server/linux-x64/terminal-run.sh.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Third Party Notices.md create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/Third Party Notices.md.meta create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/package.json create mode 100644 Playvoi.Client/Packages/com.singularitygroup.hotreload/package.json.meta diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Documentation.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Documentation.meta new file mode 100644 index 0000000..3268408 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Documentation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7a025eec5cd1851429c24e953a58d48b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Documentation/Documentation.pdf b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Documentation/Documentation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..27968728e01cb565a9f1ea4cb3899c9904aa46b7 GIT binary patch literal 33649 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 Yot%xHIRDz9A^cz@KQ=3?q>|MC01=Q({Qv*} literal 0 HcmV?d00001 diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Documentation/Documentation.pdf.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Documentation/Documentation.pdf.meta new file mode 100644 index 0000000..577af0c --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Documentation/Documentation.pdf.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8999c2c2d9cadcb44a617a5df023bfa1 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor.meta new file mode 100644 index 0000000..74ca4b0 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f5dfa6492e8e7ce4f937aa75ef4e86fd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Attribution.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Attribution.meta new file mode 100644 index 0000000..944cb63 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Attribution.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7ae8b0adf00c450d9e80e11ffa1d2cf7 +timeCreated: 1678721517 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Attribution/Attribution.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Attribution/Attribution.cs new file mode 100644 index 0000000..980755a --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Attribution/Attribution.cs @@ -0,0 +1,61 @@ +using System; +using System.Globalization; +using SingularityGroup.HotReload.DTO; +using UnityEditor; +using UnityEditor.VSAttribution.HotReload; +using UnityEngine; +using UnityEngine.Analytics; + +namespace SingularityGroup.HotReload.Editor { + internal static class Attribution { + internal const string LastLoginKey = "HotReload.Attribution.LastAttributionEventAt"; + + //Resend attribution event every 12 hours to be safe + static readonly TimeSpan resendPeriod = TimeSpan.FromHours(12); + + //The last time the attribution event was sent. + //Returns unix epoch in case it has never been sent before. + static DateTime LastAttributionEventAt { + get { + if(EditorPrefs.HasKey(LastLoginKey)) { + return DateTime.ParseExact(EditorPrefs.GetString(LastLoginKey), "o", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); + } + return DateTimeOffset.FromUnixTimeSeconds(0).UtcDateTime; + } + set { + EditorPrefs.SetString(LastLoginKey, value.ToUniversalTime().ToString("o")); + } + } + + + const string actionName = "Login"; + const string partnerName = "The Naughty Cult Ltd."; + + public static void RegisterLogin(LoginStatusResponse response) { + //Licensing might not be initialized yet. + //The hwId should be set eventually. + if(response.hardwareId == null) { + return; + } + //Only forward attribution if this is an asset store build. + //We will still distribute this package outside of the asset store (i.e via our website). + if (!PackageConst.IsAssetStoreBuild) { + return; + } + + var now = DateTime.UtcNow; + //If we sent an attribution event in the last 12 hours we should already be good. + if (now - LastAttributionEventAt < resendPeriod) { + return; + } + + var result = VSAttribution.SendAttributionEvent(actionName, partnerName, response.hardwareId); + + //Retry on transient errors + if (result == AnalyticsResult.NotInitialized) { + return; + } + LastAttributionEventAt = now; + } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Attribution/Attribution.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Attribution/Attribution.cs.meta new file mode 100644 index 0000000..8a36764 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Attribution/Attribution.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 67658aafb8404f0eb9496812ba4bb8a4 +timeCreated: 1678721795 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Attribution/VSAttribution.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Attribution/VSAttribution.cs new file mode 100644 index 0000000..cc06552 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Attribution/VSAttribution.cs @@ -0,0 +1,68 @@ +using System; +using UnityEngine.Analytics; + +namespace UnityEditor.VSAttribution.HotReload +{ + internal static class VSAttribution + { + const int k_VersionId = 4; + const int k_MaxEventsPerHour = 10; + const int k_MaxNumberOfElements = 1000; + + const string k_VendorKey = "unity.vsp-attribution"; + const string k_EventName = "vspAttribution"; + + static bool RegisterEvent() + { + AnalyticsResult result = EditorAnalytics.RegisterEventWithLimit(k_EventName, k_MaxEventsPerHour, + k_MaxNumberOfElements, k_VendorKey, k_VersionId); + + var isResultOk = result == AnalyticsResult.Ok; + return isResultOk; + } + + [Serializable] + struct VSAttributionData + { + public string actionName; + public string partnerName; + public string customerUid; + public string extra; + } + + /// + /// Registers and attempts to send a Verified Solutions Attribution event. + /// + /// Name of the action, identifying a place this event was called from. + /// Identifiable Verified Solutions Partner's name. + /// Unique identifier of the customer using Partner's Verified Solution. + public static AnalyticsResult SendAttributionEvent(string actionName, string partnerName, string customerUid) + { + try + { + // Are Editor Analytics enabled ? (Preferences) + if (!EditorAnalytics.enabled) + return AnalyticsResult.AnalyticsDisabled; + + if (!RegisterEvent()) + return AnalyticsResult.InvalidData; + + // Create an expected data object + var eventData = new VSAttributionData + { + actionName = actionName, + partnerName = partnerName, + customerUid = customerUid, + extra = "{}" + }; + + return EditorAnalytics.SendEventWithLimit(k_EventName, eventData, k_VersionId); + } + catch + { + // Fail silently + return AnalyticsResult.AnalyticsDisabled; + } + } + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Attribution/VSAttribution.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Attribution/VSAttribution.cs.meta new file mode 100644 index 0000000..d9256b0 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Attribution/VSAttribution.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d7493a30e78d4ec783ead20baea2c4d2 +timeCreated: 1678721534 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI.meta new file mode 100644 index 0000000..7ce99ac --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a100625513d043c7bb875461043f4f86 +timeCreated: 1673820086 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/CliUtils.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/CliUtils.cs new file mode 100644 index 0000000..b18c4be --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/CliUtils.cs @@ -0,0 +1,100 @@ +using System.Diagnostics; +using System.IO; +using UnityEngine; +#if !UNITY_EDITOR_OSX +using System; +#endif + +namespace SingularityGroup.HotReload.Editor.Cli { + internal static class CliUtils { + public static string GetTempDownloadFilePath(string osxFileName) { + if (UnityHelper.Platform == RuntimePlatform.OSXEditor) { + // project specific temp directory that is writeable on MacOS (Path.GetTempPath() wasn't when run through HotReload.app) + return Path.GetFullPath(PackageConst.LibraryCachePath + $"/HotReloadServerTemp/{osxFileName}"); + } else { + return Path.GetTempFileName(); + } + } + + public static string GetHotReloadTempDir() { + if (UnityHelper.Platform == RuntimePlatform.OSXEditor) { + // project specific temp directory that is writeable on MacOS (Path.GetTempPath() wasn't when run through HotReload.app) + return Path.GetFullPath(PackageConst.LibraryCachePath + "/HotReloadServerTemp"); + } else { + return Path.Combine(Path.GetTempPath(), "HotReloadTemp"); + } + } + + public static string GetAppDataPath() { +# if (UNITY_EDITOR_OSX) + var baseDir = "/Users/Shared"; +# elif (UNITY_EDITOR_LINUX) + var baseDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); +# else + var baseDir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); +#endif + return Path.Combine(baseDir, "singularitygroup-hotreload"); + } + + public static string GetExecutableTargetDir() { + if (PackageConst.IsAssetStoreBuild) { + return Path.Combine(GetAppDataPath(), "asset-store", $"executables_{PackageConst.ServerVersion.Replace('.', '-')}"); + } + return Path.Combine(GetAppDataPath(), $"executables_{PackageConst.ServerVersion.Replace('.', '-')}"); + } + + public static string GetCliTempDir() { + return Path.Combine(GetHotReloadTempDir(), "MethodPatches"); + } + + public static void Chmod(string targetFile, string flags = "+x") { + // ReSharper disable once PossibleNullReferenceException + Process.Start(new ProcessStartInfo("chmod", $"{flags} \"{targetFile}\"") { + UseShellExecute = false, + }).WaitForExit(2000); + } + + public static bool TryFindServerDir(out string path) { + const string serverBasePath = "Packages/com.singularitygroup.hotreload/Server"; + if(Directory.Exists(serverBasePath)) { + path = Path.GetFullPath(serverBasePath); + return true; + } + + //Not found in packages. Try to find in assets folder. + //fast path - this is the expected folder + const string alternativeExecutablePath = "Assets/HotReload/Server"; + if(Directory.Exists(alternativeExecutablePath)) { + path = Path.GetFullPath(alternativeExecutablePath); + return true; + } + //slow path - try to find the server directory somewhere in the assets folder + var candidates = Directory.GetDirectories("Assets", "HotReload", SearchOption.AllDirectories); + foreach(var candidate in candidates) { + var serverDir = Path.Combine(candidate, "Server"); + if(Directory.Exists(serverDir)) { + path = Path.GetFullPath(serverDir); + return true; + } + } + path = null; + return false; + } + + public static string GetPidFilePath(string hotreloadTempDir) { + return Path.GetFullPath(Path.Combine(hotreloadTempDir, "server.pid")); + } + + public static void KillLastKnownHotReloadProcess() { + var pidPath = GetPidFilePath(GetHotReloadTempDir()); + try { + var pid = int.Parse(File.ReadAllText(pidPath)); + Process.GetProcessById(pid).Kill(); + } + catch { + //ignore + } + File.Delete(pidPath); + } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/CliUtils.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/CliUtils.cs.meta new file mode 100644 index 0000000..74b9a55 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/CliUtils.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b0243b348dec4a308dc7b98e09842d2c +timeCreated: 1673820875 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/FallbackCliController.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/FallbackCliController.cs new file mode 100644 index 0000000..6601490 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/FallbackCliController.cs @@ -0,0 +1,13 @@ + +using System.Threading.Tasks; + +namespace SingularityGroup.HotReload.Editor.Cli { + class FallbackCliController : ICliController { + public string BinaryFileName => ""; + public string PlatformName => ""; + public bool CanOpenInBackground => false; + public Task Start(StartArgs args) => Task.CompletedTask; + + public Task Stop() => Task.CompletedTask; + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/FallbackCliController.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/FallbackCliController.cs.meta new file mode 100644 index 0000000..a235970 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/FallbackCliController.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 090ed5d45f294f0d8799879206139bd6 +timeCreated: 1673824275 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/HotReloadCli.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/HotReloadCli.cs new file mode 100644 index 0000000..4b76a06 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/HotReloadCli.cs @@ -0,0 +1,182 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using SingularityGroup.HotReload.Newtonsoft.Json; +using UnityEditor; + +namespace SingularityGroup.HotReload.Editor.Cli { + [InitializeOnLoad] + public static class HotReloadCli { + internal static readonly ICliController controller; + + //InitializeOnLoad ensures controller gets initialized on unity thread + static HotReloadCli() { + controller = + #if UNITY_EDITOR_OSX + new OsxCliController(); + #elif UNITY_EDITOR_LINUX + new LinuxCliController(); + #elif UNITY_EDITOR_WIN + new WindowsCliController(); + #else + new FallbackCliController(); + #endif + } + + public static bool CanOpenInBackground => controller.CanOpenInBackground; + + /// + /// Public API: Starts the Hot Reload server. Must be on the main thread + /// + public static Task StartAsync() { + return StartAsync( + exposeServerToNetwork: HotReloadPrefs.ExposeServerToLocalNetwork, + allAssetChanges: HotReloadPrefs.AllAssetChanges, + createNoWindow: HotReloadPrefs.DisableConsoleWindow + ); + } + + internal static async Task StartAsync(bool exposeServerToNetwork, bool allAssetChanges, bool createNoWindow, LoginData loginData = null) { + await Prepare().ConfigureAwait(false); + await ThreadUtility.SwitchToThreadPool(); + StartArgs args; + if (TryGetStartArgs(UnityHelper.DataPath, exposeServerToNetwork, allAssetChanges, createNoWindow, loginData, out args)) { + await controller.Start(args); + } + } + + /// + /// Public API: Stops the Hot Reload server + /// + /// + /// This is a no-op in case the server is not running + /// + public static Task StopAsync() { + return controller.Stop(); + } + + class Config { +#pragma warning disable CS0649 + public bool useBuiltInProjectGeneration; +#pragma warning restore CS0649 + } + + static bool TryGetStartArgs(string dataPath, bool exposeServerToNetwork, bool allAssetChanges, bool createNoWindow, LoginData loginData, out StartArgs args) { + string serverDir; + if(!CliUtils.TryFindServerDir(out serverDir)) { + Log.Warning($"Failed to start the Hot Reload Server. " + + $"Unable to locate the 'Server' directory. " + + $"Make sure the 'Server' directory is " + + $"somewhere in the Assets folder inside a 'HotReload' folder or in the HotReload package"); + args = null; + return false; + } + + Config config; + if (File.Exists(PackageConst.ConfigFileName)) { + config = JsonConvert.DeserializeObject(File.ReadAllText(PackageConst.ConfigFileName)); + } else { + config = new Config(); + } + var hotReloadTmpDir = CliUtils.GetHotReloadTempDir(); + var cliTempDir = CliUtils.GetCliTempDir(); + // Versioned path so that we only need to extract the binary once. User can have multiple projects + // on their machine using different HotReload versions. + var executableTargetDir = CliUtils.GetExecutableTargetDir(); + Directory.CreateDirectory(executableTargetDir); // ensure exists + var executableSourceDir = Path.Combine(serverDir, controller.PlatformName); + var unityProjDir = Path.GetDirectoryName(dataPath); + string slnPath; + if (config.useBuiltInProjectGeneration) { + var info = new DirectoryInfo(Path.GetFullPath(".")); + slnPath = Path.Combine(Path.GetFullPath("."), info.Name + ".sln"); + if (!File.Exists(slnPath)) { + Log.Warning($"Failed to start the Hot Reload Server. Cannot find solution file. Please disable \"useBuiltInProjectGeneration\" in settings to enable custom project generation."); + args = null; + return false; + } + Log.Info("Using default project generation. If you encounter any problem with Unity's default project generation consider disabling it to use custom project generation."); + try { + Directory.Delete(ProjectGeneration.ProjectGeneration.tempDir, true); + } catch(Exception ex) { + Log.Exception(ex); + } + } else { + slnPath = ProjectGeneration.ProjectGeneration.GetSolutionFilePath(dataPath); + } + + if (!File.Exists(slnPath)) { + Log.Warning($"No .sln file found. Open any c# file to generate it so Hot Reload can work properly"); + } + + var searchAssemblies = string.Join(";", CodePatcher.I.GetAssemblySearchPaths()); + var cliArguments = $@"-u ""{unityProjDir}"" -s ""{slnPath}"" -t ""{cliTempDir}"" -a ""{searchAssemblies}"" -ver ""{PackageConst.Version}"" -proc ""{Process.GetCurrentProcess().Id}"" -assets ""{allAssetChanges}"""; + if (loginData != null) { + cliArguments += $@" -email ""{loginData.email}"" -pass ""{loginData.password}"""; + } + if (exposeServerToNetwork) { + // server will listen on local network interface (default is localhost only) + cliArguments += " -e true"; + } + args = new StartArgs { + hotreloadTempDir = hotReloadTmpDir, + cliTempDir = cliTempDir, + executableTargetDir = executableTargetDir, + executableSourceDir = executableSourceDir, + cliArguments = cliArguments, + unityProjDir = unityProjDir, + createNoWindow = createNoWindow, + }; + return true; + } + + static async Task Prepare() { + await ThreadUtility.SwitchToMainThread(); + + var dataPath = UnityHelper.DataPath; + await ProjectGeneration.ProjectGeneration.EnsureSlnAndCsprojFiles(dataPath); + await PrepareBuildInfoAsync(); + PrepareSystemPathsFile(); + } + + internal static async Task PrepareBuildInfoAsync() { + await ThreadUtility.SwitchToMainThread(); + var buildInfoInput = await BuildInfoHelper.GetGenerateBuildInfoInput(); + await Task.Run(() => { + try { + var buildInfo = BuildInfoHelper.GenerateBuildInfoThreaded(buildInfoInput); + PrepareBuildInfo(buildInfo); + } catch { + // ignore, we will warn when making a build + } + }); + } + + internal static void PrepareBuildInfo(BuildInfo buildInfo) { + // When starting server make sure it starts with correct player data state. + // (this fixes issue where Unity is in background and not sending files state). + // Always write player data because you can be on any build target and want to connect with a downloaded android build. + var json = buildInfo.ToJson(); + var cliTempDir = CliUtils.GetCliTempDir(); + Directory.CreateDirectory(cliTempDir); + File.WriteAllText(Path.Combine(cliTempDir, "playerdata.json"), json); + } + + static void PrepareSystemPathsFile() { +#pragma warning disable CS0618 // obsolete since 2023 + var lvl = PlayerSettings.GetApiCompatibilityLevel(EditorUserBuildSettings.selectedBuildTargetGroup); +#pragma warning restore CS0618 +#if UNITY_2020_3_OR_NEWER + var dirs = UnityEditor.Compilation.CompilationPipeline.GetSystemAssemblyDirectories(lvl); +#else + var t = typeof(UnityEditor.Editor).Assembly.GetType("UnityEditor.Scripting.ScriptCompilation.MonoLibraryHelpers"); + var m = t.GetMethod("GetSystemReferenceDirectories"); + var dirs = m.Invoke(null, new object[] { lvl }); +#endif + Directory.CreateDirectory(PackageConst.LibraryCachePath); + File.WriteAllText(PackageConst.LibraryCachePath + "/systemAssemblies.json", JsonConvert.SerializeObject(dirs)); + } + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/HotReloadCli.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/HotReloadCli.cs.meta new file mode 100644 index 0000000..7e0da5f --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/HotReloadCli.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9f756ed6b78d428b8b9f83a6544317fe +timeCreated: 1673820326 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/ICliController.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/ICliController.cs new file mode 100644 index 0000000..93d8826 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/ICliController.cs @@ -0,0 +1,13 @@ +using System.Threading.Tasks; + +namespace SingularityGroup.HotReload.Editor.Cli { + interface ICliController { + string BinaryFileName {get;} + string PlatformName {get;} + bool CanOpenInBackground {get;} + + Task Start(StartArgs args); + + Task Stop(); + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/ICliController.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/ICliController.cs.meta new file mode 100644 index 0000000..d278fae --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/ICliController.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8cba48e21f76483da3ba615915e731fd +timeCreated: 1673820542 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/LinuxCliController.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/LinuxCliController.cs new file mode 100644 index 0000000..9bb68ee --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/LinuxCliController.cs @@ -0,0 +1,73 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Threading.Tasks; +using Debug = UnityEngine.Debug; + +namespace SingularityGroup.HotReload.Editor.Cli { + + class LinuxCliController : ICliController { + Process process; + + public string BinaryFileName => "CodePatcherCLI"; + public string PlatformName => "linux-x64"; + public bool CanOpenInBackground => true; + + public Task Start(StartArgs args) { + var startScript = Path.Combine(args.executableSourceDir, "hotreload-start-script.sh"); + if (!File.Exists(startScript)) { + throw new FileNotFoundException(startScript); + } + File.WriteAllText(startScript, File.ReadAllText(startScript).Replace("\r\n", "\n")); + CliUtils.Chmod(startScript); + + var title = CodePatcher.TAG + "Server " + new DirectoryInfo(args.unityProjDir).Name; + title = title.Replace(" ", "-"); + title = title.Replace("'", ""); + + var cliargsfile = Path.GetTempFileName(); + File.WriteAllText(cliargsfile,args.cliArguments); + var codePatcherProc = Process.Start(new ProcessStartInfo { + FileName = startScript, + Arguments = + $"--title \"{title}\"" + + $" --executables-source-dir \"{args.executableSourceDir}\" " + + $" --executable-taget-dir \"{args.executableTargetDir}\"" + + $" --pidfile \"{CliUtils.GetPidFilePath(args.hotreloadTempDir)}\"" + + $" --cli-arguments-file \"{cliargsfile}\"" + + $" --method-patch-dir \"{args.cliTempDir}\"" + + $" --create-no-window \"{args.createNoWindow}\"", + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true + }); + if (codePatcherProc == null) { + if (File.Exists(cliargsfile)) { + File.Delete(cliargsfile); + } + throw new Exception("Could not start code patcher process."); + } + codePatcherProc.BeginErrorReadLine(); + codePatcherProc.BeginOutputReadLine(); + codePatcherProc.OutputDataReceived += (_, a) => { + }; + // error data can also mean we kill the proc beningly + codePatcherProc.ErrorDataReceived += (_, a) => { + }; + process = codePatcherProc; + return Task.CompletedTask; + } + + public async Task Stop() { + await RequestHelper.KillServer(); + try { + // process.CloseMainWindow throws if proc already exited. + // also we just rely on the pid file it is fine + CliUtils.KillLastKnownHotReloadProcess(); + } catch { + //ignored + } + process = null; + } + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/LinuxCliController.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/LinuxCliController.cs.meta new file mode 100644 index 0000000..732303c --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/LinuxCliController.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c894a69d595d4ada8cfa4afe23c68ab9 +timeCreated: 1673820131 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/OsxCliController.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/OsxCliController.cs new file mode 100644 index 0000000..d1545b8 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/OsxCliController.cs @@ -0,0 +1,190 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Threading.Tasks; +using SingularityGroup.HotReload.Editor.Semver; +using Debug = UnityEngine.Debug; + +namespace SingularityGroup.HotReload.Editor.Cli { + class OsxCliController : ICliController { + Process process; + + public string BinaryFileName => "HotReload.app.zip"; + public string PlatformName => "osx-x64"; + public bool CanOpenInBackground => false; + + /// In MacOS 13 Ventura, our app cannot launch a terminal window. + /// We use a custom app that launches HotReload server and shows it's output (just like a terminal would). + // Including MacOS 12 Monterey as well so I can dogfood it -Troy + private static bool UseCustomConsoleApp() => MacOSVersion.Value.Major >= 12; + + // dont use static because null comparison on SemVersion is broken + private static readonly Lazy MacOSVersion = new Lazy(() => { + //UnityHelper.OperatingSystem; // in Unity 2018 it returns 10.16 on monterey (no idea why) + //Environment.OSVersion returns unix version like 21.x + var startinfo = new ProcessStartInfo { + FileName = "/usr/bin/sw_vers", + Arguments = "-productVersion", + UseShellExecute = false, + RedirectStandardOutput = true, + CreateNoWindow = true, + }; + var process = Process.Start(startinfo); + + string osVersion = process.StandardOutput.ReadToEnd().Trim(); + + SemVersion macosVersion; + if (SemVersion.TryParse(osVersion, out macosVersion)) { + return macosVersion; + } + // should never happen + Log.Warning("Failed to detect MacOS version, if Hot Reload fails to start, please contact support."); + return SemVersion.None; + }); + + public async Task Start(StartArgs args) { + // Unzip the .app.zip to temp folder .app + var appExecutablePath = $"{args.executableTargetDir}/HotReload.app/Contents/MacOS/HotReload"; + var cliExecutablePath = $"{args.executableTargetDir}/HotReload.app/Contents/Resources/CodePatcherCLI"; + + // ensure running on threadpool + await ThreadUtility.SwitchToThreadPool(); + + // executableTargetDir is versioned, so only need to extract once. + if (!File.Exists(appExecutablePath)) { + try { + // delete only the extracted app folder (must not delete downloaded zip which is in same folder) + Directory.Delete(args.executableTargetDir + "/HotReload.app", true); + } catch (IOException) { + // ignore directory not found + } + Directory.CreateDirectory(args.executableTargetDir); + UnzipMacOsPackage($"{args.executableTargetDir}/{BinaryFileName}", args.executableTargetDir + "/"); + } + + try { + // Always stop first because rarely it has happened that the server process was still running after custom console closed. + // Note: this will also stop Hot Reload started by other Unity projects. + await Stop(); + } catch { + // ignored + } + + if (UseCustomConsoleApp()) { + await StartCustomConsole(args, appExecutablePath); + } else { + await StartTerminal(args, cliExecutablePath); + } + } + + public Task StartCustomConsole(StartArgs args, string executablePath) { + process = Process.Start(new ProcessStartInfo { + // Path to the HotReload.app + FileName = executablePath, + Arguments = args.cliArguments, + UseShellExecute = false, + }); + return Task.CompletedTask; + } + + public Task StartTerminal(StartArgs args, string executablePath) { + var pidFilePath = CliUtils.GetPidFilePath(args.hotreloadTempDir); + // To run in a Terminal window (so you can see compiler logs), we must put the arguments into a script file + // and run the script in Terminal. Terminal.app does not forward the arguments passed to it via `open --args`. + // *.command files are opened with the user's default terminal app. + var executableScriptPath = Path.Combine(Path.GetTempPath(), "Start_HotReloadServer.command"); + // You don't need to copy the cli executable on mac + // omit hashbang line, let shell use the default interpreter (easier than detecting your default shell beforehand) + + File.WriteAllText(executableScriptPath, $"echo $$ > \"{pidFilePath}\"" + + $"\ncd \"{Environment.CurrentDirectory}\"" + // set cwd because 'open' launches script with $HOME as cwd. + $"\n\"{executablePath}\" {args.cliArguments} || read"); + + CliUtils.Chmod(executableScriptPath); // make it executable + CliUtils.Chmod(executablePath); // make it executable + + Directory.CreateDirectory(args.hotreloadTempDir); + Directory.CreateDirectory(args.executableTargetDir); + Directory.CreateDirectory(args.cliTempDir); + + process = Process.Start(new ProcessStartInfo { + FileName = "open", + Arguments = $"{(args.createNoWindow ? "-gj" : "")} '{executableScriptPath}'", + UseShellExecute = true, + }); + + if (process.WaitForExit(1000)) { + if (process.ExitCode != 0) { + Log.Warning("Failed to the run the start server command. ExitCode={0}\nFilepath: {1}", process.ExitCode, executableScriptPath); + } + } + else { + process.EnableRaisingEvents = true; + process.Exited += (_, __) => { + if (process.ExitCode != 0) { + Log.Warning("Failed to the run the start server command. ExitCode={0}\nFilepath: {1}", process.ExitCode, executableScriptPath); + } + }; + } + return Task.CompletedTask; + } + + public async Task Stop() { + // kill HotReload server process (on mac it has different pid to the window which started it) + await RequestHelper.KillServer(); + + // process.CloseMainWindow throws if proc already exited. + // We rely on the pid file for killing the trampoline script (in-case script is just starting and HotReload server not running yet) + process = null; + CliUtils.KillLastKnownHotReloadProcess(); + } + + static void UnzipMacOsPackage(string zipPath, string unzippedFolderPath) { + //Log.Info("UnzipMacOsPackage called with {0}\n workingDirectory = {1}", zipPath, unzippedFolderPath); + if (!zipPath.EndsWith(".zip")) { + throw new ArgumentException($"Expected to end with .zip, but it was: {zipPath}", nameof(zipPath)); + } + + if (!File.Exists(zipPath)) { + throw new ArgumentException($"zip file not found {zipPath}", nameof(zipPath)); + } + var processStartInfo = new ProcessStartInfo { + FileName = "unzip", + Arguments = $"-o \"{zipPath}\"", + WorkingDirectory = unzippedFolderPath, // unzip extracts to working directory by default + UseShellExecute = true, + CreateNoWindow = true + }; + + Process process = Process.Start(processStartInfo); + process.WaitForExit(); + if (process.ExitCode != 0) { + throw new Exception($"unzip failed with ExitCode {process.ExitCode}"); + } + //Log.Info($"did unzip to {unzippedFolderPath}"); + // Move the .app folder to unzippedFolderPath + + // find the .app directory which is now inside unzippedFolderPath directory + var foundDirs = Directory.GetDirectories(unzippedFolderPath, "*.app", SearchOption.AllDirectories); + var done = false; + var destDir = unzippedFolderPath + "HotReload.app"; + foreach (var dir in foundDirs) { + if (dir.EndsWith(".app")) { + done = true; + if (dir == destDir) { + // already in the right place + break; + } + Directory.Move(dir, destDir); + //Log.Info("Moved to " + destDir); + break; + } + } + + if (!done) { + throw new Exception("Failed to find .app directory and move it to " + destDir); + } + //Log.Info($"did unzip to {unzippedFolderPath}"); + } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/OsxCliController.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/OsxCliController.cs.meta new file mode 100644 index 0000000..5e71717 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/OsxCliController.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5ebeed1c29454bc78e5a9ee64f2c9def +timeCreated: 1673821666 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/StartArgs.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/StartArgs.cs new file mode 100644 index 0000000..7d6b2a5 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/StartArgs.cs @@ -0,0 +1,12 @@ +namespace SingularityGroup.HotReload.Editor.Cli { + class StartArgs { + public string hotreloadTempDir; + // aka method patch temp dir + public string cliTempDir; + public string executableTargetDir; + public string executableSourceDir; + public string cliArguments; + public string unityProjDir; + public bool createNoWindow; + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/StartArgs.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/StartArgs.cs.meta new file mode 100644 index 0000000..66da278 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/StartArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 43d69eb7ae8aef4428da83562105bfaa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/WindowsCliController.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/WindowsCliController.cs new file mode 100644 index 0000000..d623fda --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/WindowsCliController.cs @@ -0,0 +1,33 @@ +using System.Diagnostics; +using System.IO; +using System.Threading.Tasks; + +namespace SingularityGroup.HotReload.Editor.Cli { + class WindowsCliController : ICliController { + Process process; + + public string BinaryFileName => "CodePatcherCLI.exe"; + public string PlatformName => "win-x64"; + public bool CanOpenInBackground => true; + + public Task Start(StartArgs args) { + process = Process.Start(new ProcessStartInfo { + FileName = Path.GetFullPath(Path.Combine(args.executableTargetDir, "CodePatcherCLI.exe")), + Arguments = args.cliArguments, + UseShellExecute = !args.createNoWindow, + CreateNoWindow = args.createNoWindow, + }); + return Task.CompletedTask; + } + + public async Task Stop() { + await RequestHelper.KillServer(); + try { + process?.CloseMainWindow(); + } catch { + //ignored + } + process = null; + } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/WindowsCliController.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/WindowsCliController.cs.meta new file mode 100644 index 0000000..cb2aaba --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CLI/WindowsCliController.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e5644af69ec7404a8039ff2833610d48 +timeCreated: 1673822169 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker.meta new file mode 100644 index 0000000..855fa44 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 80c2056f805745542a2c295385b25479 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/DefaultCompileChecker.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/DefaultCompileChecker.cs new file mode 100644 index 0000000..1ef81dd --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/DefaultCompileChecker.cs @@ -0,0 +1,71 @@ +#if UNITY_2019_1_OR_NEWER +using System; +using System.IO; +using System.Threading.Tasks; +using UnityEditor; +using UnityEditor.Compilation; +using UnityEngine; + +namespace SingularityGroup.HotReload.Editor { + class DefaultCompileChecker : ICompileChecker { + const string recompileFilePath = PackageConst.LibraryCachePath + "/recompile.txt"; + bool hasCompileErrors; + bool recompile; + public DefaultCompileChecker() { + CompilationPipeline.assemblyCompilationFinished += DetectCompileErrors; + CompilationPipeline.compilationFinished += OnCompilationFinished; + var currentSessionId = EditorAnalyticsSessionInfo.id; + Task.Run(() => { + try { + var compileSessionId = File.ReadAllText(recompileFilePath); + if(compileSessionId == currentSessionId.ToString()) { + ThreadUtility.RunOnMainThread(() => { + recompile = true; + _onCompilationFinished?.Invoke(); + }); + } + File.Delete(recompileFilePath); + } catch(DirectoryNotFoundException) { + //dir doesn't exist -> no recompile required + } catch(FileNotFoundException) { + //file doesn't exist -> no recompile required + } catch(Exception ex) { + Log.Warning("compile checker encountered issue: {0} {1}", ex.GetType().Name, ex.Message); + } + }); + } + + void DetectCompileErrors(string _, CompilerMessage[] messages) { + for (int i = 0; i < messages.Length; i++) { + if (messages[i].type == CompilerMessageType.Error) { + hasCompileErrors = true; + return; + } + } + } + + void OnCompilationFinished(object _) { + if(hasCompileErrors) { + //Don't recompile on compile errors. + hasCompileErrors = false; + } else { + Directory.CreateDirectory(Path.GetDirectoryName(recompileFilePath)); + File.WriteAllText(recompileFilePath, EditorAnalyticsSessionInfo.id.ToString()); + } + } + + Action _onCompilationFinished; + public event Action onCompilationFinished { + add { + if(recompile && value != null) { + value(); + } + _onCompilationFinished += value; + } + remove { + _onCompilationFinished -= value; + } + } + } +} +#endif \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/DefaultCompileChecker.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/DefaultCompileChecker.cs.meta new file mode 100644 index 0000000..e07fab9 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/DefaultCompileChecker.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ab09f7c657e6ecb44b65dd9f8cfc3d9f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/ICompileChecker.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/ICompileChecker.cs new file mode 100644 index 0000000..967e741 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/ICompileChecker.cs @@ -0,0 +1,17 @@ +using System; + +namespace SingularityGroup.HotReload.Editor { + interface ICompileChecker { + event Action onCompilationFinished; + } + + static class CompileChecker { + internal static ICompileChecker Create() { + #if UNITY_2019_1_OR_NEWER + return new DefaultCompileChecker(); + #else + return new LegacyCompileChecker(); + #endif + } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/ICompileChecker.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/ICompileChecker.cs.meta new file mode 100644 index 0000000..a1def4b --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/ICompileChecker.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 82bf36f2126bbd1498d4964272426e0f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/LegacyCompileChecker.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/LegacyCompileChecker.cs new file mode 100644 index 0000000..32569ab --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/LegacyCompileChecker.cs @@ -0,0 +1,54 @@ +#if !UNITY_2019_1_OR_NEWER +using System; +using System.Globalization; +using System.IO; +using System.Threading.Tasks; + +namespace SingularityGroup.HotReload.Editor { + class LegacyCompileChecker : ICompileChecker { + const string timestampFilePath = PackageConst.LibraryCachePath + "/lastCompileTimestamp.txt"; + const string assemblyPath = "Library/ScriptAssemblies"; + bool recompile; + public LegacyCompileChecker() { + Task.Run(() => { + var info = new DirectoryInfo(assemblyPath); + if(!info.Exists) { + return; + } + var currentCompileTimestamp = default(DateTime); + foreach (var file in info.GetFiles("*.dll")) { + var fileWriteDate = file.LastWriteTimeUtc; + if(fileWriteDate > currentCompileTimestamp) { + currentCompileTimestamp = fileWriteDate; + } + } + if(File.Exists(timestampFilePath)) { + var lastTimestampStr = File.ReadAllText(timestampFilePath); + var lastTimestamp = DateTime.ParseExact(lastTimestampStr, "o", CultureInfo.CurrentCulture).ToUniversalTime(); + if(currentCompileTimestamp > lastTimestamp) { + ThreadUtility.RunOnMainThread(() => { + recompile = true; + _onCompilationFinished?.Invoke(); + }); + } + } + Directory.CreateDirectory(Path.GetDirectoryName(timestampFilePath)); + File.WriteAllText(timestampFilePath, currentCompileTimestamp.ToString("o")); + }); + } + + Action _onCompilationFinished; + public event Action onCompilationFinished { + add { + if(recompile && value != null) { + value(); + } + _onCompilationFinished += value; + } + remove { + _onCompilationFinished -= value; + } + } + } +} +#endif \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/LegacyCompileChecker.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/LegacyCompileChecker.cs.meta new file mode 100644 index 0000000..4821a49 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/CompileChecker/LegacyCompileChecker.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f56ec68ce4b1fcc4b9c8ba5962d890f1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Constants.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Constants.cs new file mode 100644 index 0000000..073e12c --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Constants.cs @@ -0,0 +1,41 @@ + +namespace SingularityGroup.HotReload.Editor { + internal static class Constants { + public const string WebsiteURL = "https://hotreload.net"; + + public const string ProductPurchaseURL = WebsiteURL + "/pricing"; + public const string ProductPurchaseBusinessURL = ProductPurchaseURL + "?tab=business"; + public const string DocumentationURL = WebsiteURL + "/documentation"; + public const string AdditionalContentURL = DocumentationURL + "/getting-started#downloading-additional-content"; + public const string DownloadUrl = WebsiteURL + "/download"; + public const string ContactURL = WebsiteURL + "/contact"; + public const string ForumURL = "https://forum.unity.com/threads/hot-reload-edit-code-without-compiling.1389969/"; + public const string ManageLicenseURL = "https://billing.stripe.com/p/login/28odTObUQ0CU0Za3cc"; + public const string ManageAccountURL = "https://users.licensespring.com/login"; + public const string ForgotPasswordURL = "https://users.licensespring.com/reset-password"; + public const string ReportIssueURL = "https://gitlab.com/singularitygroup/hot-reload-for-unity/-/issues/new"; + public const string TroubleshootingURL = "https://hotreload.net/documentation/troubleshooting"; + public const string RecompileTroubleshootingURL = TroubleshootingURL + "#unity-recompiles-every-time-i-enterexit-playmode"; + public const string FeaturesDocumentationURL = DocumentationURL + "/features"; + public const string VoteForAwardURL = "https://awards.unity.com/#best-development-tool"; + public const string UnityStoreRateAppURL = "https://assetstore.unity.com/packages/slug/254358#reviews"; + public const string ChangelogURL = WebsiteURL + "/changelog"; + public const string DiscordInviteUrl = "https://discord.com/invite/kgxAS4Bqxr"; + + public const int DaysToRateApp = 5; + public const int RecompileButtonTextHideWidth = 460; + public const int IndicationTextHideWidth = 360; + public const int StartButtonTextHideWidth = 400; + public const int EventsListHideHeight = 360; + public const int EventsListHideWidth = 425; + public const int UpgradeLicenseNoteHideWidth = 325; + public const int UpgradeLicenseNoteHideHeight = 150; + public const int RateAppHideHeight = 325; + public const int RateAppHideWidth = 300; + public const int EventFiltersShownHideWidth = 275; + public const int ConsumptionsHideWidth = 300; + public const int ConsumptionsHideHeight = 360; + + public const string Only40EntriesShown = "Only last 40 entries are shown"; + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Constants.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Constants.cs.meta new file mode 100644 index 0000000..1178a75 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Constants.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ce502822e7fa34844bcb385f44091eb9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Demo.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Demo.meta new file mode 100644 index 0000000..1c88280 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Demo.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7c5c2596a7a469c42a1a6b35017d8a49 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Demo/EditorDemo.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Demo/EditorDemo.cs new file mode 100644 index 0000000..895c685 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Demo/EditorDemo.cs @@ -0,0 +1,26 @@ +using System.Collections; +using System.IO; +using SingularityGroup.HotReload.Demo; +using UnityEditor; +using UnityEngine; + +namespace SingularityGroup.HotReload.Editor.Demo { + class EditorDemo : IDemo { + public bool IsServerRunning() { + return ServerHealthCheck.I.IsServerHealthy; + } + + public void OpenHotReloadWindow() { + HotReloadWindow.Open(); + } + + public void OpenScriptFile(TextAsset textAsset, int line, int column) { + var path = Path.GetFullPath(AssetDatabase.GetAssetPath(textAsset)); +#if UNITY_2019_4_OR_NEWER + Unity.CodeEditor.CodeEditor.CurrentEditor.OpenProject(path, line, column); +#else + EditorUtility.OpenWithDefaultApp(path); +#endif + } + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Demo/EditorDemo.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Demo/EditorDemo.cs.meta new file mode 100644 index 0000000..fe658c1 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Demo/EditorDemo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fde6b5b57a3aeba4888a7bdaa16b3074 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/EditorCodePatcher.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/EditorCodePatcher.cs new file mode 100644 index 0000000..c262a3b --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/EditorCodePatcher.cs @@ -0,0 +1,907 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using JetBrains.Annotations; +using SingularityGroup.HotReload.DTO; +using SingularityGroup.HotReload.Editor.Cli; +using SingularityGroup.HotReload.Editor.Demo; +using SingularityGroup.HotReload.EditorDependencies; +using SingularityGroup.HotReload.RuntimeDependencies; +using UnityEditor; +using UnityEngine; +using Debug = UnityEngine.Debug; +using Task = System.Threading.Tasks.Task; +using System.Reflection; +using System.Runtime.CompilerServices; +using SingularityGroup.HotReload.Newtonsoft.Json; +using UnityEditor.Compilation; + +[assembly: InternalsVisibleTo("SingularityGroup.HotReload.IntegrationTests")] + +namespace SingularityGroup.HotReload.Editor { + internal class Config { + public bool patchEditModeOnlyOnEditorFocus; + public string[] assetBlacklist; + public bool changePlaymodeTint; + public bool disableCompilingFromEditorScripts; + } + + [InitializeOnLoad] + internal static class EditorCodePatcher { + const string sessionFilePath = PackageConst.LibraryCachePath + "/sessionId.txt"; + const string patchesFilePath = PackageConst.LibraryCachePath + "/patches.json"; + + internal static readonly ServerDownloader serverDownloader; + internal static bool _compileError; + internal static bool _applyingFailed; + internal static bool _appliedPartially; + + static Timer timer; + static bool init; + + internal static UnityLicenseType licenseType { get; private set; } + internal static bool LoginNotRequired => PackageConst.IsAssetStoreBuild && licenseType != UnityLicenseType.UnityPro; + internal static bool compileError => _compileError; + + internal static PatchStatus patchStatus = PatchStatus.None; + + internal static event Action OnPatchHandled; + + + internal static Config config; + + static bool quitting; + static EditorCodePatcher() { + if(init) { + //Avoid infinite recursion in case the static constructor gets accessed via `InitPatchesBlocked` below + return; + } + if (File.Exists(PackageConst.ConfigFileName)) { + config = JsonConvert.DeserializeObject(File.ReadAllText(PackageConst.ConfigFileName)); + } else { + config = new Config(); + } + init = true; + UnityHelper.Init(); + //Use synchonization context if possible because it's more reliable. + ThreadUtility.InitEditor(); + if (!EditorWindowHelper.IsHumanControllingUs()) { + return; + } + + serverDownloader = new ServerDownloader(); + timer = new Timer(OnIntervalThreaded, (Action) OnIntervalMainThread, 500, 500); + + UpdateHost(); + licenseType = UnityLicenseHelper.GetLicenseType(); + var compileChecker = CompileChecker.Create(); + compileChecker.onCompilationFinished += OnCompilationFinished; + EditorApplication.delayCall += InstallUtility.CheckForNewInstall; + AddEditorFocusChangedHandler(OnEditorFocusChanged); + // When domain reloads, this is a good time to ensure server has up-to-date project information + if (ServerHealthCheck.I.IsServerHealthy) { + EditorApplication.delayCall += TryPrepareBuildInfo; + } + HotReloadSuggestionsHelper.Init(); + // reset in case last session didn't shut down properly + CheckEditorSettings(); + EditorApplication.quitting += ResetSettingsOnQuit; + + AssemblyReloadEvents.beforeAssemblyReload += () => { + HotReloadTimelineHelper.PersistTimeline(); + }; + + CompilationPipeline.compilationFinished += obj => { + // reset in case package got removed + // if it got removed, it will not be enabled again + // if it wasn't removed, settings will get handled by OnIntervalMainThread + AutoRefreshSettingChecker.Reset(); + ScriptCompilationSettingChecker.Reset(); + PlaymodeTintSettingChecker.Reset(); + HotReloadRunTab.recompiling = false; + CompileMethodDetourer.Reset(); + }; + DetectEditorStart(); + DetectVersionUpdate(); + SingularityGroup.HotReload.Demo.Demo.I = new EditorDemo(); + RecordActiveDaysForRateApp(); + if (EditorApplication.isPlayingOrWillChangePlaymode) { + CodePatcher.I.InitPatchesBlocked(patchesFilePath); + HotReloadTimelineHelper.InitPersistedEvents(); + } + +#pragma warning disable CS0612 // Type or member is obsolete + if (HotReloadPrefs.RateAppShownLegacy) { + HotReloadPrefs.RateAppShown = true; + } + if (!File.Exists(HotReloadPrefs.showOnStartupPath)) { + var showOnStartupLegacy = HotReloadPrefs.GetShowOnStartupEnum(); + HotReloadPrefs.ShowOnStartup = showOnStartupLegacy; + } +#pragma warning restore CS0612 // Type or member is obsolete + + HotReloadState.ShowingRedDot = false; + + if (DateTime.Now < new DateTime(2023, 11, 1)) { + HotReloadSuggestionsHelper.SetSuggestionsShown(HotReloadSuggestionKind.UnityBestDevelopmentToolAward2023); + } else { + HotReloadSuggestionsHelper.SetSuggestionInactive(HotReloadSuggestionKind.UnityBestDevelopmentToolAward2023); + } + + EditorApplication.playModeStateChanged += state => { + if (state == PlayModeStateChange.EnteredEditMode && HotReloadPrefs.AutoRecompileUnsupportedChangesOnExitPlayMode) { + if (TryRecompileUnsupportedChanges()) { + HotReloadState.RecompiledUnsupportedChangesOnExitPlaymode = true; + } + } + }; + } + + public static void ResetSettingsOnQuit() { + quitting = true; + AutoRefreshSettingChecker.Reset(); + ScriptCompilationSettingChecker.Reset(); + PlaymodeTintSettingChecker.Reset(); + HotReloadCli.StopAsync().Forget(); + CompileMethodDetourer.Reset(); + } + + public static bool autoRecompileUnsupportedChangesSupported; + static void AddEditorFocusChangedHandler(Action handler) { + var eventInfo = typeof(EditorApplication).GetEvent("focusChanged", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); + var addMethod = eventInfo?.GetAddMethod(true) ?? eventInfo?.GetAddMethod(false); + if (addMethod != null) { + addMethod.Invoke(null, new object[]{ handler }); + } + autoRecompileUnsupportedChangesSupported = addMethod != null; + } + + private static void OnEditorFocusChanged(bool hasFocus) { + if (hasFocus && !HotReloadPrefs.AutoRecompileUnsupportedChangesImmediately) { + TryRecompileUnsupportedChanges(); + } + } + + public static bool TryRecompileUnsupportedChanges() { + if (!HotReloadPrefs.AutoRecompileUnsupportedChanges + || HotReloadTimelineHelper.UnsupportedChangesCount == 0 + && (!HotReloadPrefs.AutoRecompilePartiallyUnsupportedChanges || HotReloadTimelineHelper.PartiallySupportedChangesCount == 0) + || _compileError + || EditorApplication.isPlaying && !HotReloadPrefs.AutoRecompileUnsupportedChangesInPlayMode + ) { + return false; + } + + if (HotReloadPrefs.ShowCompilingUnsupportedNotifications) { + EditorWindowHelper.ShowNotification(EditorWindowHelper.NotificationStatus.NeedsRecompile); + } + HotReloadRunTab.Recompile(); + return true; + } + + private static DateTime lastPrepareBuildInfo = DateTime.UtcNow; + + /// Post state for player builds. + /// Only check build target because user can change build settings whenever. + internal static void TryPrepareBuildInfo() { + // Note: we post files state even when build target is wrong + // because you might connect with a build downloaded onto the device. + if ((DateTime.UtcNow - lastPrepareBuildInfo).TotalSeconds > 5) { + lastPrepareBuildInfo = DateTime.UtcNow; + HotReloadCli.PrepareBuildInfoAsync().Forget(); + } + } + + internal static void RecordActiveDaysForRateApp() { + var unixDay = (int)(DateTimeOffset.UtcNow.ToUnixTimeSeconds() / 86400); + var activeDays = GetActiveDaysForRateApp(); + if (activeDays.Count < Constants.DaysToRateApp && activeDays.Add(unixDay.ToString())) { + HotReloadPrefs.ActiveDays = string.Join(",", activeDays); + } + } + + internal static HashSet GetActiveDaysForRateApp() { + if (string.IsNullOrEmpty(HotReloadPrefs.ActiveDays)) { + return new HashSet(); + } + return new HashSet(HotReloadPrefs.ActiveDays.Split(',')); + } + + // CheckEditorStart distinguishes between domain reload and first editor open + // We have some separate logic on editor start (InstallUtility.HandleEditorStart) + private static void DetectEditorStart() { + var editorId = EditorAnalyticsSessionInfo.id; + var currVersion = PackageConst.Version; + Task.Run(() => { + try { + var lines = File.Exists(sessionFilePath) ? File.ReadAllLines(sessionFilePath) : Array.Empty(); + + long prevSessionId = -1; + string prevVersion = null; + if (lines.Length >= 2) { + long.TryParse(lines[1], out prevSessionId); + } + if (lines.Length >= 3) { + prevVersion = lines[2].Trim(); + } + var updatedFromVersion = (prevSessionId != -1 && currVersion != prevVersion) ? prevVersion : null; + + if (prevSessionId != editorId && prevSessionId != 0) { + // back to mainthread + ThreadUtility.RunOnMainThread(() => { + InstallUtility.HandleEditorStart(updatedFromVersion); + + var newEditorId = EditorAnalyticsSessionInfo.id; + if (newEditorId != 0) { + Task.Run(() => { + try { + // editorId isn't available on first domain reload, must do it here + File.WriteAllLines(sessionFilePath, new[] { + "1", // serialization version + newEditorId.ToString(), + currVersion, + }); + + } catch (IOException) { + // ignore + } + }); + } + }); + } + + } catch (IOException) { + // ignore + } catch (Exception e) { + ThreadUtility.LogException(e); + } + }); + } + + private static void DetectVersionUpdate() { + if (serverDownloader.CheckIfDownloaded(HotReloadCli.controller)) { + return; + } + ServerHealthCheck.instance.CheckHealth(); + if (!ServerHealthCheck.I.IsServerHealthy) { + return; + } + var restartServer = EditorUtility.DisplayDialog("Hot Reload", + $"When updating Hot Reload, the server must be restarted for the update to take effect." + + "\nDo you want to restart it now?", + "Restart server", "Don't restart"); + if (restartServer) { + RestartCodePatcher().Forget(); + } + } + + private static void UpdateHost() { + string host = "127.0.0.1"; + var rootPath = Path.GetFullPath("."); + RequestHelper.SetServerInfo(new PatchServerInfo(host, null, rootPath)); + } + + static void OnIntervalThreaded(object o) { + ServerHealthCheck.instance.CheckHealth(); + ThreadUtility.RunOnMainThread((Action)o); + if (serverDownloader.Progress >= 1f) { + serverDownloader.CheckIfDownloaded(HotReloadCli.controller); + } + } + + private static bool _requestingFlushErrors; + private static long _lastErrorFlush; + private static async Task RequestFlushErrors() { + _requestingFlushErrors = true; + try { + await RequestFlushErrorsCore(); + } finally { + _requestingFlushErrors = false; + } + } + + private static async Task RequestFlushErrorsCore() { + var pollFrequency = 500; + // Delay until we've hit the poll request frequency + var waitMs = (int)Mathf.Clamp(pollFrequency - ((DateTime.Now.Ticks / (float)TimeSpan.TicksPerMillisecond) - _lastErrorFlush), 0, pollFrequency); + await Task.Delay(waitMs); + await FlushErrors(); + _lastErrorFlush = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + } + + static async Task FlushErrors() { + var response = await RequestHelper.RequestFlushErrors(); + if (response == null) { + return; + } + foreach (var responseWarning in response.warnings) { + if (responseWarning.Contains("Scripts have compile errors")) { + Log.Error(responseWarning); + } else { + Log.Warning(responseWarning); + } + + if (responseWarning.Contains("Multidimensional arrays are not supported")) { + await ThreadUtility.SwitchToMainThread(); + HotReloadSuggestionsHelper.SetSuggestionsShown(HotReloadSuggestionKind.MultidimensionalArrays); + } + } + foreach (var responseError in response.errors) { + Log.Error(responseError); + } + } + + internal static bool firstPatchAttempted; + static void OnIntervalMainThread() { + RequestServerInfo(); + HotReloadSuggestionsHelper.Check(); + if(ServerHealthCheck.I.IsServerHealthy) { + TryPrepareBuildInfo(); + if (!requestingCompile && (!config.patchEditModeOnlyOnEditorFocus || Application.isPlaying || UnityEditorInternal.InternalEditorUtility.isApplicationActive)) { + RequestHelper.PollMethodPatches(HotReloadState.LastPatchId, resp => HandleResponseReceived(resp)); + } + RequestHelper.PollPatchStatus(resp => { + patchStatus = resp.patchStatus; + if (patchStatus == PatchStatus.Compiling) { + startWaitingForCompile = null; + } + if (patchStatus == PatchStatus.Patching) { + firstPatchAttempted = true; + if (HotReloadPrefs.ShowPatchingNotifications) { + EditorWindowHelper.ShowNotification(EditorWindowHelper.NotificationStatus.Patching, maxDuration: 10); + } + } else if (HotReloadPrefs.ShowPatchingNotifications) { + EditorWindowHelper.RemoveNotification(); + } + }, patchStatus); + if (HotReloadPrefs.AllAssetChanges) { + RequestHelper.PollAssetChanges(HandleAssetChange); + } + } + if (!ServerHealthCheck.I.IsServerHealthy) { + stopping = false; + } + if (startupProgress?.Item1 == 1) { + starting = false; + } + if (!_requestingFlushErrors && Running) { + RequestFlushErrors().Forget(); + } + CheckEditorSettings(); + } + + static void CheckEditorSettings() { + if (quitting) { + return; + } + CheckAutoRefresh(); + CheckScriptCompilation(); + CheckPlaymodeTint(); + CheckAssetDatabaseRefresh(); + } + + static void CheckAutoRefresh() { + if (HotReloadPrefs.AllowDisableUnityAutoRefresh && ServerHealthCheck.I.IsServerHealthy) { + AutoRefreshSettingChecker.Apply(); + AutoRefreshSettingChecker.Check(); + } else { + AutoRefreshSettingChecker.Reset(); + } + } + + static void CheckScriptCompilation() { + if (HotReloadPrefs.AllowDisableUnityAutoRefresh && ServerHealthCheck.I.IsServerHealthy) { + ScriptCompilationSettingChecker.Apply(); + ScriptCompilationSettingChecker.Check(); + } else { + ScriptCompilationSettingChecker.Reset(); + } + } + + static string[] assetExtensionBlacklist = new[] { + ".cs", + // TODO add setting to allow scenes to get hot reloaded for users who collaborate (their scenes change externally) + ".unity", + // safer to ignore meta files completely until there's a use-case + ".meta", + // debug files + ".mdb", + ".pdb", + // ".shader", //use assetBlacklist instead + }; + + public static string[] compileFiles = new[] { + ".asmdef", + ".asmref", + ".rsp", + }; + + public static string[] plugins = new[] { + // native plugins + ".dll", + ".bundle", + ".dylib", + ".so", + // plugin scripts + ".cpp", + ".h", + ".aar", + ".jar", + ".a", + ".java" + }; + + static void HandleAssetChange(string assetPath) { + // ignore directories + if (Directory.Exists(assetPath)) { + return; + } + foreach (var compileFile in compileFiles) { + if (assetPath.EndsWith(compileFile, StringComparison.Ordinal)) { + HotReloadTimelineHelper.CreateErrorEventEntry($"errors: AssemblyFileEdit: Editing assembly files requires recompiling in Unity. in {assetPath}", entryType: EntryType.Foldout); + _applyingFailed = true; + if (HotReloadPrefs.AutoRecompileUnsupportedChangesImmediately || UnityEditorInternal.InternalEditorUtility.isApplicationActive) { + TryRecompileUnsupportedChanges(); + } + return; + } + } + // Add plugin changes to unsupported changes list + foreach (var plugin in plugins) { + if (assetPath.EndsWith(plugin, StringComparison.Ordinal)) { + HotReloadTimelineHelper.CreateErrorEventEntry($"errors: NativePluginEdit: Editing native plugins requires recompiling in Unity. in {assetPath}", entryType: EntryType.Foldout); + _applyingFailed = true; + if (HotReloadPrefs.AutoRecompileUnsupportedChangesImmediately || UnityEditorInternal.InternalEditorUtility.isApplicationActive) { + TryRecompileUnsupportedChanges(); + } + return; + } + } + + // ignore file extensions that trigger domain reload + if (!HotReloadPrefs.IncludeShaderChanges) { + if (assetPath.EndsWith(".shader", StringComparison.Ordinal)) { + return; + } + } + foreach (var blacklisted in assetExtensionBlacklist) { + if (assetPath.EndsWith(blacklisted, StringComparison.Ordinal)) { + return; + } + } + if (config?.assetBlacklist != null) { + foreach (var blacklisted in config.assetBlacklist) { + if (assetPath.EndsWith(blacklisted, StringComparison.Ordinal)) { + return; + } + } + } + var relativePath = GetRelativePath(assetPath, Path.GetFullPath("Assets")); + var relativePathPackages = GetRelativePath(assetPath, Path.GetFullPath("Packages")); + // ignore files outside assets and packages folders + if (relativePath.StartsWith("..", StringComparison.Ordinal) + && relativePathPackages.StartsWith("..", StringComparison.Ordinal) + ) { + return; + } + try { + if (!File.Exists(assetPath)) { + AssetDatabase.DeleteAsset(relativePath); + } else { + AssetDatabase.ImportAsset(relativePath, ImportAssetOptions.ForceUpdate); + } + } catch (Exception e){ + Log.Warning($"Refreshing asset at path: {assetPath} failed due to exception: {e}"); + } + } + + public static string GetRelativePath(string filespec, string folder) { + Uri pathUri = new Uri(filespec); + Uri folderUri = new Uri(folder); + return Uri.UnescapeDataString(folderUri.MakeRelativeUri(pathUri).ToString().Replace('/', Path.DirectorySeparatorChar)); + } + + static void CheckPlaymodeTint() { + if (config.changePlaymodeTint && ServerHealthCheck.I.IsServerHealthy && Application.isPlaying) { + PlaymodeTintSettingChecker.Apply(); + PlaymodeTintSettingChecker.Check(); + } else { + PlaymodeTintSettingChecker.Reset(); + } + } + + static void CheckAssetDatabaseRefresh() { + if (config.disableCompilingFromEditorScripts && ServerHealthCheck.I.IsServerHealthy) { + CompileMethodDetourer.Apply(); + } else { + CompileMethodDetourer.Reset(); + } + } + + static void HandleResponseReceived(MethodPatchResponse response) { + HandleRemovedUnityMethods(response.removedMethod); + + RegisterPatchesResult patchResult = null; + if (response.patches?.Length > 0) { + LogBurstHint(response); + patchResult = CodePatcher.I.RegisterPatches(response, persist: true); + CodePatcher.I.SaveAppliedPatches(patchesFilePath).Forget(); + } + + var partiallySupportedChangesFiltered = new List(response.partiallySupportedChanges ?? Array.Empty()); + partiallySupportedChangesFiltered.RemoveAll(x => !HotReloadTimelineHelper.GetPartiallySupportedChangePref(x)); + var failuresDeduplicated = new HashSet(response.failures ?? Array.Empty()); + _compileError = response.failures?.Any(failure => failure.Contains("error CS")) ?? false; + _applyingFailed = response.failures?.Length > 0 || patchResult?.patchFailures.Count > 0; + _appliedPartially = !_applyingFailed && partiallySupportedChangesFiltered.Count > 0; + + if (_compileError) { + HotReloadTimelineHelper.EventsTimeline.RemoveAll(e => e.alertType == AlertType.CompileError); + foreach (var failure in failuresDeduplicated) { + if (failure.Contains("error CS")) { + HotReloadTimelineHelper.CreateErrorEventEntry(failure); + } + } + } else if (_applyingFailed) { + if (partiallySupportedChangesFiltered.Count > 0) { + foreach (var responsePartiallySupportedChange in partiallySupportedChangesFiltered) { + HotReloadTimelineHelper.CreatePartiallyAppliedEventEntry(responsePartiallySupportedChange, entryType: EntryType.Child); + } + } + foreach (var failure in failuresDeduplicated) { + HotReloadTimelineHelper.CreateErrorEventEntry(failure, entryType: EntryType.Child); + } + if (patchResult?.patchFailures.Count > 0) { + foreach (var failure in patchResult.patchFailures) { + SMethod method = failure.Item1; + string error = failure.Item2; + HotReloadTimelineHelper.CreatePatchFailureEventEntry(error, methodName: GetMethodName(method), methodSimpleName: method.simpleName, entryType: EntryType.Child); + } + } + HotReloadTimelineHelper.CreateReloadFinishedWithWarningsEventEntry(); + HotReloadSuggestionsHelper.SetSuggestionsShown(HotReloadSuggestionKind.UnsupportedChanges); + if (HotReloadPrefs.AutoRecompileUnsupportedChangesImmediately || UnityEditorInternal.InternalEditorUtility.isApplicationActive) { + TryRecompileUnsupportedChanges(); + } + } else if (_appliedPartially) { + foreach (var responsePartiallySupportedChange in partiallySupportedChangesFiltered) { + HotReloadTimelineHelper.CreatePartiallyAppliedEventEntry(responsePartiallySupportedChange, entryType: EntryType.Child, detailed: false); + } + HotReloadTimelineHelper.CreateReloadPartiallyAppliedEventEntry(); + + if (HotReloadPrefs.AutoRecompileUnsupportedChangesImmediately || UnityEditorInternal.InternalEditorUtility.isApplicationActive) { + TryRecompileUnsupportedChanges(); + } + } else { + HotReloadTimelineHelper.CreateReloadFinishedEventEntry(); + } + + // When patching different assembly, compile error will get removed, even though it's still there + // It's a shortcut we take for simplicity + if (!_compileError) { + HotReloadTimelineHelper.EventsTimeline.RemoveAll(x => x.alertType == AlertType.CompileError); + } + + if (HotReloadWindow.Current) { + HotReloadWindow.Current.Repaint(); + } + HotReloadState.LastPatchId = response.id; + OnPatchHandled?.Invoke(); + } + + static string GetMethodName(SMethod method) { + var spaceIndex = method.displayName.IndexOf(" ", StringComparison.Ordinal); + if (spaceIndex > 0) { + return method.displayName.Substring(spaceIndex); + } + return method.displayName; + } + + + static void HandleRemovedUnityMethods(SMethod[] removedMethods) { + if (removedMethods == null) { + return; + } + foreach(var sMethod in removedMethods) { + try { + var candidates = CodePatcher.I.SymbolResolver.Resolve(sMethod.assemblyName.Replace(".dll", "")); + var asm = candidates[0]; + var module = asm.GetLoadedModules()[0]; + var oldMethod = module.ResolveMethod(sMethod.metadataToken); + UnityEventHelper.RemoveUnityEventMethod(oldMethod); + } catch(Exception ex) { + Log.Warning("Encountered exception in RemoveUnityEventMethod: {0} {1}", ex.GetType().Name, ex.Message); + } + } + } + + [Conditional("UNITY_2022_2_OR_NEWER")] + static void LogBurstHint(MethodPatchResponse response) { + if(HotReloadPrefs.LoggedBurstHint) { + return; + } + foreach (var patch in response.patches) { + if(patch.unityJobs.Length > 0) { + Debug.LogWarning("A unity job was hot reloaded. " + + "This will cause a harmless warning that can be ignored. " + + $"More info about this can be found here: {Constants.TroubleshootingURL}"); + HotReloadPrefs.LoggedBurstHint = true; + break; + } + } + } + + private static DateTime? startWaitingForCompile; + static void OnCompilationFinished() { + ServerHealthCheck.instance.CheckHealth(); + if(ServerHealthCheck.I.IsServerHealthy) { + startWaitingForCompile = DateTime.UtcNow; + firstPatchAttempted = false; + RequestCompile().Forget(); + } + Task.Run(() => File.Delete(patchesFilePath)); + HotReloadTimelineHelper.ClearPersistance(); + } + + static bool requestingCompile; + static async Task RequestCompile() { + requestingCompile = true; + try { + await RequestHelper.RequestClearPatches(); + await ProjectGeneration.ProjectGeneration.GenerateSlnAndCsprojFiles(Application.dataPath); + await RequestHelper.RequestCompile(); + } finally { + requestingCompile = false; + } + } + + private static bool stopping; + private static bool starting; + private static DateTime? startupCompletedAt; + private static Tuple startupProgress; + + internal static bool Started => ServerHealthCheck.I.IsServerHealthy && DownloadProgress == 1 && StartupProgress?.Item1 == 1; + internal static bool Starting => (StartedServerRecently() || ServerHealthCheck.I.IsServerHealthy) && !Started && starting && patchStatus != PatchStatus.CompileError; + internal static bool Stopping => stopping && Running; + internal static bool Compiling => DateTime.UtcNow - startWaitingForCompile < TimeSpan.FromSeconds(5) || patchStatus == PatchStatus.Compiling || HotReloadRunTab.recompiling; + internal static Tuple StartupProgress => startupProgress; + + + /// + /// We have a button to stop the Hot Reload server.
+ /// Store task to ensure only one stop attempt at a time. + ///
+ private static DateTime? serverStartedAt; + private static DateTime? serverStoppedAt; + private static DateTime? serverRestartedAt; + private static bool StartedServerRecently() { + return DateTime.UtcNow - serverStartedAt < ServerHealthCheck.HeartBeatTimeout; + } + + internal static bool StoppedServerRecently() { + return DateTime.UtcNow - serverStoppedAt < ServerHealthCheck.HeartBeatTimeout || (!StartedServerRecently() && (startupProgress?.Item1 ?? 0) == 0); + } + + internal static bool RestartedServerRecently() { + return DateTime.UtcNow - serverRestartedAt < ServerHealthCheck.HeartBeatTimeout; + } + + private static bool requestingStart; + private static async Task StartCodePatcher(LoginData loginData = null) { + if (requestingStart || StartedServerRecently()) { + return; + } + stopping = false; + starting = true; + var exposeToNetwork = HotReloadPrefs.ExposeServerToLocalNetwork; + var allAssetChanges = HotReloadPrefs.AllAssetChanges; + var disableConsoleWindow = HotReloadPrefs.DisableConsoleWindow; + CodePatcher.I.ClearPatchedMethods(); + try { + requestingStart = true; + startupProgress = Tuple.Create(0f, "Starting Hot Reload"); + serverStartedAt = DateTime.UtcNow; + await HotReloadCli.StartAsync(exposeToNetwork, allAssetChanges, disableConsoleWindow, loginData).ConfigureAwait(false); + } + catch (Exception ex) { + ThreadUtility.LogException(ex); + } + finally { + requestingStart = false; + } + } + + private static bool requestingStop; + internal static async Task StopCodePatcher() { + stopping = true; + starting = false; + if (requestingStop) { + return; + } + CodePatcher.I.ClearPatchedMethods(); + try { + requestingStop = true; + await HotReloadCli.StopAsync().ConfigureAwait(false); + serverStoppedAt = DateTime.UtcNow; + await ThreadUtility.SwitchToMainThread(); + startupProgress = null; + } + catch (Exception ex) { + ThreadUtility.LogException(ex); + } + finally { + requestingStop = false; + } + } + + private static bool requestingRestart; + internal static async Task RestartCodePatcher() { + if (requestingRestart) { + return; + } + try { + requestingRestart = true; + await StopCodePatcher(); + await DownloadAndRun(); + serverRestartedAt = DateTime.UtcNow; + } + finally { + requestingRestart = false; + } + } + + + private static bool requestingDownloadAndRun; + internal static float DownloadProgress => serverDownloader.Progress; + internal static bool DownloadRequired => DownloadProgress < 1f; + internal static bool DownloadStarted => serverDownloader.Started; + internal static bool RequestingDownloadAndRun => requestingDownloadAndRun; + internal static async Task DownloadAndRun(LoginData loginData = null) { + if (requestingDownloadAndRun) { + return false; + } + stopping = false; + requestingDownloadAndRun = true; + try { + if (DownloadRequired) { + var ok = await serverDownloader.PromptForDownload(); + if (!ok) { + return false; + } + } + await StartCodePatcher(loginData); + return true; + } finally { + requestingDownloadAndRun = false; + } + } + + private const int SERVER_POLL_FREQUENCY_ON_STARTUP_MS = 500; + private const int SERVER_POLL_FREQUENCY_AFTER_STARTUP_MS = 2000; + private static int GetPollFrequency() { + return (startupProgress != null && startupProgress.Item1 < 1) || StartedServerRecently() + ? SERVER_POLL_FREQUENCY_ON_STARTUP_MS + : SERVER_POLL_FREQUENCY_AFTER_STARTUP_MS; + } + + internal static bool RequestingLoginInfo { get; set; } + + [CanBeNull] internal static LoginStatusResponse Status { get; private set; } + internal static void HandleStatus(LoginStatusResponse resp) { + Attribution.RegisterLogin(resp); + + bool consumptionsChanged = Status?.freeSessionRunning != resp.freeSessionRunning || Status?.freeSessionEndTime != resp.freeSessionEndTime; + bool expiresAtChanged = Status?.licenseExpiresAt != resp.licenseExpiresAt; + if (resp.consumptionsUnavailableReason == ConsumptionsUnavailableReason.UnrecoverableError + && Status?.consumptionsUnavailableReason != ConsumptionsUnavailableReason.UnrecoverableError + ) { + Log.Error("Free charges unavailabe. Please contact support if the issue persists."); + } + if (!RequestingLoginInfo && resp.requestError == null) { + Status = resp; + } + if (resp.lastLicenseError == null) { + // If we got success, we should always show an error next time it comes up + HotReloadPrefs.ErrorHidden = false; + } + + var oldStartupProgress = startupProgress; + var newStartupProgress = Tuple.Create( + resp.startupProgress, + string.IsNullOrEmpty(resp.startupStatus) ? "Starting Hot Reload" : resp.startupStatus); + + startupProgress = newStartupProgress; + // ReSharper disable once CompareOfFloatsByEqualityOperator + if (startupCompletedAt == null && newStartupProgress.Item1 == 1f) { + startupCompletedAt = DateTime.UtcNow; + } + + if (oldStartupProgress == null + || Math.Abs(oldStartupProgress.Item1 - newStartupProgress.Item1) > 0 + || oldStartupProgress.Item2 != newStartupProgress.Item2 + || consumptionsChanged + || expiresAtChanged + ) { + // Send project files state now that server can receive requests (only needed for player builds) + TryPrepareBuildInfo(); + } + } + + internal static async Task RequestLogin(string email, string password) { + RequestingLoginInfo = true; + try { + int i = 0; + while (!Running && i < 100) { + await Task.Delay(100); + i++; + } + + Status = await RequestHelper.RequestLogin(email, password, 10); + + // set to false so new error is shown + HotReloadPrefs.ErrorHidden = false; + if (Status?.isLicensed == true) { + HotReloadPrefs.LicenseEmail = email; + HotReloadPrefs.LicensePassword = Status.initialPassword ?? password; + } + } finally { + RequestingLoginInfo = false; + } + } + private static bool requestingServerInfo; + private static long lastServerPoll; + private static bool running; + internal static bool Running => ServerHealthCheck.I.IsServerHealthy; + + internal static void RequestServerInfo() { + if (requestingServerInfo) { + return; + } + RequestServerInfoAsync().Forget(); + } + + private static async Task RequestServerInfoAsync() { + requestingServerInfo = true; + try { + await RequestServerInfoCore(); + } finally { + requestingServerInfo = false; + } + } + + private static async Task RequestServerInfoCore() { + var pollFrequency = GetPollFrequency(); + // Delay until we've hit the poll request frequency + var waitMs = (int)Mathf.Clamp(pollFrequency - ((DateTime.Now.Ticks / (float)TimeSpan.TicksPerMillisecond) - lastServerPoll), 0, pollFrequency); + await Task.Delay(waitMs); + + var oldRunning = running; + + var newRunning = ServerHealthCheck.I.IsServerHealthy; + running = newRunning; + + if (running) { + var resp = await RequestHelper.GetLoginStatus(30); + HandleStatus(resp); + } else { + startupCompletedAt = null; + } + + if (!running && !StartedServerRecently()) { + // Reset startup progress + startupProgress = null; + } + + // Repaint if the running Status has changed since the layout changes quite a bit + if (oldRunning != newRunning && HotReloadWindow.Current) { + HotReloadRunTab.RepaintInstant(); + } + + lastServerPoll = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; + } + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/EditorCodePatcher.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/EditorCodePatcher.cs.meta new file mode 100644 index 0000000..f78605b --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/EditorCodePatcher.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ac7b192276a4a9d4f9098377d317cb2e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/EditorIndicationState.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/EditorIndicationState.cs new file mode 100644 index 0000000..839a710 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/EditorIndicationState.cs @@ -0,0 +1,164 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using SingularityGroup.HotReload.DTO; + +namespace SingularityGroup.HotReload.Editor { + internal static class EditorIndicationState { + internal enum IndicationStatus { + Stopped, + Started, + Stopping, + Installing, + Starting, + Reloaded, + PartiallySupported, + Unsupported, + Patching, + Loading, + Compiling, + CompileErrors, + ActivationFailed, + FinishRegistration, + } + + internal static readonly string greyIconPath = "grey"; + internal static readonly string greenIconPath = "green"; + internal static readonly string redIconPath = "red"; + private static readonly Dictionary IndicationIcon = new Dictionary { + // grey icon: + { IndicationStatus.FinishRegistration, greyIconPath }, + { IndicationStatus.Stopped, greyIconPath }, + // green icon: + { IndicationStatus.Started, greenIconPath }, + // log icons: + { IndicationStatus.Reloaded, HotReloadTimelineHelper.alertIconString[AlertType.AppliedChange] }, + { IndicationStatus.Unsupported, HotReloadTimelineHelper.alertIconString[AlertType.UnsupportedChange] }, + { IndicationStatus.PartiallySupported, HotReloadTimelineHelper.alertIconString[AlertType.PartiallySupportedChange] }, + { IndicationStatus.CompileErrors, HotReloadTimelineHelper.alertIconString[AlertType.CompileError] }, + // spinner: + { IndicationStatus.Stopping, Spinner.SpinnerIconPath }, + { IndicationStatus.Starting, Spinner.SpinnerIconPath }, + { IndicationStatus.Patching, Spinner.SpinnerIconPath }, + { IndicationStatus.Loading, Spinner.SpinnerIconPath }, + { IndicationStatus.Compiling, Spinner.SpinnerIconPath }, + { IndicationStatus.Installing, Spinner.SpinnerIconPath }, + // red icon: + { IndicationStatus.ActivationFailed, redIconPath }, + }; + + private static readonly IndicationStatus[] SpinnerIndications = IndicationIcon + .Where(kvp => kvp.Value == Spinner.SpinnerIconPath) + .Select(kvp => kvp.Key) + .ToArray(); + + // NOTE: if you add longer text, make sure UI is wide enough for it + public static readonly Dictionary IndicationText = new Dictionary { + { IndicationStatus.FinishRegistration, "Finish Registration" }, + { IndicationStatus.Started, "Waiting for code changes" }, + { IndicationStatus.Stopping, "Stopping Hot Reload" }, + { IndicationStatus.Stopped, "Hot Reload inactive" }, + { IndicationStatus.Installing, "Installing" }, + { IndicationStatus.Starting, "Starting Hot Reload" }, + { IndicationStatus.Reloaded, "Reload finished" }, + { IndicationStatus.PartiallySupported, "Changes partially applied" }, + { IndicationStatus.Unsupported, "Finished with warnings" }, + { IndicationStatus.Patching, "Reloading" }, + { IndicationStatus.Compiling, "Compiling" }, + { IndicationStatus.CompileErrors, "Scripts have compile errors" }, + { IndicationStatus.ActivationFailed, "Activation failed" }, + { IndicationStatus.Loading, "Loading" }, + }; + + private const int MinSpinnerDuration = 200; + private static DateTime spinnerStartedAt; + private static IndicationStatus latestStatus; + private static bool SpinnerCompletedMinDuration => DateTime.UtcNow - spinnerStartedAt > TimeSpan.FromMilliseconds(MinSpinnerDuration); + private static IndicationStatus GetIndicationStatus() { + var status = GetIndicationStatusCore(); + var newStatusIsSpinner = SpinnerIndications.Contains(status); + var latestStatusIsSpinner = SpinnerIndications.Contains(latestStatus); + if (status == latestStatus) { + return status; + } else if (latestStatusIsSpinner) { + if (newStatusIsSpinner) { + return status; + } else if (SpinnerCompletedMinDuration) { + latestStatus = status; + return status; + } else { + return latestStatus; + } + } else if (newStatusIsSpinner) { + spinnerStartedAt = DateTime.UtcNow; + latestStatus = status; + return status; + } else { + spinnerStartedAt = DateTime.UtcNow; + latestStatus = IndicationStatus.Loading; + return status; + } + } + + private static IndicationStatus GetIndicationStatusCore() { + if (RedeemLicenseHelper.I.RegistrationRequired) + return IndicationStatus.FinishRegistration; + if (EditorCodePatcher.DownloadRequired && EditorCodePatcher.DownloadStarted || EditorCodePatcher.RequestingDownloadAndRun && !EditorCodePatcher.Starting && !EditorCodePatcher.Stopping) + return IndicationStatus.Installing; + if (EditorCodePatcher.Stopping) + return IndicationStatus.Stopping; + if (EditorCodePatcher.Compiling && !EditorCodePatcher.Stopping && !EditorCodePatcher.Starting && EditorCodePatcher.Running) + return IndicationStatus.Compiling; + if (EditorCodePatcher.Starting && !EditorCodePatcher.Stopping) + return IndicationStatus.Starting; + if (!EditorCodePatcher.Running) + return IndicationStatus.Stopped; + if (EditorCodePatcher.Status?.isLicensed != true && EditorCodePatcher.Status?.isFree != true && EditorCodePatcher.Status?.freeSessionFinished == true) + return IndicationStatus.ActivationFailed; + if (EditorCodePatcher.compileError) + return IndicationStatus.CompileErrors; + + // fallback on patch status + if (!EditorCodePatcher.Started && !EditorCodePatcher.Running) { + return IndicationStatus.Stopped; + } + switch (EditorCodePatcher.patchStatus) { + case PatchStatus.Idle: + if (!EditorCodePatcher.Compiling && !EditorCodePatcher.firstPatchAttempted && !EditorCodePatcher.compileError) { + return IndicationStatus.Started; + } + if (EditorCodePatcher._applyingFailed) { + return IndicationStatus.Unsupported; + } + if (EditorCodePatcher._appliedPartially) { + return IndicationStatus.PartiallySupported; + } + return IndicationStatus.Reloaded; + case PatchStatus.Patching: return IndicationStatus.Patching; + case PatchStatus.Unsupported: return IndicationStatus.Unsupported; + case PatchStatus.Compiling: return IndicationStatus.Compiling; + case PatchStatus.CompileError: return IndicationStatus.CompileErrors; + case PatchStatus.None: + default: return IndicationStatus.Reloaded; + } + } + + internal static IndicationStatus CurrentIndicationStatus => GetIndicationStatus(); + internal static bool SpinnerActive => SpinnerIndications.Contains(CurrentIndicationStatus); + internal static string IndicationIconPath => IndicationIcon[CurrentIndicationStatus]; + internal static string IndicationStatusText { + get { + var indicationStatus = CurrentIndicationStatus; + string txt; + if (indicationStatus == IndicationStatus.Starting && EditorCodePatcher.StartupProgress != null) { + txt = EditorCodePatcher.StartupProgress.Item2; + } else if (!IndicationText.TryGetValue(indicationStatus, out txt)) { + Log.Warning($"Indication text not found for status {indicationStatus}"); + } else { + txt = IndicationText[indicationStatus]; + } + return txt; + } + } + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/EditorIndicationState.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/EditorIndicationState.cs.meta new file mode 100644 index 0000000..e3d23c8 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/EditorIndicationState.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ee342ddb17e444c7a8927be3bd792ae2 +timeCreated: 1686087206 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/GitUtil.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/GitUtil.cs new file mode 100644 index 0000000..875381d --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/GitUtil.cs @@ -0,0 +1,87 @@ + +using System; +using System.ComponentModel; +using System.Diagnostics; +using Debug = UnityEngine.Debug; + +namespace SingularityGroup.HotReload.Editor { + internal static class GitUtil { + /// + /// Fallback is PatchServerInfo.UnknownCommitHash + /// + public static string GetShortCommitHashOrFallback(int timeoutAfterMillis = 5000) { + var shortCommitHash = PatchServerInfo.UnknownCommitHash; + + var commitHash = GetShortCommitHashSafe(timeoutAfterMillis); + // On MacOS GetShortCommitHash() returns 7 characters, on Windows it returns 8 characters. + // When git command produced an unexpected result, use a fallback string + if (commitHash != null && commitHash.Length >= 6) { + shortCommitHash = commitHash.Length < 8 ? commitHash : commitHash.Substring(0, 8); + } + + return shortCommitHash; + } + + // only log exception once per domain reload, to prevent spamming the console + private static bool loggedExceptionInGetShortCommitHashSafe = false; + + /// + /// Get the git commit hash, returning null if it takes too long. + /// + /// + /// + /// + /// This method is 'better safe than sorry' because we must not break the user's build.
+ /// It is better to not know the commit hash than to fail the build. + ///
+ private static string GetShortCommitHashSafe(int timeoutAfterMillis) { + Process process = null; + // Note: don't use ReadToEndAsync because waiting on that task blocks forever. + try { + process = StartGitCommand("log", " -n 1 --pretty=format:%h"); + var stdout = process.StandardOutput; + if (process.WaitForExit(timeoutAfterMillis)) { + return stdout.ReadToEnd(); + } else { + // In a git repo with git lfs, git log can be blocked by waiting for switch branches / download lfs objects + // For that reason I disabled this warning log until a better solution is implemented (e.g. cache the commit and use cached if timeout). + // Log.Warning( + // $"[{CodePatcher.TAG}] Timed out trying to get the git commit hash, HotReload will not warn you about" + + // " a build connecting to a server running on a different commit (which is not supported)"); + return null; + } + } catch (Win32Exception ex) { + if (ex.NativeErrorCode == 2) { + // git not found, ignore because user doesn't use git for version control + return null; + } else if (!loggedExceptionInGetShortCommitHashSafe) { + loggedExceptionInGetShortCommitHashSafe = true; + Debug.LogException(ex); + } + } catch (Exception ex) { + if (!loggedExceptionInGetShortCommitHashSafe) { + loggedExceptionInGetShortCommitHashSafe = true; + Log.Exception(ex); + } + } finally { + if (process != null) { + process.Dispose(); + } + } + return null; + } + + static Process StartGitCommand(string command, string arguments, Action modifySettings = null) { + var startInfo = new ProcessStartInfo("git", command + " " + arguments) { + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true, + }; + if (modifySettings != null) { + modifySettings(startInfo); + } + return Process.Start(startInfo); + } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/GitUtil.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/GitUtil.cs.meta new file mode 100644 index 0000000..60f6051 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/GitUtil.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f994bd5bb9f33f740ae37f8c79048a10 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers.meta new file mode 100644 index 0000000..9a003a6 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 387b31d7da35b27428629a83bb4ac589 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/AssemblyOmission.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/AssemblyOmission.cs new file mode 100644 index 0000000..e8778a8 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/AssemblyOmission.cs @@ -0,0 +1,187 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using UnityEditor; +using System.Linq; +using System.Runtime.CompilerServices; +using SingularityGroup.HotReload.Newtonsoft.Json; +using UnityEditor.Compilation; + +[assembly: InternalsVisibleTo("SingularityGroup.HotReload.EditorTests")] + +namespace SingularityGroup.HotReload.Editor { + internal static class AssemblyOmission { + // [MenuItem("Window/Hot Reload Dev/List omitted projects")] + private static void Check() { + Log.Info("To compile C# files same as a Player build, we must omit projects which aren't part of the selected Player build."); + var omitted = GetOmittedProjects(EditorUserBuildSettings.activeScriptCompilationDefines); + Log.Info("---------"); + + foreach (var name in omitted) { + Log.Info("omitted editor/other project named: {0}", name); + } + } + + [JsonObject(MemberSerialization.Fields)] + private class AssemblyDefinitionJson { + public string name; + public string[] defineConstraints; + } + + // scripts in Assets/ (with no asmdef) are always compiled into Assembly-CSharp + private static readonly string alwaysIncluded = "Assembly-CSharp"; + + private class Cache : AssetPostprocessor { + public static string[] ommitedProjects; + + private static void OnPostprocessAllAssets(string[] importedAssets, + string[] deletedAssets, + string[] movedAssets, + string[] movedFromAssetPaths) { + ommitedProjects = null; + } + } + + // main thread only + public static string[] GetOmittedProjects(string allDefineSymbols, bool verboseLogs = false) { + if (Cache.ommitedProjects != null) { + return Cache.ommitedProjects; + } + var arr = allDefineSymbols.Split(';'); + var omitted = GetOmittedProjects(arr, verboseLogs); + Cache.ommitedProjects = omitted; + return omitted; + } + + // must be deterministic (return projects in same order each time) + private static string[] GetOmittedProjects(string[] allDefineSymbols, bool verboseLogs = false) { + // HotReload uses names of assemblies. + var editorAssemblies = GetEditorAssemblies(); + + editorAssemblies.Remove(alwaysIncluded); + var omittedByConstraint = DefineConstraints.GetOmittedAssemblies(allDefineSymbols); + editorAssemblies.AddRange(omittedByConstraint); + + // Note: other platform player assemblies are also returned here, but I haven't seen it cause issues + // when using Hot Reload with IdleGame Android build. + var playerAssemblies = GetPlayerAssemblies().ToArray(); + + if (verboseLogs) { + foreach (var name in editorAssemblies) { + Log.Info("found project named {0}", name); + } + foreach (var playerAssemblyName in playerAssemblies) { + Log.Debug("player assembly named {0}", playerAssemblyName); + } + } + // leaves the editor assemblies that are not built into player assemblies (e.g. editor and test assemblies) + var toOmit = editorAssemblies.Except(playerAssemblies.Select(asm => asm.name)); + var unique = new HashSet(toOmit); + return unique.OrderBy(s => s).ToArray(); + } + + // main thread only + public static List GetEditorAssemblies() { + return CompilationPipeline + .GetAssemblies(AssembliesType.Editor) + .Select(asm => asm.name) + .ToList(); + } + + public static Assembly[] GetPlayerAssemblies() { + var playerAssemblyNames = CompilationPipeline + #if UNITY_2019_3_OR_NEWER + .GetAssemblies(AssembliesType.PlayerWithoutTestAssemblies) // since Unity 2019.3 + #else + .GetAssemblies(AssembliesType.Player) + #endif + .ToArray(); + + + return playerAssemblyNames; + } + + internal static class DefineConstraints { + /// + /// When define constraints evaluate to false, we need + /// + /// + /// + /// + /// Not aware of a Unity api to read defineConstraints, so we do it ourselves.
+ /// Find any asmdef files where the define constraints evaluate to false. + ///
+ public static string[] GetOmittedAssemblies(string[] defineSymbols) { + var guids = AssetDatabase.FindAssets("t:asmdef"); + var asmdefFiles = guids.Select(AssetDatabase.GUIDToAssetPath); + var shouldOmit = new List(); + foreach (var asmdefFile in asmdefFiles) { + var asmdef = ReadDefineConstraints(asmdefFile); + if (asmdef == null) continue; + if (asmdef.defineConstraints == null || asmdef.defineConstraints.Length == 0) { + // Hot Reload already handles assemblies correctly if they have no define symbols. + continue; + } + + var allPass = asmdef.defineConstraints.All(constraint => EvaluateDefineConstraint(constraint, defineSymbols)); + if (!allPass) { + shouldOmit.Add(asmdef.name); + } + } + + return shouldOmit.ToArray(); + } + + static AssemblyDefinitionJson ReadDefineConstraints(string path) { + try { + var json = File.ReadAllText(path); + var asmdef = JsonConvert.DeserializeObject(json); + return asmdef; + } catch (Exception) { + // ignore malformed asmdef + return null; + } + } + + // Unity Define Constraints syntax is described in the docs https://docs.unity3d.com/Manual/class-AssemblyDefinitionImporter.html + static readonly Dictionary syntaxMap = new Dictionary { + { "OR", "||" }, + { "AND", "&&" }, + { "NOT", "!" } + }; + + /// + /// Evaluate a define constraint like 'UNITY_ANDROID || UNITY_IOS' + /// + /// + /// + /// + public static bool EvaluateDefineConstraint(string input, string[] defineSymbols) { + // map Unity defineConstraints syntax to DataTable syntax (unity supports both) + foreach (var item in syntaxMap) { + // surround with space because || may not have spaces around it + input = input.Replace(item.Value, $" {item.Key} "); + } + + // remove any extra spaces we just created + input = input.Replace(" ", " "); + + var tokens = input.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + + foreach (var token in tokens) { + if (!syntaxMap.ContainsKey(token) && token != "false" && token != "true") { + var index = input.IndexOf(token, StringComparison.Ordinal); + + // replace symbols with true or false depending if they are in the array or not. + input = input.Substring(0, index) + defineSymbols.Contains(token) + input.Substring(index + token.Length); + } + } + + var dt = new DataTable(); + return (bool)dt.Compute(input, ""); + } + } + } + +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/AssemblyOmission.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/AssemblyOmission.cs.meta new file mode 100644 index 0000000..261ed35 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/AssemblyOmission.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0b94f2314a044b109de488be1ccd5640 +timeCreated: 1674233674 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/BuildInfoHelper.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/BuildInfoHelper.cs new file mode 100644 index 0000000..92f97d5 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/BuildInfoHelper.cs @@ -0,0 +1,143 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using UnityEditor; +using UnityEngine; + +namespace SingularityGroup.HotReload.Editor { + struct BuildInfoInput { + public readonly string allDefineSymbols; + public readonly BuildTarget activeBuildTarget; + public readonly string[] omittedProjects; + public readonly bool batchMode; + + public BuildInfoInput(string allDefineSymbols, BuildTarget activeBuildTarget, string[] omittedProjects, bool batchMode) { + this.allDefineSymbols = allDefineSymbols; + this.activeBuildTarget = activeBuildTarget; + this.omittedProjects = omittedProjects; + this.batchMode = batchMode; + } + } + + static class BuildInfoHelper { + public static async Task GetGenerateBuildInfoInput() { + var buildTarget = EditorUserBuildSettings.activeBuildTarget; + var activeDefineSymbols = EditorUserBuildSettings.activeScriptCompilationDefines; + var batchMode = Application.isBatchMode; + var allDefineSymbols = await Task.Run(() => { + return GetAllAndroidMonoBuildDefineSymbolsThreaded(activeDefineSymbols); + }); + // cached so unexpensive most of the time + var omittedProjects = AssemblyOmission.GetOmittedProjects(allDefineSymbols); + + return new BuildInfoInput( + allDefineSymbols: allDefineSymbols, + activeBuildTarget: buildTarget, + omittedProjects: omittedProjects, + batchMode: batchMode + ); + } + + public static BuildInfo GenerateBuildInfoMainThread() { + return GenerateBuildInfoMainThread(EditorUserBuildSettings.activeBuildTarget); + } + + public static BuildInfo GenerateBuildInfoMainThread(BuildTarget buildTarget) { + var allDefineSymbols = GetAllAndroidMonoBuildDefineSymbolsThreaded(EditorUserBuildSettings.activeScriptCompilationDefines); + return GenerateBuildInfoThreaded(new BuildInfoInput( + allDefineSymbols: allDefineSymbols, + activeBuildTarget: buildTarget, + omittedProjects: AssemblyOmission.GetOmittedProjects(allDefineSymbols), + batchMode: Application.isBatchMode + )); + } + + public static BuildInfo GenerateBuildInfoThreaded(BuildInfoInput input) { + var omittedProjectRegex = String.Join("|", input.omittedProjects.Select(name => Regex.Escape(name))); + var shortCommitHash = GitUtil.GetShortCommitHashOrFallback(); + var hostname = IsHumanControllingUs(input.batchMode) ? IpHelper.GetIpAddress() : null; + + // Note: add a string to uniquely identify the Unity project. Could use filepath to /MyProject/Assets/ (editor Application.dataPath) + // or application identifier (com.company.appname). + // Do this when supporting multiple projects: SG-28807 + // The matching code is in Runtime assembly which compares server response with built BuildInfo. + return new BuildInfo { + projectIdentifier = "SG-29580", + commitHash = shortCommitHash, + defineSymbols = input.allDefineSymbols, + projectOmissionRegex = omittedProjectRegex, + buildMachineHostName = hostname, + buildMachinePort = RequestHelper.port, + activeBuildTarget = input.activeBuildTarget.ToString(), + }; + } + + public static bool IsHumanControllingUs(bool batchMode) { + if (batchMode) { + return false; + } + + var isCI = !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("CI")); + return !isCI; + } + + private static readonly string[] editorSymbolsToRemove = { + "PLATFORM_ARCH_64", + "UNITY_64", + "UNITY_INCLUDE_TESTS", + "UNITY_EDITOR", + "UNITY_EDITOR_64", + "UNITY_EDITOR_WIN", + "ENABLE_UNITY_COLLECTIONS_CHECKS", + "ENABLE_BURST_AOT", + "RENDER_SOFTWARE_CURSOR", + "PLATFORM_STANDALONE_WIN", + "PLATFORM_STANDALONE", + "UNITY_STANDALONE_WIN", + "UNITY_STANDALONE", + "ENABLE_MOVIES", + "ENABLE_OUT_OF_PROCESS_CRASH_HANDLER", + "ENABLE_WEBSOCKET_HOST", + "ENABLE_CLUSTER_SYNC", + "ENABLE_CLUSTERINPUT", + }; + + private static readonly string[] androidSymbolsToAdd = { + "CSHARP_7_OR_LATER", + "CSHARP_7_3_OR_NEWER", + "PLATFORM_ANDROID", + "UNITY_ANDROID", + "UNITY_ANDROID_API", + "ENABLE_EGL", + "DEVELOPMENT_BUILD", + "ENABLE_CLOUD_SERVICES_NATIVE_CRASH_REPORTING", + "PLATFORM_SUPPORTS_ADS_ID", + "UNITY_CAN_SHOW_SPLASH_SCREEN", + "UNITY_HAS_GOOGLEVR", + "UNITY_HAS_TANGO", + "ENABLE_SPATIALTRACKING", + "ENABLE_RUNTIME_PERMISSIONS", + "ENABLE_ENGINE_CODE_STRIPPING", + "UNITY_ASTC_ONLY_DECOMPRESS", + "ANDROID_USE_SWAPPY", + "ENABLE_ONSCREEN_KEYBOARD", + "ENABLE_UNITYADS_RUNTIME", + "UNITY_UNITYADS_API", + }; + + // Currently there is no better way. Alternatively we could hook into unity's call to csc.exe and parse the /define: arguments. + // Hardcoding the differences was less effort and is less error prone. + // I also looked into it and tried all the Build interfaces like this one https://docs.unity3d.com/ScriptReference/Build.IPostBuildPlayerScriptDLLs.html + // and logging EditorUserBuildSettings.activeScriptCompilationDefines in the callbacks - result: all same like editor, so I agree that hardcode is best. + public static string GetAllAndroidMonoBuildDefineSymbolsThreaded(string[] defineSymbols) { + var defines = new HashSet(defineSymbols); + defines.ExceptWith(editorSymbolsToRemove); + defines.UnionWith(androidSymbolsToAdd); + // sort for consistency, must be deterministic + var definesArray = defines.OrderBy(def => def).ToArray(); + return String.Join(";", definesArray); + } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/BuildInfoHelper.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/BuildInfoHelper.cs.meta new file mode 100644 index 0000000..db85235 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/BuildInfoHelper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f41ad09ae4f04088bf6c9ad9a4fc0885 +timeCreated: 1674220023 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/EditorWindowHelper.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/EditorWindowHelper.cs new file mode 100644 index 0000000..92553a3 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/EditorWindowHelper.cs @@ -0,0 +1,101 @@ +using System; +using System.Text.RegularExpressions; +using UnityEngine; +using System.Threading.Tasks; +using UnityEditor; +using System.Collections.Generic; +using System.Linq; + +namespace SingularityGroup.HotReload.Editor { + internal static class EditorWindowHelper { + #if UNITY_2020_1_OR_NEWER + public static bool supportsNotifications = true; + #else + public static bool supportsNotifications = false; + #endif + + private static readonly Regex ValidEmailRegex = new Regex(@"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|" + + @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(? notificationContent = new Dictionary { + { NotificationStatus.Patching, new GUIContent("[Hot Reload] Applying patches...")}, + { NotificationStatus.NeedsRecompile, new GUIContent("[Hot Reload] Unsupported Changes detected! Recompiling...")}, + }; + + static Type gameViewT; + private static EditorWindow[] gameViewWindows { + get { + gameViewT = gameViewT ?? typeof(EditorWindow).Assembly.GetType("UnityEditor.GameView"); + return Resources.FindObjectsOfTypeAll(gameViewT).Cast().ToArray(); + } + } + + private static EditorWindow[] sceneWindows { + get { + return Resources.FindObjectsOfTypeAll(typeof(SceneView)).Cast().ToArray(); + } + } + + private static EditorWindow[] notificationWindows { + get { + return gameViewWindows.Concat(sceneWindows).ToArray(); + } + } + + static NotificationStatus lastNotificationStatus; + private static DateTime? latestNotificationStartedAt; + private static bool notificationShownRecently => latestNotificationStartedAt != null && DateTime.UtcNow - latestNotificationStartedAt < TimeSpan.FromSeconds(1); + internal static void ShowNotification(NotificationStatus notificationType, float maxDuration = 3) { + // Patch status goes from Unsupported changes to patching rapidly when making unsupported change + // patching also shows right before unsupported changes sometimes + // so we don't override NeedsRecompile notification ever + bool willOverrideNeedsCompileNotification = notificationType != NotificationStatus.NeedsRecompile && notificationShownRecently || lastNotificationStatus == NotificationStatus.NeedsRecompile && notificationShownRecently; + if (!supportsNotifications || willOverrideNeedsCompileNotification) { + return; + } + + foreach (EditorWindow notificationWindow in notificationWindows) { + notificationWindow.ShowNotification(notificationContent[notificationType], maxDuration); + notificationWindow.Repaint(); + } + latestNotificationStartedAt = DateTime.UtcNow; + lastNotificationStatus = notificationType; + } + + internal static void RemoveNotification() { + if (!supportsNotifications) { + return; + } + // only patching notifications should be removed after showing less than 1 second + if (notificationShownRecently && lastNotificationStatus != NotificationStatus.Patching) { + return; + } + foreach (EditorWindow notificationWindow in notificationWindows) { + notificationWindow.RemoveNotification(); + notificationWindow.Repaint(); + } + latestNotificationStartedAt = null; + lastNotificationStatus = NotificationStatus.None; + } + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/EditorWindowHelper.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/EditorWindowHelper.cs.meta new file mode 100644 index 0000000..82045f8 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/EditorWindowHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fd463b1f0bfddf34caa662ebe375e5fe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/GUIHelper.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/GUIHelper.cs new file mode 100644 index 0000000..fab85d7 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/GUIHelper.cs @@ -0,0 +1,162 @@ +using UnityEngine; +using System.Collections.Generic; + +namespace SingularityGroup.HotReload.Editor { + internal enum InvertibleIcon { + BugReport, + Events, + EventsNew, + Recompile, + Logo, + Close, + FoldoutOpen, + FoldoutClosed, + Spinner, + Stop, + Start, + } + + internal static class GUIHelper { + private static readonly Dictionary supportedInvertibleIcons = new Dictionary { + { InvertibleIcon.BugReport, "report_bug" }, + { InvertibleIcon.Events, "events" }, + { InvertibleIcon.Recompile, "refresh" }, + { InvertibleIcon.Logo, "logo" }, + { InvertibleIcon.Close, "close" }, + { InvertibleIcon.FoldoutOpen, "foldout_open" }, + { InvertibleIcon.FoldoutClosed, "foldout_closed" }, + { InvertibleIcon.Spinner, "icon_loading_star_light_mode_96" }, + { InvertibleIcon.Stop, "Icn_Stop" }, + { InvertibleIcon.Start, "Icn_play" }, + }; + + private static readonly Dictionary invertibleIconCache = new Dictionary(); + private static readonly Dictionary invertibleIconInvertedCache = new Dictionary(); + private static readonly Dictionary iconCache = new Dictionary(); + + internal static Texture2D InvertTextureColor(Texture2D originalTexture) { + if (!originalTexture) { + return originalTexture; + } + // Get the original pixels from the texture + Color[] originalPixels = originalTexture.GetPixels(); + + // Create a new array for the inverted colors + Color[] invertedPixels = new Color[originalPixels.Length]; + + // Iterate through the pixels and invert the colors while preserving the alpha channel + for (int i = 0; i < originalPixels.Length; i++) { + Color originalColor = originalPixels[i]; + Color invertedColor = new Color(1 - originalColor.r, 1 - originalColor.g, 1 - originalColor.b, originalColor.a); + invertedPixels[i] = invertedColor; + } + + // Create a new texture and set its pixels + Texture2D invertedTexture = new Texture2D(originalTexture.width, originalTexture.height); + invertedTexture.SetPixels(invertedPixels); + + // Apply the changes to the texture + invertedTexture.Apply(); + + return invertedTexture; + } + + internal static Texture2D GetInvertibleIcon(InvertibleIcon invertibleIcon) { + Texture2D iconTexture; + var cache = HotReloadWindowStyles.IsDarkMode ? invertibleIconInvertedCache : invertibleIconCache; + + if (!cache.TryGetValue(invertibleIcon, out iconTexture) || !iconTexture) { + var type = invertibleIcon == InvertibleIcon.EventsNew ? InvertibleIcon.Events : invertibleIcon; + iconTexture = Resources.Load(supportedInvertibleIcons[type]); + + // we assume icons are for light mode by default + // therefore if its dark mode we should invert them + if (HotReloadWindowStyles.IsDarkMode) { + iconTexture = InvertTextureColor(iconTexture); + } + + cache[type] = iconTexture; + + // we combine dot image with Events icon to create a new alert version + if (invertibleIcon == InvertibleIcon.EventsNew) { + var redDot = Resources.Load("red_dot"); + iconTexture = CombineImages(iconTexture, redDot); + cache[InvertibleIcon.EventsNew] = iconTexture; + } + } + return cache[invertibleIcon]; + } + + internal static Texture2D GetLocalIcon(string iconName) { + Texture2D iconTexture; + if (!iconCache.TryGetValue(iconName, out iconTexture) || !iconTexture) { + iconTexture = Resources.Load(iconName); + iconCache[iconName] = iconTexture; + } + return iconTexture; + } + + static Texture2D CombineImages(Texture2D image1, Texture2D image2) { + if (!image1 || !image2) { + return image1; + } + var combinedImage = new Texture2D(Mathf.Max(image1.width, image2.width), Mathf.Max(image1.height, image2.height)); + + for (int y = 0; y < combinedImage.height; y++) { + for (int x = 0; x < combinedImage.width; x++) { + Color color1 = x < image1.width && y < image1.height ? image1.GetPixel(x, y) : Color.clear; + Color color2 = x < image2.width && y < image2.height ? image2.GetPixel(x, y) : Color.clear; + combinedImage.SetPixel(x, y, Color.Lerp(color1, color2, color2.a)); + } + } + combinedImage.Apply(); + return combinedImage; + } + + private static readonly Dictionary textureColorCache = new Dictionary(); + internal static Texture2D ConvertTextureToColor(Color color) { + Texture2D texture; + if (!textureColorCache.TryGetValue(color, out texture) || !texture) { + texture = new Texture2D(1, 1); + texture.SetPixel(0, 0, color); + texture.Apply(); + textureColorCache[color] = texture; + } + return texture; + } + + private static readonly Dictionary grayTextureCache = new Dictionary(); + private static readonly Dictionary colorFactor = new Dictionary { + { "error", new Color(0.6f, 0.587f, 0.114f) }, + }; + + internal static Texture2D ConvertToGrayscale(string localIcon) { + Texture2D _texture; + if (!grayTextureCache.TryGetValue(localIcon, out _texture) || !_texture) { + var icon = GUIHelper.GetLocalIcon(localIcon); + // Create a copy of the texture + Texture2D copiedTexture = new Texture2D(icon.width, icon.height, TextureFormat.RGBA32, false); + + // Convert the copied texture to grayscale + Color[] pixels = icon.GetPixels(); + for (int i = 0; i < pixels.Length; i++) { + Color pixel = pixels[i]; + Color factor; + if (!colorFactor.TryGetValue(localIcon, out factor)) { + factor = new Color(0.299f, 0.587f, 0.114f); + } + float grayscale = factor.r * pixel.r + factor.g * pixel.g + factor.b * pixel.b; + pixels[i] = new Color(grayscale, grayscale, grayscale, pixel.a); // Preserve alpha channel + } + copiedTexture.SetPixels(pixels); + copiedTexture.Apply(); + + // Store the grayscale texture in the cache + grayTextureCache[localIcon] = copiedTexture; + + return copiedTexture; + } + return _texture; + } + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/GUIHelper.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/GUIHelper.cs.meta new file mode 100644 index 0000000..05811d2 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/GUIHelper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b4be912211814333ab61898b6440dc8e +timeCreated: 1694518358 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/HotReloadSuggestionsHelper.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/HotReloadSuggestionsHelper.cs new file mode 100644 index 0000000..c0c6531 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/HotReloadSuggestionsHelper.cs @@ -0,0 +1,231 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using UnityEditor; +using UnityEditor.Compilation; +using UnityEditor.PackageManager; +using UnityEditor.PackageManager.Requests; +using UnityEngine; + +namespace SingularityGroup.HotReload.Editor { + + public enum HotReloadSuggestionKind { + UnsupportedChanges, + UnsupportedPackages, + [Obsolete] SymbolicLinks, + AutoRecompiledWhenPlaymodeStateChanges, + UnityBestDevelopmentToolAward2023, + AutoRecompiledWhenPlaymodeStateChanges2022, + MultidimensionalArrays, + } + + internal static class HotReloadSuggestionsHelper { + internal static void SetSuggestionsShown(HotReloadSuggestionKind hotReloadSuggestionKind) { + if (EditorPrefs.GetBool($"HotReloadWindow.SuggestionsShown.{hotReloadSuggestionKind}")) { + return; + } + EditorPrefs.SetBool($"HotReloadWindow.SuggestionsActive.{hotReloadSuggestionKind}", true); + EditorPrefs.SetBool($"HotReloadWindow.SuggestionsShown.{hotReloadSuggestionKind}", true); + AlertEntry entry; + if (suggestionMap.TryGetValue(hotReloadSuggestionKind, out entry) && !HotReloadTimelineHelper.Suggestions.Contains(entry)) { + HotReloadTimelineHelper.Suggestions.Insert(0, entry); + HotReloadState.ShowingRedDot = true; + } + } + + internal static bool CheckSuggestionActive(HotReloadSuggestionKind hotReloadSuggestionKind) { + return EditorPrefs.GetBool($"HotReloadWindow.SuggestionsActive.{hotReloadSuggestionKind}"); + } + + internal static void SetSuggestionInactive(HotReloadSuggestionKind hotReloadSuggestionKind) { + EditorPrefs.SetBool($"HotReloadWindow.SuggestionsActive.{hotReloadSuggestionKind}", false); + AlertEntry entry; + if (suggestionMap.TryGetValue(hotReloadSuggestionKind, out entry)) { + HotReloadTimelineHelper.Suggestions.Remove(entry); + } + } + + internal static void InitSuggestions() { + foreach (HotReloadSuggestionKind value in Enum.GetValues(typeof(HotReloadSuggestionKind))) { + if (!CheckSuggestionActive(value)) { + continue; + } + AlertEntry entry; + if (suggestionMap.TryGetValue(value, out entry) && !HotReloadTimelineHelper.Suggestions.Contains(entry)) { + HotReloadTimelineHelper.Suggestions.Insert(0, entry); + } + } + } + + internal static HotReloadSuggestionKind? FindSuggestionKind(AlertEntry targetEntry) { + foreach (KeyValuePair pair in suggestionMap) { + if (pair.Value.Equals(targetEntry)) { + return pair.Key; + } + } + return null; + } + + internal static readonly OpenURLButton recompileTroubleshootingButton = new OpenURLButton("Documentation", Constants.RecompileTroubleshootingURL); + internal static readonly OpenURLButton featuresDocumentationButton = new OpenURLButton("Documentation", Constants.FeaturesDocumentationURL); + public static Dictionary suggestionMap = new Dictionary { + { HotReloadSuggestionKind.UnityBestDevelopmentToolAward2023, new AlertEntry( + AlertType.Suggestion, + "Vote for the \"Best Development Tool\" Award!", + "Hot Reload was nominated for the \"Best Development Tool\" Award. Please consider voting. Thank you!", + actionData: () => { + GUILayout.Space(6f); + using (new EditorGUILayout.HorizontalScope()) { + if (GUILayout.Button(" Vote ")) { + Application.OpenURL(Constants.VoteForAwardURL); + SetSuggestionInactive(HotReloadSuggestionKind.UnityBestDevelopmentToolAward2023); + } + GUILayout.FlexibleSpace(); + } + }, + timestamp: DateTime.Now, + entryType: EntryType.Foldout + )}, + { HotReloadSuggestionKind.UnsupportedChanges, new AlertEntry( + AlertType.Suggestion, + "Which changes does Hot Reload support?", + "Hot Reload supports most code changes, but there are some limitations. Generally, changes to the method definition and body are allowed. Non-method changes (like adding/editing classes and fields) are not supported. See the documentation for the list of current features and our current roadmap", + actionData: () => { + GUILayout.Space(10f); + using (new EditorGUILayout.HorizontalScope()) { + featuresDocumentationButton.OnGUI(); + GUILayout.FlexibleSpace(); + } + }, + timestamp: DateTime.Now, + entryType: EntryType.Foldout + )}, + { HotReloadSuggestionKind.UnsupportedPackages, new AlertEntry( + AlertType.Suggestion, + "Unsupported package detected", + "The following packages are only partially supported: ECS, Mirror, Fishnet, and Photon. Hot Reload will work in the project, but changes specific to those packages might not work. Contact us if these packages are a big part of your project", + iconType: AlertType.UnsupportedChange, + actionData: () => { + GUILayout.Space(10f); + using (new EditorGUILayout.HorizontalScope()) { + HotReloadAboutTab.contactButton.OnGUI(); + GUILayout.FlexibleSpace(); + } + }, + timestamp: DateTime.Now, + entryType: EntryType.Foldout + )}, + { HotReloadSuggestionKind.AutoRecompiledWhenPlaymodeStateChanges, new AlertEntry( + AlertType.Suggestion, + "Unity recompiles on enter/exit play mode?", + "If you have an issue with the Unity Editor recompiling when the Play Mode state changes, please consult the documentation, and don’t hesitate to reach out to us if you need assistance", + actionData: () => { + GUILayout.Space(10f); + using (new EditorGUILayout.HorizontalScope()) { + recompileTroubleshootingButton.OnGUI(); + GUILayout.Space(5f); + HotReloadAboutTab.discordButton.OnGUI(); + GUILayout.Space(5f); + HotReloadAboutTab.contactButton.OnGUI(); + GUILayout.FlexibleSpace(); + } + }, + timestamp: DateTime.Now, + entryType: EntryType.Foldout + )}, +#if UNITY_2022_1_OR_NEWER + { HotReloadSuggestionKind.AutoRecompiledWhenPlaymodeStateChanges2022, new AlertEntry( + AlertType.Suggestion, + "Unsupported setting detected", + "The 'Sprite Packer Mode' setting can cause unintended recompilations if set to 'Sprite Atlas V1 - Always Enabled'", + iconType: AlertType.UnsupportedChange, + actionData: () => { + GUILayout.Space(10f); + using (new EditorGUILayout.HorizontalScope()) { + if (GUILayout.Button(" Use \"Sprite Atlas V2\" ")) { + EditorSettings.spritePackerMode = SpritePackerMode.SpriteAtlasV2; + } + if (GUILayout.Button(" Open Settings ")) { + SettingsService.OpenProjectSettings("Project/Editor"); + } + if (GUILayout.Button(" Ignore suggestion ")) { + SetSuggestionInactive(HotReloadSuggestionKind.AutoRecompiledWhenPlaymodeStateChanges2022); + } + + GUILayout.FlexibleSpace(); + } + }, + timestamp: DateTime.Now, + entryType: EntryType.Foldout, + hasExitButton: false + )}, +#endif + { HotReloadSuggestionKind.MultidimensionalArrays, new AlertEntry( + AlertType.Suggestion, + "Multidimensional arrays are not supported. Use jagged arrays instead", + "Hot Reload doesn't support multidimensional ([,]) arrays. Jagged arrays ([][]) are a better alternative, and Microsoft recommends using them instead", + iconType: AlertType.UnsupportedChange, + actionData: () => { + GUILayout.Space(10f); + using (new EditorGUILayout.HorizontalScope()) { + if (GUILayout.Button(" Learn more ")) { + Application.OpenURL("https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1814"); + } + GUILayout.FlexibleSpace(); + } + }, + timestamp: DateTime.Now, + entryType: EntryType.Foldout + )}, + }; + + static ListRequest listRequest; + static string[] unsupportedPackages = new[] { + "com.unity.entities", + "com.firstgeargames.fishnet", + }; + static List unsupportedPackagesList; + static DateTime lastPlaymodeChange; + + public static void Init() { + listRequest = Client.List(offlineMode: false, includeIndirectDependencies: true); + + EditorApplication.playModeStateChanged += state => { + lastPlaymodeChange = DateTime.UtcNow; + }; + CompilationPipeline.compilationStarted += obj => { + if (DateTime.UtcNow - lastPlaymodeChange < TimeSpan.FromSeconds(1) && !HotReloadState.RecompiledUnsupportedChangesOnExitPlaymode) { + SetSuggestionsShown(HotReloadSuggestionKind.AutoRecompiledWhenPlaymodeStateChanges); + } + HotReloadState.RecompiledUnsupportedChangesOnExitPlaymode = false; + }; + InitSuggestions(); + } + + public static void Check() { + if (listRequest.IsCompleted && unsupportedPackagesList == null) { + unsupportedPackagesList = new List(); + var packages = listRequest.Result; + foreach (var packageInfo in packages) { + if (unsupportedPackages.Contains(packageInfo.name)) { + unsupportedPackagesList.Add(packageInfo.name); + } + } + if (unsupportedPackagesList.Count > 0) { + SetSuggestionsShown(HotReloadSuggestionKind.UnsupportedPackages); + } + } + +#if UNITY_2022_1_OR_NEWER + if (EditorSettings.spritePackerMode == SpritePackerMode.AlwaysOnAtlas) { + SetSuggestionsShown(HotReloadSuggestionKind.AutoRecompiledWhenPlaymodeStateChanges2022); + } else if (CheckSuggestionActive(HotReloadSuggestionKind.AutoRecompiledWhenPlaymodeStateChanges2022)) { + SetSuggestionInactive(HotReloadSuggestionKind.AutoRecompiledWhenPlaymodeStateChanges2022); + EditorPrefs.SetBool($"HotReloadWindow.SuggestionsShown.{HotReloadSuggestionKind.AutoRecompiledWhenPlaymodeStateChanges2022}", false); + } +#endif + } + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/HotReloadSuggestionsHelper.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/HotReloadSuggestionsHelper.cs.meta new file mode 100644 index 0000000..3507aef --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/HotReloadSuggestionsHelper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9cc471e812b143599ef5dde1d7ec022a +timeCreated: 1694632601 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/HotReloadTimelineHelper.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/HotReloadTimelineHelper.cs new file mode 100644 index 0000000..a353ffd --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/HotReloadTimelineHelper.cs @@ -0,0 +1,451 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using JetBrains.Annotations; +using SingularityGroup.HotReload.DTO; +using SingularityGroup.HotReload.Newtonsoft.Json; +using UnityEditor; +using UnityEngine; + + +namespace SingularityGroup.HotReload.Editor { + internal enum TimelineType { + Suggestions, + Timeline, + } + + internal enum AlertType { + Suggestion, + UnsupportedChange, + CompileError, + PartiallySupportedChange, + AppliedChange + } + + internal enum AlertEntryType { + Error, + Failure, + PatchApplied, + PartiallySupportedChange, + } + + internal enum EntryType { + Parent, + Child, + Standalone, + Foldout, + } + + internal class PersistedAlertData { + public readonly AlertData[] alertDatas; + + public PersistedAlertData(AlertData[] alertDatas) { + this.alertDatas = alertDatas; + } + } + + internal class AlertData { + public readonly AlertEntryType alertEntryType; + public readonly string errorString; + public readonly string methodName; + public readonly string methodSimpleName; + public readonly PartiallySupportedChange partiallySupportedChange; + public readonly EntryType entryType; + public readonly bool detiled; + public readonly DateTime createdAt; + + public AlertData(AlertEntryType alertEntryType, DateTime createdAt, bool detiled = false, EntryType entryType = EntryType.Standalone, string errorString = null, string methodName = null, string methodSimpleName = null, PartiallySupportedChange partiallySupportedChange = default(PartiallySupportedChange)) { + this.alertEntryType = alertEntryType; + this.createdAt = createdAt; + this.detiled = detiled; + this.entryType = entryType; + this.errorString = errorString; + this.methodName = methodName; + this.methodSimpleName = methodSimpleName; + this.partiallySupportedChange = partiallySupportedChange; + } + } + + internal class AlertEntry { + internal readonly AlertType alertType; + internal readonly string title; + internal readonly DateTime timestamp; + internal readonly string description; + [CanBeNull] internal readonly Action actionData; + internal readonly AlertType iconType; + internal readonly string shortDescription; + internal readonly EntryType entryType; + internal readonly AlertData alertData; + internal readonly bool hasExitButton; + + internal AlertEntry(AlertType alertType, string title, string description, DateTime timestamp, string shortDescription = null, Action actionData = null, AlertType? iconType = null, EntryType entryType = EntryType.Standalone, AlertData alertData = default(AlertData), bool hasExitButton = true) { + this.alertType = alertType; + this.title = title; + this.description = description; + this.shortDescription = shortDescription; + this.actionData = actionData; + this.iconType = iconType ?? alertType; + this.timestamp = timestamp; + this.entryType = entryType; + this.alertData = alertData; + this.hasExitButton = hasExitButton; + } + } + + internal static class HotReloadTimelineHelper { + internal const int maxVisibleEntries = 40; + + private static List eventsTimeline = new List(); + internal static List EventsTimeline => eventsTimeline; + + static readonly string filePath = Path.Combine(PackageConst.LibraryCachePath, "eventEntries.json"); + + public static void InitPersistedEvents() { + if (!File.Exists(filePath)) { + return; + } + var redDotShown = HotReloadState.ShowingRedDot; + try { + var persistedAlertData = JsonConvert.DeserializeObject(File.ReadAllText(filePath)); + eventsTimeline = new List(persistedAlertData.alertDatas.Length); + for (int i = persistedAlertData.alertDatas.Length - 1; i >= 0; i--) { + AlertData alertData = persistedAlertData.alertDatas[i]; + switch (alertData.alertEntryType) { + case AlertEntryType.Error: + CreateErrorEventEntry(errorString: alertData.errorString, entryType: alertData.entryType, createdAt: alertData.createdAt); + break; + case AlertEntryType.Failure: + if (alertData.entryType == EntryType.Parent) { + CreateReloadFinishedWithWarningsEventEntry(createdAt: alertData.createdAt); + } else { + CreatePatchFailureEventEntry(errorString: alertData.errorString, methodName: alertData.methodName, methodSimpleName: alertData.methodSimpleName, entryType: alertData.entryType, createdAt: alertData.createdAt); + } + break; + case AlertEntryType.PatchApplied: + CreateReloadFinishedEventEntry(createdAt: alertData.createdAt); + break; + case AlertEntryType.PartiallySupportedChange: + if (alertData.entryType == EntryType.Parent) { + CreateReloadPartiallyAppliedEventEntry(createdAt: alertData.createdAt); + } else { + CreatePartiallyAppliedEventEntry(alertData.partiallySupportedChange, entryType: alertData.entryType, detailed: alertData.detiled, createdAt: alertData.createdAt); + } + break; + } + } + } catch (Exception e) { + Log.Warning($"Failed initializing Hot Reload event entries on start: {e}"); + } finally { + // Ensure red dot is not triggered for existing entries + HotReloadState.ShowingRedDot = redDotShown; + } + } + + internal static void PersistTimeline() { + var alertDatas = new AlertData[eventsTimeline.Count]; + for (var i = 0; i < eventsTimeline.Count; i++) { + alertDatas[i] = eventsTimeline[i].alertData; + } + var persistedData = new PersistedAlertData(alertDatas); + try { + File.WriteAllText(path: filePath, contents: JsonConvert.SerializeObject(persistedData)); + } catch (Exception e) { + Log.Warning($"Failed persisting Hot Reload event entries: {e}"); + } + } + + internal static void ClearPersistance() { + try { + File.Delete(filePath); + } catch { + // ignore + } + eventsTimeline = new List(); + } + + internal static readonly Dictionary alertIconString = new Dictionary { + { AlertType.Suggestion, "alert_info" }, + { AlertType.UnsupportedChange, "warning" }, + { AlertType.CompileError, "error" }, + { AlertType.PartiallySupportedChange, "infos" }, + { AlertType.AppliedChange, "applied_patch" }, + }; + + public static Dictionary partiallySupportedChangeDescriptions = new Dictionary { + {PartiallySupportedChange.LambdaClosure, "A lambda closure was edited (captured variable was added or removed). Changes to it will only be visible to the next created lambda(s)."}, + {PartiallySupportedChange.EditAsyncMethod, "An async method was edited. Changes to it will only be visible the next time this method is called."}, + {PartiallySupportedChange.AddMonobehaviourMethod, "A new method was added. It will not show up in the Inspector until the next full recompilation."}, + {PartiallySupportedChange.EditMonobehaviourField, "A field in a MonoBehaviour was removed or reordered. The inspector will not notice this change until the next full recompilation."}, + {PartiallySupportedChange.EditCoroutine, "An IEnumerator/IEnumerable was edited. When used as a coroutine, changes to it will only be visible the next time the coroutine is created."}, + {PartiallySupportedChange.AddEnumMember, "An enum member was added. ToString and other reflection methods work only after the next full recompilation. Additionally, changes to the enum order may not apply until you patch usages in other places of the code."}, + {PartiallySupportedChange.EditFieldInitializer, "A field initializer was edited. Changes will only apply to new instances of that type, since the initializer for an object only runs when it is created."}, + {PartiallySupportedChange.AddMethodWithAttributes, "A method with attributes was added. Method attributes will not have any effect until the next full recompilation."}, + }; + + internal static List Suggestions = new List(); + internal static int UnsupportedChangesCount => EventsTimeline.Count(alert => alert.alertType == AlertType.UnsupportedChange && alert.entryType != EntryType.Child); + internal static int PartiallySupportedChangesCount => EventsTimeline.Count(alert => alert.alertType == AlertType.PartiallySupportedChange && alert.entryType != EntryType.Child); + internal static int CompileErrorsCount => EventsTimeline.Count(alert => alert.alertType == AlertType.CompileError); + internal static int AppliedChangesCount => EventsTimeline.Count(alert => alert.alertType == AlertType.AppliedChange); + + static Regex shortDescriptionRegex = new Regex(@"^(\w+)\s(\w+)(?=:)", RegexOptions.Compiled); + + internal static int GetRunTabTimelineEventCount() { + int total = 0; + if (HotReloadPrefs.RunTabUnsupportedChangesFilter) { + total += UnsupportedChangesCount; + } + if (HotReloadPrefs.RunTabPartiallyAppliedPatchesFilter) { + total += PartiallySupportedChangesCount; + } + if (HotReloadPrefs.RunTabCompileErrorFilter) { + total += CompileErrorsCount; + } + if (HotReloadPrefs.RunTabAppliedPatchesFilter) { + total += AppliedChangesCount; + } + return total; + } + + internal static List expandedEntries = new List(); + + internal static void RenderCompileButton() { + if (GUILayout.Button("Recompile", GUILayout.Width(80))) { + HotReloadRunTab.RecompileWithChecks(); + } + } + + private static float maxScrollPos; + internal static void RenderErrorEventActions(string description, ErrorData errorData) { + int maxLen = 2400; + string text = errorData.stacktrace; + if (text.Length > maxLen) { + text = text.Substring(0, maxLen) + "..."; + } + + GUILayout.TextArea(text, HotReloadWindowStyles.StacktraceTextAreaStyle); + + if (errorData.file || !errorData.stacktrace.Contains("error CS")) { + GUILayout.Space(10f); + } + + using (new EditorGUILayout.HorizontalScope()) { + if (!errorData.stacktrace.Contains("error CS")) { + RenderCompileButton(); + } + + // Link + if (errorData.file) { + GUILayout.FlexibleSpace(); + if (GUILayout.Button(errorData.linkString, HotReloadWindowStyles.LinkStyle)) { + AssetDatabase.OpenAsset(errorData.file, Math.Max(errorData.lineNumber, 1)); + } + } + } + } + + private static Texture2D GetFilterIcon(int count, AlertType alertType) { + if (count == 0) { + return GUIHelper.ConvertToGrayscale(alertIconString[alertType]); + } + return GUIHelper.GetLocalIcon(alertIconString[alertType]); + } + + internal static void RenderAlertFilters() { + using (new EditorGUILayout.HorizontalScope()) { + var text = AppliedChangesCount > 999 ? "999+" : " " + AppliedChangesCount; + + HotReloadPrefs.RunTabAppliedPatchesFilter = GUILayout.Toggle( + HotReloadPrefs.RunTabAppliedPatchesFilter, + new GUIContent(text, GetFilterIcon(AppliedChangesCount, AlertType.AppliedChange)), + HotReloadWindowStyles.EventFiltersStyle); + + GUILayout.Space(-1f); + + text = PartiallySupportedChangesCount > 999 ? "999+" : " " + PartiallySupportedChangesCount; + HotReloadPrefs.RunTabPartiallyAppliedPatchesFilter = GUILayout.Toggle( + HotReloadPrefs.RunTabPartiallyAppliedPatchesFilter, + new GUIContent(text, GetFilterIcon(PartiallySupportedChangesCount, AlertType.PartiallySupportedChange)), + HotReloadWindowStyles.EventFiltersStyle); + + GUILayout.Space(-1f); + + text = UnsupportedChangesCount > 999 ? "999+" : " " + UnsupportedChangesCount; + HotReloadPrefs.RunTabUnsupportedChangesFilter = GUILayout.Toggle( + HotReloadPrefs.RunTabUnsupportedChangesFilter, + new GUIContent(text, GetFilterIcon(UnsupportedChangesCount, AlertType.UnsupportedChange)), + HotReloadWindowStyles.EventFiltersStyle); + + GUILayout.Space(-1f); + + text = CompileErrorsCount > 999 ? "999+" : " " + CompileErrorsCount; + HotReloadPrefs.RunTabCompileErrorFilter = GUILayout.Toggle( + HotReloadPrefs.RunTabCompileErrorFilter, + new GUIContent(text, GetFilterIcon(CompileErrorsCount, AlertType.CompileError)), + HotReloadWindowStyles.EventFiltersStyle); + } + } + + internal static void CreateErrorEventEntry(string errorString, EntryType entryType = EntryType.Standalone, DateTime? createdAt = null) { + var timestamp = createdAt ?? DateTime.Now; + var alertType = errorString.Contains("error CS") + ? AlertType.CompileError + : AlertType.UnsupportedChange; + var title = errorString.Contains("error CS") + ? "Compile error" + : "Unsupported change"; + ErrorData errorData = ErrorData.GetErrorData(errorString); + var description = errorData.error; + string shortDescription = null; + if (alertType != AlertType.CompileError) { + shortDescription = shortDescriptionRegex.Match(description).Value; + } + Action actionData = () => RenderErrorEventActions(description, errorData); + InsertEntry(new AlertEntry( + timestamp: timestamp, + alertType: alertType, + title: title, + description: description, + shortDescription: shortDescription, + actionData: actionData, + entryType: entryType, + alertData: new AlertData(AlertEntryType.Error, createdAt: timestamp, errorString: errorString, entryType: entryType) + )); + } + + internal static void CreatePatchFailureEventEntry(string errorString, string methodName, string methodSimpleName = null, EntryType entryType = EntryType.Standalone, DateTime? createdAt = null) { + var timestamp = createdAt ?? DateTime.Now; + ErrorData errorData = ErrorData.GetErrorData(errorString); + var title = $"Failed applying patch to method"; + Action actionData = () => RenderErrorEventActions(errorData.error, errorData); + InsertEntry(new AlertEntry( + timestamp: timestamp, + alertType : AlertType.UnsupportedChange, + title: title, + description: $"{title}: {methodName}, tap here to see more.", + shortDescription: methodSimpleName, + actionData: actionData, + entryType: entryType, + alertData: new AlertData(AlertEntryType.Failure, createdAt: timestamp, errorString: errorString, methodName: methodName, methodSimpleName: methodSimpleName, entryType: entryType) + )); + } + + internal static void CreateReloadFinishedEventEntry(DateTime? createdAt = null) { + var timestamp = createdAt ?? DateTime.Now; + InsertEntry(new AlertEntry( + timestamp: timestamp, + alertType : AlertType.AppliedChange, + title: EditorIndicationState.IndicationText[EditorIndicationState.IndicationStatus.Reloaded], + description: "No issues found", + entryType: EntryType.Standalone, + alertData: new AlertData(AlertEntryType.PatchApplied, createdAt: timestamp, entryType: EntryType.Standalone) + )); + } + + internal static void CreateReloadFinishedWithWarningsEventEntry(DateTime? createdAt = null) { + var timestamp = createdAt ?? DateTime.Now; + InsertEntry(new AlertEntry( + timestamp: timestamp, + alertType : AlertType.UnsupportedChange, + title: EditorIndicationState.IndicationText[EditorIndicationState.IndicationStatus.Unsupported], + description: "See detailed entries below", + entryType: EntryType.Parent, + alertData: new AlertData(AlertEntryType.Failure, createdAt: timestamp, entryType: EntryType.Parent) + )); + } + + internal static void CreateReloadPartiallyAppliedEventEntry(DateTime? createdAt = null) { + var timestamp = createdAt ?? DateTime.Now; + InsertEntry(new AlertEntry( + timestamp: timestamp, + alertType : AlertType.PartiallySupportedChange, + title: EditorIndicationState.IndicationText[EditorIndicationState.IndicationStatus.PartiallySupported], + description: "See detailed entries below", + entryType: EntryType.Parent, + alertData: new AlertData(AlertEntryType.PartiallySupportedChange, createdAt: timestamp, entryType: EntryType.Parent) + )); + } + + internal static void CreatePartiallyAppliedEventEntry(PartiallySupportedChange partiallySupportedChange, EntryType entryType = EntryType.Standalone, bool detailed = true, DateTime? createdAt = null) { + var timestamp = createdAt ?? DateTime.Now; + string description; + if (!partiallySupportedChangeDescriptions.TryGetValue(partiallySupportedChange, out description)) { + return; + } + InsertEntry(new AlertEntry( + timestamp: timestamp, + alertType : AlertType.PartiallySupportedChange, + title : detailed ? "Change partially applied" : ToString(partiallySupportedChange), + description : description, + shortDescription: detailed ? ToString(partiallySupportedChange) : null, + actionData: () => { + GUILayout.Space(10f); + using (new EditorGUILayout.HorizontalScope()) { + RenderCompileButton(); + GUILayout.FlexibleSpace(); + if (GetPartiallySupportedChangePref(partiallySupportedChange)) { + if (GUILayout.Button("Ignore this event type ", HotReloadWindowStyles.LinkStyle)) { + HidePartiallySupportedChange(partiallySupportedChange); + HotReloadRunTab.RepaintInstant(); + } + } + } + }, + entryType: entryType, + alertData: new AlertData(AlertEntryType.PartiallySupportedChange, createdAt: timestamp, partiallySupportedChange: partiallySupportedChange, entryType: entryType, detiled: detailed) + )); + } + + internal static void InsertEntry(AlertEntry entry) { + eventsTimeline.Insert(0, entry); + if (entry.alertType != AlertType.AppliedChange) { + HotReloadState.ShowingRedDot = true; + } + } + + internal static void ClearEntries() { + eventsTimeline.Clear(); + } + + internal static bool GetPartiallySupportedChangePref(PartiallySupportedChange key) { + return EditorPrefs.GetBool($"HotReloadWindow.ShowPartiallySupportedChangeType.{key}", true); + } + + internal static void HidePartiallySupportedChange(PartiallySupportedChange key) { + EditorPrefs.SetBool($"HotReloadWindow.ShowPartiallySupportedChangeType.{key}", false); + // loop over scroll entries to remove hidden entries + for (var i = EventsTimeline.Count - 1; i >= 0; i--) { + var eventEntry = EventsTimeline[i]; + if (eventEntry.alertData.partiallySupportedChange == key) { + EventsTimeline.Remove(eventEntry); + } + } + } + + // performance optimization (Enum.ToString uses reflection) + internal static string ToString(this PartiallySupportedChange change) { + switch (change) { + case PartiallySupportedChange.LambdaClosure: + return nameof(PartiallySupportedChange.LambdaClosure); + case PartiallySupportedChange.EditAsyncMethod: + return nameof(PartiallySupportedChange.EditAsyncMethod); + case PartiallySupportedChange.AddMonobehaviourMethod: + return nameof(PartiallySupportedChange.AddMonobehaviourMethod); + case PartiallySupportedChange.EditMonobehaviourField: + return nameof(PartiallySupportedChange.EditMonobehaviourField); + case PartiallySupportedChange.EditCoroutine: + return nameof(PartiallySupportedChange.EditCoroutine); + case PartiallySupportedChange.AddEnumMember: + return nameof(PartiallySupportedChange.AddEnumMember); + case PartiallySupportedChange.EditFieldInitializer: + return nameof(PartiallySupportedChange.EditFieldInitializer); + case PartiallySupportedChange.AddMethodWithAttributes: + return nameof(PartiallySupportedChange.AddMethodWithAttributes); + default: + throw new ArgumentOutOfRangeException(nameof(change), change, null); + } + } + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/HotReloadTimelineHelper.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/HotReloadTimelineHelper.cs.meta new file mode 100644 index 0000000..1190a7d --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/HotReloadTimelineHelper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ffb65be71b8b4d14800f8b28bf68d0ab +timeCreated: 1695210350 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/Spinner.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/Spinner.cs new file mode 100644 index 0000000..5755fdb --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/Spinner.cs @@ -0,0 +1,80 @@ +using System; +using UnityEngine; + +namespace SingularityGroup.HotReload.Editor { + internal class Spinner { + internal static string SpinnerIconPath => "icon_loading_star_light_mode_96"; + internal static Texture2D spinnerTexture => GUIHelper.GetInvertibleIcon(InvertibleIcon.Spinner); + private Texture2D _rotatedTextureLight; + private Texture2D _rotatedTextureDark; + private Texture2D rotatedTextureLight => _rotatedTextureLight ? _rotatedTextureLight : _rotatedTextureLight = GetCopy(spinnerTexture); + private Texture2D rotatedTextureDark => _rotatedTextureDark ? _rotatedTextureDark : _rotatedTextureDark = GetCopy(spinnerTexture); + internal Texture2D rotatedTexture => HotReloadWindowStyles.IsDarkMode ? rotatedTextureDark : rotatedTextureLight; + + private float _rotationAngle; + private DateTime _lastRotation; + private int _rotationPeriod; + + internal Spinner(int rotationPeriodInMilliseconds) { + _rotationPeriod = rotationPeriodInMilliseconds; + } + + internal Texture2D GetIcon() { + if (DateTime.UtcNow - _lastRotation > TimeSpan.FromMilliseconds(_rotationPeriod)) { + _lastRotation = DateTime.UtcNow; + _rotationAngle += 45; + if (_rotationAngle >= 360f) + _rotationAngle -= 360f; + return RotateImage(spinnerTexture, _rotationAngle); + } + return rotatedTexture; + } + + private Texture2D RotateImage(Texture2D originalTexture, float angle) { + int w = originalTexture.width; + int h = originalTexture.height; + + int x, y; + float centerX = w / 2f; + float centerY = h / 2f; + + for (x = 0; x < w; x++) { + for (y = 0; y < h; y++) { + float dx = x - centerX; + float dy = y - centerY; + float distance = Mathf.Sqrt(dx * dx + dy * dy); + float oldAngle = Mathf.Atan2(dy, dx) * Mathf.Rad2Deg; + float newAngle = oldAngle + angle; + + float newX = centerX + distance * Mathf.Cos(newAngle * Mathf.Deg2Rad); + float newY = centerY + distance * Mathf.Sin(newAngle * Mathf.Deg2Rad); + + if (newX >= 0 && newX < w && newY >= 0 && newY < h) { + rotatedTexture.SetPixel(x, y, originalTexture.GetPixel((int)newX, (int)newY)); + } else { + rotatedTexture.SetPixel(x, y, Color.clear); + } + } + } + + rotatedTexture.Apply(); + return rotatedTexture; + } + + public static Texture2D GetCopy(Texture2D tex, TextureFormat format = TextureFormat.RGBA32, bool mipChain = false) { + var tmp = RenderTexture.GetTemporary(tex.width, tex.height, 0, RenderTextureFormat.Default, RenderTextureReadWrite.Linear); + Graphics.Blit(tex, tmp); + + RenderTexture.active = tmp; + try { + var copy = new Texture2D(tex.width, tex.height, format, mipChain: mipChain); + copy.ReadPixels(new Rect(0, 0, tmp.width, tmp.height), 0, 0); + copy.Apply(); + return copy; + } finally { + RenderTexture.active = null; + RenderTexture.ReleaseTemporary(tmp); + } + } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/Spinner.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/Spinner.cs.meta new file mode 100644 index 0000000..cf8cbea --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/Spinner.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8bd77f0465824c5da3e1454f75c6e93c +timeCreated: 1685871830 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/UnitySettingsHelper.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/UnitySettingsHelper.cs new file mode 100644 index 0000000..b158a67 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/UnitySettingsHelper.cs @@ -0,0 +1,95 @@ +using UnityEngine; +using System.Reflection; +using System; +using System.Collections; +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("SingularityGroup.HotReload.Demo")] + +namespace SingularityGroup.HotReload.Editor { + internal class UnitySettingsHelper { + public static UnitySettingsHelper I = new UnitySettingsHelper(); + + private bool initialized; + private object pref; + private PropertyInfo prefColorProp; + private MethodInfo setMethod; + private Type settingsType; + private Type prefColorType; + const string currentPlaymodeTintPrefKey = "Playmode tint"; + + internal bool playmodeTintSupported => EditorCodePatcher.config.changePlaymodeTint && EnsureInitialized(); + + private UnitySettingsHelper() { + EnsureInitialized(); + } + + + private bool EnsureInitialized() { + if (initialized) { + return true; + } + try { + // cache members for performance + settingsType = settingsType ?? (settingsType = typeof(UnityEditor.Editor).Assembly.GetType($"UnityEditor.PrefSettings")); + prefColorType = prefColorType ?? (prefColorType = typeof(UnityEditor.Editor).Assembly.GetType($"UnityEditor.PrefColor")); + prefColorProp = prefColorProp ?? (prefColorProp = prefColorType?.GetProperty("Color", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)); + pref = pref ?? (pref = GetPref(settingsType: settingsType, prefColorType: prefColorType)); + setMethod = setMethod ?? (setMethod = GetSetMethod(settingsType: settingsType, prefColorType: prefColorType)); + + if (prefColorProp == null + || pref == null + || setMethod == null + ) { + return false; + } + + // clear cache for performance + settingsType = null; + prefColorType = null; + + initialized = true; + return true; + } catch { + return false; + } + } + + private static MethodInfo GetSetMethod(Type settingsType, Type prefColorType) { + var setMethodBase = settingsType?.GetMethod("Set", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); + return setMethodBase?.MakeGenericMethod(prefColorType); + } + + private static object GetPref(Type settingsType, Type prefColorType) { + var prefsMethodBase = settingsType?.GetMethod("Prefs", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); + var prefsMethod = prefsMethodBase?.MakeGenericMethod(prefColorType); + var prefs = (IEnumerable)prefsMethod?.Invoke(null, Array.Empty()); + if (prefs != null) { + foreach (object kvp in prefs) { + var key = kvp.GetType().GetProperty("Key", BindingFlags.Instance | BindingFlags.Public)?.GetMethod.Invoke(kvp, Array.Empty()); + if (key?.ToString() == currentPlaymodeTintPrefKey) { + return kvp.GetType().GetProperty("Value", BindingFlags.Instance | BindingFlags.Public)?.GetMethod.Invoke(kvp, Array.Empty()); + } + + } + } + return null; + } + + public Color? GetCurrentPlaymodeColor() { + if (!playmodeTintSupported) { + return null; + } + return (Color)prefColorProp.GetValue(pref); + } + + public void SetPlaymodeTint(Color color) { + if (!playmodeTintSupported) { + return; + } + prefColorProp.SetValue(pref, color); + setMethod.Invoke(null, new object[] { currentPlaymodeTintPrefKey, pref }); + } + } +} + diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/UnitySettingsHelper.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/UnitySettingsHelper.cs.meta new file mode 100644 index 0000000..5441ebd --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Helpers/UnitySettingsHelper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 34fb1222dc00466ab4e3db7383bd00ee +timeCreated: 1694279476 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadEventPopup.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadEventPopup.cs new file mode 100644 index 0000000..5a85540 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadEventPopup.cs @@ -0,0 +1,95 @@ +using UnityEngine; +using UnityEditor; + + +namespace SingularityGroup.HotReload.Editor { + public enum PopupSource { + Window, + Overlay, + } + public class HotReloadEventPopup : PopupWindowContent { + public static HotReloadEventPopup I = new HotReloadEventPopup(); + private Vector2 _PopupScrollPos; + public bool open { get; private set; } + private PopupSource source; + private HotReloadRunTabState currentState; + + public static void Open(PopupSource source, Vector2 pos) { + I.source = source; + PopupWindow.Show(new Rect(pos.x, pos.y, 0, 0), I); + } + + public override Vector2 GetWindowSize() { + if (HotReloadRunTab.ShouldRenderConsumption(currentState) + && (HotReloadWindowStyles.windowScreenWidth <= Constants.ConsumptionsHideWidth + || HotReloadWindowStyles.windowScreenHeight <= Constants.ConsumptionsHideHeight + || source == PopupSource.Overlay) + ) { + return new Vector2(600, 450); + } else { + return new Vector2(500, 375); + } + } + + public void Repaint() { + if (open) { + PopupWindow.GetWindow().Repaint(); + } + } + + public override void OnGUI(Rect rect) { + if (Event.current.type == EventType.Layout) { + currentState = HotReloadRunTabState.Current; + } + if (HotReloadWindowStyles.windowScreenWidth <= Constants.UpgradeLicenseNoteHideWidth + || HotReloadWindowStyles.windowScreenHeight <= Constants.UpgradeLicenseNoteHideHeight + || source == PopupSource.Overlay + ) { + HotReloadRunTab.RenderUpgradeLicenseNote(currentState, HotReloadWindowStyles.UpgradeLicenseButtonOverlayStyle); + } + using (new EditorGUILayout.HorizontalScope(EditorStyles.helpBox)) { + using (var scope = new EditorGUILayout.ScrollViewScope(_PopupScrollPos, GUIStyle.none, GUI.skin.verticalScrollbar, GUILayout.MaxHeight(495))) { + _PopupScrollPos.x = scope.scrollPosition.x; + _PopupScrollPos.y = scope.scrollPosition.y; + + if (HotReloadWindowStyles.windowScreenWidth <= Constants.ConsumptionsHideWidth + || HotReloadWindowStyles.windowScreenHeight <= Constants.ConsumptionsHideHeight + || source == PopupSource.Overlay + ) { + HotReloadRunTab.RenderLicenseInfo(currentState); + } + + HotReloadRunTab.RenderBars(currentState); + } + } + + bool rateAppShown = HotReloadWindow.ShouldShowRateApp(); + if ((HotReloadWindowStyles.windowScreenWidth <= Constants.RateAppHideWidth + || HotReloadWindowStyles.windowScreenHeight <= Constants.RateAppHideHeight + || source == PopupSource.Overlay) + && rateAppShown + ) { + HotReloadWindow.RenderRateApp(); + } + + if (HotReloadWindowStyles.windowScreenWidth <= Constants.EventFiltersShownHideWidth + || source == PopupSource.Overlay + ) { + using (new EditorGUILayout.HorizontalScope()) { + GUILayout.Space(21); + HotReloadTimelineHelper.RenderAlertFilters(); + } + } + HotReloadState.ShowingRedDot = false; + } + + public override void OnOpen() { + open = true; + } + + public override void OnClose() { + _PopupScrollPos = Vector2.zero; + open = false; + } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadEventPopup.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadEventPopup.cs.meta new file mode 100644 index 0000000..15219c6 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadEventPopup.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 00ec214cde074cf298acef73bb09a4fc +timeCreated: 1696574416 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadOverlay.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadOverlay.cs new file mode 100644 index 0000000..1e18625 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadOverlay.cs @@ -0,0 +1,154 @@ +#if UNITY_2021_2_OR_NEWER +using System; +using System.Collections.Generic; +using UnityEditor.Overlays; +using UnityEngine.UIElements; +using UnityEditor; +using UnityEngine; +using UnityEditor.Toolbars; + +namespace SingularityGroup.HotReload.Editor { + [Overlay(typeof(SceneView), "Hot Reload", true)] + [Icon("Assets/HotReload/Editor/Resources/Icon_DarkMode.png")] + internal class HotReloadOverlay : ToolbarOverlay { + HotReloadOverlay() : base(HotReloadToolbarIndicationButton.id, HotReloadToolbarEventsButton.id, HotReloadToolbarRecompileButton.id) {} + + [EditorToolbarElement(id, typeof(SceneView))] + class HotReloadToolbarIndicationButton : EditorToolbarButton, IAccessContainerWindow { + internal const string id = "HotReloadOverlay/LogoButton"; + public EditorWindow containerWindow { get; set; } + + internal HotReloadToolbarIndicationButton() { + icon = GetIndicationIcon(); + tooltip = EditorIndicationState.IndicationStatusText; + clicked += OnClick; + EditorApplication.update += Update; + } + + void OnClick() { + EditorWindow.GetWindow().Show(); + EditorWindow.GetWindow().SelectTab(typeof(HotReloadRunTab)); + } + + void Update() { + icon = GetIndicationIcon(); + tooltip = EditorIndicationState.IndicationStatusText; + } + + ~HotReloadToolbarIndicationButton() { + clicked -= OnClick; + EditorApplication.update -= Update; + } + } + + [EditorToolbarElement(id, typeof(SceneView))] + class HotReloadToolbarEventsButton : EditorToolbarButton, IAccessContainerWindow { + internal const string id = "HotReloadOverlay/EventsButton"; + public EditorWindow containerWindow { get; set; } + + internal HotReloadToolbarEventsButton() { + icon = HotReloadState.ShowingRedDot ? GUIHelper.GetInvertibleIcon(InvertibleIcon.EventsNew) : GUIHelper.GetInvertibleIcon(InvertibleIcon.Events); + tooltip = "Events"; + clicked += OnClick; + EditorApplication.update += Update; + } + + void OnClick() { + HotReloadEventPopup.Open(PopupSource.Overlay, Event.current.mousePosition); + } + + void Update() { + icon = HotReloadState.ShowingRedDot ? GUIHelper.GetInvertibleIcon(InvertibleIcon.EventsNew) : GUIHelper.GetInvertibleIcon(InvertibleIcon.Events); + } + + ~HotReloadToolbarEventsButton() { + clicked -= OnClick; + EditorApplication.update -= Update; + } + } + + + [EditorToolbarElement(id, typeof(SceneView))] + class HotReloadToolbarRecompileButton : EditorToolbarButton, IAccessContainerWindow { + internal const string id = "HotReloadOverlay/RecompileButton"; + + public EditorWindow containerWindow { get; set; } + + private Texture2D refreshIcon => GUIHelper.GetInvertibleIcon(InvertibleIcon.Recompile); + internal HotReloadToolbarRecompileButton() { + icon = refreshIcon; + tooltip = "Recompile"; + clicked += HotReloadRunTab.RecompileWithChecks; + } + } + + private static Texture2D latestIcon; + private static Dictionary iconTextures = new Dictionary(); + private static Spinner spinner = new Spinner(100); + private static Texture2D GetIndicationIcon() { + if (EditorIndicationState.IndicationIconPath == null || EditorIndicationState.SpinnerActive) { + latestIcon = spinner.GetIcon(); + } else { + latestIcon = GUIHelper.GetLocalIcon(EditorIndicationState.IndicationIconPath); + } + return latestIcon; + } + + private static Image indicationIcon; + private static Label indicationText; + + /// + /// Create Hot Reload overlay panel. + /// + public override VisualElement CreatePanelContent() { + var root = new VisualElement() { name = "Hot Reload Indication" }; + root.style.flexDirection = FlexDirection.Row; + + indicationIcon = new Image() { image = GUIHelper.GetLocalIcon(EditorIndicationState.greyIconPath) }; + indicationIcon.style.height = 30; + indicationIcon.style.width = 30; + indicationIcon.style.marginLeft = 2; + indicationIcon.style.marginTop = 1; + indicationIcon.style.marginRight = 5; + + indicationText = new Label(){text = EditorIndicationState.IndicationStatusText}; + indicationText.style.paddingTop = 9; + indicationText.style.marginLeft = new StyleLength(StyleKeyword.Auto); + indicationText.style.marginRight = new StyleLength(StyleKeyword.Auto); + + root.Add(indicationIcon); + root.Add(indicationText); + root.style.width = 190; + root.style.height = 32; + + EditorApplication.update += Update; + return root; + } + + static bool _repaint; + static bool _instantRepaint; + static DateTime _lastRepaint; + private void Update() { + indicationIcon.image = GetIndicationIcon(); + indicationText.text = EditorIndicationState.IndicationStatusText; + try { + if (EditorWindow.mouseOverWindow + && EditorWindow.mouseOverWindow?.GetType() == typeof(UnityEditor.PopupWindow) + && HotReloadEventPopup.I.open + ) { + _repaint = true; + } + } catch (NullReferenceException) { + // Unity randomly throws nullrefs when EditorWindow.mouseOverWindow gets accessed + } + if (_repaint && DateTime.UtcNow - _lastRepaint > TimeSpan.FromMilliseconds(33)) { + _repaint = false; + _instantRepaint = true; + } + if (_instantRepaint) { + HotReloadEventPopup.I.Repaint(); + } + } + } +} +#endif diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadOverlay.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadOverlay.cs.meta new file mode 100644 index 0000000..cd97ffb --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadOverlay.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 91650b4b0d054bdf9c1e922305e6a61a +timeCreated: 1685130321 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadPrefs.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadPrefs.cs new file mode 100644 index 0000000..88e8bde --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadPrefs.cs @@ -0,0 +1,423 @@ +using System; +using System.Globalization; +using System.IO; +using JetBrains.Annotations; +using SingularityGroup.HotReload.Editor.Cli; +using UnityEditor; +using UnityEngine; + +namespace SingularityGroup.HotReload.Editor { + internal static class HotReloadPrefs { + private const string RemoteServerKey = "HotReloadWindow.RemoteServer"; + private const string RemoteServerHostKey = "HotReloadWindow.RemoteServerHost"; + private const string LicenseEmailKey = "HotReloadWindow.LicenseEmail"; + private const string RenderAuthLoginKey = "HotReloadWindow.RenderAuthLogin"; + private const string FirstLoginCachedKey = "HotReloadWindow.FirstLoginCachedKey"; + [Obsolete] + private const string ShowOnStartupKey = "HotReloadWindow.ShowOnStartup"; + private const string PasswordCachedKey = "HotReloadWindow.PasswordCached"; + private const string ExposeServerToLocalNetworkKey = "HotReloadWindow.ExposeServerToLocalNetwork"; + private const string ErrorHiddenCachedKey = "HotReloadWindow.ErrorHiddenCachedKey"; + private const string RefreshManuallyTipCachedKey = "HotReloadWindow.RefreshManuallyTipCachedKey"; + private const string ShowLoginCachedKey = "HotReloadWindow.ShowLoginCachedKey"; + private const string ConfigurationKey = "HotReloadWindow.Configuration"; + private const string ShowPromoCodesCachedKey = "HotReloadWindow.ShowPromoCodesCached"; + private const string ShowOnDeviceKey = "HotReloadWindow.ShowOnDevice"; + private const string ShowChangelogKey = "HotReloadWindow.ShowChangelog"; + private const string UnsupportedChangesKey = "HotReloadWindow.ShowUnsupportedChanges"; + private const string LoggedBurstHintKey = "HotReloadWindow.LoggedBurstHint"; + private const string ShouldDoAutoRefreshFixupKey = "HotReloadWindow.ShouldDoAutoRefreshFixup"; + private const string ActiveDaysKey = "HotReloadWindow.ActiveDays"; + [Obsolete] + private const string RateAppShownKey = "HotReloadWindow.RateAppShown"; + private const string PatchesCollapseKey = "HotReloadWindow.PatchesCollapse"; + private const string PatchesGroupAllKey = "HotReloadWindow.PatchesGroupAll"; + private const string LaunchOnEditorStartKey = "HotReloadWindow.LaunchOnEditorStart"; + private const string AutoRecompileUnsupportedChangesKey = "HotReloadWindow.AutoRecompileUnsupportedChanges"; + private const string AutoRecompilePartiallyUnsupportedChangesKey = "HotReloadWindow.AutoRecompilePartiallyUnsupportedChanges"; + private const string ShowPatchingNotificationsKey = "HotReloadWindow.ShowPatchingNotifications"; + private const string ShowCompilingUnsupportedNotificationsKey = "HotReloadWindow.ShowCompilingUnsupportedNotifications"; + private const string AutoRecompileUnsupportedChangesImmediatelyKey = "HotReloadWindow.AutoRecompileUnsupportedChangesImmediately"; + private const string AutoRecompileUnsupportedChangesOnExitPlayModeKey = "HotReloadWindow.AutoRecompileUnsupportedChangesOnExitPlayMode"; + private const string AutoRecompileUnsupportedChangesInPlayModeKey = "HotReloadWindow.AutoRecompileUnsupportedChangesInPlayMode"; + private const string AllowDisableUnityAutoRefreshKey = "HotReloadWindow.AllowDisableUnityAutoRefresh"; + private const string DefaultAutoRefreshKey = "HotReloadWindow.DefaultAutoRefresh"; + private const string DefaultAutoRefreshModeKey = "HotReloadWindow.DefaultAutoRefreshMode"; + private const string DefaultScriptCompilationKeyKey = "HotReloadWindow.DefaultScriptCompilationKey"; + private const string DefaultEditorTintKey = "HotReloadWindow.DefaultEditorTint"; + private const string AppliedAutoRefreshKey = "HotReloadWindow.AppliedAutoRefresh"; + private const string AppliedScriptCompilationKey = "HotReloadWindow.AppliedScriptCompilation"; + private const string AppliedEditorTintKey = "HotReloadWindow.AppliedEditorTint"; + private const string AllAssetChangesKey = "HotReloadWindow.AllAssetChanges"; + private const string IncludeShaderChangesKey = "HotReloadWindow.IncludeShaderChanges"; + private const string DisableConsoleWindowKey = "HotReloadWindow.DisableConsoleWindow"; + private const string RedeemLicenseEmailKey = "HotReloadWindow.RedeemLicenseEmail"; + private const string RedeemLicenseInvoiceKey = "HotReloadWindow.RedeemLicenseInvoice"; + private const string RunTabEventsSuggestionsFoldoutKey = "HotReloadWindow.RunTabEventsSuggestionsFoldout"; + private const string RunTabEventsTimelineFoldoutKey = "HotReloadWindow.RunTabEventsTimelineFoldout"; + private const string RunTabUnsupportedChangesFilterKey = "HotReloadWindow.RunTabUnsupportedChangesFilter"; + private const string RunTabCompileErrorFilterKey = "HotReloadWindow.RunTabCompileErrorFilter"; + private const string RunTabPartiallyAppliedPatchesFilterKey = "HotReloadWindow.RunTabPartiallyAppliedPatchesFilter"; + private const string RunTabAppliedPatchesFilterKey = "HotReloadWindow.RunTabAppliedPatchesFilter"; + private const string RecompileDialogueShownKey = "HotReloadWindow.RecompileDialogueShown"; + private const string OpenedWindowAtLeastOnceKey = "HotReloadWindow.OpenedWindowAtLeastOnce"; + + public const string DontShowPromptForDownloadKey = "ServerDownloader.DontShowPromptForDownload"; + + [Obsolete] public const string AllowHttpSettingCacheKey = "HotReloadWindow.AllowHttpSettingCacheKey"; + [Obsolete] public const string AutoRefreshSettingCacheKey = "HotReloadWindow.AutoRefreshSettingCacheKey"; + [Obsolete] public const string ScriptCompilationSettingCacheKey = "HotReloadWindow.ScriptCompilationSettingCacheKey"; + [Obsolete] public const string ProjectGenerationSettingCacheKey = "HotReloadWindow.ProjectGenerationSettingCacheKey"; + + + [Obsolete] + public static bool RemoteServer { + get { return EditorPrefs.GetBool(RemoteServerKey, false); } + set { EditorPrefs.SetBool(RemoteServerKey, value); } + } + + public static bool DontShowPromptForDownload { + get { return EditorPrefs.GetBool(DontShowPromptForDownloadKey, false); } + set { EditorPrefs.SetBool(DontShowPromptForDownloadKey, value); } + } + + [Obsolete] + public static string RemoteServerHost { + get { return EditorPrefs.GetString(RemoteServerHostKey); } + set { EditorPrefs.SetString(RemoteServerHostKey, value); } + } + + public static string LicenseEmail { + get { return EditorPrefs.GetString(LicenseEmailKey); } + set { EditorPrefs.SetString(LicenseEmailKey, value); } + } + + public static string LicensePassword { + get { return EditorPrefs.GetString(PasswordCachedKey); } + set { EditorPrefs.SetString(PasswordCachedKey, value); } + } + + [Obsolete] + public static bool RenderAuthLogin { // false = render free trial + get { return EditorPrefs.GetBool(RenderAuthLoginKey); } + set { EditorPrefs.SetBool(RenderAuthLoginKey, value); } + } + + [Obsolete] + public static bool FirstLogin { + get { return EditorPrefs.GetBool(FirstLoginCachedKey, true); } + set { EditorPrefs.SetBool(FirstLoginCachedKey, value); } + } + + [Obsolete] + public static string ShowOnStartupLegacy { // WindowAutoOpen + get { return EditorPrefs.GetString(ShowOnStartupKey); } + set { EditorPrefs.SetString(ShowOnStartupKey, value); } + } + + public static string showOnStartupPath { get; }= Path.Combine(CliUtils.GetAppDataPath(), "showOnStartup.txt"); + static ShowOnStartupEnum? showOnStartup; + public static ShowOnStartupEnum ShowOnStartup { + get { + if (showOnStartup != null) { + return showOnStartup.Value; + } + if (!File.Exists(showOnStartupPath)) { + showOnStartup = ShowOnStartupEnum.Always; + return showOnStartup.Value; + } + var text = File.ReadAllText(showOnStartupPath); + ShowOnStartupEnum _showOnStartup; + if (Enum.TryParse(text, true, out _showOnStartup)) { + showOnStartup = _showOnStartup; + return showOnStartup.Value; + } + showOnStartup = ShowOnStartupEnum.Always; + return showOnStartup.Value; + } + set { + // ReSharper disable once AssignNullToNotNullAttribute + Directory.CreateDirectory(Path.GetDirectoryName(showOnStartupPath)); + File.WriteAllText(showOnStartupPath, value.ToString()); + showOnStartup = value; + } + } + + + public static bool ErrorHidden { + get { return EditorPrefs.GetBool(ErrorHiddenCachedKey); } + set { EditorPrefs.SetBool(ErrorHiddenCachedKey, value); } + } + + public static bool ShowLogin { + get { return EditorPrefs.GetBool(ShowLoginCachedKey, true); } + set { EditorPrefs.SetBool(ShowLoginCachedKey, value); } + } + + public static bool ShowConfiguration { + get { return EditorPrefs.GetBool(ConfigurationKey, true); } + set { EditorPrefs.SetBool(ConfigurationKey, value); } + } + + public static bool ShowPromoCodes { + get { return EditorPrefs.GetBool(ShowPromoCodesCachedKey, true); } + set { EditorPrefs.SetBool(ShowPromoCodesCachedKey, value); } + } + + public static bool ShowOnDevice { + get { return EditorPrefs.GetBool(ShowOnDeviceKey, true); } + set { EditorPrefs.SetBool(ShowOnDeviceKey, value); } + } + + public static bool ShowChangeLog { + get { return EditorPrefs.GetBool(ShowChangelogKey, true); } + set { EditorPrefs.SetBool(ShowChangelogKey, value); } + } + + public static bool ShowUnsupportedChanges { + get { return EditorPrefs.GetBool(UnsupportedChangesKey, true); } + set { EditorPrefs.SetBool(UnsupportedChangesKey, value); } + } + + [Obsolete] + public static bool RefreshManuallyTip { + get { return EditorPrefs.GetBool(RefreshManuallyTipCachedKey); } + set { EditorPrefs.SetBool(RefreshManuallyTipCachedKey, value); } + } + + public static bool LoggedBurstHint { + get { return EditorPrefs.GetBool(LoggedBurstHintKey); } + set { EditorPrefs.SetBool(LoggedBurstHintKey, value); } + } + + [Obsolete] + public static bool ShouldDoAutoRefreshFixup { + get { return EditorPrefs.GetBool(ShouldDoAutoRefreshFixupKey, true); } + set { EditorPrefs.SetBool(ShouldDoAutoRefreshFixupKey, value); } + } + + public static string ActiveDays { + get { return EditorPrefs.GetString(ActiveDaysKey, string.Empty); } + set { EditorPrefs.SetString(ActiveDaysKey, value); } + } + + [Obsolete] + public static bool RateAppShownLegacy { + get { return EditorPrefs.GetBool(RateAppShownKey, false); } + set { EditorPrefs.SetBool(RateAppShownKey, value); } + } + + static string rateAppPath = Path.Combine(CliUtils.GetAppDataPath(), "ratedApp.txt"); + static bool? rateAppShown; + public static bool RateAppShown { + get { + if (rateAppShown != null) { + return rateAppShown.Value; + } + rateAppShown = File.Exists(rateAppPath); + return rateAppShown.Value; + } + set { + // ReSharper disable once AssignNullToNotNullAttribute + Directory.CreateDirectory(Path.GetDirectoryName(rateAppPath)); + if (value && !File.Exists(rateAppPath)) { + using (File.Create(rateAppPath)) { } + } else if (!value && File.Exists(rateAppPath)) { + File.Delete(rateAppPath); + } + rateAppShown = value; + } + } + + [Obsolete] + public static bool PatchesGroupAll { + get { return EditorPrefs.GetBool(PatchesGroupAllKey, false); } + set { EditorPrefs.SetBool(PatchesGroupAllKey, value); } + } + + [Obsolete] + public static bool PatchesCollapse { + get { return EditorPrefs.GetBool(PatchesCollapseKey, true); } + set { EditorPrefs.SetBool(PatchesCollapseKey, value); } + } + + [Obsolete] + public static ShowOnStartupEnum GetShowOnStartupEnum() { + ShowOnStartupEnum showOnStartupEnum; + if (Enum.TryParse(HotReloadPrefs.ShowOnStartupLegacy, true, out showOnStartupEnum)) { + return showOnStartupEnum; + } + return ShowOnStartupEnum.Always; + } + + public static bool ExposeServerToLocalNetwork { + get { return EditorPrefs.GetBool(ExposeServerToLocalNetworkKey, false); } + set { EditorPrefs.SetBool(ExposeServerToLocalNetworkKey, value); } + } + + public static bool LaunchOnEditorStart { + get { return EditorPrefs.GetBool(LaunchOnEditorStartKey, false); } + set { EditorPrefs.SetBool(LaunchOnEditorStartKey, value); } + } + + public static bool AutoRecompileUnsupportedChanges { + get { return EditorPrefs.GetBool(AutoRecompileUnsupportedChangesKey, false); } + set { EditorPrefs.SetBool(AutoRecompileUnsupportedChangesKey, value); } + } + + public static bool AutoRecompilePartiallyUnsupportedChanges { + get { return EditorPrefs.GetBool(AutoRecompilePartiallyUnsupportedChangesKey, false); } + set { EditorPrefs.SetBool(AutoRecompilePartiallyUnsupportedChangesKey, value); } + } + + public static bool ShowPatchingNotifications { + get { return EditorPrefs.GetBool(ShowPatchingNotificationsKey, true); } + set { EditorPrefs.SetBool(ShowPatchingNotificationsKey, value); } + } + + public static bool ShowCompilingUnsupportedNotifications { + get { return EditorPrefs.GetBool(ShowCompilingUnsupportedNotificationsKey, true); } + set { EditorPrefs.SetBool(ShowCompilingUnsupportedNotificationsKey, value); } + } + + public static bool AutoRecompileUnsupportedChangesImmediately { + get { return EditorPrefs.GetBool(AutoRecompileUnsupportedChangesImmediatelyKey, false); } + set { EditorPrefs.SetBool(AutoRecompileUnsupportedChangesImmediatelyKey, value); } + } + + public static bool AutoRecompileUnsupportedChangesOnExitPlayMode { + get { return EditorPrefs.GetBool(AutoRecompileUnsupportedChangesOnExitPlayModeKey, false); } + set { EditorPrefs.SetBool(AutoRecompileUnsupportedChangesOnExitPlayModeKey, value); } + } + + public static bool AutoRecompileUnsupportedChangesInPlayMode { + get { return EditorPrefs.GetBool(AutoRecompileUnsupportedChangesInPlayModeKey, false); } + set { EditorPrefs.SetBool(AutoRecompileUnsupportedChangesInPlayModeKey, value); } + } + + public static bool AllowDisableUnityAutoRefresh { + get { return EditorPrefs.GetBool(AllowDisableUnityAutoRefreshKey, false); } + set { EditorPrefs.SetBool(AllowDisableUnityAutoRefreshKey, value); } + } + + public static int DefaultAutoRefresh { + get { return EditorPrefs.GetInt(DefaultAutoRefreshKey, -1); } + set { EditorPrefs.SetInt(DefaultAutoRefreshKey, value); } + } + + [UsedImplicitly] + public static int DefaultAutoRefreshMode { + get { return EditorPrefs.GetInt(DefaultAutoRefreshModeKey, -1); } + set { EditorPrefs.SetInt(DefaultAutoRefreshModeKey, value); } + } + + public static int DefaultScriptCompilation { + get { return EditorPrefs.GetInt(DefaultScriptCompilationKeyKey, -1); } + set { EditorPrefs.SetInt(DefaultScriptCompilationKeyKey, value); } + } + + public static Color? DefaultEditorTint { + get { return ColorFromString(EditorPrefs.GetString(DefaultEditorTintKey, string.Empty)); } + set { EditorPrefs.SetString(DefaultEditorTintKey, ColorToString(value)); } + } + + public static bool AppliedAutoRefresh { + get { return EditorPrefs.GetBool(AppliedAutoRefreshKey); } + set { EditorPrefs.SetBool(AppliedAutoRefreshKey, value); } + } + + public static bool AppliedScriptCompilation { + get { return EditorPrefs.GetBool(AppliedScriptCompilationKey); } + set { EditorPrefs.SetBool(AppliedScriptCompilationKey, value); } + } + + public static Color? AppliedEditorTint { + get { return ColorFromString(EditorPrefs.GetString(AppliedEditorTintKey, string.Empty)); } + set { EditorPrefs.SetString(AppliedEditorTintKey, ColorToString(value)); } + } + + public static bool AllAssetChanges { + get { return EditorPrefs.GetBool(AllAssetChangesKey, false); } + set { EditorPrefs.SetBool(AllAssetChangesKey, value); } + } + + public static bool IncludeShaderChanges { + get { return EditorPrefs.GetBool(IncludeShaderChangesKey, false); } + set { EditorPrefs.SetBool(IncludeShaderChangesKey, value); } + } + + public static bool DisableConsoleWindow { + get { return EditorPrefs.GetBool(DisableConsoleWindowKey, false); } + set { EditorPrefs.SetBool(DisableConsoleWindowKey, value); } + } + + public static string RedeemLicenseEmail { + get { return EditorPrefs.GetString(RedeemLicenseEmailKey); } + set { EditorPrefs.SetString(RedeemLicenseEmailKey, value); } + } + + public static string RedeemLicenseInvoice { + get { return EditorPrefs.GetString(RedeemLicenseInvoiceKey); } + set { EditorPrefs.SetString(RedeemLicenseInvoiceKey, value); } + } + + public static bool RunTabEventsTimelineFoldout { + get { return EditorPrefs.GetBool(RunTabEventsTimelineFoldoutKey, true); } + set { EditorPrefs.SetBool(RunTabEventsTimelineFoldoutKey, value); } + } + + public static bool RunTabEventsSuggestionsFoldout { + get { return EditorPrefs.GetBool(RunTabEventsSuggestionsFoldoutKey, true); } + set { EditorPrefs.SetBool(RunTabEventsSuggestionsFoldoutKey, value); } + } + + public static bool RunTabUnsupportedChangesFilter { + get { return EditorPrefs.GetBool(RunTabUnsupportedChangesFilterKey, true); } + set { EditorPrefs.SetBool(RunTabUnsupportedChangesFilterKey, value); } + } + + public static bool RunTabCompileErrorFilter { + get { return EditorPrefs.GetBool(RunTabCompileErrorFilterKey, true); } + set { EditorPrefs.SetBool(RunTabCompileErrorFilterKey, value); } + } + + public static bool RunTabPartiallyAppliedPatchesFilter { + get { return EditorPrefs.GetBool(RunTabPartiallyAppliedPatchesFilterKey, true); } + set { EditorPrefs.SetBool(RunTabPartiallyAppliedPatchesFilterKey, value); } + } + + public static bool RunTabAppliedPatchesFilter { + get { return EditorPrefs.GetBool(RunTabAppliedPatchesFilterKey, true); } + set { EditorPrefs.SetBool(RunTabAppliedPatchesFilterKey, value); } + } + + public static bool RecompileDialogueShown { + get { return EditorPrefs.GetBool(RecompileDialogueShownKey); } + set { EditorPrefs.SetBool(RecompileDialogueShownKey, value); } + } + + public static bool OpenedWindowAtLeastOnce { + get { return EditorPrefs.GetBool(OpenedWindowAtLeastOnceKey); } + set { EditorPrefs.SetBool(OpenedWindowAtLeastOnceKey, value); } + } + + private const string rgbaDelimiter = ";"; + public static string ColorToString(Color? _color) { + if (_color == null) { + return null; + } + var color = _color.Value; + var cultInfo = CultureInfo.InvariantCulture; + string[] rgbaList = { color.r.ToString(cultInfo), color.g.ToString(cultInfo), color.b.ToString(cultInfo), color.a.ToString(cultInfo)}; + return String.Join(rgbaDelimiter, rgbaList); + } + + public static Color? ColorFromString(string ser) { + if (string.IsNullOrEmpty(ser)) { + return null; + } + string[] rgbaParts = ser.Split(rgbaDelimiter.ToCharArray()); + return new Color(float.Parse(rgbaParts[0]), float.Parse(rgbaParts[1]),float.Parse(rgbaParts[2]),float.Parse(rgbaParts[3])); + } + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadPrefs.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadPrefs.cs.meta new file mode 100644 index 0000000..9548ddf --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadPrefs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 96451431b50143944b85d4fbdde5f104 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadSettingsEditor.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadSettingsEditor.cs new file mode 100644 index 0000000..fdb536d --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadSettingsEditor.cs @@ -0,0 +1,70 @@ +using System.IO; +using UnityEditor; +using UnityEngine; + +namespace SingularityGroup.HotReload.Editor { + static class HotReloadSettingsEditor { + /// Ensure settings asset file is created and saved + public static void EnsureSettingsCreated(HotReloadSettingsObject asset) { + if (!SettingsExists()) { + CreateNewSettingsFile(asset, HotReloadSettingsObject.editorAssetPath); + } + } + + /// Load existing settings asset or return the default settings + public static HotReloadSettingsObject LoadSettingsOrDefault() { + if (SettingsExists()) { + return AssetDatabase.LoadAssetAtPath(HotReloadSettingsObject.editorAssetPath); + } else { + // create an instance with default values + return ScriptableObject.CreateInstance(); + } + } + + /// + /// Create settings asset file + /// + /// Assume that settings asset doesn't exist yet + /// The settings asset + static void CreateNewSettingsFile(HotReloadSettingsObject asset, string editorAssetPath) { + // create new settings asset + // ReSharper disable once AssignNullToNotNullAttribute + Directory.CreateDirectory(Path.GetDirectoryName(editorAssetPath)); + if (asset == null) { + asset = ScriptableObject.CreateInstance(); + } + AssetDatabase.CreateAsset(asset, editorAssetPath); + // Saving the asset isn't needed right after you created it. Unity will save it at the appropriate time. + // Troy: I tested in Unity 2018 LTS, first Android build creates the asset file and asset is included in the build. + } + + #region include/exclude in build + + private static bool SettingsExists() { + return AssetExists(HotReloadSettingsObject.editorAssetPath); + } + + private static bool AssetExists(string assetPath) { + return AssetDatabase.GetMainAssetTypeAtPath(assetPath) != null; + } + + public static void AddOrRemoveFromBuild(bool includeSettingsInBuild) { + AssetDatabase.StartAssetEditing(); + var so = LoadSettingsOrDefault(); + try { + if (includeSettingsInBuild) { + // Note: don't need to force create settings because we know the defaults in player. + so.EnsurePrefabSetCorrectly(); + EnsureSettingsCreated(so); + } else { + // this block shouldn't create the asset file, but it's also fine if it does + so.EnsurePrefabNotInBuild(); + } + } finally { + AssetDatabase.StopAssetEditing(); + } + } + + #endregion + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadSettingsEditor.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadSettingsEditor.cs.meta new file mode 100644 index 0000000..c357b5b --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadSettingsEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a0f4231ca4f63e54da0ecf87ab62c381 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadState.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadState.cs new file mode 100644 index 0000000..7bbfdf6 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadState.cs @@ -0,0 +1,25 @@ +using UnityEditor; + +namespace SingularityGroup.HotReload.Editor { + internal static class HotReloadState { + private const string LastPatchIdKey = "HotReloadWindow.LastPatchId"; + private const string ShowingRedDotKey = "HotReloadWindow.ShowingRedDot"; + private const string RecompiledUnsupportedChangesOnExitPlaymodeKey = "HotReloadWindow.RecompiledUnsupportedChangesOnExitPlaymode"; + + public static string LastPatchId { + get { return SessionState.GetString(LastPatchIdKey, string.Empty); } + set { SessionState.SetString(LastPatchIdKey, value); } + } + + public static bool ShowingRedDot { + get { return SessionState.GetBool(ShowingRedDotKey, false); } + set { SessionState.SetBool(ShowingRedDotKey, value); } + } + + public static bool RecompiledUnsupportedChangesOnExitPlaymode { + get { return SessionState.GetBool(RecompiledUnsupportedChangesOnExitPlaymodeKey, false); } + set { SessionState.SetBool(RecompiledUnsupportedChangesOnExitPlaymodeKey, value); } + } + } + +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadState.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadState.cs.meta new file mode 100644 index 0000000..b79cbe6 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/HotReloadState.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 803347281bcf46b6b37d48231b8882be +timeCreated: 1694458889 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Icon_Player.png b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Icon_Player.png new file mode 100644 index 0000000000000000000000000000000000000000..09e5105fcdb44e6637ef47b9eb03dc52c9626431 GIT binary patch literal 2621 zcmZ`*2{=@J7r$d)N_Lt0m_dV)xiTSpvI`l5CWJ9F)npmQ$e<|nMkpF421zB^Lxs`X zBCjPSD4UHj;w0ioINKu*4giwl3jzEPNr0E*K{zJ>fdbrW91pOAZ2RRqL)6wV zJOFTx4DhXC+&Pwe*l-q?vub&-Le?u@<@tqHxyt*?SLM>Kq|JdGBOGLNC?{)zBkHlghHxSR~?%?3? z$G~)S|LA8O8ENV5Hn81+2fh2QTp+;2_r&jEL}e_&f5xVzrTwg}t<9OApZ5?H5NMN= zl`Z2@blY#IVuy@d-s1R-*f=^i{dIo+Pv!2x!NJ`{2RD6qQB4_$y6BT|uSU4Dv$NEv zE{Ygq`9(#XER{5Shmd8K|7CB9gs)V24^Pwv;MWv-VjUoetOK&ThQ*I^mE~PWHu&TONinBY6jg6adeOQ4h zq?N>*N>Xcj$t{*^w0XnNGK}0~L=)nihfZ^sGTjxw{R=E{F=MgX5RNhDgJ)mHydjhv zvrHR}euSS8l?A`{oh%(uoOr_s6>PeAkoL zNC@xN(nv+-$id$^89I)#+3cIn=@~>i6oj`FJ0@-V3au=*Nq<-Xs-VW(&8bc?eL{!T zkVy6*>m?8l9fsJTuaf@QjwMbpyuMSLoNNiYG^?m#0;KfS+=-23kg7T-0L!DBH1{tD4%Vc>(!^!MaUz-*tqE8ah zu!%JLtX@<{`eN=RLmV#ld7oq-Q8joDi)efOc5iy6!%hW#_&$HjlB!t|DcLN>yXBa| zCS_|0rIzNoIhuZrM6zgaa^<*CyHk7}t9qezFRy^nliG9JQrP25@{p@39;YJu#728w zzjpg6eRgP%)KLBT#J%;xVtviu;!m6z+xouhTI;p;a7e9XZ8hjzio@+kZ81sejlvh zo{p)hchpk0*fx}iW<$}mq(&cHJR$=~T<~qVv?JP+=6W#o$l`sI`sWR849&>X;B7W8 z*tjOiTNo?E;xoyKBYgWb3NOB>8L`8Rx}5q&E<&A<5}a>N=bODggAq&mnC7$im;xRc zINW{1nXQ9K`hHCXuBJUP0FkU7qNfB49-itvJaRdAyfZd>oTwkWB)n9$RnH*9WlY$* z-*PHU2c;~kpsu{Muyy2o((+|i(yQSEYSMO-V`C}%)82|f{w?8DyxBj`6phA4?R$|2 z?dZ8gxtnY$1E*X&7a#62M9nB<4~Dh-)tI?8=O^2dNJQddc23UQ;!{rqS;S8m7gC26 zVKM1xi7)9nlyLViAJt5Hflos#R+i82QMs8`ZR5{_{b1>79 z*>^w&+1uOOb^8=A)1hCdsz)LGdh!0cfGz`l-Iv~k){DpOtr+b*c6BoLUhbc=?B37P z%1`j*YTp~x3{FXu?<|HjF}xsR3hyS;dn{=787cSQ)p~xX^Dm;TMrWAHW!F?iM_$9) zg({T0-Ckk)PHvy@TYSHr1-7Yu)yh*#Ka#cQ~IOV{!Gf@k@HiiHU}3T5#JZ z3nXc<`mW2zLmHD9Eq&FxokoG7xH#I0A{}0yN=@vTtBb{h?&ad2qQ%>ykLAU9N^pOQ NY%Luv%J%uh{1;g*C*%MC literal 0 HcmV?d00001 diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Icon_Player.png.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Icon_Player.png.meta new file mode 100644 index 0000000..31d1ef2 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Icon_Player.png.meta @@ -0,0 +1,147 @@ +fileFormatVersion: 2 +guid: 90cf8e542151548c6aa3cba26467e144 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation.meta new file mode 100644 index 0000000..09a0fe3 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 12e88a0f97924d18859867b0cc957d03 +timeCreated: 1676802469 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/DownloadUtility.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/DownloadUtility.cs new file mode 100644 index 0000000..f29b1b1 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/DownloadUtility.cs @@ -0,0 +1,98 @@ +using System; +using System.IO; +using System.Net; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using SingularityGroup.HotReload.Editor.Cli; + +namespace SingularityGroup.HotReload.Editor { + static class DownloadUtility { + const string baseUrl = "https://cdn.hotreload.net"; + + public static async Task DownloadFile(string url, string targetFilePath, IProgress progress, CancellationToken cancellationToken) { + var tmpDir = Path.GetDirectoryName(targetFilePath); + Directory.CreateDirectory(tmpDir); + using(var client = RequestHelper.CreateHttpClient()) { + client.Timeout = TimeSpan.FromMinutes(10); + return await client.DownloadAsync(url, targetFilePath, progress, cancellationToken).ConfigureAwait(false); + } + } + + public static string GetPackagePrefix(string version) { + if (PackageConst.IsAssetStoreBuild) { + return $"releases/asset-store/{version.Replace('.', '-')}"; + } + return $"releases/{version.Replace('.', '-')}"; + } + + public static string GetDownloadUrl(string key) { + return $"{baseUrl}/{key}"; + } + + public static async Task DownloadAsync(this HttpClient client, string requestUri, string destinationFilePath, IProgress progress, CancellationToken cancellationToken = default(CancellationToken)) { + // Get the http headers first to examine the content length + using (var response = await client.GetAsync(requestUri, HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false)) { + if (response.StatusCode != HttpStatusCode.OK) { + throw new DownloadException($"Download failed with status code {response.StatusCode} and reason {response.ReasonPhrase}"); + } + var contentLength = response.Content.Headers.ContentLength; + if (!contentLength.HasValue) { + throw new DownloadException("Download failed: Content length unknown"); + } + + using (var fs = new FileStream(destinationFilePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)) + using (var download = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) { + + // Ignore progress reporting when no progress reporter was + if (progress == null) { + await download.CopyToAsync(fs).ConfigureAwait(false); + } else { + // Convert absolute progress (bytes downloaded) into relative progress (0% - 99.9%) + var relativeProgress = new Progress(totalBytes => progress.Report(Math.Min(99.9f, (float)totalBytes / contentLength.Value))); + // Use extension method to report progress while downloading + await download.CopyToAsync(fs, 81920, relativeProgress, cancellationToken).ConfigureAwait(false); + } + await fs.FlushAsync().ConfigureAwait(false); + if (fs.Length != contentLength.Value) { + throw new DownloadException("Download failed: download file is corrupted"); + } + return new DownloadResult(HttpStatusCode.OK, null); + } + } + } + + static async Task CopyToAsync(this Stream source, Stream destination, int bufferSize, IProgress progress, CancellationToken cancellationToken) { + if (source == null) + throw new ArgumentNullException(nameof(source)); + if (!source.CanRead) + throw new ArgumentException("Has to be readable", nameof(source)); + if (destination == null) + throw new ArgumentNullException(nameof(destination)); + if (!destination.CanWrite) + throw new ArgumentException("Has to be writable", nameof(destination)); + if (bufferSize < 0) + throw new ArgumentOutOfRangeException(nameof(bufferSize)); + + var buffer = new byte[bufferSize]; + long totalBytesRead = 0; + int bytesRead; + while ((bytesRead = await source.ReadAsync(buffer, 0, buffer.Length, cancellationToken).ConfigureAwait(false)) != 0) { + await destination.WriteAsync(buffer, 0, bytesRead, cancellationToken).ConfigureAwait(false); + totalBytesRead += bytesRead; + progress?.Report(totalBytesRead); + } + } + + [Serializable] + public class DownloadException : ApplicationException { + public DownloadException(string message) + : base(message) { + } + + public DownloadException(string message, Exception innerException) + : base(message, innerException) { + } + } + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/DownloadUtility.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/DownloadUtility.cs.meta new file mode 100644 index 0000000..2ddff18 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/DownloadUtility.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2a7a39befa1f455cb21fcad46513b6e5 +timeCreated: 1676973096 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/ExponentialBackoff.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/ExponentialBackoff.cs new file mode 100644 index 0000000..9591972 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/ExponentialBackoff.cs @@ -0,0 +1,18 @@ +using System; + +namespace SingularityGroup.HotReload.Editor { + static class ExponentialBackoff { + + public static TimeSpan GetTimeout(int attempt, int minBackoff = 250, int maxBackoff = 60000, int deltaBackoff = 400) { + attempt = Math.Min(25, attempt); // safety to avoid overflow below + + var delta = (uint)( + (Math.Pow(2.0, attempt) - 1.0) + * deltaBackoff + ); + + var interval = Math.Min(checked(minBackoff + delta), maxBackoff); + return TimeSpan.FromMilliseconds(interval); + } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/ExponentialBackoff.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/ExponentialBackoff.cs.meta new file mode 100644 index 0000000..dccb61b --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/ExponentialBackoff.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5329de48151140eb871721ae80f925cd +timeCreated: 1676908147 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/InstallUtility.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/InstallUtility.cs new file mode 100644 index 0000000..8bb8025 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/InstallUtility.cs @@ -0,0 +1,58 @@ +using System; +using System.IO; +using SingularityGroup.HotReload.DTO; +using SingularityGroup.HotReload.Editor.Cli; +using SingularityGroup.HotReload.EditorDependencies; +using UnityEditor; +using UnityEngine; +#if UNITY_2019_4_OR_NEWER +using System.Reflection; +using Unity.CodeEditor; +#endif + +namespace SingularityGroup.HotReload.Editor { + static class InstallUtility { + const string installFlagPath = PackageConst.LibraryCachePath + "/installFlag.txt"; + + public static void DebugClearInstallState() { + File.Delete(installFlagPath); + } + + // HandleEditorStart is only called on editor start, not on domain reload + public static void HandleEditorStart(string updatedFromVersion) { + var showOnStartup = HotReloadPrefs.ShowOnStartup; + if (showOnStartup == ShowOnStartupEnum.Always || (showOnStartup == ShowOnStartupEnum.OnNewVersion && !String.IsNullOrEmpty(updatedFromVersion))) { + HotReloadWindow.Open(); + } + if (HotReloadPrefs.LaunchOnEditorStart) { + EditorCodePatcher.DownloadAndRun().Forget(); + } + + RequestHelper.RequestEditorEventWithRetry(new Stat(StatSource.Client, StatLevel.Debug, StatFeature.Editor, StatEventType.Start)).Forget(); + } + + public static void CheckForNewInstall() { + if(File.Exists(installFlagPath)) { + return; + } + Directory.CreateDirectory(Path.GetDirectoryName(installFlagPath)); + using(File.Create(installFlagPath)) { } + //Avoid opening the window on domain reload + EditorApplication.delayCall += HandleNewInstall; + } + + static void HandleNewInstall() { + if (EditorCodePatcher.licenseType == UnityLicenseType.UnityPro) { + RedeemLicenseHelper.I.StartRegistration(); + } + HotReloadWindow.Open(); + HotReloadPrefs.AllowDisableUnityAutoRefresh = true; + HotReloadPrefs.AllAssetChanges = true; + HotReloadPrefs.AutoRecompileUnsupportedChanges = true; + HotReloadPrefs.AutoRecompileUnsupportedChangesOnExitPlayMode = true; + if (HotReloadCli.CanOpenInBackground) { + HotReloadPrefs.DisableConsoleWindow = true; + } + } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/InstallUtility.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/InstallUtility.cs.meta new file mode 100644 index 0000000..3c86cce --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/InstallUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ee93b2c98bc7d8f4bb38bbbd5961d354 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/ServerDownloader.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/ServerDownloader.cs new file mode 100644 index 0000000..1bd6315 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/ServerDownloader.cs @@ -0,0 +1,190 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using SingularityGroup.HotReload.DTO; +using SingularityGroup.HotReload.Editor.Cli; +using SingularityGroup.HotReload.Newtonsoft.Json; +using UnityEditor; +using UnityEngine; + +namespace SingularityGroup.HotReload.Editor { + internal class ServerDownloader : IProgress { + public float Progress {get; private set;} + public bool Started {get; private set;} + + class Config { + public Dictionary customServerExecutables; + } + + public string GetExecutablePath(ICliController cliController) { + var targetDir = CliUtils.GetExecutableTargetDir(); + var targetPath = Path.Combine(targetDir, cliController.BinaryFileName); + return targetPath; + } + + public bool IsDownloaded(ICliController cliController) { + return File.Exists(GetExecutablePath(cliController)); + } + + public bool CheckIfDownloaded(ICliController cliController) { + if(TryUseUserDefinedBinaryPath(cliController, GetExecutablePath(cliController))) { + Started = true; + Progress = 1f; + return true; + } else if(IsDownloaded(cliController)) { + Started = true; + Progress = 1f; + return true; + } else { + Started = false; + Progress = 0f; + return false; + } + } + + public async Task EnsureDownloaded(ICliController cliController, CancellationToken cancellationToken) { + var targetDir = CliUtils.GetExecutableTargetDir(); + var targetPath = Path.Combine(targetDir, cliController.BinaryFileName); + Started = true; + if(File.Exists(targetPath)) { + Progress = 1f; + return true; + } + Progress = 0f; + await ThreadUtility.SwitchToThreadPool(cancellationToken); + + Directory.CreateDirectory(targetDir); + if(TryUseUserDefinedBinaryPath(cliController, targetPath)) { + Progress = 1f; + return true; + } + + var tmpPath = CliUtils.GetTempDownloadFilePath("Server.tmp"); + var attempt = 0; + bool sucess = false; + HashSet errors = null; + while(!sucess) { + try { + if (File.Exists(targetPath)) { + Progress = 1f; + return true; + } + // Note: we are writing to temp file so if downloaded file is corrupted it will not cause issues until it's copied to target location + var result = await DownloadUtility.DownloadFile(GetDownloadUrl(cliController), tmpPath, this, cancellationToken).ConfigureAwait(false); + sucess = result.statusCode == HttpStatusCode.OK; + } catch (Exception e) { + var error = $"{e.GetType().Name}: {e.Message}"; + errors = (errors ?? new HashSet()); + if (errors.Add(error)) { + Log.Warning($"Download attempt failed. If the issue persists please reach out to customer support for assistance. Exception: {error}"); + } + } + if (!sucess) { + await Task.Delay(ExponentialBackoff.GetTimeout(attempt), cancellationToken).ConfigureAwait(false); + } + Progress = 0; + attempt++; + } + + if (errors?.Count > 0) { + var data = new EditorExtraData { + { StatKey.Errors, new List(errors) }, + }; + // sending telemetry requires server to be running so we only attempt after server is downloaded + RequestHelper.RequestEditorEventWithRetry(new Stat(StatSource.Client, StatLevel.Error, StatFeature.Editor, StatEventType.Download), data).Forget(); + Log.Info("Download succeeded!"); + } + + const int ERROR_ALREADY_EXISTS = 0xB7; + try { + File.Move(tmpPath, targetPath); + } catch(IOException ex) when((ex.HResult & 0x0000FFFF) == ERROR_ALREADY_EXISTS) { + //another downloader came first + try { + File.Delete(tmpPath); + } catch { + //ignored + } + } + Progress = 1f; + return true; + } + + static bool TryUseUserDefinedBinaryPath(ICliController cliController, string targetPath) { + if (!File.Exists(PackageConst.ConfigFileName)) { + return false; + } + + var config = JsonConvert.DeserializeObject(File.ReadAllText(PackageConst.ConfigFileName)); + var customExecutables = config?.customServerExecutables; + if (customExecutables == null) { + return false; + } + + string customBinaryPath; + if(!customExecutables.TryGetValue(cliController.PlatformName, out customBinaryPath)) { + return false; + } + + if (!File.Exists(customBinaryPath)) { + Log.Warning($"unable to find server binary for platform '{cliController.PlatformName}' at '{customBinaryPath}'. " + + $"Will proceed with downloading the binary (default behavior)"); + return false; + } + + try { + var targetFile = new FileInfo(targetPath); + bool copy = true; + if (targetFile.Exists) { + copy = File.GetLastWriteTimeUtc(customBinaryPath) > targetFile.LastWriteTimeUtc; + } + if (copy) { + Directory.CreateDirectory(Path.GetDirectoryName(targetPath)); + File.Copy(customBinaryPath, targetPath, true); + } + return true; + } catch(IOException ex) { + Log.Warning("encountered exception when copying server binary in the specified custom executable path '{0}':\n{1}", customBinaryPath, ex); + return false; + } + } + + static string GetDownloadUrl(ICliController cliController) { + const string version = PackageConst.ServerVersion; + var key = $"{DownloadUtility.GetPackagePrefix(version)}/server/{cliController.PlatformName}/{cliController.BinaryFileName}"; + return DownloadUtility.GetDownloadUrl(key); + } + + void IProgress.Report(float value) { + Progress = value; + } + + public Task PromptForDownload() { + if (EditorUtility.DisplayDialog( + title: "Install platform specific components", + message: InstallDescription, + ok: "Install", + cancel: "More Info") + ) { + return EnsureDownloaded(HotReloadCli.controller, CancellationToken.None); + } + Application.OpenURL(Constants.AdditionalContentURL); + return Task.FromResult(false); + } + + public const string InstallDescription = "For Hot Reload to work, additional components specific to your operating system have to be installed"; + } + + class DownloadResult { + public readonly HttpStatusCode statusCode; + public readonly string error; + public DownloadResult(HttpStatusCode statusCode, string error) { + this.statusCode = statusCode; + this.error = error; + } + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/ServerDownloader.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/ServerDownloader.cs.meta new file mode 100644 index 0000000..480ff83 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/ServerDownloader.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f076514e142a4915ab2676a9ca6d884a +timeCreated: 1676802482 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/UpdateUtility.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/UpdateUtility.cs new file mode 100644 index 0000000..fbf393d --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/UpdateUtility.cs @@ -0,0 +1,94 @@ +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using SingularityGroup.HotReload.Editor.Cli; +using SingularityGroup.HotReload.RuntimeDependencies; +using UnityEditor; +#if UNITY_EDITOR_WIN +using System.Diagnostics; +using Debug = UnityEngine.Debug; +#endif + +namespace SingularityGroup.HotReload.Editor { + static class UpdateUtility { + public static async Task Update(string version, IProgress progress, CancellationToken cancellationToken) { + await ThreadUtility.SwitchToThreadPool(); + + string serverDir; + if(!CliUtils.TryFindServerDir(out serverDir)) { + progress?.Report(1); + return "unable to locate hot reload package"; + } + var packageDir = Path.GetDirectoryName(Path.GetFullPath(serverDir)); + var cacheDir = Path.GetFullPath(PackageConst.LibraryCachePath); + if(Path.GetPathRoot(packageDir) != Path.GetPathRoot(cacheDir)) { + progress?.Report(1); + return "unable to update package because it is located on a different drive than the unity project"; + } + var updatedPackageCopy = BackupPackage(packageDir, version); + + var key = $"{DownloadUtility.GetPackagePrefix(version)}/HotReload.zip"; + var url = DownloadUtility.GetDownloadUrl(key); + var targetFileName = $"HotReload{version.Replace('.', '-')}.zip"; + var targetFilePath = CliUtils.GetTempDownloadFilePath(targetFileName); + var proxy = new Progress(f => progress?.Report(f * 0.7f)); + var result = await DownloadUtility.DownloadFile(url, targetFilePath, proxy, cancellationToken).ConfigureAwait(false); + if(result.error != null) { + progress?.Report(1); + return result.error; + } + + PackageUpdater.UpdatePackage(targetFilePath, updatedPackageCopy); + progress?.Report(0.8f); + + var packageRecycleBinDir = PackageConst.LibraryCachePath + $"/PackageArchived-{version}-{Guid.NewGuid():N}"; + try { + Directory.Move(packageDir, packageRecycleBinDir); + Directory.Move(updatedPackageCopy, packageDir); + } catch { + // fallback to replacing files individually if access to the folder is denied + PackageUpdater.UpdatePackage(targetFilePath, packageDir); + } + try { + Directory.Delete(packageRecycleBinDir, true); + } catch (IOException) { + //ignored + } + + progress?.Report(1); + return null; + } + + static string BackupPackage(string packageDir, string version) { + var backupPath = PackageConst.LibraryCachePath + $"/PackageBackup-{version}"; + if(Directory.Exists(backupPath)) { + Directory.Delete(backupPath, true); + } + DirectoryCopy(packageDir, backupPath); + return backupPath; + } + + static void DirectoryCopy(string sourceDirPath, string destDirPath) { + var rootSource = new DirectoryInfo(sourceDirPath); + + var sourceDirs = rootSource.GetDirectories(); + // ensure destination directory exists + Directory.CreateDirectory(destDirPath); + + // Get the files in the directory and copy them to the new destination + var files = rootSource.GetFiles(); + foreach (var file in files) { + string temppath = Path.Combine(destDirPath, file.Name); + var copy = file.CopyTo(temppath); + copy.LastWriteTimeUtc = file.LastWriteTimeUtc; + } + + // copying subdirectories, and their contents to destination + foreach (var subdir in sourceDirs) { + string subDirDestPath = Path.Combine(destDirPath, subdir.Name); + DirectoryCopy(subdir.FullName, subDirDestPath); + } + } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/UpdateUtility.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/UpdateUtility.cs.meta new file mode 100644 index 0000000..902970d --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Installation/UpdateUtility.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d8485ce38122465e9e70d5992d9ae7ed +timeCreated: 1676966641 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild.meta new file mode 100644 index 0000000..d600ba4 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0fe483b6b7ad4be79b58901d03e35511 +timeCreated: 1674041345 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/BuildGenerateBuildInfo.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/BuildGenerateBuildInfo.cs new file mode 100644 index 0000000..573ef1b --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/BuildGenerateBuildInfo.cs @@ -0,0 +1,42 @@ +using System; +using System.IO; +using UnityEditor; +using UnityEditor.Build; + +#pragma warning disable CS0618 +namespace SingularityGroup.HotReload.Editor { + public class BuildGenerateBuildInfo : IPreprocessBuild, IPostprocessBuild { + public int callbackOrder => 10; + + public void OnPreprocessBuild(BuildTarget target, string path) { + try { + if (!HotReloadBuildHelper.IncludeInThisBuild()) { + return; + } + // write BuildInfo json into the StreamingAssets directory + GenerateBuildInfo(BuildInfo.GetStoredPath(), target); + } catch (BuildFailedException) { + throw; + } catch (Exception e) { + throw new BuildFailedException(e); + } + } + + private static void GenerateBuildInfo(string buildFilePath, BuildTarget buildTarget) { + var buildInfo = BuildInfoHelper.GenerateBuildInfoMainThread(buildTarget); + // write to StreamingAssets + // create StreamingAssets folder if not exists (in-case project has no StreamingAssets files) + // ReSharper disable once AssignNullToNotNullAttribute + Directory.CreateDirectory(Path.GetDirectoryName(buildFilePath)); + File.WriteAllText(buildFilePath, buildInfo.ToJson()); + } + + public void OnPostprocessBuild(BuildTarget target, string path) { + try { + File.Delete(BuildInfo.GetStoredPath()); + } catch { + // ignore + } + } + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/BuildGenerateBuildInfo.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/BuildGenerateBuildInfo.cs.meta new file mode 100644 index 0000000..6ab20c0 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/BuildGenerateBuildInfo.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 178df48ca88b4cddac448a49196b49bf +timeCreated: 1682338738 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/HotReloadBuildHelper.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/HotReloadBuildHelper.cs new file mode 100644 index 0000000..8c553f2 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/HotReloadBuildHelper.cs @@ -0,0 +1,106 @@ +using System; +using System.IO; +using UnityEditor; + +namespace SingularityGroup.HotReload.Editor { + internal static class HotReloadBuildHelper { + /// + /// Should HotReload runtime be included in the current build? + /// + public static bool IncludeInThisBuild() { + return IsAllBuildSettingsSupported(); + } + + /// + /// Get scripting backend for the current platform. + /// + /// Scripting backend + public static ScriptingImplementation GetCurrentScriptingBackend() { +#pragma warning disable CS0618 + return PlayerSettings.GetScriptingBackend(BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget)); +#pragma warning restore CS0618 + } + + public static ManagedStrippingLevel GetCurrentStrippingLevel() { +#pragma warning disable CS0618 + return PlayerSettings.GetManagedStrippingLevel(BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget)); +#pragma warning restore CS0618 + } + + public static void SetCurrentScriptingBackend(ScriptingImplementation to) { +#pragma warning disable CS0618 + // only set it if default is not correct (avoid changing ProjectSettings when not needed) + if (GetCurrentScriptingBackend() != to) { + PlayerSettings.SetScriptingBackend(EditorUserBuildSettings.selectedBuildTargetGroup, to); + } +#pragma warning restore CS0618 + } + + public static void SetCurrentStrippingLevel(ManagedStrippingLevel to) { +#pragma warning disable CS0618 + // only set it if default is not correct (avoid changing ProjectSettings when not needed) + if (GetCurrentStrippingLevel() != to) { + PlayerSettings.SetManagedStrippingLevel(EditorUserBuildSettings.selectedBuildTargetGroup, to); + } +#pragma warning restore CS0618 + } + + /// Is the current build target supported? + /// main thread only + public static bool IsBuildTargetSupported() { + var buildTarget = EditorUserBuildSettings.selectedBuildTargetGroup; + return Array.IndexOf(unsupportedBuildTargets, buildTarget) == -1; + } + + /// Are all the settings supported? + /// main thread only + static bool IsAllBuildSettingsSupported() { + if (!IsBuildTargetSupported()) { + return false; + } + + // need way to give it settings object, dont want to give serializedobject + var options = HotReloadSettingsEditor.LoadSettingsOrDefault(); + var so = new SerializedObject(options); + + // check all projeect options + foreach (var option in HotReloadSettingsTab.allOptions) { + var projectOption = option as ProjectOptionBase; + if (projectOption != null) { + // if option is required, build can't use hot reload + if (projectOption.IsRequiredForBuild() && !projectOption.GetValue(so)) { + return false; + } + } + } + + return GetCurrentScriptingBackend() == ScriptingImplementation.Mono2x + && GetCurrentStrippingLevel() == ManagedStrippingLevel.Disabled + && EditorUserBuildSettings.development; + } + + /// + /// Some platforms are not supported because they don't have Mono scripting backend. + /// + /// + /// Only list the platforms that definately don't have Mono scripting. + /// + private static readonly BuildTargetGroup[] unsupportedBuildTargets = new [] { + BuildTargetGroup.iOS, // mono support was removed many years ago + BuildTargetGroup.WebGL, // has never had mono + }; + + public static bool IsMonoSupported(BuildTargetGroup buildTarget) { + // "When a platform can support both backends, Mono is the default. For more information, see Scripting restrictions." + // Unity docs https://docs.unity3d.com/Manual/Mono.html (2019.4/2020.3/2021.3) +#pragma warning disable CS0618 // obsolete since 2023 + var defaultScripting = PlayerSettings.GetDefaultScriptingBackend(buildTarget); +#pragma warning restore CS0618 + if (defaultScripting == ScriptingImplementation.Mono2x) { + return Array.IndexOf(unsupportedBuildTargets, buildTarget) == -1; + } + // default scripting was not Mono, so the platform doesn't support Mono at all. + return false; + } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/HotReloadBuildHelper.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/HotReloadBuildHelper.cs.meta new file mode 100644 index 0000000..030488c --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/HotReloadBuildHelper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b9aa611f02544b609c5b29f9d1409d6e +timeCreated: 1674041425 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PostbuildModifyAndroidManifest.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PostbuildModifyAndroidManifest.cs new file mode 100644 index 0000000..17e03c6 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PostbuildModifyAndroidManifest.cs @@ -0,0 +1,133 @@ +using System; +using System.IO; +using System.Text.RegularExpressions; +using UnityEditor.Android; +using UnityEditor.Build; + +namespace SingularityGroup.HotReload.Editor { +#pragma warning disable CS0618 + /// + /// + /// This class sets option in the AndroidManifest that you choose in HotReload build settings. + /// + /// + /// - To connect to the HotReload server through the local network, we need to permit access to http://192...
+ /// - Starting with Android 9, insecure http requests are not allowed by default and must be whitelisted + ///
+ ///
+ internal class PostbuildModifyAndroidManifest : IPostGenerateGradleAndroidProject { +#pragma warning restore CS0618 + public int callbackOrder => 10; + + private const string manifestFileName = "AndroidManifest.xml"; + + public void OnPostGenerateGradleAndroidProject(string path) { + try { + if (!HotReloadBuildHelper.IncludeInThisBuild()) { + return; + } + // Note: in future we may support users with custom configuration for usesCleartextTraffic + #if UNITY_2022_1_OR_NEWER + // Unity 2022 or newer → do nothing, we rely on Unity option to control the flag + #else + // Unity 2021 or older → put manifest flag in if Unity is making a Development Build + var manifestFilePath = FindAndroidManifest(path); + if (manifestFilePath == null) { + throw new BuildFailedException($"[{CodePatcher.TAG}] Unable to find {manifestFileName}"); + } + SetUsesCleartextTraffic(manifestFilePath); + #endif + } catch (BuildFailedException) { + throw; + } catch (Exception e) { + throw new BuildFailedException(e); + } + } + + /// identifier that is used in the deeplink uri scheme + /// (initially tried Application.identifier, but that was giving unexpected results based on PlayerSettings) + // SG-29580 + // Something to uniqly identify the application, but it must be something which is highly likely + // to be the same at build time (studio might have logic to set e.g. product name to MyGameProd or MyGameTest) + public static string ApplicationIdentiferSlug => "app"; +/* + public static string ApplicationIdentiferSlug => Regex.Replace(ApplicationIdentifer, @"[^a-zA-Z0-9\.\-]", "") + .Replace("..", ".") // happens if your companyname in Unity ends with a dot + .ToLowerInvariant(); + + private static void AddDeeplinkForwarder(string manifestFilePath) { + // add the hotreload-${identifier} uri scheme to the AndroidManifest.xml file + // it should be added as part of an intent-filter for the activity "com.singularitygroup.deeplinkforwarder.DeepLinkForwarderActivity" + var contents = File.ReadAllText(manifestFilePath); + if (contents.Contains("android:name=\"com.singularitygroup.deeplinkforwarder.DeepLinkForwarderActivity\"")) { + // user has already set this themselves, don't replace it + return; + } + + //note: not using android:host or any other data attr because android still shows a chooser for all ur hotreload apps + // Therefore must use a unique uri scheme to ensure only one app can handle it. + var activityWithIntentFilter = @" + + + + + + + +"; + var newContents = Regex.Replace(contents, + @"", + activityWithIntentFilter + "\n " + ); + File.WriteAllText(manifestFilePath, newContents); + } +*/ + // Assume unityLibraryPath is to {gradleProject}/unityLibrary/ which is roughly the same across Unity versions 2018/2019/2020/2021/2022 + private static string FindAndroidManifest(string unityLibraryPath) { + // find the AndroidManifest.xml file which we can edit + var dir = new DirectoryInfo(unityLibraryPath); + var manifestFilePath = Path.Combine(dir.FullName, "src", "main", manifestFileName); + if (File.Exists(manifestFilePath)) { + return manifestFilePath; + } + + Log.Info("Did not find {0} at {1}, searching for manifest file inside {2}", manifestFileName, manifestFilePath, dir.FullName); + var manifestFiles = dir.GetFiles(manifestFileName, SearchOption.AllDirectories); + if (manifestFiles.Length == 0) { + return null; + } + + foreach (var file in manifestFiles) { + if (file.FullName.Contains("src")) { + // good choice + return file.FullName; + } + } + // fallback to the first file found + return manifestFiles[0].FullName; + } + + /// + /// Set option android:usesCleartextTraffic="true" + + /// + /// Absolute filepath to the unityLibrary AndroidManifest.xml file + private static void SetUsesCleartextTraffic(string manifestFilePath) { + // Ideally we would create or modify a "Network Security Configuration file" to permit access to local ip addresses + // https://developer.android.com/training/articles/security-config#manifest + // but that becomes difficult when the user has their own configuration file - would need to search for it and it may be inside an aar. + var contents = File.ReadAllText(manifestFilePath); + if (contents.Contains("android:usesCleartextTraffic=")) { + // user has already set this themselves, don't replace it + return; + } + var newContents = Regex.Replace(contents, + @""; + newContents += $"\n"; + File.WriteAllText(manifestFilePath, newContents); + } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PostbuildModifyAndroidManifest.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PostbuildModifyAndroidManifest.cs.meta new file mode 100644 index 0000000..538171c --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PostbuildModifyAndroidManifest.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1949292efc07445ea4c040d544e2d369 +timeCreated: 1675441886 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PostbuildSendProjectState.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PostbuildSendProjectState.cs new file mode 100644 index 0000000..c28b406 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PostbuildSendProjectState.cs @@ -0,0 +1,26 @@ +using System; +using SingularityGroup.HotReload.Editor.Cli; +using UnityEditor; +using UnityEditor.Build; + +namespace SingularityGroup.HotReload.Editor { +#pragma warning disable CS0618 + class PostbuildSendProjectState : IPostprocessBuild { +#pragma warning restore CS0618 + public int callbackOrder => 9999; + public void OnPostprocessBuild(BuildTarget target, string path) { + try { + if (!HotReloadBuildHelper.IncludeInThisBuild()) { + return; + } + // after build passes, need to send again because EditorApplication.delayCall isn't called. + var buildInfo = BuildInfoHelper.GenerateBuildInfoMainThread(); + HotReloadCli.PrepareBuildInfo(buildInfo); + } catch (BuildFailedException) { + throw; + } catch (Exception e) { + throw new BuildFailedException(e); + } + } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PostbuildSendProjectState.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PostbuildSendProjectState.cs.meta new file mode 100644 index 0000000..719e8a4 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PostbuildSendProjectState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3b27b9eab16f78f448477e546fd5eb97 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PrebuildIncludeResources.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PrebuildIncludeResources.cs new file mode 100644 index 0000000..40081e8 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PrebuildIncludeResources.cs @@ -0,0 +1,60 @@ +using System; +using UnityEditor; +using UnityEditor.Build; +using UnityEngine; + +namespace SingularityGroup.HotReload.Editor { + /// Includes HotReload Resources only in development builds + /// + /// This build script ensures that HotReload Resources are not included in release builds. + /// + /// When HotReload is enabled:
+ /// - include HotReloadSettingsObject in development Android builds.
+ /// - exclude HotReloadSettingsObject from the build.
+ /// When HotReload is disabled:
+ /// - excludes HotReloadSettingsObject from the build.
+ ///
+ ///
+#pragma warning disable CS0618 + internal class PrebuildIncludeResources : IPreprocessBuild, IPostprocessBuild { +#pragma warning restore CS0618 + public int callbackOrder => 10; + + // Preprocess warnings don't show up in console + bool warnSettingsNotSupported; + + public void OnPreprocessBuild(BuildTarget target, string path) { + try { + if (HotReloadBuildHelper.IncludeInThisBuild()) { + // move scriptable object into Resources/ folder + HotReloadSettingsEditor.AddOrRemoveFromBuild(true); + } else { + // make sure HotReload resources are not in the build + HotReloadSettingsEditor.AddOrRemoveFromBuild(false); + + var options = HotReloadSettingsEditor.LoadSettingsOrDefault(); + var so = new SerializedObject(options); + if (IncludeInBuildOption.I.GetValue(so)) { + warnSettingsNotSupported = true; + } + } + } catch (BuildFailedException) { + throw; + } catch (Exception ex) { + throw new BuildFailedException(ex); + } + } + + public void OnPostprocessBuild(BuildTarget target, string path) { + if (warnSettingsNotSupported) { + Debug.LogWarning("Hot Reload was not included in the build because one or more build settings were not supported."); + } + } + + // Do nothing in post build. settings asset will be dirty if build fails, so not worth fixing just for successful builds. + // [PostProcessBuild] + // private static void PostBuild(BuildTarget target, string pathToBuiltProject) { + // } + } + +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PrebuildIncludeResources.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PrebuildIncludeResources.cs.meta new file mode 100644 index 0000000..6a88638 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/PlayerBuild/PrebuildIncludeResources.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7a63dd2d10359e94a8a3c24bf59164fb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration.meta new file mode 100644 index 0000000..f6f2a3a --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ac3ce0c4b45643859281090bdc74719c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/FileIOProvider.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/FileIOProvider.cs new file mode 100644 index 0000000..2af8f5a --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/FileIOProvider.cs @@ -0,0 +1,44 @@ +using System; +using System.IO; +using System.Security; +using System.Text; +using SingularityGroup.HotReload.Editor.Util; + +namespace SingularityGroup.HotReload.Editor.ProjectGeneration { + class FileIOProvider : IFileIO + { + public bool Exists(string fileName) + { + return File.Exists(fileName); + } + + public string ReadAllText(string fileName) + { + return File.ReadAllText(fileName); + } + + public void WriteAllText(string path, string content) + { + File.WriteAllText(path, content, Encoding.UTF8); + } + + public string EscapedRelativePathFor(string file, string projectDirectory) + { + var projectDir = Path.GetFullPath(projectDirectory); + + // We have to normalize the path, because the PackageManagerRemapper assumes + // dir seperators will be os specific. + var absolutePath = Path.GetFullPath(file.NormalizePath()); + var path = SkipPathPrefix(absolutePath, projectDir); + + return SecurityElement.Escape(path); + } + + private static string SkipPathPrefix(string path, string prefix) + { + return path.StartsWith($@"{prefix}{Path.DirectorySeparatorChar}", StringComparison.Ordinal) + ? path.Substring(prefix.Length + 1) + : path; + } + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/FileIOProvider.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/FileIOProvider.cs.meta new file mode 100644 index 0000000..b01018d --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/FileIOProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 27e102e0bda3b0c4f95d4e5e9e3bf16a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/GUIDProvider.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/GUIDProvider.cs new file mode 100644 index 0000000..d55e241 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/GUIDProvider.cs @@ -0,0 +1,9 @@ +namespace SingularityGroup.HotReload.Editor.ProjectGeneration { + class GUIDProvider : IGUIDGenerator + { + public string ProjectGuid(string name) + { + return SolutionGuidGenerator.GuidForProject(name); + } + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/GUIDProvider.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/GUIDProvider.cs.meta new file mode 100644 index 0000000..3aaeaf5 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/GUIDProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ca39683512eedae448726b029ca101ec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IFileIO.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IFileIO.cs new file mode 100644 index 0000000..0cda7f5 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IFileIO.cs @@ -0,0 +1,12 @@ +namespace SingularityGroup.HotReload.Editor.ProjectGeneration +{ + internal interface IFileIO + { + bool Exists(string fileName); + + string ReadAllText(string fileName); + void WriteAllText(string path, string content); + + string EscapedRelativePathFor(string file, string projectDirectory); + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IFileIO.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IFileIO.cs.meta new file mode 100644 index 0000000..86d76fb --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IFileIO.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6e856fe8c0b7d3c45a06140d120fdd87 +timeCreated: 1580717666 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IGUIDGenerator.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IGUIDGenerator.cs new file mode 100644 index 0000000..46bde64 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IGUIDGenerator.cs @@ -0,0 +1,7 @@ +namespace SingularityGroup.HotReload.Editor.ProjectGeneration +{ + internal interface IGUIDGenerator + { + string ProjectGuid(string name); + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IGUIDGenerator.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IGUIDGenerator.cs.meta new file mode 100644 index 0000000..1854437 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IGUIDGenerator.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 27fd74267707df04ab2cfac0e8abd782 +timeCreated: 1580717700 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IHotReloadProjectGenerationPostProcessor.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IHotReloadProjectGenerationPostProcessor.cs new file mode 100644 index 0000000..de473c0 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IHotReloadProjectGenerationPostProcessor.cs @@ -0,0 +1,43 @@ +namespace SingularityGroup.HotReload.Editor.ProjectGeneration { + /// + /// Allows to post process Hot Reload's project generation. + /// This should only be needed if you tinker with Unity's project generation as well. + /// Types that inherit from this interface will get created automatically whenever Hot Reload generates project files. + /// Types that implement this interface need to have a public parameterless default constructor. + /// + public interface IHotReloadProjectGenerationPostProcessor { + + /// + /// Specifies the ordering of the post processor. + /// Post processors with lower callback order get executed first. + /// + int CallbackOrder { get; } + + /// + /// Use this method to set up state you need for the project generation. + /// Calls to unity API need to happen here and it's values need to be cached. + /// This is the only method that will get executed on the main thread. + /// + void InitializeOnMainThread(); + + /// + /// Gets called whenever Hot Reload generated a project file. + /// The destination file path for the .csproj file + /// The file contents of the .csproj file + /// + string OnGeneratedCSProjectThreaded(string path, string contents); + + /// + /// Gets called whenever Hot Reload generated a solution file. + /// The destination file path for the .sln file + /// The file contents of the .sln file + /// + string OnGeneratedSlnSolutionThreaded(string path, string contents); + + /// + /// Gets called after Hot Reload project generation is finished. + /// + void OnGeneratedCSProjectFilesThreaded(); + } +} + diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IHotReloadProjectGenerationPostProcessor.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IHotReloadProjectGenerationPostProcessor.cs.meta new file mode 100644 index 0000000..a336fc9 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/IHotReloadProjectGenerationPostProcessor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ff65ad426f484ad5bbd34fb8f9204c4d +timeCreated: 1676637309 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGenenerationPostProcessor.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGenenerationPostProcessor.cs new file mode 100644 index 0000000..17856eb --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGenenerationPostProcessor.cs @@ -0,0 +1,14 @@ +using System.IO; +using UnityEditor; +using UnityEngine; + +namespace SingularityGroup.HotReload.Editor.ProjectGeneration { + class ProjectGenenerationPostProcessor : AssetPostprocessor { + // Called once before any generation of sln/csproj files happens, can return true to disable generation altogether + static bool OnPreGeneratingCSProjectFiles() { + ProjectGeneration.GenerateSlnAndCsprojFiles(Application.dataPath).Forget(); + return false; + } + } +} + diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGenenerationPostProcessor.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGenenerationPostProcessor.cs.meta new file mode 100644 index 0000000..fd6578f --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGenenerationPostProcessor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d58a4838109c4b31ac7f221547ad82e8 +timeCreated: 1676527868 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGeneration.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGeneration.cs new file mode 100644 index 0000000..cb2d3bf --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGeneration.cs @@ -0,0 +1,893 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Security; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using SingularityGroup.HotReload; +using SingularityGroup.HotReload.Editor.Util; +using SingularityGroup.HotReload.Newtonsoft.Json; +using UnityEditor; +using UnityEditor.Compilation; +using UnityEditor.PackageManager; +using UnityEditorInternal; +using Assembly = UnityEditor.Compilation.Assembly; +using PackageInfo = UnityEditor.PackageManager.PackageInfo; +#if UNITY_2019_1_OR_NEWER +using System.Reflection; +#endif + +namespace SingularityGroup.HotReload.Editor.ProjectGeneration { + class ProjectGeneration { + private enum ScriptingLanguage { + None, + CSharp + } + + [Serializable] + class Config { + public string projectExclusionRegex; + public HashSet projectBlacklist; + public HashSet polyfillSourceFiles; + public bool excludeAllAnalyzers; + public bool useBuiltInProjectGeneration; + } + + public static readonly string MSBuildNamespaceUri = "http://schemas.microsoft.com/developer/msbuild/2003"; + + /// + /// Map source extensions to ScriptingLanguages + /// + private static readonly Dictionary k_BuiltinSupportedExtensions = + new Dictionary { + { "cs", ScriptingLanguage.CSharp }, + { "uxml", ScriptingLanguage.None }, + { "uss", ScriptingLanguage.None }, + { "shader", ScriptingLanguage.None }, + { "compute", ScriptingLanguage.None }, + { "cginc", ScriptingLanguage.None }, + { "hlsl", ScriptingLanguage.None }, + { "glslinc", ScriptingLanguage.None }, + { "template", ScriptingLanguage.None }, + { "raytrace", ScriptingLanguage.None }, + { "json", ScriptingLanguage.None }, + { "rsp", ScriptingLanguage.None }, + { "asmdef", ScriptingLanguage.None }, + { "asmref", ScriptingLanguage.None }, + { "xaml", ScriptingLanguage.None }, + { "tt", ScriptingLanguage.None }, + { "t4", ScriptingLanguage.None }, + { "ttinclude", ScriptingLanguage.None } + }; + + private string m_SolutionProjectEntryTemplate = string.Join(Environment.NewLine, + @"Project(""{{{0}}}"") = ""{1}"", ""{2}"", ""{{{3}}}""", + @"EndProject").Replace(" ", "\t"); + + private string m_SolutionProjectConfigurationTemplate = string.Join(Environment.NewLine, + @" {{{0}}}.Debug|Any CPU.ActiveCfg = Debug|Any CPU", + @" {{{0}}}.Debug|Any CPU.Build.0 = Debug|Any CPU").Replace(" ", "\t"); + + private string[] m_ProjectSupportedExtensions = new string[0]; + + private readonly string m_ProjectName; + private readonly string m_ProjectDirectory; + private readonly string m_SolutionDirectory; + private readonly IFileIO m_FileIOProvider; + private readonly IGUIDGenerator m_GUIDGenerator; + private static readonly SemaphoreSlim gate = new SemaphoreSlim(1, 1); + + private const string k_ToolsVersion = "4.0"; + private const string k_ProductVersion = "10.0.20506"; + private const string k_BaseDirectory = "."; + +#if !UNITY_2020_2_OR_NEWER + private const string k_TargetLanguageVersion = "latest"; +#endif + + // ReSharper disable once CollectionNeverUpdated.Local + private readonly Dictionary m_PackageInfoCache = + new Dictionary(); + + private Assembly[] m_AllEditorAssemblies; + + private Assembly[] m_AllPlayerAssemblies; + + private string[] m_AllAssetPaths; + + private string m_EngineAssemblyPath; + + private string m_EditorAssemblyPath; + + private bool m_SuppressCommonWarnings; + + private string m_FallbackRootNamespace; + + private IHotReloadProjectGenerationPostProcessor[] m_PostProcessors; + + + public static bool IsSyncing => gate.CurrentCount == 0; + + internal const string tempDir = PackageConst.LibraryCachePath + "/Solution"; + public static string GetUnityProjectDirectory(string dataPath) => new DirectoryInfo(dataPath).Parent.FullName; + public static string GetSolutionFilePath(string dataPath) => Path.Combine(tempDir, Path.GetFileName(GetUnityProjectDirectory(dataPath)) + ".sln"); + + public static Task GenerateSlnAndCsprojFiles(string dataPath) { + if (!IsSyncing) { + return GenerateAsync(dataPath); + } + return Task.CompletedTask; + } + + public static Task EnsureSlnAndCsprojFiles(string dataPath) { + if (File.Exists(GetSolutionFilePath(dataPath))) { + return Task.CompletedTask; + } + + return GenerateAsync(dataPath); + } + + private static Task GenerateAsync(string dataPath) { + Directory.CreateDirectory(tempDir); + var gen = new ProjectGeneration(tempDir, GetUnityProjectDirectory(dataPath)); + return gen.Sync(); + } + + + public ProjectGeneration(string solutionDirectory, string unityProjectDirectory) { + m_ProjectDirectory = unityProjectDirectory; + m_SolutionDirectory = solutionDirectory; + m_ProjectName = Path.GetFileName(unityProjectDirectory); + m_FileIOProvider = new FileIOProvider(); + m_GUIDGenerator = new GUIDProvider(); + } + + public async Task Sync() { + await ThreadUtility.SwitchToThreadPool(); + var config = LoadConfig(); + if (config.useBuiltInProjectGeneration) { + return; + } + + await ThreadUtility.SwitchToMainThread(); + await gate.WaitAsync(); + try { + //Cache all data that is accessed via unity API on the unity main thread. + m_AllAssetPaths = AssetDatabase.GetAllAssetPaths(); + m_ProjectSupportedExtensions = EditorSettings.projectGenerationUserExtensions; + m_EngineAssemblyPath = InternalEditorUtility.GetEngineAssemblyPath(); + m_EditorAssemblyPath = InternalEditorUtility.GetEditorAssemblyPath(); + m_FallbackRootNamespace = EditorSettings.projectGenerationRootNamespace; + m_SuppressCommonWarnings = +#if UNITY_2020_1_OR_NEWER + PlayerSettings.suppressCommonWarnings; +#else + false; +#endif + + //Do the remaining work on a separate thread + await Task.WhenAll( + BuildPackageInfoCache(), + BuildEditorAssemblies(), + BuildPostProcessors() + ); + await GenerateAndWriteSolutionAndProjects(config); + } finally { + gate.Release(); + } + } + + private Config LoadConfig() { + var configPath = Path.Combine(m_ProjectDirectory, PackageConst.ConfigFileName); + Config config; + if(File.Exists(configPath)) { + config = JsonConvert.DeserializeObject(File.ReadAllText(configPath)); + } else { + config = new Config(); + } + return config; + } + + private bool ShouldFileBePartOfSolution(string file) { + // Exclude files coming from packages except if they are internalized. + if (IsInternalizedPackagePath(file)) { + return false; + } + + return HasValidExtension(file); + } + + public bool HasValidExtension(string file) { + var extension = Path.GetExtension(file); + + // Dll's are not scripts but still need to be included.. + if (file.Equals(".dll", StringComparison.OrdinalIgnoreCase)) + return true; + + return IsSupportedExtension(extension); + } + + private bool IsSupportedExtension(string extension) { + extension = extension.TrimStart('.'); + return k_BuiltinSupportedExtensions.ContainsKey(extension) || m_ProjectSupportedExtensions.Contains(extension); + } + + async Task GenerateAndWriteSolutionAndProjects(Config config) { + await ThreadUtility.SwitchToThreadPool(); + + var projectExclusionRegex = config.projectExclusionRegex != null ? new Regex(config.projectExclusionRegex, RegexOptions.Compiled | RegexOptions.Singleline) : null; + var projectBlacklist = config.projectBlacklist ?? new HashSet(); + var polyfillSourceFiles = config.polyfillSourceFiles ?? new HashSet(); + var filteredProjects = new HashSet(); + var runtimeDependenciesBuilder = new List(); + runtimeDependenciesBuilder.Add(typeof(HarmonyLib.DetourApi).Assembly.Location); +# if UNITY_2019_4_OR_NEWER + runtimeDependenciesBuilder.Add(typeof(Helper2019).Assembly.Location); +#endif +# if UNITY_2020_3_OR_NEWER + runtimeDependenciesBuilder.Add(typeof(Helper2020).Assembly.Location); +#endif +# if UNITY_2022_2_OR_NEWER + runtimeDependenciesBuilder.Add(typeof(Helper2022).Assembly.Location); +#endif + var runtimeDependencies = runtimeDependenciesBuilder.ToArray(); + + // Only synchronize islands that have associated source files and ones that we actually want in the project. + // This also filters out DLLs coming from .asmdef files in packages. + var assemblies = GetAssemblies(ShouldFileBePartOfSolution).ToArray(); + var projectParts = new List(); + foreach (var assembly in assemblies) { + if(projectExclusionRegex != null && projectExclusionRegex.IsMatch(assembly.name)) { + filteredProjects.Add(assembly.name); + continue; + } + var part = new ProjectPart(assembly.name, assembly, "", m_FallbackRootNamespace, polyfillSourceFiles); + string projectPath; +# if (UNITY_2021_3_OR_NEWER) + projectPath = Path.GetRelativePath(m_ProjectDirectory, ProjectFile(part)).Replace('\\', '/'); +# else + projectPath = ProjectFile(part).Replace('\\', '/').Replace(m_ProjectDirectory.Replace('\\', '/'), ""); +#endif + if(projectBlacklist.Contains(projectPath)) { + filteredProjects.Add(assembly.name); + continue; + } + projectParts.Add(part); + } + + SyncSolution(projectParts.ToArray()); + + await ThreadUtility.SwitchToMainThread(); + var responseFiles = new List[projectParts.Count]; + for (var i = 0; i < projectParts.Count; i++) { + responseFiles[i] = projectParts[i].ParseResponseFileData(m_ProjectDirectory).ToList(); + } + + await ThreadUtility.SwitchToThreadPool(); + for (var i = 0; i < projectParts.Count; i++) { + SyncProject(projectParts[i], responseFiles[i], filteredProjects, runtimeDependencies, config); + } + + foreach (var pp in m_PostProcessors) { + try { + pp.OnGeneratedCSProjectFilesThreaded(); + } catch (Exception ex) { + Log.Warning("Post processor '{0}' threw exception when calling OnGeneratedCSProjectFilesThreaded:\n{1}", pp, ex); + } + } + } + + private void SyncProject( + ProjectPart island, + List responseFileData, + HashSet filteredProjects, + string[] runtimeDependencies, + Config config) { + + SyncProjectFileIfNotChanged( + ProjectFile(island), + ProjectText(island, responseFileData, filteredProjects, runtimeDependencies, config)); + } + + private void SyncProjectFileIfNotChanged(string path, string newContents) { + foreach (var pp in m_PostProcessors) { + try { + newContents = pp.OnGeneratedCSProjectThreaded(path, newContents); + } catch (Exception ex) { + Log.Warning("Post processor '{0}' failed when processing project '{1}':\n{2}", pp, path, ex); + } + } + + SyncFileIfNotChanged(path, newContents); + } + + private void SyncSolutionFileIfNotChanged(string path, string newContents) { + foreach (var pp in m_PostProcessors) { + try { + newContents = pp.OnGeneratedSlnSolutionThreaded(path, newContents); + } catch (Exception ex) { + Log.Warning("Post processor '{0}' failed when processing solution '{1}':\n{2}", pp, path, ex); + } + } + + SyncFileIfNotChanged(path, newContents); + } + + + private void SyncFileIfNotChanged(string path, string newContents) { + try { + if (m_FileIOProvider.Exists(path) && newContents == m_FileIOProvider.ReadAllText(path)) { + return; + } + } catch (Exception exception) { + Log.Exception(exception); + } + + m_FileIOProvider.WriteAllText(path, newContents); + } + + private string ProjectText(ProjectPart assembly, List responseFilesData, HashSet filteredProjects, string[] runtimeDependencies, Config config) { + var projectBuilder = new StringBuilder(ProjectHeader(assembly, responseFilesData, config)); + + foreach (var file in assembly.SourceFiles) { + var fullFile = m_FileIOProvider.EscapedRelativePathFor(file, m_SolutionDirectory); + projectBuilder.Append(" ").Append(Environment.NewLine); + } + + projectBuilder.Append(assembly.AssetsProjectPart); + + var responseRefs = responseFilesData.SelectMany(x => x.FullPathReferences.Select(r => r)); + var internalAssemblyReferences = assembly.AssemblyReferences + .Where(reference => filteredProjects.Contains(reference.name) || !reference.sourceFiles.Any(ShouldFileBePartOfSolution)).Select(i => i.outputPath); + var allReferences = + assembly.CompiledAssemblyReferences + .Union(responseRefs) + .Union(internalAssemblyReferences).ToArray(); + + foreach (var reference in allReferences) { + var fullReference = Path.IsPathRooted(reference) ? reference : Path.Combine(m_ProjectDirectory, reference); + AppendReference(fullReference, projectBuilder); + } + foreach (var path in runtimeDependencies) { + AppendReference(path, projectBuilder); + } + + if (assembly.AssemblyReferences.Length > 0) { + projectBuilder.Append(" ").Append(Environment.NewLine); + projectBuilder.Append(" ").Append(Environment.NewLine); + foreach (var reference in assembly.AssemblyReferences.Where(i => !filteredProjects.Contains(i.name) && i.sourceFiles.Any(ShouldFileBePartOfSolution))) { + var name = GetProjectName(reference.name, reference.defines); + projectBuilder.Append(" ") + .Append(Environment.NewLine); + projectBuilder.Append(" {").Append(ProjectGuid(name)).Append("}").Append(Environment.NewLine); + projectBuilder.Append(" ").Append(name).Append("").Append(Environment.NewLine); + projectBuilder.Append(" ").Append(Environment.NewLine); + } + } + + projectBuilder.Append(ProjectFooter()); + return projectBuilder.ToString(); + } + + private static void AppendReference(string fullReference, StringBuilder projectBuilder) { + var escapedFullPath = SecurityElement.Escape(fullReference); + escapedFullPath = escapedFullPath.NormalizePath(); + projectBuilder.Append(" ").Append(Environment.NewLine); + projectBuilder.Append(" ").Append(escapedFullPath).Append("").Append(Environment.NewLine); + projectBuilder.Append(" ").Append(Environment.NewLine); + } + + private string ProjectFile(ProjectPart projectPart) { + return Path.Combine(m_SolutionDirectory, $"{GetProjectName(projectPart.Name, projectPart.Defines)}.csproj"); + } + + public string SolutionFile() { + return Path.Combine(m_SolutionDirectory, $"{m_ProjectName}.sln"); + } + + private string ProjectHeader( + ProjectPart assembly, + List responseFilesData, + Config config + ) { + var otherResponseFilesData = GetOtherArgumentsFromResponseFilesData(responseFilesData); + var arguments = new object[] { + k_ToolsVersion, + k_ProductVersion, + ProjectGuid(GetProjectName(assembly.Name, assembly.Defines)), + m_EngineAssemblyPath, + m_EditorAssemblyPath, + string.Join(";", assembly.Defines.Concat(responseFilesData.SelectMany(x => x.Defines)).Distinct().ToArray()), + MSBuildNamespaceUri, + assembly.Name, + assembly.OutputPath, + assembly.RootNamespace, + "", + GenerateLangVersion(otherResponseFilesData["langversion"], assembly), + k_BaseDirectory, + assembly.CompilerOptions.AllowUnsafeCode | responseFilesData.Any(x => x.Unsafe), + GenerateNoWarn(otherResponseFilesData["nowarn"].Distinct().ToList()), + config.excludeAllAnalyzers ? "" : GenerateAnalyserItemGroup(RetrieveRoslynAnalyzers(assembly, otherResponseFilesData)), + config.excludeAllAnalyzers ? "" : GenerateAnalyserAdditionalFiles(otherResponseFilesData["additionalfile"].SelectMany(x=>x.Split(';')).Distinct().ToArray()), + config.excludeAllAnalyzers ? "" : GenerateRoslynAnalyzerRulesetPath(assembly, otherResponseFilesData), + GenerateWarningLevel(otherResponseFilesData["warn"].Concat(otherResponseFilesData["w"]).Distinct()), + GenerateWarningAsError(otherResponseFilesData["warnaserror"], otherResponseFilesData["warnaserror-"], + otherResponseFilesData["warnaserror+"]), + GenerateDocumentationFile(otherResponseFilesData["doc"].ToArray()), + GenerateNullable(otherResponseFilesData["nullable"]) + }; + + try { + return string.Format(GetProjectHeaderTemplate(), arguments); + } catch (Exception) { + throw new NotSupportedException( + "Failed creating c# project because the c# project header did not have the correct amount of arguments, which is " + + arguments.Length); + } + } + + string[] RetrieveRoslynAnalyzers(ProjectPart assembly, ILookup otherResponseFilesData) { + var otherAnalyzers = otherResponseFilesData["a"] ?? Array.Empty(); + #if UNITY_2020_2_OR_NEWER + return otherResponseFilesData["analyzer"].Concat(otherAnalyzers) + .SelectMany(x=>x.Split(';')) + // #if !ROSLYN_ANALYZER_FIX + // .Concat(GetRoslynAnalyzerPaths()) + // #else + .Concat(assembly.CompilerOptions.RoslynAnalyzerDllPaths) + // #endif + .Select(MakeAbsolutePath) + .Distinct() + .ToArray(); + #else + return otherResponseFilesData["analyzer"].Concat(otherAnalyzers) + .SelectMany(x=>x.Split(';')) + .Distinct() + .Select(MakeAbsolutePath) + .ToArray(); + #endif + } + + private static string GenerateAnalyserItemGroup(string[] paths) { + // + // + // + // + if (!paths.Any()) + return string.Empty; + + var analyserBuilder = new StringBuilder(); + analyserBuilder.AppendLine(" "); + foreach (var path in paths) { + analyserBuilder.AppendLine($" "); + } + + analyserBuilder.AppendLine(" "); + return analyserBuilder.ToString(); + } + + private string GenerateRoslynAnalyzerRulesetPath(ProjectPart assembly, ILookup otherResponseFilesData) { +#if UNITY_2020_2_OR_NEWER + return GenerateAnalyserRuleSet(otherResponseFilesData["ruleset"].Append(assembly.CompilerOptions.RoslynAnalyzerRulesetPath) + .Where(a => !string.IsNullOrEmpty(a)).Distinct().Select(x => MakeAbsolutePath(x).NormalizePath()).ToArray()); +#else + return GenerateAnalyserRuleSet(otherResponseFilesData["ruleset"].Distinct().Select(x => MakeAbsolutePath(x).NormalizePath()).ToArray()); +#endif + } + + private static string GenerateAnalyserRuleSet(string[] paths) { + //..\path\to\myrules.ruleset + if (!paths.Any()) + return string.Empty; + + return + $"{Environment.NewLine}{string.Join(Environment.NewLine, paths.Select(a => $" {a}"))}"; + } + + private static string MakeAbsolutePath(string path) { + return Path.IsPathRooted(path) ? path : Path.GetFullPath(path); + } + + private string GenerateNullable(IEnumerable enumerable) { + var val = enumerable.FirstOrDefault(); + if (string.IsNullOrWhiteSpace(val)) + return string.Empty; + + return $"{Environment.NewLine} {val}"; + } + + private static string GenerateDocumentationFile(string[] paths) { + if (!paths.Any()) + return String.Empty; + + return $"{Environment.NewLine}{string.Join(Environment.NewLine, paths.Select(a => $" {a}"))}"; + } + + private static string GenerateWarningAsError(IEnumerable args, IEnumerable argsMinus, IEnumerable argsPlus) { + var returnValue = String.Empty; + var allWarningsAsErrors = false; + var warningIds = new List(); + + foreach (var s in args) { + if (s == "+" || s == string.Empty) allWarningsAsErrors = true; + else if (s == "-") allWarningsAsErrors = false; + else { + warningIds.Add(s); + } + } + + warningIds.AddRange(argsPlus); + + returnValue += $@" {allWarningsAsErrors}"; + if (warningIds.Any()) { + returnValue += $"{Environment.NewLine} {string.Join(";", warningIds)}"; + } + + if (argsMinus.Any()) + returnValue += $"{Environment.NewLine} {string.Join(";", argsMinus)}"; + + return $"{Environment.NewLine}{returnValue}"; + } + + private static string GenerateWarningLevel(IEnumerable warningLevel) { + var level = warningLevel.FirstOrDefault(); + if (!string.IsNullOrWhiteSpace(level)) + return level; + + return 4.ToString(); + } + + private static string GetSolutionText() { + return string.Join(Environment.NewLine, + @"", + @"Microsoft Visual Studio Solution File, Format Version {0}", + @"# Visual Studio {1}", + @"{2}", + @"Global", + @" GlobalSection(SolutionConfigurationPlatforms) = preSolution", + @" Debug|Any CPU = Debug|Any CPU", + @" EndGlobalSection", + @" GlobalSection(ProjectConfigurationPlatforms) = postSolution", + @"{3}", + @" EndGlobalSection", + @" GlobalSection(SolutionProperties) = preSolution", + @" HideSolutionNode = FALSE", + @" EndGlobalSection", + @"EndGlobal", + @"").Replace(" ", "\t"); + } + + private static string GetProjectFooterTemplate() { + return string.Join(Environment.NewLine, + @" ", + @" ", + @" ", + @"", + @""); + } + + private static string GetProjectHeaderTemplate() { + var header = new[] { + @"", + @"", + @" ", + @" {11}", + @" <_TargetFrameworkDirectories>non_empty_path_generated_by_unity.rider.package", + @" <_FullFrameworkReferenceAssemblyPaths>non_empty_path_generated_by_unity.rider.package", + @" true{17}", + @" ", + @" ", + @" Debug", + @" AnyCPU", + @" {1}", + @" 2.0", + @" {9}", + @" {{{2}}}", + @" {{E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1}};{{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}}", + @" Library", + @" Properties", + @" {7}", + @" v4.7.1", + @" 512", + @" {12}", + @" ", + @" ", + @" true", + @" full", + @" false", + @" {8}", + @" {5}", + @" prompt", + @" {18}", + @" {14}", + @" {13}{19}{20}{21}", + @" " + }; + + var forceExplicitReferences = new[] { + @" ", + @" true", + @" true", + @" false", + @" false", + @" false", + @" " + }; + + var footer = new[] { + @"{15}{16} ", + @"" + }; + + var pieces = header.Concat(forceExplicitReferences).Concat(footer).ToArray(); + return string.Join(Environment.NewLine, pieces); + } + + private void SyncSolution(ProjectPart[] islands) { + SyncSolutionFileIfNotChanged(SolutionFile(), SolutionText(islands)); + } + + private string SolutionText(ProjectPart[] islands) { + var fileversion = "11.00"; + var vsversion = "2010"; + + var projectEntries = GetProjectEntries(islands); + var projectConfigurations = string.Join(Environment.NewLine, + islands.Select(i => GetProjectActiveConfigurations(ProjectGuid(GetProjectName(i.Name, i.Defines)))).ToArray()); + return string.Format(GetSolutionText(), fileversion, vsversion, projectEntries, projectConfigurations); + } + + private static ILookup GetOtherArgumentsFromResponseFilesData(List responseFilesData) { + var paths = responseFilesData.SelectMany(x => { + return x.OtherArguments + .Where(a => a.StartsWith("/", StringComparison.Ordinal) || a.StartsWith("-", StringComparison.Ordinal)) + .Select(b => { + var index = b.IndexOf(":", StringComparison.Ordinal); + if (index > 0 && b.Length > index) { + var key = b.Substring(1, index - 1); + return new KeyValuePair(key, b.Substring(index + 1)); + } + + const string warnaserror = "warnaserror"; + if (b.Substring(1).StartsWith(warnaserror, StringComparison.Ordinal)) { + return new KeyValuePair(warnaserror, b.Substring(warnaserror.Length + 1)); + } + + const string nullable = "nullable"; + if (b.Substring(1).StartsWith(nullable)) { + var res = b.Substring(nullable.Length + 1); + if (string.IsNullOrWhiteSpace(res) || res.Equals("+")) + res = "enable"; + else if (res.Equals("-")) + res = "disable"; + return new KeyValuePair(nullable, res); + } + + return default(KeyValuePair); + }); + }) + .Distinct() + .ToLookup(o => o.Key, pair => pair.Value); + return paths; + } + + private string GenerateLangVersion(IEnumerable langVersionList, ProjectPart assembly) { + var langVersion = langVersionList.FirstOrDefault(); + if (!string.IsNullOrWhiteSpace(langVersion)) + return langVersion; +#if UNITY_2020_2_OR_NEWER + return assembly.CompilerOptions.LanguageVersion; +#else + return k_TargetLanguageVersion; +#endif + } + + private static string GenerateAnalyserAdditionalFiles(string[] paths) { + if (!paths.Any()) + return string.Empty; + + var analyserBuilder = new StringBuilder(); + analyserBuilder.AppendLine(" "); + foreach (var path in paths) { + analyserBuilder.AppendLine($" "); + } + + analyserBuilder.AppendLine(" "); + return analyserBuilder.ToString(); + } + + public string GenerateNoWarn(List codes) { + if (m_SuppressCommonWarnings) + codes.AddRange(new[] { "0169", "0649" }); + + if (!codes.Any()) + return string.Empty; + + return string.Join(",", codes.Distinct()); + } + + private string GetProjectEntries(ProjectPart[] islands) { + var projectEntries = islands.Select(i => string.Format( + m_SolutionProjectEntryTemplate, + SolutionGuidGenerator.GuidForSolution(), + i.Name, + Path.GetFileName(ProjectFile(i)), + ProjectGuid(GetProjectName(i.Name, i.Defines)) + )); + + return string.Join(Environment.NewLine, projectEntries.ToArray()); + } + + /// + /// Generate the active configuration string for a given project guid + /// + private string GetProjectActiveConfigurations(string projectGuid) { + return string.Format( + m_SolutionProjectConfigurationTemplate, + projectGuid); + } + + private static string ProjectFooter() { + return GetProjectFooterTemplate(); + } + + + private string ProjectGuid(string name) { + return m_GUIDGenerator.ProjectGuid(m_ProjectName + name); + } + + public ProjectGenerationFlag ProjectGenerationFlag => ProjectGenerationFlag.Local | ProjectGenerationFlag.Embedded; + + public string GetAssemblyNameFromScriptPath(string path) { + return CompilationPipeline.GetAssemblyNameFromScriptPath(path); + } + + public IEnumerable GetAssemblies(Func shouldFileBePartOfSolution) { + return m_AllEditorAssemblies.Where(a => a.sourceFiles.Any(shouldFileBePartOfSolution)); + } + + private Task BuildEditorAssemblies() { + var assemblies = CompilationPipeline.GetAssemblies(AssembliesType.Editor); + return Task.Run(() => { + var result = new Assembly[assemblies.Length]; + for (var i = 0; i < assemblies.Length; i++) { + var assembly = assemblies[i]; + var outputPath = $@"Temp\Bin\Debug\{assembly.name}\"; + result[i] = new Assembly(assembly.name, outputPath, assembly.sourceFiles, + assembly.defines, + assembly.assemblyReferences, assembly.compiledAssemblyReferences, + assembly.flags, assembly.compilerOptions +#if UNITY_2020_2_OR_NEWER + , assembly.rootNamespace +#endif + ); + } + + m_AllEditorAssemblies = result; + }); + } + + public string GetProjectName(string name, string[] defines) { + if (!ProjectGenerationFlag.HasFlag(ProjectGenerationFlag.PlayerAssemblies)) + return name; + return !defines.Contains("UNITY_EDITOR") ? name + ".Player" : name; + } + + private static string ResolvePotentialParentPackageAssetPath(string assetPath) { + const string packagesPrefix = "packages/"; + if (!assetPath.StartsWith(packagesPrefix, StringComparison.OrdinalIgnoreCase)) { + return null; + } + + var followupSeparator = assetPath.IndexOf('/', packagesPrefix.Length); + if (followupSeparator == -1) { + return assetPath.ToLowerInvariant(); + } + + return assetPath.Substring(0, followupSeparator).ToLowerInvariant(); + } + + public UnityEditor.PackageManager.PackageInfo FindForAssetPath(string assetPath) { + var parentPackageAssetPath = ResolvePotentialParentPackageAssetPath(assetPath); + if (parentPackageAssetPath == null) { + return null; + } + + PackageInfo cachedPackageInfo; + if (m_PackageInfoCache.TryGetValue(parentPackageAssetPath, out cachedPackageInfo)) { + return cachedPackageInfo; + } + + return null; + } + + async Task BuildPackageInfoCache() { +#if UNITY_2019_4_OR_NEWER + m_PackageInfoCache.Clear(); + var parentAssetPaths = new HashSet(); + await Task.Run(() => { + for (var i = 0; i < m_AllAssetPaths.Length; i++) { + if (string.IsNullOrWhiteSpace(m_AllAssetPaths[i])) { + continue; + } + + var parentPackageAssetPath = ResolvePotentialParentPackageAssetPath(m_AllAssetPaths[i]); + if (parentPackageAssetPath == null) { + continue; + } + + parentAssetPaths.Add(parentPackageAssetPath); + } + }); + foreach (var parentAssetPath in parentAssetPaths) { + var result = UnityEditor.PackageManager.PackageInfo.FindForAssetPath(parentAssetPath); + m_PackageInfoCache.Add(parentAssetPath, result); + } +#else + //keep compiler happy + await Task.CompletedTask; +#endif + } + + async Task BuildPostProcessors() { +#if UNITY_2019_1_OR_NEWER + var types = TypeCache.GetTypesDerivedFrom(); + m_PostProcessors = await Task.Run(() => { + var postProcessors = new List(types.Count); + foreach (var type in types) { + try { + var instance = (IHotReloadProjectGenerationPostProcessor)Activator.CreateInstance(type); + postProcessors.Add(instance); + } catch (MissingMethodException) { + Log.Warning("The type '{0}' was expected to have a public default constructor but it didn't", type.FullName); + } catch (TargetInvocationException ex) { + Log.Warning("Exception occurred when invoking default constructor of '{0}':\n{1}", type.FullName, ex.InnerException); + } catch (Exception ex) { + Log.Warning("Unknown exception encountered when trying to create post processor '{0}':\n{1}", type.FullName, ex); + } + } + + postProcessors.Sort((x, y) => x.CallbackOrder.CompareTo(y.CallbackOrder)); + return postProcessors.ToArray(); + }); + foreach (var postProcessor in m_PostProcessors) { + postProcessor.InitializeOnMainThread(); + } +#else + m_PostProcessors = new IHotReloadProjectGenerationPostProcessor[0]; + //keep compiler happy + await Task.CompletedTask; +#endif + } + + public bool IsInternalizedPackagePath(string path) { + if (string.IsNullOrWhiteSpace(path)) { + return false; + } + + var packageInfo = FindForAssetPath(path); + if (packageInfo == null) { + return false; + } + + var packageSource = packageInfo.source; + switch (packageSource) { + case PackageSource.Embedded: + case PackageSource.Local: + return false; + default: + return true; + } + } + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGeneration.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGeneration.cs.meta new file mode 100644 index 0000000..da50753 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGeneration.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c7b221ce3667aeb4ea915b8e2eca7213 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGenerationFlag.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGenerationFlag.cs new file mode 100644 index 0000000..ac6781f --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGenerationFlag.cs @@ -0,0 +1,18 @@ +using System; + +namespace SingularityGroup.HotReload.Editor.ProjectGeneration +{ + [Flags] + enum ProjectGenerationFlag + { + None = 0, + Embedded = 1, + Local = 2, + Registry = 4, + Git = 8, + BuiltIn = 16, + Unknown = 32, + PlayerAssemblies = 64, + LocalTarBall = 128, + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGenerationFlag.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGenerationFlag.cs.meta new file mode 100644 index 0000000..6e29b9c --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectGenerationFlag.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ea506e49c851dbd4fa394c3ed513970c +timeCreated: 1580820569 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectPart.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectPart.cs new file mode 100644 index 0000000..4f2fa3a --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectPart.cs @@ -0,0 +1,85 @@ +using System.Collections.Generic; +using System.Linq; +using UnityEditor.Compilation; +using UnityEngine; + +namespace SingularityGroup.HotReload.Editor.ProjectGeneration +{ + internal class ProjectPart + { + public string Name { get; } + public string OutputPath { get; } + public Assembly Assembly { get; } + public string AssetsProjectPart { get; } + public string[] SourceFiles { get; } + public string RootNamespace { get; } + public Assembly[] AssemblyReferences { get; } + public string[] CompiledAssemblyReferences { get; } + public string[] Defines { get; } + public ScriptCompilerOptions CompilerOptions { get; } + + public ProjectPart(string name, Assembly assembly, string assetsProjectPart, string fallbackRootNamespace, HashSet additionalSourceFiles) + { + Name = name; + Assembly = assembly; + AssetsProjectPart = assetsProjectPart; + OutputPath = assembly != null ? assembly.outputPath : "Temp/Bin/Debug"; + SourceFiles = assembly != null ? assembly.sourceFiles.Union(additionalSourceFiles).ToArray() : new string[0]; +#if UNITY_2020_2_OR_NEWER + RootNamespace = assembly != null ? assembly.rootNamespace : string.Empty; +#else + RootNamespace = fallbackRootNamespace; +#endif + AssemblyReferences = assembly != null ? assembly.assemblyReferences : new Assembly[0]; + CompiledAssemblyReferences = assembly!=null? assembly.compiledAssemblyReferences:new string[0]; + Defines = assembly != null ? assembly.defines : new string[0]; + CompilerOptions = assembly != null ? assembly.compilerOptions : new ScriptCompilerOptions(); + } + + public IEnumerable ParseResponseFileData(string projectDirectory) + { +#if UNITY_2019_1_OR_NEWER + if (Assembly == null) + return new ResponseFileData[0]; + + var systemReferenceDirectories = + CompilationPipeline.GetSystemAssemblyDirectories(Assembly.compilerOptions.ApiCompatibilityLevel); + + var responseFilesData = Assembly.compilerOptions.ResponseFiles.ToDictionary( + x => x, x => CompilationPipeline.ParseResponseFile( + x, + projectDirectory, + systemReferenceDirectories + )); + + var responseFilesWithErrors = responseFilesData.Where(x => x.Value.Errors.Any()) + .ToDictionary(x => x.Key, x => x.Value); + + if (responseFilesWithErrors.Any()) + { + foreach (var error in responseFilesWithErrors) + foreach (var valueError in error.Value.Errors) + { + Log.Error("{0} Parse Error : {1}", error.Key, valueError); + } + } + + return responseFilesData.Select(x => x.Value); +#else + return new ResponseFileData[0]; +#endif + } + } + +} +#if !UNITY_2019_1_OR_NEWER +namespace UnityEditor.Compilation { + internal class ResponseFileData { + public string[] Defines; + public string[] FullPathReferences; + public string[] Errors; + public string[] OtherArguments; + public bool Unsafe; + } +} +#endif diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectPart.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectPart.cs.meta new file mode 100644 index 0000000..b8d863e --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/ProjectPart.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3067d709488a2374aba4a7b421588fe9 +timeCreated: 1604050230 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/SolutionGuidGenerator.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/SolutionGuidGenerator.cs new file mode 100644 index 0000000..1417531 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/SolutionGuidGenerator.cs @@ -0,0 +1,29 @@ +using System; +using System.Security.Cryptography; +using System.Text; + +namespace SingularityGroup.HotReload.Editor.ProjectGeneration +{ + internal static class SolutionGuidGenerator + { + public static string GuidForProject(string projectName) + { + return ComputeGuidHashFor(projectName + "salt"); + } + + public static string GuidForSolution() + { + // GUID for a C# class library: http://www.codeproject.com/Reference/720512/List-of-Visual-Studio-Project-Type-GUIDs + return "FAE04EC0-301F-11D3-BF4B-00C04F79EFBC"; + } + + static string ComputeGuidHashFor(string input) + { + using (var md5 = MD5.Create()) + { + var hash = md5.ComputeHash(Encoding.Default.GetBytes(input)); + return new Guid(hash).ToString(); + } + } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/SolutionGuidGenerator.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/SolutionGuidGenerator.cs.meta new file mode 100644 index 0000000..e8a8fa1 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/SolutionGuidGenerator.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6cced23b33c3f7541bb84997246eb6ca +timeCreated: 1580717740 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/Util.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/Util.meta new file mode 100644 index 0000000..f4d773e --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/Util.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 15ba2343e4c758e45a3901e7f4ad146f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/Util/FileSystemUtil.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/Util/FileSystemUtil.cs new file mode 100644 index 0000000..c58df02 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/Util/FileSystemUtil.cs @@ -0,0 +1,37 @@ +namespace SingularityGroup.HotReload.Editor.Util +{ + internal static class FileSystemUtil + { + + public static string FileNameWithoutExtension(string path) + { + if (string.IsNullOrEmpty(path)) + { + return ""; + } + + var indexOfDot = -1; + var indexOfSlash = 0; + for (var i = path.Length - 1; i >= 0; i--) + { + if (indexOfDot == -1 && path[i] == '.') + { + indexOfDot = i; + } + + if (path[i] == '/' || path[i] == '\\') + { + indexOfSlash = i + 1; + break; + } + } + + if (indexOfDot == -1) + { + indexOfDot = path.Length; + } + + return path.Substring(indexOfSlash, indexOfDot - indexOfSlash); + } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/Util/FileSystemUtil.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/Util/FileSystemUtil.cs.meta new file mode 100644 index 0000000..3d65835 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/Util/FileSystemUtil.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 20b02f00e1547df45ab6ce84acc5dd0c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/Util/StringUtils.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/Util/StringUtils.cs new file mode 100644 index 0000000..486a32a --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/Util/StringUtils.cs @@ -0,0 +1,14 @@ +using System.IO; + +namespace SingularityGroup.HotReload.Editor.Util +{ + internal static class StringUtils + { + public static string NormalizePath(this string path) + { + return path.Replace(Path.DirectorySeparatorChar == '\\' + ? '/' + : '\\', Path.DirectorySeparatorChar); + } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/Util/StringUtils.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/Util/StringUtils.cs.meta new file mode 100644 index 0000000..c1b137e --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ProjectGeneration/Util/StringUtils.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5418a9e29385f45488b32d5459ec2c7a +timeCreated: 1623056718 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/RequiredSettings.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/RequiredSettings.meta new file mode 100644 index 0000000..2fd152d --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/RequiredSettings.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bc190bdaae2340c6a6d8cb811dfefe03 +timeCreated: 1674242068 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/RequiredSettings/RequiredSettingChecker.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/RequiredSettings/RequiredSettingChecker.cs new file mode 100644 index 0000000..6177dcf --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/RequiredSettings/RequiredSettingChecker.cs @@ -0,0 +1,270 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using SingularityGroup.HotReload.HarmonyLib; +using UnityEditor; +using UnityEditor.Compilation; +using UnityEngine; + +namespace SingularityGroup.HotReload.Editor { + using IndicationStatus = EditorIndicationState.IndicationStatus; + + // Before Unity 2021.3, value is 0 or 1. Only value of 1 is a problem. + // From Unity 2021.3 onwards, the key is "kAutoRefreshMode". + // kAutoRefreshMode options are: + // 0: disabled + // 1: enabled + // 2: enabled outside playmode + // + // On newer Unity versions, Visual Studio is also checking the kAutoRefresh setting (but it should only check kAutoRefreshMode). + // This is making hot reload unusable and so this setting needs to also get disabled. + internal static class AutoRefreshSettingChecker { + const string autoRefreshKey = "kAutoRefresh"; + #if UNITY_2021_3_OR_NEWER + const string autoRefreshModeKey = "kAutoRefreshMode"; + #endif + + const int desiredValue = 0; + + public static void Apply() { + if (HotReloadPrefs.AppliedAutoRefresh) { + return; + } + + var defaultPref = EditorPrefs.GetInt(autoRefreshKey); + HotReloadPrefs.DefaultAutoRefresh = defaultPref; + EditorPrefs.SetInt(autoRefreshKey, desiredValue); + + #if UNITY_2021_3_OR_NEWER + var defaultModePref = EditorPrefs.GetInt(autoRefreshModeKey); + HotReloadPrefs.DefaultAutoRefreshMode = defaultModePref; + EditorPrefs.SetInt(autoRefreshModeKey, desiredValue); + #endif + + HotReloadPrefs.AppliedAutoRefresh = true; + } + + public static void Check() { + if (!HotReloadPrefs.AppliedAutoRefresh) { + return; + } + + if (EditorPrefs.GetInt(autoRefreshKey) != desiredValue) { + HotReloadPrefs.DefaultAutoRefresh = -1; + } + + #if UNITY_2021_3_OR_NEWER + if (EditorPrefs.GetInt(autoRefreshModeKey) != desiredValue) { + HotReloadPrefs.DefaultAutoRefreshMode = -1; + } + #endif + } + + public static void Reset() { + if (!HotReloadPrefs.AppliedAutoRefresh) { + return; + } + + if (EditorPrefs.GetInt(autoRefreshKey) == desiredValue + && HotReloadPrefs.DefaultAutoRefresh != -1 + ) { + EditorPrefs.SetInt(autoRefreshKey, HotReloadPrefs.DefaultAutoRefresh); + } + HotReloadPrefs.DefaultAutoRefresh = -1; + + #if UNITY_2021_3_OR_NEWER + if (EditorPrefs.GetInt(autoRefreshModeKey) == desiredValue + && HotReloadPrefs.DefaultAutoRefreshMode != -1 + ) { + EditorPrefs.SetInt(autoRefreshModeKey, HotReloadPrefs.DefaultAutoRefreshMode); + } + HotReloadPrefs.DefaultAutoRefreshMode = -1; + #endif + + HotReloadPrefs.AppliedAutoRefresh = false; + } + } + + internal static class ScriptCompilationSettingChecker { + const string scriptCompilationKey = "ScriptCompilationDuringPlay"; + + const int recompileAndContinuePlaying = 0; + static int? recompileAfterFinishedPlaying = (int?)typeof(EditorWindow).Assembly.GetType("UnityEditor.ScriptChangesDuringPlayOptions")? + .GetField("RecompileAfterFinishedPlaying", BindingFlags.Static | BindingFlags.Public)? + .GetValue(null); + + public static void Apply() { + if (HotReloadPrefs.AppliedScriptCompilation) { + return; + } + + var defaultPref = EditorPrefs.GetInt(scriptCompilationKey); + HotReloadPrefs.DefaultScriptCompilation = defaultPref; + EditorPrefs.SetInt(scriptCompilationKey, GetRecommendedAutoScriptCompilationKey()); + + HotReloadPrefs.AppliedScriptCompilation = true; + } + + public static void Check() { + if (!HotReloadPrefs.AppliedScriptCompilation) { + return; + } + if (EditorPrefs.GetInt(scriptCompilationKey) != GetRecommendedAutoScriptCompilationKey()) { + HotReloadPrefs.DefaultScriptCompilation = -1; + } + } + + public static void Reset() { + if (!HotReloadPrefs.AppliedScriptCompilation) { + return; + } + if (EditorPrefs.GetInt(scriptCompilationKey) == GetRecommendedAutoScriptCompilationKey() + && HotReloadPrefs.DefaultScriptCompilation != -1 + ) { + EditorPrefs.SetInt(scriptCompilationKey, HotReloadPrefs.DefaultScriptCompilation); + } + HotReloadPrefs.DefaultScriptCompilation = -1; + + HotReloadPrefs.AppliedScriptCompilation = false; + } + + static int GetRecommendedAutoScriptCompilationKey() { + // In some projects due to an unknown reason both "RecompileAndContinuePlaying" and "StopPlayingAndRecompile" cause issues + // We were unable to identify the cause and therefore we always try to default to "RecompileAfterFinishedPlaying" + // The exact issue users are experiencing is that domain reload happens shortly after entering play mode causing nullrefs + return recompileAfterFinishedPlaying ?? recompileAndContinuePlaying; + } + } + + internal static class PlaymodeTintSettingChecker { + private static readonly Color unsupportedPlaymodeColor = new Color(1f, 0.8f, 0f, 1f); + private static readonly Color compilePlaymodeErrorColor = new Color(1f, 0.7f, 0.7f, 1f); + + public static void Apply() { + if (HotReloadPrefs.AppliedEditorTint != null || !UnitySettingsHelper.I.playmodeTintSupported) { + return; + } + var defaultPref = HotReloadPrefs.DefaultEditorTint ?? UnitySettingsHelper.I.GetCurrentPlaymodeColor(); + if (defaultPref == null) { + return; + } + HotReloadPrefs.DefaultEditorTint = defaultPref.Value; + var currentPlaymodeTint = GetModifiedPlaymodeTint() ?? defaultPref.Value; + SetPlaymodeTint(currentPlaymodeTint); + } + + public static void Check() { + if (HotReloadPrefs.AppliedEditorTint == null || !UnitySettingsHelper.I.playmodeTintSupported) { + return; + } + // if user modifies the settings manually, prevent the setting to be changed + if (HotReloadPrefs.DefaultEditorTint == null || UnitySettingsHelper.I.GetCurrentPlaymodeColor() != HotReloadPrefs.AppliedEditorTint) { + HotReloadPrefs.DefaultEditorTint = null; + return; + } + var color = GetModifiedPlaymodeTint(); + if (color != null && color != HotReloadPrefs.AppliedEditorTint) { + SetPlaymodeTint(color.Value); + } + } + + + public static void Reset() { + if (HotReloadPrefs.AppliedEditorTint == null || !UnitySettingsHelper.I.playmodeTintSupported) { + return; + } + var color = HotReloadPrefs.DefaultEditorTint; + if (color != null && UnitySettingsHelper.I.GetCurrentPlaymodeColor() == HotReloadPrefs.AppliedEditorTint) { + SetPlaymodeTint(color.Value); + } + + HotReloadPrefs.DefaultEditorTint = null; + HotReloadPrefs.AppliedEditorTint = null; + } + + + private static void SetPlaymodeTint(Color color) { + UnitySettingsHelper.I.SetPlaymodeTint(color); + HotReloadPrefs.AppliedEditorTint = color; + } + + private static Color? GetModifiedPlaymodeTint() { + switch (EditorIndicationState.CurrentIndicationStatus) { + case IndicationStatus.CompileErrors: + return compilePlaymodeErrorColor; + case IndicationStatus.Unsupported: + return unsupportedPlaymodeColor; + default: + return HotReloadPrefs.DefaultEditorTint; + } + } + } + + internal static class CompileMethodDetourer { + static bool detouredMethod; + static List reverters = new List(); + + public static void Apply() { + if (detouredMethod) { + return; + } + detouredMethod = true; + + var originAssetRefresh = typeof(AssetDatabase).GetMethod(nameof(AssetDatabase.Refresh), Type.EmptyTypes); + var targetAssetRefresh = typeof(CompileMethodDetourer).GetMethod(nameof(DetouredAssetRefresh)); + + DetourMethod(originAssetRefresh, targetAssetRefresh); + + var originAssetRefreshWithParams = typeof(AssetDatabase).GetMethod(nameof(AssetDatabase.Refresh), new[] { typeof(ImportAssetOptions) }); + var targetAssetRefreshWithParams = typeof(CompileMethodDetourer).GetMethod(nameof(DetouredAssetRefresh)); + + DetourMethod(originAssetRefreshWithParams, targetAssetRefreshWithParams); + + var originCompilation = typeof(CompilationPipeline).GetMethod(nameof(CompilationPipeline.RequestScriptCompilation), Type.EmptyTypes); + var targetCompilation = typeof(CompileMethodDetourer).GetMethod(nameof(RequestScriptCompilation)); + + DetourMethod(originCompilation, targetCompilation); + } + + static void DetourMethod(MethodBase original, MethodBase replacement) { + DetourResult result; + DetourApi.DetourMethod(original, replacement, out result); + + if (!result.success) { + Debug.LogWarning($"Detouring {original.Name} method failed. {result.exception?.GetType()} {result.exception}"); + } else { + reverters.Add(result.patchRecord); + } + } + + public static void Reset() { + if (!detouredMethod) { + return; + } + + detouredMethod = false; + + // don't revert for now + // foreach (var reverter in reverters) { + // try { + // reverter.Dispose(); + // } catch (Exception exc) { + // Debug.LogWarning($"Reverting method detour failed. {exc.GetType()} {exc}"); + // } + // } + + reverters.Clear(); + + // hack to undo changes to Editor assemblies. + // Doing this when starting hotreload cancels the start + // Exit playmode right away to prevent delayed compiling + EditorApplication.isPlaying = false; + + EditorApplication.ExecuteMenuItem("Assets/Refresh"); + EditorUtility.RequestScriptReload(); //this will undo the modifications to the assemblies + } + + public static void DetouredAssetRefresh(ImportAssetOptions options) { } + public static void RequestScriptCompilation() { } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/RequiredSettings/RequiredSettingChecker.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/RequiredSettings/RequiredSettingChecker.cs.meta new file mode 100644 index 0000000..5190e38 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/RequiredSettings/RequiredSettingChecker.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 63765d77daad497ba3966a622a486391 +timeCreated: 1674243489 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources.meta new file mode 100644 index 0000000..f14fddd --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 030ba7c6c9994974b321f9c38df270ad +timeCreated: 1673704008 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Icn_Stop.png b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Icn_Stop.png new file mode 100644 index 0000000000000000000000000000000000000000..a27133ced07c649372d94826f46be15ed8562f88 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=-3?y@QpIZW?7>k44ofvPP)Tsw@I14-?iy0XB zj({-ZRBb+KpdfRAPl#)9aPX><#jk)|Zci7-kcv6U2?{{7R2UeyrQK%%3Nv`R`njxg HN@xNAa%dWD literal 0 HcmV?d00001 diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Icn_Stop.png.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Icn_Stop.png.meta new file mode 100644 index 0000000..72fb6d0 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Icn_Stop.png.meta @@ -0,0 +1,116 @@ +fileFormatVersion: 2 +guid: bef6749cf91a43b4e8368429a0487ac9 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Icn_play.png b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Icn_play.png new file mode 100644 index 0000000000000000000000000000000000000000..429e1be8bce15d0fba8a5e746d8932ccf801aba2 GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CH!3-pIl6mg|DaPU;cPGZ1Cw1z99L@rd$YKTt zZeb8+WSBKa0x0Md;1l9%4F*6Sgh2+$adpc!pnkEEAivG#E)SH1sax9WX5oX0&mKK{*jhYe=FcCj z0y1f7j*5vusYn+QYj#h`NsK4llq0*|$fUG0F$i2{X01_Y6$cu};OXk;vd$@?2>`#{ BOG*F$ literal 0 HcmV?d00001 diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Icn_play.png.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Icn_play.png.meta new file mode 100644 index 0000000..643c935 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Icn_play.png.meta @@ -0,0 +1,116 @@ +fileFormatVersion: 2 +guid: 052ef782f5237784eab3e4952a88afde +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Logo_HotReload_DarkMode.png b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Logo_HotReload_DarkMode.png new file mode 100644 index 0000000000000000000000000000000000000000..5f144aa01a4b74dd8d2b88f93a6a69866984e1ff GIT binary patch literal 3927 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 literal 0 HcmV?d00001 diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Logo_HotReload_DarkMode.png.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Logo_HotReload_DarkMode.png.meta new file mode 100644 index 0000000..5b27f0f --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Logo_HotReload_DarkMode.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: 0c501457e83420242a3ac14642818be3 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Logo_HotReload_LightMode.png b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Logo_HotReload_LightMode.png new file mode 100644 index 0000000000000000000000000000000000000000..bfaeb4a8ee1e467eb1c2a10b421fe7e34c97b648 GIT binary patch literal 3879 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 literal 0 HcmV?d00001 diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Logo_HotReload_LightMode.png.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Logo_HotReload_LightMode.png.meta new file mode 100644 index 0000000..4dd19e0 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/Logo_HotReload_LightMode.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: 4a83d4a4d357e18408c025ef0737ab39 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/alert_info.png b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/alert_info.png new file mode 100644 index 0000000000000000000000000000000000000000..f17c65b1cc99a9417302748fc473472d6c506b97 GIT binary patch literal 862 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 literal 0 HcmV?d00001 diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/applied_patch.png.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/applied_patch.png.meta new file mode 100644 index 0000000..9976cd8 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/applied_patch.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 3e8fc7297345815e0a9416a6b0d4cd68 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/blue.png b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/blue.png new file mode 100644 index 0000000000000000000000000000000000000000..a16c26e1872319cf43d75a5865b9587523ba10a5 GIT binary patch literal 6101 zcmeHKc{r5a`=7CAmx@HjAnTaTHj}Xvc}E&VQq1xUW0@HW_u%w zWNA|&g_4w{l&!qc8})rg`}O<&({=s6|21Ev;4hcYpMgNc_VPWvc_eZqjLl)u86g0Sx19~ZfG7qX0*QKf-)qZ} z=epAKqsyX2H06_qle}67{ZpFsDuU~`-P>C27rbtzB+6;Mo_53Z-6!`J;*;yNlyENk zdTMo)eeuiGaPLcAze=ggdtJzt{5;wII5ZZutTSQ3tNY?7mDyUEh@zL%nFot=75~{) z*vj3#z3-(3F3bMGwguo+{u{OGso#t)343jO_*5SwV!9S zM9$H*_WelRyLprXbF{NJttf|3uRh6$&Rx6u466y(&{2Y|>CEyUC z$QG7p4qxkopKlmi5fvV1FjJ(qJn~(e;!w8bzZ3U2SZ#W=BQEK1LeT-)jYSn=+BE&1 zJy~*HOe;O%menFj7eu3_d1-CuskgcY@I*Fe)_eWxUF5(V)TdFOpw_ltb4th|M=a~~^N&pp$qHvBL7UAjre~BQ4w)7v4D7yodn77x z)q)=9&WVrm7Xt>i6+A%5{2kwS$QC=MAipz9y-+LY#>A=c$u*XtpINJJ|J!XC&VJCP z5`%LTtuD^p65+{b{bxO>QUEiXp!^MTqQ-DidiXK{EBgP-`d-% zAx~FuoTbFKBx@j7jJSm(&h7zs&hWwBys6{)cbUh1BGF@JLlIoAl;6vQ9>q*O&vsW}E2x3qn5^^GUJw@Ge^@JRc#CIk#yO?j`^L(BOBH4*kZ)nhL+kbD*mABptzmgV^r;l ziG#)JwRi9p`R@ycNEJ-Se~1?ix%|CCBlrtpi5{r)u3H)A7J+hu})iDhIpx zT=yNb|K56V`M9oxf9rm~uKjZEYR==Aj%SjNe@M=(S7P$HpYZ#E;-GU@2nij%^=Pex z+w)0I+g_}@Msy61Zx!)V{ImwOySKhtF}$tRI#H}}u(?su%|WQ};?mR+omONylbSb^ zzJ0(&D;{N_*B@jyhKh$_Fc?W ztQ$ADGncVq#FiD3^t@8L;d(@KMI9S|3$sf*u;uABTC~jLnTRIO`C9%eB~7i)O4@6l zz2>SSb>*UNmjaGHLW%c}*3~syl05+0(7qm|HcC z>~-0?qyH18B|>NR2(~>3nZsQBasM%u3)hOou>5to&pU=+8y#rhxnrg(G{E_xecFt+ zh5z-!)3$au=uZ-vSJ)>~2b8S1=faLuCXJ|XniO3@utaBZ6R^X;2( z`&cdp3HDCCy^5AOo_e_ne@A(?l$$xetABJZE_Lh3bpGYJ&waW>$II$=L+kU^TVE#^ z-G@M+@eDgVH)lJ$Z|@`UEtIqKFu|$CTD8q@ONpnC$T+MpwE(|aetFnY{T0o&41=06 zf6glq(Hcma+Q(P%vtD3K<&6IHK{Wj+=hxPM*q(Ft?<}je8lkeXF_m!Oe8Z)+o&ArR0(=%0AfyYN>^;Mk^WeronE`GPyorC|sjN^V zGL1z6jG{u>;06K$v9O9_lc~V~4@Ln37)%0uvY`nMW6%h2FB2k)$hHFl8BTl-;LdmT zpz?#MI2zo_Qqm#{4-$j|JTfdQG=#~;M-kwQym;_l(2Rt`79qS~0^FPE2D4*v0GP3n zu@MU45XFeVz%33 z5eV*fCXXD2U~)AD6kj;(0WOupVDlI(CQQIdrm(_!1UMY*hkc7Lluaalr)P4%ssQSN zj3Tp1()X#0g`+T=)YQUJ-~eyk_2#B;T$U95CJfGnm<#}sNe0`;hd1g zbZAs05CVjPP%h{d{foAsQ%u2-(B=rT35td=#hB2{sb6&Bi0y)!|629#K-ib3FOwjIvDgKJ zEfy}GO#R}7OO60&i;h6MFJ06?GBW@GXZY8W`qs|)FT+JcQR!HKf=1Bj6fDA+ZbC*- zOiWD>Xd0FZ;3($CCK&9m>|7R|7fI#-HUVI!U^ZY0EoKAL{VJy3ulUG7K%f)~gGHcl z2n@~xgTkY6c$66&`88RjU`~I_)&lu|^srb2{Im#wc3;}S#RXieklz=puX+h2{2zY4 zj>G@Z14#YH$#3cVN3K6|{gwj11^!cAf8_ct1%3%3TFs=dS>{}->7pH3?HGE?}$B?skDg9YlB6CczS*b#N2wkP_(!D zvM`+9cGT9AfSIV>d7`^~`7T4E^^^J0!BOPC;#{9o%@&dEQ%~E)8yx}LOYZNwCO#b= z*)dnQDf8B=yTIZ4iSfDmA{EkvT*8@F?SnaPO^$Z;2t#MBS6#jP@nOCV{mBadvREKWFP7`yYcN BpM3xT literal 0 HcmV?d00001 diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/blue.png.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/blue.png.meta new file mode 100644 index 0000000..6bae334 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/blue.png.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 8909f5f9b1bbe3a4e99335241d585b33 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/close.png b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/close.png new file mode 100644 index 0000000000000000000000000000000000000000..fc5f16ccc838f840806f37e2f2018dafbb0907e0 GIT binary patch literal 252 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 M7S9SCn7U}?UuBxaS^xk5 literal 0 HcmV?d00001 diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/events.png.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/events.png.meta new file mode 100644 index 0000000..f25ea85 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/events.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: b2c1a1b6177ddd425ba5b4879dd5903a +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/foldout_closed.png b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/foldout_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..ad482a11ed024745a288a56af2c9bcb16cdc44a0 GIT binary patch literal 4865 zcmeHKc~BEs8t;Tt5JVT1akFEa;3{g8?$AIIi3bTv!~g=0z@pIU?m#c(AO{JKiUS@v zcwm93$f9hGC`?Tl(egmWYY@w8ol$n2!Gi)kRvqzT)d6*1heNELsx7N_{-aYb?|bk4 z-tT?y_rCWfy)Gtdu9wF+4+w(1lo5(pP{T~|aRuMJ2UUkab%jb$YLv<;kUMAqB+D6M zF&I!-gKRd-3338`Yd{$VYzD)WaV!@{y&l+q?6XUNJ-H9V1~$rKLtdaR2So&IUr^V8 zLa*&zs{z=|xG0E=PnujeXNF|bI0B7#5+%tu6lQWTLQ7>tUfK|xYP0?@2o?>%Ce zw(l$Y9DClZEJiha> z?C~vD*zt?l*Hc~7>$O#*ve4qiqn&EqPj6Z>JT+NUicV50&772%Po8!O&hMA*>^8lq zmK3sPY!;s#e)Z3{;EJCPcwO%P4*#rVVVkLKSg|0Y=bWXnJ>;^>R+oxTg0EKRv?2Qv z(uv(062HGzuxA~wrYf$X=xM^8V~vSZ7bQNg=viG^-cWbZQpSr&9T`~!hs_>6u>|MM z`#S2&)xN(pO@Fm^@d<@sb@D{SIBgf(tL~xOyZqZXlU`RVg#o^9^(mZtgs=M}_J*?d zW#gwuwL3qV>9lC+g_LTi{X4(WND-+C*%`l!<_l``(kZN5T+7_`yx z3FZXVd?}&V3UE@drUW*vfjKZJbf(RK6B(2lR#R!TPR8v#dV&knq>Q^LNQI~jaw?sU zSZbu=mPW-BOEU-w$(=dFBh)4Z1X{|B!!~WE&Lp+TxDH+^u$gWl7j{6*88U7Hh$Fe) zNWqu@6CnI>8=WoU&hUUkjig2ztC-VA0a`L{y4h@y3WZjyRbUMi=#6PYR3ecG5s^?N z;sXTVl%q4_HonfpV<>t#6qJcD(griF*TD=YuGU-3GA2v5eXPDx143sdIGU+Wwf(p;3bY|XQ3X&L@Z?G6M9or!Z zA(csK0n`LmML$@Qxp4zC7zxs7t-&!1i2VW5Ol#hY^?`59h+{j09Rbq^ct1e*@7)0g zD3wa8&=VHMJ*7g%W!9IHdV(gU4im#f;t-Jr>=i>r0xD66I7lK!Lio4@C;6Bt1m%kfNf4jXkQ6FLF;py4JE%xPI!ABR;@~)G zEuKaR4Z1YP03*0`c8pTS6$yG*b@aq!;${t)Amh%bbr#!uXgsZ@;>t$c4gzWZ0(}@b~w8`p)9_ zTmpuN7WpWBhvXWP>!TF-DDY5p4axOU3ValJD7yY{a(TReouYK$Uyv2NEJdleG=di` zS9RoE1=I{Jf)@GL90G6D&@e+pq6vaL|G*R$R95Z>I^E1lRk+(d4`+`Mk6iZYA_!tv zC>68g({KH5eb6)M(!}R-x}O6>{UZ&_llNb-_~)b|J>~2 z?VVR#+#o`iurj(Y1`A#t3Y?<1*#~#)g@9rLZ z6gpC}o;T&vh`Mk6Po8EUJ~6^xo8R&5Og;zIPMXzBEUd^#owc!GGFz`dwLkF5>(}E) zuH;M}b863|pBDVJXvdD$n}6ESYKgp=w6?ln%e>YLp0*XluG;$6jOkIt#wRRf+d|E{`be^&al?jC2o?&KM{ zan{~nW1n)H3R+r>g1Gy+xxBT?!()PP-2U6E zH^)P_9c##IYBCCPmtoSaJElPkvmX4zT$hq!+*jCsAa@+mrTcDD?St(n7B{$PN)t8P dsjA86NAPy*j=%OIwu0b=l;Keddsu4Te*n^O&$0jj literal 0 HcmV?d00001 diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/foldout_closed.png.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/foldout_closed.png.meta new file mode 100644 index 0000000..b55e117 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/foldout_closed.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: ae8d6e8a046a7ba47937cf15819407e3 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/foldout_open.png b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/foldout_open.png new file mode 100644 index 0000000000000000000000000000000000000000..928bbfaa96eb5daa34d2610bd4bc69200b2cdf88 GIT binary patch literal 4861 zcmeHKdsGuw8lQkXL}(FFL0O0aE03LICYgjJ5-AW$q68?R0*b<9GJ%o2$O958t3^?K zph8_A92Tux#7B!&yNZSn~S#phB9tnAZ2cXFq z2Qg?J&>5p-7lte33g%XU?gwOAhwjrDZq9K%kf#sIn}HlYsN(`;l;HyTfUypAE|C4f zxDRw{^}t@oflN0~=SK!48hL0;k}J}fTsDfZc^I%qxI8h6h!Kp5a>abUn9Bp&jGZGM z(MXYbXbnJFNhKtt$rBQoMw3B9X-NpO)sN4dsO=Pi}1Aw_@GlrdOKEnf(mM9mo6MvS$9miTJqk;jQM7 z-g}aJHyQDteu3?eaxZAn?e;4|-(57>^?>I;HZJzg%h7B>XUXN3pxnpz`yR5-92W0* zYJRX+w2m>STKKv5<=1X9>;Lt!&-tfq`25XpIn0jn@3LjjI;`zo(dXT^y442?F7LHF zkb_wTL_<~f#V;!x*M#odtvtS|FY9(|dv;W2_D}WCD&DI*e&`EpZKy17;=E1F__)b4 zH{+pm_ou9_@V|R%cK_-{C#39(oSBH}k2_s_4t?+Od`0Ki3x3`!=S28>wB!c$5dNM& zxK!14Ee)BS(lzdWtZQcJ+1$OZhj+Yxb-{ve&u=^3*-Z;;4|(L=gA!6#Y0oruH%4^- z^!KNMWy&c5t#0Loiw)<>>gGVyok+WDP>>7Zc4l$!{d@I~ZvG;<{6nut9%MdNEQqH7jDU`6X zKprI+Oe7OyV{8OYv{A)e)*LTpj7hB#r%T@$gaA(xR)NK06mvKwB_-?<9@}8b=b$2y zh=XuBTrLbWV6$Cs!ELbK97;nBU`RVT>l?25jyC4J+DEochzDV@=21;~Cu(?V%R$a=vydc}F1(T)J~VcZwA zhtBR)23iV*SZW}ww0m-?ghlT!RvQRPEq01LLL?9hc?8T?qbeBV@iefAk4D3UiWFc3 ziQ*y@8wDlTn=QDWAZaK7&ZYnkiV8&phO1#5{@xKG0=3~EYa|6khlfiu4$V`)kqUf7qrx-<4s!`L z24f^I8Ww7BAuJSfLF9xy6xR&IZy4Qd&{#@v6B(Becm!O5^mP70F~gmKig?kNk^+*B z0w4@V5g5US2;&bD#u+>?hprhzCywF#ijx?p!l)tx>;~pQ@dCAwGh7S@IRpOwo^3D| zzvmWA=GZ1L#qSthV|2X~123gKmR)0Xy%Ym4r975h|2Mk4MqZ~#J@^+?0$!H-zN`oD zV350NUXm303d)2s!}c8oZ`9Cuqb%DDK@%p?odMO>1%OEpi(HZD(c?AFD?0FL>xvWz za;cR|<1z|v-raV3?t|C;E0k;4Qh&F}Z5595vwUm*_Nsq}a^=dHb^4q&#IBvf8GG(t zTdSNM1*f3T9gimJ(|$==IKJE}2>E)`+&ee+`YDv@pgsA-FPmcwI#m?3s4@54Iq5U@ z0(tz>WvMk`@*3fzvd+h4&z>*ilh>Q~1YWrq7c`Ca=+Tueg^|TwB_(Zlb&l^M`X0X3 z!pQmX!?u6pjtTO86{mI zA#HyRb##UHedFG+$=co$dfQ&#W0y&8*mPCREoYQJ9&YzMwzQO`*ZNMKQkkD0?>R#n z)T4o>*3F6Oe)Z6a)TQ?7>Gm7F{o91I&sOc3Z(n|AYxTqO@U^?bFJYH4#pR`McPSbh zS6}N))f%=cy*fVF9_Y9ha4=(6)z!`iVdV1NfvfNU_w-lzB7R~{Zcjsvgc}yndNj#9 z!EvwYgJj;cPZ96W5bx^ovNy3LtoJ&Tk6Y7**

6u%Rw1lj%E!zQ4`sm&nhg)jmUy!qBFaovO? zM}C}Uz7$)DMP5ImyFR6Su50I{Cr|npk`3t@-R52f=cq%;3*<=I5fqS?>(X9%iA3HRK}+PQem z{NAl;FD2iu``XC;{BT=&6Mt&$6vI}Zt|Fatr%mTXJbl^McRWDg=STUFB|#oda=()G zVhY~e)}8ey^n>lGrdiIduBnYPW+ixtZCT41#(c=zzW&j($v-M*KUi=e@bGD->%8o2 ueRsreW%9ob;e9Js{k3!NuFk*jE13TqtGqo@a%v^e*$kepelF{r5}E*Ymy#O* literal 0 HcmV?d00001 diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/green.png.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/green.png.meta new file mode 100644 index 0000000..b73df52 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/green.png.meta @@ -0,0 +1,124 @@ +fileFormatVersion: 2 +guid: 45ccf4d7106fc972cb676d15f014f50c +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 109.07 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/grey.png b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/grey.png new file mode 100644 index 0000000000000000000000000000000000000000..786e5306d16c8f65b2ec254c97ddf3b424ede71d GIT binary patch literal 493 zcmVkdg0005BNklP5cA=4`B9R;6Gr(Lm$jfN z+5lt!FsMlb$*d?Puw4P+^w#BeFVzt!L+oo4LomgyL^oy>`;Eo@zQtkmBvMM(_cQ=D zk46k3h#H$O!&9GPKKuv>rz54KyA7K;D#MUCjXgaV=&jXre!}|x)j=aXW=l2ii}m#5 zF-#mXh@bC9_B4i;myNtzYjo%B=4*^+DHMMyHhE5 zV}^?k2n^DVDP^ZB08ETxGcys;lH(JhnK6p9zxd4$te#JKE`)UQ?$p$n^~wF=>&46U jzgpV=o9b_EeH8#7{Ug0^-H&2$00000NkvXXu0mjfQ3~CZ literal 0 HcmV?d00001 diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/grey.png.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/grey.png.meta new file mode 100644 index 0000000..f6e189d --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/grey.png.meta @@ -0,0 +1,124 @@ +fileFormatVersion: 2 +guid: c381173cda2dd9304b52e11e1a7537bd +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_check_circle.png b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_check_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..7f99562cff1cd7535a5055b2855b8e30a4cc8540 GIT binary patch literal 916 zcmV;F18e+=P)Px&PDw;TRA@u(nN3m}Q4q)fE$(AZ5VLd0B6L6Bh|Jb`!u zaS?DAxB<&7giiHLVVKX?^LR5Asxmu@_woOA_v_cwL)h|%wp>5{14KOdvweu#%P|;x zAld`tF!-M^0`nY%ITpJQ_|P4>^8Dr=cy676xdBE4gguoohQJI!G{8acPBkZEkUhZo zyaA$b0QNT#0ALDG2VU>iW}V^ylk*dRz5+P0*)V6$5a26#{b7-HivdiUZ2;ekY*2VC z@g)xWH`;l6fJsw?3qTc57oLBi*+>WQ+Fh(15|7IxL%_t@&T%d zd6S75Ur_h2vxa2@gxTiaw0<@J^J!Lg$^mGKc-N`YmUjrxKTVsQ4iH{aKWuj^Y2F1q zzZ+jW9bnS@<=}>O%`t`Nzc&L^Zhg7}_!7VyBQf(Q)cb?=aY+x1Th}1|Y+TIEfG{ki zirraA31NWXTX_A*Wts%2E_|Xft$~m#w(h^p_CUDEqZ{Mqu97^EvNtX6jV1ZAcC`LJ z5%oYd7ni+wu}SP=ivhGc086P{*0Y)TKowoV>vdKFHvxD8qYHw()My?D;>81WgL+T0 zR)`bXdE6X;aHdf6gx|Fj9Chc=g`FGmp|A&d{%eI`1MpY;iZma>rFa9tL~#Zrm2vGf z(OF1`a4p^tLK=WD6KEjZi#HzPB4tEA1QLapHqV<5U~U>MdXZ&8#6`FgFYD%BWHMmV zoC0`fGQ{iuCJ2|}ff+nM(uZTxa@r=0R`Ilg2(Cy) zVWy7LU|=GAk~i_|#boJ)U`3Knv^04)?U_dLQmmg15PCsgFpi5EskG6N@?m|K?5;%7 zlv;&YaDNYUl&j4;0 z6>b+oX-a~cXW0g^95`(iI|I`ISPtW@!lK5|A7ahQ0nE!jXeay}wfZb2Px%LP$kL5+w>psl}gwmX@sw{#29hd?3P2`#a*mmf3m7NleNnH>o0FHqHUBM;NodAP6GIRl?X?$R} z=p0G{p#va|w6RX7Bmg6(hbqZq7XPJa9H{u>07$8n#^bu$m|~FXB#rSkiZKqrmPs`* zwaSoQS(#J-q{H4BDk(R4TU5tZ0ayoS%WaXN{0(3(%%cJzbBYXOdHTer799XGRi5R^ z@*-RM!c%Ni1m=O&oB~(?){1S50+2=5)%Dk(?i>Z+3h308m@?fp(3KQ{w;VJtm0zT( z)g=M=0xDDXtggE6ux(K(-mO@)P?O{$7ct1{i zf1!~mWVww9rPoeQN0@a0cCe7%%&=@cB^vvp@;FKo9_6(G! i)gkvk0Ef=B67>VwUt%#q^N9ig0000?P)Px%p-DtRRA@u(nLCdYF%ZZ9UMU@~4#cB_J3$LA@C`PzMH))(D1Z(mXn2T60}>^d zf=5Y{B9r|FKzp_72B0AUy&41(Y;fXhVM#F*Dy>9A*WGqG)W4 zNe*Le`o_$BEEga>RlaGH=QCf7G3ORfvD+d*M7IDuXd?iC+syoM-ZvXSlSc;WJZ-Da zHh}j4PD(X5B>#b#Pvu46R||?))_hEu`9L1P9{@o^Gb%M>nE5~7Y)i;{0PmNO_nX-J zH0pOD^ZqE2!#97GeDsh;-w97Jso97?Hc%le?UsEQ&mQ_$=64o#=iI~6{5^tIOavQlN~ zO`N5`+ebbd(A+cY82~E)4g=Vm?z1fb-vK0rakDkgtR*u|CBqBtfl4e_q+}PMqKPc5 Z<}W1b1V9r#p4$Kb002ovPDHLkV1j>FMLYli literal 0 HcmV?d00001 diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_circle_gray.png.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_circle_gray.png.meta new file mode 100644 index 0000000..3b3591b --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_circle_gray.png.meta @@ -0,0 +1,147 @@ +fileFormatVersion: 2 +guid: 809ef8ee76ad04e198cc8ba61c994f83 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_loading_star_light_mode_96.png b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_loading_star_light_mode_96.png new file mode 100644 index 0000000000000000000000000000000000000000..317ba373be7912a0a93e86985d5b6b13d933d551 GIT binary patch literal 822 zcmV-61Ihe}P)z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA0?SE6K~z{r?Uy}k zB0(6(-Blx^U?C)U+}46ct`7=U=|fyeDK-{CB*g{t2^6o8AQk};%Md-%Um=EQ`s6F@ zk-{bjlHf~r@AZLIs@SO>+9>4q9{C- zD;UFu9CLGXbBMV}9R6m*wjk{A9LlLF!=XeXaXlZ^V|og}U@*A$`~6xZ$eRiq zdKWUf0_FIjopNAl0DuwjoJ5Hx-JAEW1iqED&@BNS8?~lOM6K7c1Yc|% z%Ve}5o6RDzRJ>mAUcFxb%erkTl}g{~>b|2qaB_NjYMa1pPeCr1JD`b>)dYIc+_CO= zfpV$@+I+2YxorEMurvV5$K!FEL_`Vc_(UC80eDUo?iY@t*S0glbO{i4cuu04&wV~$ z>f+);m(|YC&-W=ZzaUfA{aGj!bjKA+p`6CxB+{~Iwj72CWHK3%lxv=wDF@Hb&mnp} z?V>qlv= zR(m9+X%b~B=|-brxq}zCCU`3^gRs+5rK!mDT{@r7+doR7G!O^~&1Tc^fON{)*;$MJ zX9z3p0f0y_(UL{J0B>b0mOWo!YQQ?#umLXDKPmJ=|34R&L;wH)07*qoM6N<$f*gKq AKL7v# literal 0 HcmV?d00001 diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_loading_star_light_mode_96.png.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_loading_star_light_mode_96.png.meta new file mode 100644 index 0000000..1734c10 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_loading_star_light_mode_96.png.meta @@ -0,0 +1,124 @@ +fileFormatVersion: 2 +guid: 725116e63c640c8408ca1c393191bc99 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 109.07 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_warning_circle.png b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_warning_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..9c4d478e633e3ec3907696c2f47865e9eab73a53 GIT binary patch literal 941 zcmV;e15*5nP)Px&XGugsRA@u(S=~|FKoI^`%n;dfCZ>YG6Cy8x3V;f5I)DlS6#x~)R1l~jrUFa_ z_$ij3fC}PF5Ehok!NV0xTx|0Xbpx3+I+i$=ijMNrr&-2snT5cjke=Y)8q}ZzC?Z?T+0+VaHhVUtk0p`Bdds$0lK=kwEkM2~xUm5@aY^?0me!8>l7GgkW z;VR`001)XpSlB`UT-!VYaQd1V0B~+Op0IQLEgb+Rx~O#r$MFERDlIS{yk-UnxUD+g z>@gK)VCexY!5v5sA&me4h`!|^5RRe%sSW^yx|B=&f6}1T#Ob&{X*yEVsLn!G7Le3J zCJuFNQ_%jgECUqvK3a|!3d7QxIg##0z_{S70B0(1fdJ_2W=_*n^7qg**QaBVU)%Ni zs^iHAHO#)T?_u{cI!d!Zok*OXEVja38~o$rI9mp5q|k;%YxgRVDnK>%}UGpZ+Z zHagBq8oN|!AVk+zchJb%F9l#6PMW3_Sq4qkGd(XILZOSjfFB%LF<&TzqS?vtM@>zw z!A$kE^(gfhQxM3c*omHBwefrOfy2Cp7Yd=c_!U5is6pa4t2~%TCTbC=9UT=)-jN`4 zc}0@6o1iQJo)xgDKV1rL&OgL1oFm0VvC}vU>jk5goEXI2rXB P00000NkvXXu0mjfQz@q> literal 0 HcmV?d00001 diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_warning_circle.png.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_warning_circle.png.meta new file mode 100644 index 0000000..1bac47b --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/icon_warning_circle.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: 0f8d84c5136cc4c119f14ee9797fb05f +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/infos.png b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/infos.png new file mode 100644 index 0000000000000000000000000000000000000000..5a8ed9b223762c380d713baa6e2fe63e9c14fb0c GIT binary patch literal 5947 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 literal 0 HcmV?d00001 diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/logo.png.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/logo.png.meta new file mode 100644 index 0000000..182331f --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/logo.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 0779c2964d0997956acf3c29e4e38a5c +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/red.png b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/red.png new file mode 100644 index 0000000000000000000000000000000000000000..44c2c9bf7ccc4a185cdbfaed8cadb5cad95f11d8 GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyegQrqu0Z;Ur~M;Or^jygK=i@g z=dqi^V|Rzw0iMr1T^_sJe+c$@?B)E#10?d;)$Wn2{kO=#Kk?!JlOn%G2K`Tt{+|@} zJ1+EZLd2i=uu_ZL#y}GVN`m}?8AP)Wz7SaW@4NTk-+6z29IE_1OAjcw%G1R$#NzbX zNjHU>6?j}lZ?Z(HFn#-9za{wAMy`@e+rRC5wn4@6@P~NGlP-Ig3rp@!J=Pk->~Ler zgEecqpjbspLC oFWp+V#kKnTg?qIZ{*~`!et1$j`zopr0N&}C&j0`b literal 0 HcmV?d00001 diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/red.png.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/red.png.meta new file mode 100644 index 0000000..920a9a6 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/red.png.meta @@ -0,0 +1,124 @@ +fileFormatVersion: 2 +guid: b0408809d04ad6d719d1e4d66c181cc2 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/red_dot.png b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/red_dot.png new file mode 100644 index 0000000000000000000000000000000000000000..5c43f676b505b913e2eae037ddbe72af53e3b654 GIT binary patch literal 4838 zcmeHLdvH|M8NVAI30uYYBFL26eu$ z&$kfCfe%pAHW{&*I%8d8GabZTsv>|O- zNG|LTz(&FG9k6eQO?@Km>nt3bpB(Fl%R(%Tp?;~)UyV{ul5o0cXircskq|_ZK}k*| zDUo5If7|ayA~KO|tqZQf@1Ln2PqokELE{N6tVRHWqz<&~e5m5BlDq$O?wMsR0dZgH zALn_RPFBubcYI}G+2hp@ocgT(2Q8($x6JSAdN_{pH|mayukwHYY+zwdYhHeEc0u{< zqQOnR!{ytuyKmn3;_R<@qIMjZpwpT47a-;6H$ zC*A$-tjL*Py!hbP`ljvkUal`HDM70Wx2Q9;{0otHr+(BD`cYBk!a-s1sBiZCjY`Lr z!Mi@%)q8jE$9<9Tp?w9jmaTp;`C<*rTvjhX*Z%3A3!fA}GFKztX>U5#vf}!i@zOP` z!eSqJ^o1uEJeiLk*=}!tVfvAk1zlxZuJ2y-?}z*GU6uC-r`UyA)ooMH|FiAp8&_k$ zzZ`h4(q8b>OS8NGH7C35bjkA{@*i|>e_OP*Ug+F=X|R8P=aqs_f4O~@JIisgv#V+8 z?yolY-c$ea`5nv8?`@@D3r$ZgKBDzZdh3&gC> zOYir;fAL(yyEktlhl7dNetUSqRs_jgqz3AYI{$J})}l^H(L%tPipI?aLy8xt;*z`; z7-$GIs4=(W>gjV1R8`!LAmbfuR?S`s=ykV^@D2~O8?8PY&0z`o!p{Zyj zri&@J!@?Ee*c9Uq)KW3lx*c_}jyzfdptO^A5?FakT~9d{+0o*J5*BN`OEM7f$?a$~ zjJSy7$z;-*bUC#|15OHpfD;r>Q5e*~^yZi$rLdTOp9zu1@B&>ZRCUITQkDItUM z^&n>4HyT2bhwbA{iHMbsBI6(eqEJR-P(GpP! zE~grm8UP-THCR4O!o|{RpW8t>i4jS4L^8tA!0lMB#+p(i69F{}Y7NO`lVk#iwNCAK%q_OC_7B-Sn0+cpD9wAq-JgplFEwmP@XsmX!5tyq03Bw2h{su@w zWN48gGlb!{K1Epyvoa+EjOPG>!K^rp4>K&rGXfoAsgS|~dTh}DPl_ZJpa_w6i45`G zrO2}3up}!XOkfBKZfF;Y@v_2UG7mTf5E4O!_-`>qW~l7hu_+eg=E*-)x5fB>Rd!lo z)KvjjKP`h-5WLaw;VUgu7Utz~3qP41bqhT}=m{s|;&+0s3A)C`z_^qrs%wI-aWOD1 z<%#P0*66a2ycB~N{985&UwPH{noh#k<*A{{rC#JONDv9mZ+`{;Uj&&JuUMrc$oFQL z&4%nhFb4{=4WGX}`>)gT@^0hr$@Sb0MQ428(g5H4`OZ>%8BmYH zpcF77m|-dZa~bp)zA&6&SiE{314G#Czu9YlK@}tle%Zok#W028*#Ga0<_skaXBhtf zw_MH0z`z1g@MR057?bphXABGs3=A7WcQNdPnacz*oWY982`bGHTFAH$VKEB>0|UeV zT*i4T9>au~SN*^J-;}|W(H5>M^nYkFE?+Pa@+L&VB}OZBi75Vh7Ptb&$^VlgWRazV zS^m7bmVy*ep+_0TnCxNx2xehA#>lry1MUk31|FX;TmC%_o5FDH{}%>x#MoMaMDWU)X002ovPDHLkV1oH{cAo$M literal 0 HcmV?d00001 diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/refresh.png.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/refresh.png.meta new file mode 100644 index 0000000..3181315 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/refresh.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 75c3ce1c05b6563dfbd2ac68fbb63c79 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/report_bug.png b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/report_bug.png new file mode 100644 index 0000000000000000000000000000000000000000..9754cfbbe431bbe4c6dce336797ccffe7feda5d7 GIT binary patch literal 763 zcmVA#+anu}5EkTqaEb}-2?9ui_95oQYqH2AmKo6=cnxu!W;SDFI~IoYC_n^&jFKswk|hDD z-3UMqiGL1|28MC6q_UC?egLT)Cc6SR^i4$EpY%ua{!lms>ih7CBpZi2C3u`zWPou z34CXfv($Oz06n-?X=Ry05d|bNMkg6$af8D&c=G|!fn7P*nuQol%qh1t62ocgNbsAw zv8fMh4wD~bq>7r=PY=pLh}=X)ki3m^%gL9S1;4yDNbaCtl!*mBxsC{AJk>$+4$iAS z%6UMO6zhmU9HTxUbzRud!p>Ea$s||2*JG;yWVDFnCp+2UO>aAP^--i#LoNUrScOY} zUJ)Q9CuyS<3)vWWMx}Cso)$9{c%w?AKz!5v%K~I9Hf%)kgcodMoC;svb)T4IKV|@u z*(*lHS3MU75ZgIJ8dg$ir2bD1Tq-ZgW*-kBOi$52xaPv3hH{b$V0B< zd!HhGFNHDS0%i`fNDnXR;B9zylv~~<2^%qt)55DT07;~9lSVbMQhTduc?}PTxKFe4 tgw299lgF?cTkS6(4OrNUOO5m2tltmQ-w6mViemr(002ovPDHLkV1m%nPJ#dc literal 0 HcmV?d00001 diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/report_bug.png.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/report_bug.png.meta new file mode 100644 index 0000000..860560d --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/report_bug.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 77c9c0af0f612d0a0a94cf95e2235730 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/warning.png b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Resources/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..b1ad63e45b6910832c6af732bfaf1a24a2df5491 GIT binary patch literal 5523 zcmeHKdpMM78-K^KtRg9G!Zd2rVa(y3!OR+GHA92s)Y&^T?=Uelnu8e?Nlly5X=%U6 zek5#EwB;*SO0`Nbk!Dui^3B@ALeg-*ex;=YH<- zCi?lTm}W570D_=tET)G)=&|Z%tOx#DzsS7=y8CDdi_c;$fu?{5fW+uP7&Qho%p_Y2 zqYY_;u|1%f09%bwx49TyO`im8^Km-`*f!%BEnt%{TF^Amr-McYwkhcIK@)s8w$~M4 zt3OjTKTKe$nLqR^SZqHm*_K4Kg(+Y?kqpy`G&-4tB@^i|__YUUOy)*hR~Rix2(o#0_ym28@vJRp0&Uz>{!5Eq zgi1QiC<3Pc`gyvK5_Vbb57ajc+hDO?*R@ys*M}9XT2HS(H~ELpXuY<@xw&cE<1+2t zTT}D+D@^^U)yxVm=bO?c(Pdfs?sHtG%rt@Dmhi}!nm)Oa)utYtWA*UkjFY~%Qw@6) ze_fSpKD$q^?@n%xw0Y6=^I6%(88Z)=%UqwWD5$o*y2aLES?`_9BR+R$>L*sXnO6(% z?Aznz$etGzaG+n6RBh0Kzqh%hDs7;RVAxi46fLNq=Q?kHh?@zH7qH6h>)E)X&DqD8 zwQ+ZDIKO+`ORAIudFa5jpY?`@8p5_Y76X}Z0|j7%(yf+C!@<5wf5-FYwI!< zce~G)9IDsHvNtRg#qV+tJ>$~QW!dve)YJV0zB?KR-5ioscHL}i1xctB1cb;!*emH= zvCtObi8-jPQW&K^G04$b8HI2oP#Knkh6zLrTu9? zeFC^!Be*mk&e_SpQAq~`LR5xemBL7ol&)mpG`w_RtA`0VtOg>BVBkVPBDsqtD3)SN zu_fX?m4aw8&dC7lDB0*OYW5r||0nT!Vr zyfj86LzH-t)LKn3#^HfVxe`H?Odu9v)tm@NESE8GI53a>;GZyx&7PnaNyk+HdJvRI z6oF(*BnX9s$t$EX&uBn0?$BSZkOss=p#*FdP_;xUnPsEd96vk6Hd@kOB50mjcnBss^5tPWM*iEAF zl?XsqB9W85Qd98&6^v3*E{$S`C&CC7Pk|{2-hqp7@b-WM=Fw;{jEs51P;B;3%76V7NC4L<7i$r96uz-PEDGg>iDT}o>DXePfFJX}(CW*Bbp&{D>r~U z8oN=e(Jf<7V~>#n%~ir;HJ5^paK}QBBGD*M<0s%6o8pEeqA(OxkMVTbke-^aD6Ea< zpca4Xiy|CVp8^mJPo&|=qz{78#swpc2TV}cj1Lhz68=jQM-5<7kpb(*#z64`wU97T z497JC{{Eex@w50lx4>e*Z1P$9ev#{oT%V=DXMw+D*B7}yOM%YTZ6buC~$iD<$siCP+%r#O7`f8@SVW711Ibcv<#$tQw zcTAmSV!7zX>5`Waq)T9VxCVqbKU~x3Gjo;c2H0Yq*Q{mP3$s!@4(rwKHNaa0Bpsg8 zZ1VQ*3hv4gT%yx^-64Ia&02|OhNP_JyXxk+UON^#BR9$DbYtgA{hPDbcE&U?e)O+~nkeSD2mg`2~gRPDez<#&%Ntih~+X1o%Gf+u~C15Fw

vaxVbv*9S zHq}**q`huv;E{jSJKvC|AOAy8;99E5(-&vg>9jm&-&1sFZGW@Zsg=8+XJ< zyJUUNy`KVajmqV@Q=zi5c!5?Y<p7*6OK{k1;t6s-Ak>lb+S&nzssXR4hgPH>gwHTcF*7Hq-J%cBjr%$(6*6zM{8pNrp zbK34yH5w=3gvJ*bPk+QTPO7k}`Dc!!@;>ocquK1)W|)@l#u6G-$qx?3WL`*)6o|zF z40LrsW5%wtPJZkF8=}@%d)4`P}vS zBGpAhoqd?1_^GM{*8v>s#lGt=C9l$d+!+`aAJX<4E-k>a(qNk%16|Gf(Ud^>6fU9yr)y{&4hqJh>3=-=?}@m>XR9 zdumI!$>x|JoMY;$JM1r}GN#eHAjBiD)GHcm%;lyuH@Loi(Xse=TKM38v+j}0_SfCe z+gi0Y>l#Cns5=(886Q91x!hz~H8&yqN!O$H^p%g&f+Vnq4%&LnwQ46uoH1aKkkpbF z;OmQ67*BuQ>u-E}Yhu}kjTu**s!q&Li%0Fw6}8=l?5O!(4|7ILpL~D0@Mx3g=upMl zCwVP(bu}3fc0=oLoP^?Bor;Tg!#OX%F+8V0o^{pz=9RH&C}a)NIQ*=lQ~~w&w+|1f zp4@6RJoSsu9ty>DU`CD+5=my2!(ZRKx`V)hVm<%#UACh;t*Jl9Z0_a)wOhLt9p>K zn_sbUkaceV@~QEZuO)8-BB08Ujk$lmKQedw;P=eOCE91s*t}95w#gSP@E+_Ghn;g7 hT~9R}?TRcZw>t2={Zbm)L;$KO#PamvrxxO&7x1tTUB z!g>3eE&u=ks!2paR5;7clGzf2APhwnSrkNeu>JoJ?UXuHflm6?-q#$KBxe}@D*Xq37<0ZSi+(CGXRT4k{gNjfC zLC{lw%*Q64y}LzQXn`=J0w@zZF{%LA_5h0upj{7e8USt@c;b$sPfp*r2@VPzHM}fv u-LNpQa#`B#CGFOgHfyh*+N%%R|1J;ViX&?$IjO?{0000 instance; + public static TimeSpan HeartBeatTimeout => heartBeatTimeout; + + ServerHealthCheck() { } + + ///

+ /// Whether or not the server is running and responsive + /// + public bool IsServerHealthy { get; private set; } + + void IServerHealthCheckInternal.CheckHealth() { + var fi = new FileInfo(Path.Combine(CliUtils.GetCliTempDir(), "health")); + IsServerHealthy = fi.Exists && DateTime.UtcNow - fi.LastWriteTimeUtc < heartBeatTimeout; + } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ServerHealthCheck.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ServerHealthCheck.cs.meta new file mode 100644 index 0000000..381018b --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/ServerHealthCheck.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 45b5951115b94f6ab79756f71777a915 +timeCreated: 1673812440 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/SingularityGroup.HotReload.Editor.asmdef b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/SingularityGroup.HotReload.Editor.asmdef new file mode 100644 index 0000000..fa46fc6 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/SingularityGroup.HotReload.Editor.asmdef @@ -0,0 +1,28 @@ +{ + "name": "SingularityGroup.HotReload.Editor", + "rootNamespace": "SingularityGroup.HotReload", + "references": [ + "SingularityGroup.HotReload.Runtime.Public", + "SingularityGroup.HotReload.Runtime", + "UnityEditor.UI", + "UnityEngine.UI", + "UnityEngine.TestRunner", + "UnityEditor.TestRunner" + ], + "optionalUnityReferences": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "SingularityGroup.HotReload.RuntimeDependencies.dll", + "SingularityGroup.HotReload.RuntimeDependencies2019.dll", + "SingularityGroup.HotReload.RuntimeDependencies2020.dll", + "SingularityGroup.HotReload.RuntimeDependencies2022.dll", + "SingularityGroup.HotReload.EditorDependencies.dll" + ], + "autoReferenced": false, + "defineConstraints": [] +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/SingularityGroup.HotReload.Editor.asmdef.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/SingularityGroup.HotReload.Editor.asmdef.meta new file mode 100644 index 0000000..bbe106e --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/SingularityGroup.HotReload.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 43aab4a50a5839e44af6c24ac5006688 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/SingularityGroup.HotReload.EditorDependencies.dll b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/SingularityGroup.HotReload.EditorDependencies.dll new file mode 100644 index 0000000000000000000000000000000000000000..7dc39afa056827a6d4b05820467e711a345cc47b GIT binary patch literal 61440 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 literal 0 HcmV?d00001 diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/SingularityGroup.HotReload.EditorDependencies.dll.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/SingularityGroup.HotReload.EditorDependencies.dll.meta new file mode 100644 index 0000000..4e2eed2 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/SingularityGroup.HotReload.EditorDependencies.dll.meta @@ -0,0 +1,86 @@ +fileFormatVersion: 2 +guid: 2286e58e1d144b84c925391e896974b2 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 1 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 1 + Exclude Editor: 0 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + - first: + Android: Android + second: + enabled: 0 + settings: + CPU: ARMv7 + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: AnyCPU + DefaultValueInitialized: true + OS: AnyOS + - first: + Standalone: Linux64 + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: x86_64 + - first: + Standalone: Win + second: + enabled: 0 + settings: + CPU: x86 + - first: + Standalone: Win64 + second: + enabled: 0 + settings: + CPU: x86_64 + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + iPhone: iOS + second: + enabled: 0 + settings: + AddToEmbeddedBinaries: false + CPU: AnyCPU + CompileFlags: + FrameworkDependencies: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Versioning.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Versioning.meta new file mode 100644 index 0000000..0477de0 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Versioning.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5726f82867506c8408235866081bec1d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Versioning/PackageUpdateChecker.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Versioning/PackageUpdateChecker.cs new file mode 100644 index 0000000..6629ba0 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Versioning/PackageUpdateChecker.cs @@ -0,0 +1,288 @@ +using System; +using System.IO; +using System.Net; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using SingularityGroup.HotReload.Editor.Semver; +using SingularityGroup.HotReload.Newtonsoft.Json; +using SingularityGroup.HotReload.Newtonsoft.Json.Linq; +using UnityEditor; +using UnityEngine; +using UnityEngine.Networking; + +namespace SingularityGroup.HotReload.Editor { + internal class PackageUpdateChecker { + const string persistedFile = PackageConst.LibraryCachePath + "/updateChecker.json"; + readonly JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(); + SemVersion newVersionDetected; + bool started; + + private static TimeSpan RetryInterval => TimeSpan.FromSeconds(30); + private static TimeSpan CheckInterval => TimeSpan.FromHours(1); + + private static readonly HttpClient client = RequestHelper.CreateHttpClient(); + + private static string _lastRemotePackageVersion; + + public static string lastRemotePackageVersion => _lastRemotePackageVersion; + + public async void StartCheckingForNewVersion() { + if(started) { + return; + } + started = true; + + for (;;) { + try { + await PerformVersionCheck(); + if(newVersionDetected != null) { + break; + } + } catch(Exception ex) { + Log.Warning("encountered exception when checking for new Hot Reload package version:\n{0}", ex); + } + await Task.Delay(RetryInterval); + } + } + + public bool TryGetNewVersion(out SemVersion version) { + var currentVersion = SemVersion.Parse(PackageConst.Version, strict: true); + return !ReferenceEquals(version = newVersionDetected, null) && newVersionDetected > currentVersion; + } + + async Task PerformVersionCheck() { + var state = await LoadPersistedState(); + var currentVersion = SemVersion.Parse(PackageConst.Version, strict: true); + if(state != null) { + _lastRemotePackageVersion = state.lastRemotePackageVersion; + var newVersion = SemVersion.Parse(state.lastRemotePackageVersion); + if(newVersion > currentVersion) { + newVersionDetected = newVersion; + return; + } + if(DateTime.UtcNow - state.lastVersionCheck < CheckInterval) { + return; + } + } + + var response = await GetLatestPackageVersion(); + if(response.err != null) { + if(response.statusCode == 0 || response.statusCode == 404) { + // probably no internet, fail silently and retry + } else { + Log.Warning("version check failed: {0}", response.err); + } + } else { + var newVersion = response.data; + if (response.data > currentVersion) { + newVersionDetected = newVersion; + } + await Task.Run(() => PersistState(response.data)); + } + } + + void PersistState(SemVersion newVersion) { + // ReSharper disable once AssignNullToNotNullAttribute + var fi = new FileInfo(persistedFile); + fi.Directory.Create(); + using (var streamWriter = new StreamWriter(fi.OpenWrite())) + using (var writer = new JsonTextWriter(streamWriter)) { + jsonSerializer.Serialize(writer, new State { + lastVersionCheck = DateTime.UtcNow, + lastRemotePackageVersion = newVersion.ToString() + }); + } + } + + Task LoadPersistedState() { + return Task.Run(() => { + var fi = new FileInfo(persistedFile); + if(!fi.Exists) { + return null; + } + + using(var streamReader = fi.OpenText()) + using(var reader = new JsonTextReader(streamReader)) { + return jsonSerializer.Deserialize(reader); + } + }); + } + + + + static async Task> GetLatestPackageVersion() { + string versionUrl; + + if (PackageConst.IsAssetStoreBuild) { + // version updates are synced with asset store + versionUrl = "https://d2tc55zjhw51ly.cloudfront.net/releases/latest/asset-store-version.json"; + } else { + versionUrl = "https://gitlab.hotreload.net/root/hot-reload-releases/-/raw/production/package.json"; + } + try { + using(var resp = await client.GetAsync(versionUrl).ConfigureAwait(false)) { + if(resp.StatusCode != HttpStatusCode.OK) { + return Response.FromError($"Request failed with statusCode: {resp.StatusCode} {resp.ReasonPhrase}"); + } + + var json = await resp.Content.ReadAsStringAsync().ConfigureAwait(false); + var o = await JObject.LoadAsync(new JsonTextReader(new StringReader(json))).ConfigureAwait(false); + SemVersion newVersion; + JToken value; + if (!o.TryGetValue("version", out value)) { + return Response.FromError("Invalid package.json"); + } else if(!SemVersion.TryParse(value.Value(), out newVersion, strict: true)) { + return Response.FromError($"Invalid version in package.json: '{value.Value()}'"); + } else { + return Response.FromResult(newVersion); + } + } + } catch(Exception ex) { + return Response.FromError($"{ex.GetType().Name} {ex.Message}"); + } + } + + public async Task UpdatePackageAsync(SemVersion newVersion) { + //Package can be updated by updating the git url via the package manager + if(EditorUtility.DisplayDialog($"Update To v{newVersion}", $"By pressing 'Update' the Hot Reload package will be updated to v{newVersion}", "Update", "Cancel")) { + var resp = await GetLatestPackageVersion(); + if(resp.err == null && resp.data > newVersion) { + newVersion = resp.data; + } + + if(await IsUsingGitRepo()) { + var err = UpdateGitUrlInManifest(newVersion); + if(err != null) { + Log.Warning("Encountered issue when updating Hot Reload: {0}", err); + } else { + //Delete state to force another version check after the package is installed + File.Delete(persistedFile); + #if UNITY_2020_3_OR_NEWER + UnityEditor.PackageManager.Client.Resolve(); + #else + CompileMethodDetourer.Reset(); + AssetDatabase.Refresh(); + #endif + } + } else { + var err = await UpdateUtility.Update(newVersion.ToString(), null, CancellationToken.None); + if(err != null) { + Log.Warning("Failed to update package: {0}", err); + } else { + CompileMethodDetourer.Reset(); + AssetDatabase.Refresh(); + } + } + + //open changelog + HotReloadPrefs.ShowChangeLog = true; + HotReloadWindow.Current.SelectTab(typeof(HotReloadAboutTab)); + } + } + + string UpdateGitUrlInManifest(SemVersion newVersion) { + const string repoUrl = "git+https://gitlab.hotreload.net/root/hot-reload-releases.git"; + const string manifestJsonPath = "Packages/manifest.json"; + var repoUrlToNewVersion = $"{repoUrl}#{newVersion}"; + if(!File.Exists(manifestJsonPath)) { + return "Unable to find manifest.json"; + } + + var root = JObject.Load(new JsonTextReader(new StringReader(File.ReadAllText(manifestJsonPath)))); + JObject deps; + var err = TryGetManfestDeps(root, out deps); + if(err != null) { + return err; + } + deps[PackageConst.PackageName] = repoUrlToNewVersion; + root["dependencies"] = deps; + File.WriteAllText(manifestJsonPath, root.ToString(Formatting.Indented)); + return null; + } + + static string TryGetManfestDeps(JObject root, out JObject deps) { + JToken value; + if(!root.TryGetValue("dependencies", out value)) { + deps = null; + return "no dependencies object found in manifest.json"; + } + deps = value.Value(); + if(deps == null) { + return "dependencies object null in manifest.json"; + } + return null; + } + + static async Task IsUsingGitRepo() { + var respose = await Task.Run(() => IsUsingGitRepoThreaded(PackageConst.PackageName)); + if(respose.err != null) { + Log.Warning("Unable to find package. message: {0}", respose.err); + return false; + } else { + return respose.data; + } + } + + static Response IsUsingGitRepoThreaded(string packageId) { + var fi = new FileInfo("Packages/manifest.json"); + if(!fi.Exists) { + return "Unable to find manifest.json"; + } + + using(var reader = fi.OpenText()) { + var root = JObject.Load(new JsonTextReader(reader)); + JObject deps; + var err = TryGetManfestDeps(root, out deps); + if(err != null) { + return "no dependencies specified in manifest.json"; + } + JToken value; + if(!deps.TryGetValue(packageId, out value)) { + //Likely a local package directly in the packages folder of the unity project + //or the package got moved into the Assets folder + return Response.FromResult(false); + } + var pathToPackage = value.Value(); + if(pathToPackage.StartsWith("git+", StringComparison.Ordinal)) { + return Response.FromResult(true); + } + if(pathToPackage.StartsWith("https://", StringComparison.Ordinal)) { + return Response.FromResult(true); + } + return Response.FromResult(false); + } + } + + class Response { + public readonly T data; + public readonly string err; + public readonly long statusCode; + public Response(T data, string err, long statusCode) { + this.data = data; + this.err = err; + this.statusCode = statusCode; + } + + public static implicit operator Response( string err) { + return Response.FromError(err); + } + } + + static class Response { + public static Response FromError(string error) { + return new Response(default(T), error, -1); + } + public static Response FromResult(T result) { + return new Response(result, null, 200); + } + } + + class State { + public DateTime lastVersionCheck; + public string lastRemotePackageVersion; + } + } + + +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Versioning/PackageUpdateChecker.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Versioning/PackageUpdateChecker.cs.meta new file mode 100644 index 0000000..7170c48 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Versioning/PackageUpdateChecker.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0cecc9e1c2704904691175cdd2f450e6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Versioning/SemVer.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Versioning/SemVer.cs new file mode 100644 index 0000000..72d9854 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Versioning/SemVer.cs @@ -0,0 +1,536 @@ +using System; +#if !NETSTANDARD +using System.Globalization; +using System.Runtime.Serialization; +using System.Security.Permissions; +#endif +using System.Text.RegularExpressions; + +namespace SingularityGroup.HotReload.Editor.Semver +{ + /// + /// A semantic version implementation. + /// Conforms to v2.0.0 of http://semver.org/ + /// +#if NETSTANDARD + sealed class SemVersion : IComparable, IComparable +#else + [Serializable] + sealed class SemVersion : IComparable, IComparable, ISerializable +#endif + { + public static SemVersion None = new SemVersion(0, 0, 0); + public static string NoneString = new SemVersion(0, 0, 0).ToString(); + + static Regex parseEx = + new Regex(@"^(?\d+)" + + @"(\.(?\d+))?" + + @"(\.(?\d+))?" + + @"(\-(?
[0-9A-Za-z\-\.]+))?" +
+                @"(\+(?[0-9A-Za-z\-\.]+))?$",
+#if NETSTANDARD
+                RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture);
+#else
+                RegexOptions.CultureInvariant | RegexOptions.Compiled | RegexOptions.ExplicitCapture);
+#endif
+
+#if !NETSTANDARD
+        /// 
+        /// Initializes a new instance of the  class.
+        /// 
+        /// 
+        /// 
+        /// 
+        private SemVersion(SerializationInfo info, StreamingContext context)
+        {
+            if (info == null) throw new ArgumentNullException("info");
+            var semVersion = Parse(info.GetString("SemVersion"));
+            Major = semVersion.Major;
+            Minor = semVersion.Minor;
+            Patch = semVersion.Patch;
+            Prerelease = semVersion.Prerelease;
+            Build = semVersion.Build;
+        }
+#endif
+
+        /// 
+        /// Initializes a new instance of the  class.
+        /// 
+        /// The major version.
+        /// The minor version.
+        /// The patch version.
+        /// The prerelease version (eg. "alpha").
+        /// The build eg ("nightly.232").
+        public SemVersion(int major, int minor = 0, int patch = 0, string prerelease = "", string build = "")
+        {
+            this.Major = major;
+            this.Minor = minor;
+            this.Patch = patch;
+
+            this.Prerelease = prerelease ?? "";
+            this.Build = build ?? "";
+        }
+
+        /// 
+        /// Initializes a new instance of the  class.
+        /// 
+        /// The  that is used to initialize 
+        /// the Major, Minor, Patch and Build properties.
+        public SemVersion(Version version)
+        {
+            if (version == null)
+                throw new ArgumentNullException("version");
+
+            this.Major = version.Major;
+            this.Minor = version.Minor;
+
+            if (version.Revision >= 0)
+            {
+                this.Patch = version.Revision;
+            }
+
+            this.Prerelease = String.Empty;
+
+            if (version.Build > 0)
+            {
+                this.Build = version.Build.ToString();
+            }
+            else
+            {
+                this.Build = String.Empty;
+            }
+        }
+
+        /// 
+        /// Parses the specified string to a semantic version.
+        /// 
+        /// The version string.
+        /// If set to true minor and patch version are required, else they default to 0.
+        /// The SemVersion object.
+        /// When a invalid version string is passed.
+        public static SemVersion Parse(string version, bool strict = false)
+        {
+            var match = parseEx.Match(version);
+            if (!match.Success)
+                throw new ArgumentException("Invalid version.", "version");
+
+#if NETSTANDARD
+            var major = int.Parse(match.Groups["major"].Value);
+#else
+            var major = int.Parse(match.Groups["major"].Value, CultureInfo.InvariantCulture);
+#endif
+
+            var minorMatch = match.Groups["minor"];
+            int minor = 0;
+            if (minorMatch.Success) 
+            {
+#if NETSTANDARD
+                minor = int.Parse(minorMatch.Value);
+#else
+                minor = int.Parse(minorMatch.Value, CultureInfo.InvariantCulture);
+#endif
+            }
+            else if (strict)
+            {
+                throw new InvalidOperationException("Invalid version (no minor version given in strict mode)");
+            }
+
+            var patchMatch = match.Groups["patch"];
+            int patch = 0;
+            if (patchMatch.Success)
+            {
+#if NETSTANDARD
+                patch = int.Parse(patchMatch.Value);
+#else
+                patch = int.Parse(patchMatch.Value, CultureInfo.InvariantCulture);
+#endif
+            }
+            else if (strict) 
+            {
+                throw new InvalidOperationException("Invalid version (no patch version given in strict mode)");
+            }
+
+            var prerelease = match.Groups["pre"].Value;
+            var build = match.Groups["build"].Value;
+
+            return new SemVersion(major, minor, patch, prerelease, build);
+        }
+
+        /// 
+        /// Parses the specified string to a semantic version.
+        /// 
+        /// The version string.
+        /// When the method returns, contains a SemVersion instance equivalent 
+        /// to the version string passed in, if the version string was valid, or null if the 
+        /// version string was not valid.
+        /// If set to true minor and patch version are required, else they default to 0.
+        /// False when a invalid version string is passed, otherwise true.
+        public static bool TryParse(string version, out SemVersion semver, bool strict = false)
+        {
+            try
+            {
+                semver = Parse(version, strict);
+                return true;
+            }
+            catch (Exception)
+            {
+                semver = null;
+                return false;
+            }
+        }
+
+        /// 
+        /// Tests the specified versions for equality.
+        /// 
+        /// The first version.
+        /// The second version.
+        /// If versionA is equal to versionB true, else false.
+        public static bool Equals(SemVersion versionA, SemVersion versionB)
+        {
+            if (ReferenceEquals(versionA, null))
+                return ReferenceEquals(versionB, null);
+            return versionA.Equals(versionB);
+        }
+
+        /// 
+        /// Compares the specified versions.
+        /// 
+        /// The version to compare to.
+        /// The version to compare against.
+        /// If versionA < versionB < 0, if versionA > versionB > 0,
+        /// if versionA is equal to versionB 0.
+        public static int Compare(SemVersion versionA, SemVersion versionB)
+        {
+            if (ReferenceEquals(versionA, null))
+                return ReferenceEquals(versionB, null) ? 0 : -1;
+            return versionA.CompareTo(versionB);
+        }
+
+        /// 
+        /// Make a copy of the current instance with optional altered fields. 
+        /// 
+        /// The major version.
+        /// The minor version.
+        /// The patch version.
+        /// The prerelease text.
+        /// The build text.
+        /// The new version object.
+        public SemVersion Change(int? major = null, int? minor = null, int? patch = null,
+            string prerelease = null, string build = null)
+        {
+            return new SemVersion(
+                major ?? this.Major,
+                minor ?? this.Minor,
+                patch ?? this.Patch,
+                prerelease ?? this.Prerelease,
+                build ?? this.Build);
+        }
+
+        /// 
+        /// Gets the major version.
+        /// 
+        /// 
+        /// The major version.
+        /// 
+        public int Major { get; private set; }
+
+        /// 
+        /// Gets the minor version.
+        /// 
+        /// 
+        /// The minor version.
+        /// 
+        public int Minor { get; private set; }
+
+        /// 
+        /// Gets the patch version.
+        /// 
+        /// 
+        /// The patch version.
+        /// 
+        public int Patch { get; private set; }
+
+        /// 
+        /// Gets the pre-release version.
+        /// 
+        /// 
+        /// The pre-release version.
+        /// 
+        public string Prerelease { get; private set; }
+
+        /// 
+        /// Gets the build version.
+        /// 
+        /// 
+        /// The build version.
+        /// 
+        public string Build { get; private set; }
+
+        /// 
+        /// Returns a  that represents this instance.
+        /// 
+        /// 
+        /// A  that represents this instance.
+        /// 
+        public override string ToString()
+        {
+            var version = "" + Major + "." + Minor + "." + Patch;
+            if (!String.IsNullOrEmpty(Prerelease))
+                version += "-" + Prerelease;
+            if (!String.IsNullOrEmpty(Build))
+                version += "+" + Build;
+            return version;
+        }
+
+        /// 
+        /// Compares the current instance with another object of the same type and returns an integer that indicates 
+        /// whether the current instance precedes, follows, or occurs in the same position in the sort order as the 
+        /// other object.
+        /// 
+        /// An object to compare with this instance.
+        /// 
+        /// A value that indicates the relative order of the objects being compared. 
+        /// The return value has these meanings: Value Meaning Less than zero 
+        ///  This instance precedes  in the sort order. 
+        ///  Zero This instance occurs in the same position in the sort order as . i
+        ///  Greater than zero This instance follows  in the sort order.
+        /// 
+        public int CompareTo(object obj)
+        {
+            return CompareTo((SemVersion)obj);
+        }
+
+        /// 
+        /// Compares the current instance with another object of the same type and returns an integer that indicates 
+        /// whether the current instance precedes, follows, or occurs in the same position in the sort order as the 
+        /// other object.
+        /// 
+        /// An object to compare with this instance.
+        /// 
+        /// A value that indicates the relative order of the objects being compared. 
+        /// The return value has these meanings: Value Meaning Less than zero 
+        ///  This instance precedes  in the sort order. 
+        ///  Zero This instance occurs in the same position in the sort order as . i
+        ///  Greater than zero This instance follows  in the sort order.
+        /// 
+        public int CompareTo(SemVersion other)
+        {
+            if (ReferenceEquals(other, null))
+                return 1;
+
+            var r = this.CompareByPrecedence(other);
+            if (r != 0)
+                return r;
+
+            r = CompareComponent(this.Build, other.Build);
+            return r;
+        }
+
+        /// 
+        /// Compares to semantic versions by precedence. This does the same as a Equals, but ignores the build information.
+        /// 
+        /// The semantic version.
+        /// true if the version precedence matches.
+        public bool PrecedenceMatches(SemVersion other)
+        {
+            return CompareByPrecedence(other) == 0;
+        }
+
+        /// 
+        /// Compares to semantic versions by precedence. This does the same as a Equals, but ignores the build information.
+        /// 
+        /// The semantic version.
+        /// 
+        /// A value that indicates the relative order of the objects being compared. 
+        /// The return value has these meanings: Value Meaning Less than zero 
+        ///  This instance precedes  in the version precedence.
+        ///  Zero This instance has the same precedence as . i
+        ///  Greater than zero This instance has creater precedence as .
+        /// 
+        public int CompareByPrecedence(SemVersion other)
+        {
+            if (ReferenceEquals(other, null))
+                return 1;
+
+            var r = this.Major.CompareTo(other.Major);
+            if (r != 0) return r;
+
+            r = this.Minor.CompareTo(other.Minor);
+            if (r != 0) return r;
+
+            r = this.Patch.CompareTo(other.Patch);
+            if (r != 0) return r;
+
+            r = CompareComponent(this.Prerelease, other.Prerelease, true);
+            return r;
+        }
+
+        static int CompareComponent(string a, string b, bool lower = false)
+        {
+            var aEmpty = String.IsNullOrEmpty(a);
+            var bEmpty = String.IsNullOrEmpty(b);
+            if (aEmpty && bEmpty)
+                return 0;
+
+            if (aEmpty)
+                return lower ? 1 : -1;
+            if (bEmpty)
+                return lower ? -1 : 1;
+
+            var aComps = a.Split('.');
+            var bComps = b.Split('.');
+
+            var minLen = Math.Min(aComps.Length, bComps.Length);
+            for (int i = 0; i < minLen; i++)
+            {
+                var ac = aComps[i];
+                var bc = bComps[i];
+                int anum, bnum;
+                var isanum = Int32.TryParse(ac, out anum);
+                var isbnum = Int32.TryParse(bc, out bnum);
+                int r;
+                if (isanum && isbnum)
+                {
+                    r = anum.CompareTo(bnum);
+                    if (r != 0) return anum.CompareTo(bnum);
+                }
+                else
+                {
+                    if (isanum)
+                        return -1;
+                    if (isbnum)
+                        return 1;
+                    r = String.CompareOrdinal(ac, bc);
+                    if (r != 0)
+                        return r;
+                }
+            }
+
+            return aComps.Length.CompareTo(bComps.Length);
+        }
+
+        /// 
+        /// Determines whether the specified  is equal to this instance.
+        /// 
+        /// The  to compare with this instance.
+        /// 
+        ///   true if the specified  is equal to this instance; otherwise, false.
+        /// 
+        public override bool Equals(object obj)
+        {
+            if (ReferenceEquals(obj, null))
+                return false;
+
+            if (ReferenceEquals(this, obj))
+                return true;
+
+            var other = (SemVersion)obj;
+
+            return this.Major == other.Major &&
+                this.Minor == other.Minor &&
+                this.Patch == other.Patch &&
+                string.Equals(this.Prerelease, other.Prerelease, StringComparison.Ordinal) &&
+                string.Equals(this.Build, other.Build, StringComparison.Ordinal);
+        }
+
+        /// 
+        /// Returns a hash code for this instance.
+        /// 
+        /// 
+        /// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. 
+        /// 
+        public override int GetHashCode()
+        {
+            unchecked
+            {
+                int result = this.Major.GetHashCode();
+                result = result * 31 + this.Minor.GetHashCode();
+                result = result * 31 + this.Patch.GetHashCode();
+                result = result * 31 + this.Prerelease.GetHashCode();
+                result = result * 31 + this.Build.GetHashCode();
+                return result;
+            }
+        }
+
+#if !NETSTANDARD
+        [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
+        public void GetObjectData(SerializationInfo info, StreamingContext context)
+        {
+            if (info == null) throw new ArgumentNullException("info");
+            info.AddValue("SemVersion", ToString());
+        }
+#endif
+
+        /// 
+        /// The override of the equals operator. 
+        /// 
+        /// The left value.
+        /// The right value.
+        /// If left is equal to right true, else false.
+        public static bool operator ==(SemVersion left, SemVersion right)
+        {
+            if(ReferenceEquals(right, null)) {
+                return ReferenceEquals(left, null);
+            }
+            if(ReferenceEquals(left, null)) {
+                return false;
+            }
+            return left.PrecedenceMatches(right);
+        }
+
+        /// 
+        /// The override of the un-equal operator. 
+        /// 
+        /// The left value.
+        /// The right value.
+        /// If left is not equal to right true, else false.
+        public static bool operator !=(SemVersion left, SemVersion right)
+        {
+            return !(left == right);
+        }
+
+        /// 
+        /// The override of the greater operator. 
+        /// 
+        /// The left value.
+        /// The right value.
+        /// If left is greater than right true, else false.
+        public static bool operator >(SemVersion left, SemVersion right)
+        {
+            return left.CompareByPrecedence(right) > 0;
+        }
+
+        /// 
+        /// The override of the greater than or equal operator. 
+        /// 
+        /// The left value.
+        /// The right value.
+        /// If left is greater than or equal to right true, else false.
+        public static bool operator >=(SemVersion left, SemVersion right)
+        {
+            return left == right || left > right;
+        }
+
+        /// 
+        /// The override of the less operator. 
+        /// 
+        /// The left value.
+        /// The right value.
+        /// If left is less than right true, else false.
+        public static bool operator <(SemVersion left, SemVersion right)
+        {
+            return left.CompareByPrecedence(right) < 0;
+        }
+
+        /// 
+        /// The override of the less than or equal operator. 
+        /// 
+        /// The left value.
+        /// The right value.
+        /// If left is less than or equal to right true, else false.
+        public static bool operator <=(SemVersion left, SemVersion right)
+        {
+            return left == right || left < right;
+        }
+    }
+}
diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Versioning/SemVer.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Versioning/SemVer.cs.meta
new file mode 100644
index 0000000..44ae33a
--- /dev/null
+++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Versioning/SemVer.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0b49a1188451e7745af9f636d854efc8
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window.meta
new file mode 100644
index 0000000..710dd15
--- /dev/null
+++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e1826b88dea6aa446a9bc22bc0140c22
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI.meta
new file mode 100644
index 0000000..5cbd648
--- /dev/null
+++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: dddc1cae3f951f84da98305ec6228f25
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Buttons.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Buttons.meta
new file mode 100644
index 0000000..4d51a80
--- /dev/null
+++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Buttons.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 86f1446dfdbc2a94aac993437231aaa4
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Buttons/OpenDialogueButton.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Buttons/OpenDialogueButton.cs
new file mode 100644
index 0000000..3ecfc20
--- /dev/null
+++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Buttons/OpenDialogueButton.cs
@@ -0,0 +1,42 @@
+using UnityEditor;
+using UnityEngine;
+
+namespace SingularityGroup.HotReload.Editor {
+    internal class OpenDialogueButton : IGUIComponent {
+        public readonly string text;
+        public readonly string url;
+        public readonly string title;
+        public readonly string message;
+        public readonly string ok;
+        public readonly string cancel;
+        
+        public OpenDialogueButton(string text, string url, string title, string message, string ok, string cancel) {
+            this.text = text;
+            this.url = url;
+            this.title = title;
+            this.message = message;
+            this.ok = ok;
+            this.cancel = cancel;
+        }
+
+        public void OnGUI() {
+             Render(text, url, title, message, ok, cancel);
+        }
+
+        public static void Render(string text, string url, string title, string message, string ok, string cancel) {
+            if (GUILayout.Button(new GUIContent(text.StartsWith(" ") ? text : " " + text))) {
+                if (EditorUtility.DisplayDialog(title, message, ok, cancel)) {
+                    Application.OpenURL(url);
+                }
+            }
+        }
+        
+        public static void RenderRaw(Rect rect, string text, string url, string title, string message, string ok, string cancel, GUIStyle style = null) {
+            if (GUI.Button(rect, new GUIContent(text.StartsWith(" ") ? text : " " + text), style ?? GUI.skin.button)) {
+                if (EditorUtility.DisplayDialog(title, message, ok, cancel)) {
+                    Application.OpenURL(url);
+                }
+            }
+        }
+    }
+}
diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Buttons/OpenDialogueButton.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Buttons/OpenDialogueButton.cs.meta
new file mode 100644
index 0000000..057e641
--- /dev/null
+++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Buttons/OpenDialogueButton.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 97ca8174f0514e8e9ee5d4be26ed8078
+timeCreated: 1674416481
\ No newline at end of file
diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Buttons/OpenURLButton.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Buttons/OpenURLButton.cs
new file mode 100644
index 0000000..0f1edcc
--- /dev/null
+++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Buttons/OpenURLButton.cs
@@ -0,0 +1,29 @@
+using UnityEditor;
+using UnityEngine;
+
+namespace SingularityGroup.HotReload.Editor {
+    internal class OpenURLButton : IGUIComponent {
+        public readonly string text;
+        public readonly string url;
+        public OpenURLButton(string text, string url) {
+            this.text = text;
+            this.url = url;
+        }
+
+        public void OnGUI() {
+            Render(text, url);
+        }
+
+        public static void Render(string text, string url) {
+            if (GUILayout.Button(new GUIContent(text.StartsWith(" ") ? text : " " + text))) {
+                Application.OpenURL(url);
+            }
+        }
+        
+        public static void RenderRaw(Rect rect, string text, string url, GUIStyle style = null) {
+            if (GUI.Button(rect, new GUIContent(text.StartsWith(" ") ? text : " " + text), style ?? GUI.skin.button)) {
+                Application.OpenURL(url);
+            }
+        }
+    }
+}
diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Buttons/OpenURLButton.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Buttons/OpenURLButton.cs.meta
new file mode 100644
index 0000000..9a7eb23
--- /dev/null
+++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Buttons/OpenURLButton.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ef12252fc9d1f9f438cbd34cf8f7364b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/EditorTextures.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/EditorTextures.cs
new file mode 100644
index 0000000..d20fae9
--- /dev/null
+++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/EditorTextures.cs
@@ -0,0 +1,116 @@
+using UnityEngine;
+
+namespace SingularityGroup.HotReload.Editor {
+    /// 
+    /// Create a new texture only once. Safe access to generated textures.
+    /// 
+    /// 
+    /// If 
+    internal static class EditorTextures {
+        private static Texture2D black;
+        private static Texture2D white;
+        private static Texture2D lightGray225;
+        private static Texture2D lightGray235;
+        private static Texture2D darkGray17;
+        private static Texture2D darkGray30;
+
+        // Texture2D.blackTexture doesn't render properly in Editor GUI.
+        public static Texture2D Black {
+            get {
+                if (!black) {
+                    black = new Texture2D(2, 2, TextureFormat.RGBA32, false);
+                    
+                    var pixels = black.GetPixels32();
+                    for (var i = 0; i < pixels.Length; i++) {
+                        pixels[i] = new Color32(0, 0, 0, byte.MaxValue);
+                    }
+                    black.SetPixels32(pixels);
+                    black.Apply();
+                }
+                return black;
+            }
+        }
+        
+        // Texture2D.whiteTexture might not render properly in Editor GUI.
+        public static Texture2D White {
+            get {
+                
+                if (!white) {
+                    white = new Texture2D(2, 2, TextureFormat.RGBA32, false);
+                    
+                    var pixels = white.GetPixels32();
+                    for (var i = 0; i < pixels.Length; i++) {
+                        pixels[i] = new Color32(byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue);
+                    }
+                    white.SetPixels32(pixels);
+                    white.Apply();
+                }
+                return white;
+            }
+        }
+
+        public static Texture2D DarkGray17 {
+            get {
+                if (!darkGray17) {
+                    darkGray17 = new Texture2D(2, 2, TextureFormat.RGBA32, false);
+                    
+                    var pixels = darkGray17.GetPixels32();
+                    for (var i = 0; i < pixels.Length; i++) {
+                        pixels[i] = new Color32(17, 17, 17, byte.MaxValue);
+                    }
+                    darkGray17.SetPixels32(pixels);
+                    darkGray17.Apply();
+                }
+                return darkGray17;
+            }
+        }
+        
+        public static Texture2D DarkGray40 {
+            get {
+                if (!darkGray30) {
+                    darkGray30 = new Texture2D(2, 2, TextureFormat.RGBA32, false);
+                    
+                    var pixels = darkGray30.GetPixels32();
+                    for (var i = 0; i < pixels.Length; i++) {
+                        pixels[i] = new Color32(40, 40, 40, byte.MaxValue);
+                    }
+                    darkGray30.SetPixels32(pixels);
+                    darkGray30.Apply();
+                }
+                return darkGray30;
+            }
+        }
+
+        public static Texture2D LightGray238 {
+            get {
+                if (!lightGray235) {
+                    lightGray235 = new Texture2D(2, 2, TextureFormat.RGBA32, false);
+                    
+                    var pixels = lightGray235.GetPixels32();
+                    for (var i = 0; i < pixels.Length; i++) {
+                        pixels[i] = new Color32(238, 238, 238, byte.MaxValue);
+                    }
+                    lightGray235.SetPixels32(pixels);
+                    lightGray235.Apply();
+                }
+                return lightGray235;
+            }
+        }
+
+        public static Texture2D LightGray225 {
+            get {
+                if (!lightGray225) {
+                    lightGray225 = new Texture2D(2, 2, TextureFormat.RGBA32, false);
+
+                    var pixels = lightGray225.GetPixels32();
+                    for (var i = 0; i < pixels.Length; i++) {
+                        pixels[i] = new Color32(225, 225, 225, byte.MaxValue);
+                    }
+                    lightGray225.SetPixels32(pixels);
+                    lightGray225.Apply();
+                }
+                return lightGray225;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/EditorTextures.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/EditorTextures.cs.meta
new file mode 100644
index 0000000..9365b09
--- /dev/null
+++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/EditorTextures.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 9116854180be4f2b8fcc0422bcf570a5
+timeCreated: 1674127121
\ No newline at end of file
diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/IGUIComponent.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/IGUIComponent.cs
new file mode 100644
index 0000000..323ce59
--- /dev/null
+++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/IGUIComponent.cs
@@ -0,0 +1,5 @@
+namespace SingularityGroup.HotReload.Editor {
+    internal interface IGUIComponent {
+        void OnGUI();
+    }
+}
diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/IGUIComponent.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/IGUIComponent.cs.meta
new file mode 100644
index 0000000..eb09edb
--- /dev/null
+++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/IGUIComponent.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 893cb208871dab94488cb988920f0ebd
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options.meta
new file mode 100644
index 0000000..32dff3d
--- /dev/null
+++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2b3fa5ea1ed3545429de96b41801942f
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/AllowAndroidAppToMakeHttpRequestsOption.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/AllowAndroidAppToMakeHttpRequestsOption.cs
new file mode 100644
index 0000000..bcdedf8
--- /dev/null
+++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/AllowAndroidAppToMakeHttpRequestsOption.cs
@@ -0,0 +1,48 @@
+using UnityEditor;
+
+namespace SingularityGroup.HotReload.Editor {
+    internal class AllowAndroidAppToMakeHttpRequestsOption : ProjectOptionBase {
+        public override string ShortSummary {
+            get {
+                return "Allow app to make HTTP requests";
+            }
+        }
+
+        public override string Summary => ShortSummary;
+
+        public override bool GetValue(SerializedObject so) {
+            #if UNITY_2022_1_OR_NEWER
+            // use PlayerSettings as the source of truth 
+            return PlayerSettings.insecureHttpOption != InsecureHttpOption.NotAllowed;
+            #else
+            return GetProperty(so).boolValue;
+            #endif
+        }
+
+        public override string ObjectPropertyName =>
+            nameof(HotReloadSettingsObject.AllowAndroidAppToMakeHttpRequests);
+
+        public override void SetValue(SerializedObject so, bool value) {
+            base.SetValue(so, value);
+
+            // Enabling on Unity 2022 or newer → set the Unity option to ‘Development Builds only’
+            #if UNITY_2022_1_OR_NEWER
+            var notAllowed = PlayerSettings.insecureHttpOption == InsecureHttpOption.NotAllowed;
+            if (value) {
+                // user chose to enable it
+                if (notAllowed) {
+                    PlayerSettings.insecureHttpOption = InsecureHttpOption.DevelopmentOnly;
+                }
+            } else {
+                // user chose to disable it
+                PlayerSettings.insecureHttpOption = InsecureHttpOption.NotAllowed;
+            }
+            #endif
+        }
+
+        public override void InnerOnGUI(SerializedObject so) {
+            var description = "For Hot Reload to work on-device, please allow HTTP requests";
+            EditorGUILayout.LabelField(description, HotReloadWindowStyles.WrapStyle);
+        }
+    }
+}
\ No newline at end of file
diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/AllowAndroidAppToMakeHttpRequestsOption.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/AllowAndroidAppToMakeHttpRequestsOption.cs.meta
new file mode 100644
index 0000000..4217a03
--- /dev/null
+++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/AllowAndroidAppToMakeHttpRequestsOption.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0a7442cee510ab4498ca2a846e0c4e92
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/Base.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/Base.meta
new file mode 100644
index 0000000..a16bb70
--- /dev/null
+++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/Base.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: bb8474c37f13d704d96b43e0f681680d
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/Base/HotReloadOptionBase.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/Base/HotReloadOptionBase.cs
new file mode 100644
index 0000000..8cfa457
--- /dev/null
+++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/Base/HotReloadOptionBase.cs
@@ -0,0 +1,57 @@
+using UnityEditor;
+
+namespace SingularityGroup.HotReload.Editor {
+    /// 
+    /// An option stored inside the current Unity project.
+    /// 
+    internal abstract class ProjectOptionBase : IOption, ISerializedProjectOption {
+        public abstract string ShortSummary { get; }
+        public abstract string Summary { get; }
+
+        public virtual bool GetValue(SerializedObject so) {
+            return so.FindProperty(ObjectPropertyName).boolValue;
+        }
+
+        protected SerializedProperty GetProperty(SerializedObject so) {
+            return so.FindProperty(ObjectPropertyName);
+        }
+        
+        public virtual void SetValue(SerializedObject so, bool value) {
+            so.FindProperty(ObjectPropertyName).boolValue = value;
+        }
+
+        public virtual void InnerOnGUI(SerializedObject so) { }
+
+        public abstract string ObjectPropertyName { get; }
+
+        /// 
+        /// Override this if your option is not needed for on-device Hot Reload to work.
+ /// (by default, a project option must be true for Hot Reload to work) + ///
+ public virtual bool IsRequiredForBuild() { + return true; + } + } + + /// + /// An option that is stored on the user's computer (shared between Unity projects). + /// + internal abstract class ComputerOptionBase : IOption { + public abstract string ShortSummary { get; } + public abstract string Summary { get; } + + public abstract bool GetValue(); + + /// Uses for storing the value on the user's computer. + public virtual void SetValue(bool value) { } + + public bool GetValue(SerializedObject so) => GetValue(); + + public virtual void SetValue(SerializedObject so, bool value) => SetValue(value); + + void IOption.InnerOnGUI(SerializedObject so) { + InnerOnGUI(); + } + public virtual void InnerOnGUI() { } + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/Base/HotReloadOptionBase.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/Base/HotReloadOptionBase.cs.meta new file mode 100644 index 0000000..6df327e --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/Base/HotReloadOptionBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dab8ef53c2ee30a40ab6a7e4abd1260c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/Base/OptionInterfaces.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/Base/OptionInterfaces.cs new file mode 100644 index 0000000..e68f3a1 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/Base/OptionInterfaces.cs @@ -0,0 +1,34 @@ +using UnityEditor; + +namespace SingularityGroup.HotReload.Editor { + public interface IOption { + string ShortSummary { get; } + string Summary { get; } + + /// The wrapped by SerializedObject + bool GetValue(SerializedObject so); + + /// + /// Handle the new value. + /// + /// + /// Note: caller must skip calling this if value same as GetValue! + /// + /// The wrapped by SerializedObject + /// + void SetValue(SerializedObject so, bool value); + + /// The wrapped by SerializedObject + void InnerOnGUI(SerializedObject so); + } + + /// + /// An option scoped to the current Unity project. + /// + /// + /// These options are intended to be shared with collaborators and used by Unity Player builds. + /// + public interface ISerializedProjectOption { + string ObjectPropertyName { get; } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/Base/OptionInterfaces.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/Base/OptionInterfaces.cs.meta new file mode 100644 index 0000000..01c775b --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/Base/OptionInterfaces.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0a626aa97160471f85de4646a634bdf1 +timeCreated: 1674574633 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/ExposeServerOption.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/ExposeServerOption.cs new file mode 100644 index 0000000..9b5f4f7 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/ExposeServerOption.cs @@ -0,0 +1,82 @@ +using System; +using System.Threading.Tasks; +using SingularityGroup.HotReload.Editor.Cli; +using UnityEditor; + +namespace SingularityGroup.HotReload.Editor { + internal sealed class ExposeServerOption : ComputerOptionBase { + + public override string ShortSummary => "Allow Devices to Connect"; + public override string Summary => "Allow Devices to Connect (WiFi)"; + + public override void InnerOnGUI() { + string description; + if (GetValue()) { + description = "The HotReload server is reachable from devices on the same Wifi network"; + } else { + description = "The HotReload server is available to your computer only. Other devices cannot connect to it."; + } + EditorGUILayout.LabelField(description, HotReloadWindowStyles.WrapStyle); + } + + public override bool GetValue() { + return HotReloadPrefs.ExposeServerToLocalNetwork; + } + + public override void SetValue(SerializedObject so, bool val) { + // AllowAndroidAppToMakeHttpRequestsOption + if (val == HotReloadPrefs.ExposeServerToLocalNetwork) { + return; + } + + HotReloadPrefs.ExposeServerToLocalNetwork = val; + if (val) { + // they allowed this one for mobile builds, so now we allow everything else needed for player build to work with HR + new AllowAndroidAppToMakeHttpRequestsOption().SetValue(so, true); + } + RunTask(() => { + RunOnMainThreadSync(() => { + var isRunningResult = ServerHealthCheck.I.IsServerHealthy; + if (isRunningResult) { + var restartServer = EditorUtility.DisplayDialog("Hot Reload", + $"When changing '{Summary}', the Hot Reload server must be restarted for this to take effect." + + "\nDo you want to restart it now?", + "Restart server", "Don't restart"); + if (restartServer) { + CodePatcher.I.ClearPatchedMethods(); + EditorCodePatcher.RestartCodePatcher().Forget(); + } + } + }); + }); + } + + void RunTask(Action action) { + var token = HotReloadWindow.Current.cancelToken; + Task.Run(() => { + if (token.IsCancellationRequested) return; + try { + action(); + } catch (Exception ex) { + ThreadUtility.LogException(ex, token); + } + }, token); + } + + void RunTask(Func action) { + var token = HotReloadWindow.Current.cancelToken; + Task.Run(async () => { + if (token.IsCancellationRequested) return; + try { + await action(); + } catch (Exception ex) { + ThreadUtility.LogException(ex, token); + } + }, token); + } + + void RunOnMainThreadSync(Action action) { + ThreadUtility.RunOnMainThread(action, HotReloadWindow.Current.cancelToken); + } + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/ExposeServerOption.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/ExposeServerOption.cs.meta new file mode 100644 index 0000000..2d303ec --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/ExposeServerOption.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5ab0973d3ae1275469237480381842c0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/IncludeInBuildOption.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/IncludeInBuildOption.cs new file mode 100644 index 0000000..3a68134 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/IncludeInBuildOption.cs @@ -0,0 +1,24 @@ +using UnityEditor; + +namespace SingularityGroup.HotReload.Editor { + internal class IncludeInBuildOption : ProjectOptionBase, ISerializedProjectOption { + static IncludeInBuildOption _I; + public static IncludeInBuildOption I = _I ?? (_I = new IncludeInBuildOption()); + public override string ShortSummary => "Include Hot Reload in player builds"; + public override string Summary => ShortSummary; + + public override string ObjectPropertyName => + nameof(HotReloadSettingsObject.IncludeInBuild); + + public override void InnerOnGUI(SerializedObject so) { + string description; + if (GetValue(so)) { + description = "The Hot Reload runtime is included in development builds that use the Mono scripting backend."; + } else { + description = "The Hot Reload runtime will not be included in any build. Use this option to disable HotReload without removing it from your project."; + } + description += " This option does not affect Hot Reload usage in Playmode"; + EditorGUILayout.LabelField(description, HotReloadWindowStyles.WrapStyle); + } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/IncludeInBuildOption.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/IncludeInBuildOption.cs.meta new file mode 100644 index 0000000..f46610d --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Options/IncludeInBuildOption.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 39ed4f822bcd81340bdf7189b3bc5016 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs.meta new file mode 100644 index 0000000..b777231 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9c0f7811020465d46bcd0305e2f83e8a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Base.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Base.meta new file mode 100644 index 0000000..9cec40c --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Base.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 58d14712b7ef14540ba4817a5ef873a6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Base/HotReloadTabBase.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Base/HotReloadTabBase.cs new file mode 100644 index 0000000..7a64888 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Base/HotReloadTabBase.cs @@ -0,0 +1,33 @@ + +using UnityEditor; +using UnityEngine; + +namespace SingularityGroup.HotReload.Editor { + internal abstract class HotReloadTabBase : IGUIComponent { + protected readonly HotReloadWindow _window; + + public string Title { get; } + public Texture Icon { get; } + public string Tooltip { get; } + + public HotReloadTabBase(HotReloadWindow window, string title, Texture iconImage, string tooltip) { + _window = window; + + Title = title; + Icon = iconImage; + Tooltip = tooltip; + } + + public HotReloadTabBase(HotReloadWindow window, string title, string iconName, string tooltip) : + this(window, title, EditorGUIUtility.IconContent(iconName).image, tooltip) { + } + + protected void Repaint() { + _window.Repaint(); + } + + public virtual void Update() { } + + public abstract void OnGUI(); + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Base/HotReloadTabBase.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Base/HotReloadTabBase.cs.meta new file mode 100644 index 0000000..57e00c6 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Base/HotReloadTabBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c2c79b82bd9636d499449f91f93fae2a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Helpers.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Helpers.meta new file mode 100644 index 0000000..0c5c6ba --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Helpers.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a089a7225d904b00b2893a34b514ad28 +timeCreated: 1689791626 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Helpers/RedeemLicenseHelper.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Helpers/RedeemLicenseHelper.cs new file mode 100644 index 0000000..2c2d873 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Helpers/RedeemLicenseHelper.cs @@ -0,0 +1,308 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using SingularityGroup.HotReload.DTO; +using SingularityGroup.HotReload.Newtonsoft.Json; +using UnityEditor; +using UnityEngine; + +namespace SingularityGroup.HotReload.Editor { + internal enum RedeemStage { + None, + Registration, + Redeem, + Login + } + + // IMPORTANT: don't rename + internal enum RegistrationOutcome { + None, + Indie, + Business, + } + + internal class RedeemLicenseHelper { + public static readonly RedeemLicenseHelper I = new RedeemLicenseHelper(); + + private string _pendingCompanySize; + private string _pendingInvoiceNumber; + private string _pendingRedeemEmail; + + private const string registerFlagPath = PackageConst.LibraryCachePath + "/registerFlag.txt"; + public const string registerOutcomePath = PackageConst.LibraryCachePath + "/registerOutcome.txt"; + + public RedeemStage RedeemStage { get; private set; } + public RegistrationOutcome RegistrationOutcome { get; private set; } + public bool RegistrationRequired => RedeemStage != RedeemStage.None; + + private string status; + private string error; + + const string statusSuccess = "success"; + const string statusAlreadyClaimed = "already redeemed by this user/device"; + const string unknownError = "We apologize, an error happened while redeeming your license. Please reach out to customer support for assistance."; + + private GUILayoutOption[] secondaryButtonLayoutOptions = new[] { GUILayout.MaxWidth(100) }; + + private bool requestingRedeem; + private HttpClient redeemClient; + const string redeemUrl = "https://vmhzj6jonn3qy7hk7tx7levpli0bstpj.lambda-url.us-east-1.on.aws/redeem"; + + public RedeemLicenseHelper() { + if (File.Exists(registerFlagPath)) { + RedeemStage = RedeemStage.Registration; + } + try { + if (File.Exists(registerOutcomePath)) { + RegistrationOutcome outcome; + if (Enum.TryParse(File.ReadAllText(registerOutcomePath), out outcome)) { + RegistrationOutcome = outcome; + } + } + } catch (Exception e) { + Log.Warning($"Failed determining registration outcome with {e.GetType().Name}: {e.Message}"); + } + } + + public void RenderStage(HotReloadRunTabState state) { + if (state.redeemStage == RedeemStage.Registration) { + RenderRegistration(); + } else if (state.redeemStage == RedeemStage.Redeem) { + RenderRedeem(); + } else if (state.redeemStage == RedeemStage.Login) { + RenderLogin(state); + } + } + + private void RenderRegistration() { + var message = PackageConst.IsAssetStoreBuild + ? "Unity Pro users are required to obtain an additional license. You are eligible to redeem one if your company has ten or fewer employees. Please enter your company details below." + : "The licensing model for Unity Pro users varies depending on the number of employees in your company. Please enter your company details below."; + if (error != null) { + EditorGUILayout.HelpBox(error, MessageType.Warning); + } else { + EditorGUILayout.HelpBox(message, MessageType.Info); + } + EditorGUILayout.Space(); + EditorGUILayout.Space(); + + EditorGUILayout.LabelField("Comany size (number of employees)"); + GUI.SetNextControlName("company_size"); + _pendingCompanySize = EditorGUILayout.TextField(_pendingCompanySize)?.Trim(); + EditorGUILayout.Space(); + + if (GUILayout.Button("Proceed")) { + int companySize; + if (!int.TryParse(_pendingCompanySize, out companySize)) { + error = "Please enter a number."; + } else { + error = null; + HandleRegistration(companySize); + } + } + } + + void HandleRegistration(int companySize) { + RequestHelper.RequestEditorEvent(new Stat(StatSource.Client, StatLevel.Debug, StatFeature.Licensing, StatEventType.Register), new EditorExtraData { { StatKey.CompanySize, companySize } }); + if (companySize > 10) { + FinishRegistration(RegistrationOutcome.Business); + EditorCodePatcher.DownloadAndRun().Forget(); + } else if (PackageConst.IsAssetStoreBuild) { + SwitchToStage(RedeemStage.Redeem); + } else { + FinishRegistration(RegistrationOutcome.Indie); + EditorCodePatcher.DownloadAndRun().Forget(); + } + } + + private void RenderRedeem() { + if (error != null) { + EditorGUILayout.HelpBox(error, MessageType.Warning); + } else { + EditorGUILayout.HelpBox("To enable us to verify your purchase, please enter your invoice number/order ID. Additionally, provide the email address that you intend to use for managing your credentials.", MessageType.Info); + } + EditorGUILayout.Space(); + EditorGUILayout.Space(); + + EditorGUILayout.LabelField("Invoice number/Order ID"); + GUI.SetNextControlName("invoice_number"); + _pendingInvoiceNumber = EditorGUILayout.TextField(_pendingInvoiceNumber ?? HotReloadPrefs.RedeemLicenseInvoice)?.Trim(); + EditorGUILayout.Space(); + + EditorGUILayout.LabelField("Email"); + GUI.SetNextControlName("email_redeem"); + _pendingRedeemEmail = EditorGUILayout.TextField(_pendingRedeemEmail ?? HotReloadPrefs.RedeemLicenseEmail); + EditorGUILayout.Space(); + + using (new EditorGUI.DisabledScope(requestingRedeem)) { + if (GUILayout.Button("Redeem", HotReloadRunTab.bigButtonHeight)) { + RedeemLicense(email: _pendingRedeemEmail, invoiceNumber: _pendingInvoiceNumber).Forget(); + } + } + EditorGUILayout.Space(); + EditorGUILayout.Space(); + + using (new EditorGUILayout.HorizontalScope()) { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("Skip", secondaryButtonLayoutOptions)) { + SwitchToStage(RedeemStage.Login); + } + GUILayout.FlexibleSpace(); + } + } + + async Task RedeemLicense(string email, string invoiceNumber) { + string validationError; + if (string.IsNullOrEmpty(invoiceNumber)) { + validationError = "Please enter invoice number / order ID."; + } else { + validationError = HotReloadRunTab.ValidateEmail(email); + } + if (validationError != null) { + error = validationError; + return; + } + var resp = await RequestRedeem(email: email, invoiceNumber: invoiceNumber); + status = resp?.status; + if (status != null) { + if (status != statusSuccess && status != statusAlreadyClaimed) { + Log.Error("Redeeming license failed: unknown status received"); + error = unknownError; + } else { + HotReloadPrefs.RedeemLicenseEmail = email; + HotReloadPrefs.RedeemLicenseInvoice = invoiceNumber; + // prepare data for login screen + HotReloadPrefs.LicenseEmail = email; + HotReloadPrefs.LicensePassword = null; + + SwitchToStage(RedeemStage.Login); + } + } else if (resp?.error != null) { + Log.Warning($"Redeeming a license failed with error: {resp.error}"); + error = GetPrettyError(resp); + } else { + Log.Warning("Redeeming a license failed: uknown error encountered"); + error = unknownError; + } + } + + string GetPrettyError(RedeemResponse response) { + var err = response?.error; + if (err == null) { + return unknownError; + } + if (err.Contains("Invalid email")) { + return "Please enter a valid email address."; + } else if (err.Contains("License invoice already redeemed")) { + return "The invoice number/order ID you're trying to use has already been applied to redeem a license. Please enter a different invoice number/order ID. If you have already redeemed a license for another email, you may proceed to the next step."; + } else if (err.Contains("Different license already redeemed by given email")) { + return "The provided email has already been used to redeem a license. If you have previously redeemed a license, you can proceed to the next step and use your existing credentials. If not, please input a different email address."; + } else if (err.Contains("Invoice not found")) { + return "The invoice was not found. Please ensure that you've entered the correct invoice number/order ID."; + } else if (err.Contains("Invoice refunded")) { + return "The purchase has been refunded. Please enter a different invoice number/order ID."; + } else { + return unknownError; + } + } + + async Task RequestRedeem(string email, string invoiceNumber) { + requestingRedeem = true; + await ThreadUtility.SwitchToThreadPool(); + try { + redeemClient = redeemClient ?? (redeemClient = RequestHelper.CreateHttpClient()); + var input = new Dictionary { + { "email", email }, + { "invoice", invoiceNumber } + }; + var content = new StringContent(JsonConvert.SerializeObject(input), Encoding.UTF8, "application/json"); + using (var resp = await redeemClient.PostAsync(redeemUrl, content, HotReloadWindow.Current.cancelToken).ConfigureAwait(false)) { + if (resp.StatusCode != HttpStatusCode.OK) { + return new RedeemResponse(null, $"Redeem request failed. Status code: {(int)resp.StatusCode}, reason: {resp.ReasonPhrase}"); + } + var str = await resp.Content.ReadAsStringAsync().ConfigureAwait(false); + try { + return JsonConvert.DeserializeObject(str); + } catch (Exception ex) { + return new RedeemResponse(null, $"Failed deserializing redeem response with exception: {ex.GetType().Name}: {ex.Message}"); + } + } + } catch (WebException ex) { + return new RedeemResponse(null, $"Redeeming license failed: WebException encountered {ex.Message}"); + } finally { + requestingRedeem = false; + } + } + + private class RedeemResponse { + public string status; + public string error; + + public RedeemResponse(string status, string error) { + this.status = status; + this.error = error; + } + } + + private void RenderLogin(HotReloadRunTabState state) { + if (status == statusSuccess) { + EditorGUILayout.HelpBox("Success! You will receive an email containing your license password shortly. Once you receive it, please enter the received password in the designated field below to complete your registration.", MessageType.Info); + } else if (status == statusAlreadyClaimed) { + EditorGUILayout.HelpBox("Your license has already been redeemed. Please enter your existing password below.", MessageType.Info); + } + EditorGUILayout.Space(); + EditorGUILayout.Space(); + + HotReloadRunTab.RenderLicenseInnerPanel(state, renderLogout: false); + EditorGUILayout.Space(); + EditorGUILayout.Space(); + + using (new EditorGUILayout.HorizontalScope()) { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("Go Back", secondaryButtonLayoutOptions)) { + SwitchToStage(RedeemStage.Redeem); + } + GUILayout.FlexibleSpace(); + } + } + + public void StartRegistration() { + // ReSharper disable once AssignNullToNotNullAttribute + Directory.CreateDirectory(Path.GetDirectoryName(registerFlagPath)); + using (File.Create(registerFlagPath)) { + } + RedeemStage = RedeemStage.Registration; + RegistrationOutcome = RegistrationOutcome.None; + } + + public void FinishRegistration(RegistrationOutcome outcome) { + // ReSharper disable once AssignNullToNotNullAttribute + Directory.CreateDirectory(Path.GetDirectoryName(registerFlagPath)); + File.WriteAllText(registerOutcomePath, outcome.ToString()); + File.Delete(registerFlagPath); + RegistrationOutcome = outcome; + SwitchToStage(RedeemStage.None); + Cleanup(); + } + + void SwitchToStage(RedeemStage stage) { + // remove focus so that the input field re-renders + GUI.FocusControl(null); + RedeemStage = stage; + } + + void Cleanup() { + redeemClient?.Dispose(); + redeemClient = null; + _pendingCompanySize = null; + _pendingInvoiceNumber = null; + _pendingRedeemEmail = null; + status = null; + error = null; + } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Helpers/RedeemLicenseHelper.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Helpers/RedeemLicenseHelper.cs.meta new file mode 100644 index 0000000..364a22f --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/Helpers/RedeemLicenseHelper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ad73f74d3c494c02aae937e2dfa305a2 +timeCreated: 1689791373 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadAboutTab.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadAboutTab.cs new file mode 100644 index 0000000..560f85e --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadAboutTab.cs @@ -0,0 +1,311 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Globalization; +using System.Linq; +using UnityEditor; +using UnityEngine; +using System.Threading.Tasks; +using System.IO; +using SingularityGroup.HotReload.Editor.Cli; +using SingularityGroup.HotReload.Newtonsoft.Json; +using SingularityGroup.HotReload.EditorDependencies; + +namespace SingularityGroup.HotReload.Editor { + internal struct HotReloadAboutTabState { + public readonly bool logsFodlerExists; + public readonly IReadOnlyList changelog; + public readonly bool loginRequired; + public readonly bool hasTrialLicense; + public readonly bool hasPayedLicense; + + public HotReloadAboutTabState( + bool logsFodlerExists, + IReadOnlyList changelog, + bool loginRequired, + bool hasTrialLicense, + bool hasPayedLicense + ) { + this.logsFodlerExists = logsFodlerExists; + this.changelog = changelog; + this.loginRequired = loginRequired; + this.hasTrialLicense = hasTrialLicense; + this.hasPayedLicense = hasPayedLicense; + } + } + + internal class HotReloadAboutTab : HotReloadTabBase { + internal static readonly OpenURLButton seeMore = new OpenURLButton("See More", Constants.ChangelogURL); + internal static readonly OpenDialogueButton manageLicenseButton = new OpenDialogueButton("Manage License", Constants.ManageLicenseURL, "Manage License", "Upgrade/downgrade/edit your subscription and edit payment info.", "Open in browser", "Cancel"); + internal static readonly OpenDialogueButton manageAccountButton = new OpenDialogueButton("Manage Account", Constants.ManageAccountURL, "Manage Account", "Login with company code 'naughtycult'. Use the email you signed up with. Your initial password was sent to you by email.", "Open in browser", "Cancel"); + internal static readonly OpenURLButton contactButton = new OpenURLButton("Contact", Constants.ContactURL); + internal static readonly OpenURLButton discordButton = new OpenURLButton("Join Discord", Constants.DiscordInviteUrl); + internal static readonly OpenDialogueButton reportIssueButton = new OpenDialogueButton("Report issue", Constants.ReportIssueURL, "Report issue", "Report issue in our public issue tracker. Requires gitlab.com account (if you don't have one and are not willing to make it, please contact us by other means such as our website).", "Open in browser", "Cancel"); + + private Vector2 _changelogScroll; + private IReadOnlyList _changelog = new List(); + private bool _requestedChangelog; + private int _changelogRequestAttempt; + private string _changelogDir = Path.Combine(PackageConst.LibraryCachePath, "changelog.json"); + public static string logsPath = Path.Combine(CliUtils.GetAppDataPath(), "logs"); + + private static bool LatestChangelogLoaded(IReadOnlyList changelog) { + return changelog.Any() && changelog[0].versionNum == PackageUpdateChecker.lastRemotePackageVersion; + } + + private async Task FetchChangelog() { + if(!_changelog.Any()) { + var file = new FileInfo(_changelogDir); + if (file.Exists) { + await Task.Run(() => { + var bytes = File.ReadAllText(_changelogDir); + _changelog = JsonConvert.DeserializeObject>(bytes); + }); + } + } + if (_requestedChangelog || LatestChangelogLoaded(_changelog)) { + return; + } + _requestedChangelog = true; + try { + do { + var changelogRequestTimeout = ExponentialBackoff.GetTimeout(_changelogRequestAttempt); + _changelog = await RequestHelper.FetchChangelog() ?? _changelog; + if (LatestChangelogLoaded(_changelog)) { + await Task.Run(() => { + Directory.CreateDirectory(PackageConst.LibraryCachePath); + File.WriteAllText(_changelogDir, JsonConvert.SerializeObject(_changelog)); + }); + Repaint(); + return; + } + await Task.Delay(changelogRequestTimeout); + } while (_changelogRequestAttempt++ < 1000 && !LatestChangelogLoaded(_changelog)); + } catch { + // ignore + } finally { + _requestedChangelog = false; + } + } + + public HotReloadAboutTab(HotReloadWindow window) : base(window, "Help", "_Help", "Info and support for Hot Reload for Unity.") { } + + string GetRelativeDate(DateTime givenDate) { + const int second = 1; + const int minute = 60 * second; + const int hour = 60 * minute; + const int day = 24 * hour; + const int month = 30 * day; + + var ts = new TimeSpan(DateTime.UtcNow.Ticks - givenDate.Ticks); + var delta = Math.Abs(ts.TotalSeconds); + + if (delta < 24 * hour) + return "Today"; + + if (delta < 48 * hour) + return "Yesterday"; + + if (delta < 30 * day) + return ts.Days + " days ago"; + + if (delta < 12 * month) { + var months = Convert.ToInt32(Math.Floor((double)ts.Days / 30)); + return months <= 1 ? "one month ago" : months + " months ago"; + } + var years = Convert.ToInt32(Math.Floor((double)ts.Days / 365)); + return years <= 1 ? "one year ago" : years + " years ago"; + } + + void RenderVersion(ChangelogVersion version) { + var tempTextString = ""; + + //version number + EditorGUILayout.TextArea(version.versionNum, HotReloadWindowStyles.H1TitleStyle); + + //general info + if (version.generalInfo != null) { + EditorGUILayout.TextArea(version.generalInfo, HotReloadWindowStyles.H3TitleStyle); + } + + //features + if (version.features != null) { + EditorGUILayout.TextArea("Features:", HotReloadWindowStyles.H2TitleStyle); + tempTextString = ""; + foreach (var feature in version.features) { + tempTextString += "• " + feature + "\n"; + } + EditorGUILayout.TextArea(tempTextString, HotReloadWindowStyles.ChangelogPointerStyle); + } + + //improvements + if (version.improvements != null) { + EditorGUILayout.TextArea("Improvements:", HotReloadWindowStyles.H2TitleStyle); + tempTextString = ""; + foreach (var improvement in version.improvements) { + tempTextString += "• " + improvement + "\n"; + } + EditorGUILayout.TextArea(tempTextString, HotReloadWindowStyles.ChangelogPointerStyle); + } + + //fixes + if (version.fixes != null) { + EditorGUILayout.TextArea("Fixes:", HotReloadWindowStyles.H2TitleStyle); + tempTextString = ""; + foreach (var fix in version.fixes) { + tempTextString += "• " + fix + "\n"; + } + EditorGUILayout.TextArea(tempTextString, HotReloadWindowStyles.ChangelogPointerStyle); + } + + //date + DateTime date; + if (DateTime.TryParseExact(version.date, "dd/MM/yyyy", null, DateTimeStyles.None, out date)) { + var relativeDate = GetRelativeDate(date); + GUILayout.TextArea(relativeDate, HotReloadWindowStyles.H3TitleStyle); + } + } + + void RenderChangelog() { + FetchChangelog().Forget(); + using (new EditorGUILayout.HorizontalScope(HotReloadWindowStyles.SectionInnerBoxWide)) { + using (new EditorGUILayout.VerticalScope()) { + HotReloadPrefs.ShowChangeLog = EditorGUILayout.Foldout(HotReloadPrefs.ShowChangeLog, "Changelog", true, HotReloadWindowStyles.FoldoutStyle); + if (!HotReloadPrefs.ShowChangeLog) { + return; + } + // changelog versions + var maxChangeLogs = 5; + var index = 0; + foreach (var version in currentState.changelog) { + index++; + if (index > maxChangeLogs) { + break; + } + + using (new EditorGUILayout.HorizontalScope(HotReloadWindowStyles.ChangelogSectionInnerBox)) { + using (new EditorGUILayout.VerticalScope()) { + RenderVersion(version); + } + } + } + // see more button + using (new EditorGUILayout.HorizontalScope(HotReloadWindowStyles.ChangelogSectionInnerBox)) { + seeMore.OnGUI(); + } + } + } + } + + private Vector2 _aboutTabScrollPos; + + HotReloadAboutTabState currentState; + public override void OnGUI() { + // HotReloadAboutTabState ensures rendering is consistent between Layout and Repaint calls + // Without it errors like this happen: + // ArgumentException: Getting control 2's position in a group with only 2 controls when doing repaint + // See thread for more context: https://answers.unity.com/questions/17718/argumentexception-getting-control-2s-position-in-a.html + if (Event.current.type == EventType.Layout) { + currentState = new HotReloadAboutTabState( + logsFodlerExists: Directory.Exists(logsPath), + changelog: _changelog, + loginRequired: EditorCodePatcher.LoginNotRequired, + hasTrialLicense: _window.RunTab.TrialLicense, + hasPayedLicense: _window.RunTab.HasPayedLicense + ); + } + using (var scope = new EditorGUILayout.ScrollViewScope(_aboutTabScrollPos, GUI.skin.horizontalScrollbar, GUI.skin.verticalScrollbar, GUILayout.MaxHeight(Math.Max(HotReloadWindowStyles.windowScreenHeight, 800)), GUILayout.MaxWidth(Math.Max(HotReloadWindowStyles.windowScreenWidth, 800)))) { + _aboutTabScrollPos.x = scope.scrollPosition.x; + _aboutTabScrollPos.y = scope.scrollPosition.y; + + using (new EditorGUILayout.VerticalScope(HotReloadWindowStyles.DynamicSectionHelpTab)) { + using (new EditorGUILayout.VerticalScope()) { + GUILayout.Space(10); + RenderLogButtons(); + + EditorGUILayout.Space(); + EditorGUILayout.HelpBox($" Hot Reload version {PackageConst.Version}. ", MessageType.Info); + EditorGUILayout.Space(); + + RenderHelpButtons(); + + GUILayout.Space(15); + + try { + RenderChangelog(); + } catch { + // ignore + } + } + } + } + } + + void RenderHelpButtons() { + var labelRect = GUILayoutUtility.GetLastRect(); + using (new EditorGUILayout.HorizontalScope()) { + using (new EditorGUILayout.VerticalScope()) { + var buttonHeight = 19; + + var bigButtonRect = new Rect(labelRect.x + 3, labelRect.y + 5, labelRect.width - 6, buttonHeight); + OpenURLButton.RenderRaw(bigButtonRect, "Documentation", Constants.DocumentationURL, HotReloadWindowStyles.HelpTabButton); + + var firstLayerX = bigButtonRect.x; + var firstLayerY = bigButtonRect.y + buttonHeight + 3; + var firstLayerWidth = (int)((bigButtonRect.width / 2) - 3); + + var secondLayerX = firstLayerX + firstLayerWidth + 5; + var secondLayerY = firstLayerY + buttonHeight + 3; + var secondLayerWidth = bigButtonRect.width - firstLayerWidth - 5; + + using (new EditorGUILayout.HorizontalScope()) { + OpenURLButton.RenderRaw(new Rect { x = firstLayerX, y = firstLayerY, width = firstLayerWidth, height = buttonHeight }, contactButton.text, contactButton.url, HotReloadWindowStyles.HelpTabButton); + OpenURLButton.RenderRaw(new Rect { x = secondLayerX, y = firstLayerY, width = secondLayerWidth, height = buttonHeight }, "Unity Forum", Constants.ForumURL, HotReloadWindowStyles.HelpTabButton); + } + using (new EditorGUILayout.HorizontalScope()) { + OpenDialogueButton.RenderRaw(rect: new Rect { x = firstLayerX, y = secondLayerY, width = firstLayerWidth, height = buttonHeight }, text: reportIssueButton.text, url: reportIssueButton.url, title: reportIssueButton.title, message: reportIssueButton.message, ok: reportIssueButton.ok, cancel: reportIssueButton.cancel, style: HotReloadWindowStyles.HelpTabButton); + OpenURLButton.RenderRaw(new Rect { x = secondLayerX, y = secondLayerY, width = secondLayerWidth, height = buttonHeight }, discordButton.text, discordButton.url, HotReloadWindowStyles.HelpTabButton); + } + } + } + GUILayout.Space(80); + } + + void RenderLogButtons() { + if (currentState.logsFodlerExists) { + EditorGUILayout.Space(); + EditorGUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + if (GUILayout.Button("Open Log File")) { + var mostRecentFile = LogsHelper.FindRecentLog(logsPath); + if (mostRecentFile == null) { + Log.Info("No logs found"); + } else { + try { + Process.Start($"\"{Path.Combine(logsPath, mostRecentFile)}\""); + } catch (Win32Exception e) { + if (e.Message.Contains("Application not found")) { + try { + Process.Start("notepad.exe", $"\"{Path.Combine(logsPath, mostRecentFile)}\""); + } catch { + // Fallback to opening folder with all logs + Process.Start($"\"{logsPath}\""); + Log.Info("Failed opening log file."); + } + } + } catch { + // Fallback to opening folder with all logs + Process.Start($"\"{logsPath}\""); + Log.Info("Failed opening log file."); + } + } + } + if (GUILayout.Button("Browse all logs")) { + Process.Start($"\"{logsPath}\""); + } + EditorGUILayout.EndHorizontal(); + } + } + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadAboutTab.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadAboutTab.cs.meta new file mode 100644 index 0000000..08411c7 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadAboutTab.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7cf8e9ef1ab770249a4318e88e882a85 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadOptionsSection.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadOptionsSection.cs new file mode 100644 index 0000000..63b5c43 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadOptionsSection.cs @@ -0,0 +1,49 @@ +using UnityEditor; +using UnityEngine; + +namespace SingularityGroup.HotReload.Editor { + internal class HotReloadOptionsSection { + /// + /// Opening options tab does not automatically create the settings asset file. + /// - The Options UI shows defaults if the object asset doesn't exist. + /// - When a build starts, we also ensure the asset file exists. + /// + public void DrawGUI(SerializedObject so) { + so.Update(); // must update in-case asset was modified externally + + foreach (var option in HotReloadSettingsTab.allOptions) { + GUILayout.Space(4f); + DrawOption(option, so); + } + + // commit any changes to the underlying ScriptableObject + if (so.hasModifiedProperties) { + so.ApplyModifiedProperties(); + // Ensure asset file exists on disk, because we initially create it in memory (to provide the default values) + // This does not save the asset, user has to do that by saving assets in Unity (e.g. press hotkey Ctrl + S) + var target = so.targetObject as HotReloadSettingsObject; + if (target == null) { + Log.Warning("Unexpected problem unable to save HotReloadSettingsObject"); + } else { + // when one of the project options changed then we ensure the asset file exists. + HotReloadSettingsEditor.EnsureSettingsCreated(target); + } + } + } + + static void DrawOption(IOption option, SerializedObject so) { + EditorGUILayout.BeginVertical(HotReloadWindowStyles.BoxStyle); + + var before = option.GetValue(so); + var after = EditorGUILayout.BeginToggleGroup(new GUIContent(" " + option.Summary), before); + if (after != before) { + option.SetValue(so, after); + } + + option.InnerOnGUI(so); + + EditorGUILayout.EndToggleGroup(); + EditorGUILayout.EndVertical(); + } + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadOptionsSection.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadOptionsSection.cs.meta new file mode 100644 index 0000000..92caa62 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadOptionsSection.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 24379a407eff8494eac0f7841b70e574 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadRunTab.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadRunTab.cs new file mode 100644 index 0000000..573a624 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadRunTab.cs @@ -0,0 +1,1362 @@ +using System; +using System.Collections.Generic; +using System.IO; +using SingularityGroup.HotReload.DTO; +using SingularityGroup.HotReload.EditorDependencies; +using UnityEditor; +using UnityEditor.Compilation; +using UnityEngine; +using Color = UnityEngine.Color; +using Task = System.Threading.Tasks.Task; +#if UNITY_2019_4_OR_NEWER +using Unity.CodeEditor; +#endif + +namespace SingularityGroup.HotReload.Editor { + internal class ErrorData { + public string fileName; + public string error; + public TextAsset file; + public int lineNumber; + public string stacktrace; + public string linkString; + private static string[] supportedPaths = new[] { Path.GetFullPath("Assets"), Path.GetFullPath("Plugins") }; + + public static ErrorData GetErrorData(string errorString) { + // Get the relevant file name + string stackTrace = errorString; + string fileName = null; + try { + int csIndex = 0; + int attempt = 0; + do { + csIndex = errorString.IndexOf(".cs", csIndex + 1, StringComparison.Ordinal); + if (csIndex == -1) { + break; + } + int fileNameStartIndex = csIndex - 1; + for (; fileNameStartIndex >= 0; fileNameStartIndex--) { + if (!char.IsLetter(errorString[fileNameStartIndex])) { + if (errorString.Contains("error CS")) { + fileName = errorString.Substring(fileNameStartIndex + 1, + csIndex - fileNameStartIndex + ".cs".Length - 1); + } else { + fileName = errorString.Substring(fileNameStartIndex, + csIndex - fileNameStartIndex + ".cs".Length); + } + break; + } + } + } while (attempt++ < 100 && fileName == null); + } catch { + // ignore + } + fileName = fileName ?? "Tap to show stacktrace"; + + // Get the error + string error = (errorString.Contains("error CS") + ? "Compile error, " + : "Unsupported change detected, ") + "tap here to see more."; + int endOfError = errorString.IndexOf(". in ", StringComparison.Ordinal); + string specialChars = "\"'/\\"; + char[] characters = specialChars.ToCharArray(); + int specialChar = errorString.IndexOfAny(characters); + try { + if (errorString.Contains("error CS") ) { + error = errorString.Substring(errorString.IndexOf("error CS", StringComparison.Ordinal), errorString.Length - errorString.IndexOf("error CS", StringComparison.Ordinal)).Trim(); + using (StringReader reader = new StringReader(error)) { + string line; + while ((line = reader.ReadLine()) != null) { + error = line; + break; + } + } + } else if (errorString.StartsWith("errors:", StringComparison.Ordinal) && endOfError > 0) { + error = errorString.Substring("errors: ".Length, endOfError - "errors: ".Length).Trim(); + } else if (errorString.StartsWith("errors:", StringComparison.Ordinal) && specialChar > 0) { + error = errorString.Substring("errors: ".Length, specialChar - "errors: ".Length).Trim(); + } + } catch { + // ignore + } + + // Get relative path + TextAsset file = null; + foreach (var path in supportedPaths) { + int lastprojectIndex = 0; + int attempt = 0; + while (attempt++ < 100 && !file) { + lastprojectIndex = errorString.IndexOf(path, lastprojectIndex + 1, StringComparison.Ordinal); + if (lastprojectIndex == -1) { + break; + } + var fullCsIndex = errorString.IndexOf(".cs", lastprojectIndex, StringComparison.Ordinal); + var candidateAbsolutePath = errorString.Substring(lastprojectIndex, fullCsIndex - lastprojectIndex + ".cs".Length); + var candidateRelativePath = EditorCodePatcher.GetRelativePath(filespec: candidateAbsolutePath, folder: path); + file = AssetDatabase.LoadAssetAtPath(candidateRelativePath); + } + } + + // Get the line number + int lineNumber = 0; + try { + int lastIndex = 0; + int attempt = 0; + do { + lastIndex = errorString.IndexOf(fileName, lastIndex + 1, StringComparison.Ordinal); + if (lastIndex == -1) { + break; + } + var part = errorString.Substring(lastIndex + fileName.Length); + if (!part.StartsWith(errorString.Contains("error CS") ? "(" : ":", StringComparison.Ordinal) + || part.Length == 1 + || !char.IsDigit(part[1]) + ) { + continue; + } + int y = 1; + for (; y < part.Length; y++) { + if (!char.IsDigit(part[y])) { + break; + } + } + if (int.TryParse(part.Substring(1, errorString.Contains("error CS") ? y - 1 : y), out lineNumber)) { + break; + } + } while (attempt++ < 100); + } catch { + //ignore + } + + return new ErrorData() { + fileName = fileName, + error = error, + file = file, + lineNumber = lineNumber, + stacktrace = stackTrace, + linkString = lineNumber > 0 ? fileName + ":" + lineNumber : fileName + }; + } + + } + + internal struct HotReloadRunTabState { + public readonly bool spinnerActive; + public readonly string indicationIconPath; + public readonly bool requestingDownloadAndRun; + public readonly bool starting; + public readonly bool stopping; + public readonly bool running; + public readonly Tuple startupProgress; + public readonly string indicationStatusText; + public readonly LoginStatusResponse loginStatus; + public readonly bool downloadRequired; + public readonly bool downloadStarted; + public readonly bool requestingLoginInfo; + public readonly RedeemStage redeemStage; + public readonly int suggestionCount; + + public HotReloadRunTabState( + bool spinnerActive, + string indicationIconPath, + bool requestingDownloadAndRun, + bool starting, + bool stopping, + bool running, + Tuple startupProgress, + string indicationStatusText, + LoginStatusResponse loginStatus, + bool downloadRequired, + bool downloadStarted, + bool requestingLoginInfo, + RedeemStage redeemStage, + int suggestionCount + ) { + this.spinnerActive = spinnerActive; + this.indicationIconPath = indicationIconPath; + this.requestingDownloadAndRun = requestingDownloadAndRun; + this.starting = starting; + this.stopping = stopping; + this.running = running; + this.startupProgress = startupProgress; + this.indicationStatusText = indicationStatusText; + this.loginStatus = loginStatus; + this.downloadRequired = downloadRequired; + this.downloadStarted = downloadStarted; + this.requestingLoginInfo = requestingLoginInfo; + this.redeemStage = redeemStage; + this.suggestionCount = suggestionCount; + } + + public static HotReloadRunTabState Current => new HotReloadRunTabState( + spinnerActive: EditorIndicationState.SpinnerActive, + indicationIconPath: EditorIndicationState.IndicationIconPath, + requestingDownloadAndRun: EditorCodePatcher.RequestingDownloadAndRun, + starting: EditorCodePatcher.Starting, + stopping: EditorCodePatcher.Stopping, + running: EditorCodePatcher.Running, + startupProgress: EditorCodePatcher.StartupProgress, + indicationStatusText: EditorIndicationState.IndicationStatusText, + loginStatus: EditorCodePatcher.Status, + downloadRequired: EditorCodePatcher.DownloadRequired, + downloadStarted: EditorCodePatcher.DownloadStarted, + requestingLoginInfo: EditorCodePatcher.RequestingLoginInfo, + redeemStage: RedeemLicenseHelper.I.RedeemStage, + suggestionCount: HotReloadTimelineHelper.Suggestions.Count + ); + } + + internal struct LicenseErrorData { + public readonly string description; + public bool showBuyButton; + public string buyButtonText; + public readonly bool showLoginButton; + public readonly string loginButtonText; + public readonly bool showSupportButton; + public readonly string supportButtonText; + public readonly bool showManageLicenseButton; + public readonly string manageLicenseButtonText; + + public LicenseErrorData(string description, bool showManageLicenseButton = false, string manageLicenseButtonText = "", string loginButtonText = "", bool showSupportButton = false, string supportButtonText = "", bool showBuyButton = false, string buyButtonText = "", bool showLoginButton = false) { + this.description = description; + this.showManageLicenseButton = showManageLicenseButton; + this.manageLicenseButtonText = manageLicenseButtonText; + this.loginButtonText = loginButtonText; + this.showSupportButton = showSupportButton; + this.supportButtonText = supportButtonText; + this.showBuyButton = showBuyButton; + this.buyButtonText = buyButtonText; + this.showLoginButton = showLoginButton; + } + } + + internal class HotReloadRunTab : HotReloadTabBase { + private static string _pendingEmail; + private static string _pendingPassword; + private string _pendingPromoCode; + private bool _requestingActivatePromoCode; + + private static Tuple _activateInfoMessage; + + private HotReloadRunTabState currentState => _window.RunTabState; + // Has Indie or Pro license (even if not currenctly active) + public bool HasPayedLicense => currentState.loginStatus != null && (currentState.loginStatus.isIndieLicense || currentState.loginStatus.isBusinessLicense); + public bool TrialLicense => currentState.loginStatus != null && (currentState.loginStatus?.isTrial == true); + + private Vector2 _patchedMethodsScrollPos; + private Vector2 _runTabScrollPos; + + private string promoCodeError; + private MessageType promoCodeErrorType; + private bool promoCodeActivatedThisSession; + + public HotReloadRunTab(HotReloadWindow window) : base(window, "Run", "forward", "Run and monitor the current Hot Reload session.") { } + + public override void OnGUI() { + using(new EditorGUILayout.VerticalScope()) { + OnGUICore(); + } + } + + internal static bool ShouldRenderConsumption(HotReloadRunTabState currentState) => (currentState.running && !currentState.starting && !currentState.stopping && currentState.loginStatus?.isLicensed != true && currentState.loginStatus?.isFree != true && !EditorCodePatcher.LoginNotRequired) && !(currentState.loginStatus == null || currentState.loginStatus.isFree); + + void OnGUICore() { + using (var scope = new EditorGUILayout.ScrollViewScope(_runTabScrollPos, GUI.skin.horizontalScrollbar, GUI.skin.verticalScrollbar, GUILayout.MaxHeight(Math.Max(HotReloadWindowStyles.windowScreenHeight, 800)), GUILayout.MaxWidth(Math.Max(HotReloadWindowStyles.windowScreenWidth, 800)))) { + _runTabScrollPos.x = scope.scrollPosition.x; + _runTabScrollPos.y = scope.scrollPosition.y; + using (new EditorGUILayout.VerticalScope(HotReloadWindowStyles.DynamiSection)) { + if (HotReloadWindowStyles.windowScreenWidth > Constants.UpgradeLicenseNoteHideWidth + && HotReloadWindowStyles.windowScreenHeight > Constants.UpgradeLicenseNoteHideHeight + ) { + RenderUpgradeLicenseNote(currentState, HotReloadWindowStyles.UpgradeLicenseButtonStyle); + } + + RenderIndicationPanel(); + + if (CanRenderBars(currentState)) { + RenderBars(currentState); + // clear red dot next time button shows + HotReloadState.ShowingRedDot = false; + } + } + } + + // At the end to not fuck up rendering https://answers.unity.com/questions/400454/argumentexception-getting-control-0s-position-in-a-1.html + var renderStart = !EditorCodePatcher.Running && !EditorCodePatcher.Starting && !currentState.requestingDownloadAndRun && currentState.redeemStage == RedeemStage.None; + var e = Event.current; + if (renderStart && e.type == EventType.KeyUp + && (e.keyCode == KeyCode.Return + || e.keyCode == KeyCode.KeypadEnter) + ) { + EditorCodePatcher.DownloadAndRun().Forget(); + } + } + + internal static void RenderUpgradeLicenseNote(HotReloadRunTabState currentState, GUIStyle style) { + var isIndie = RedeemLicenseHelper.I.RegistrationOutcome == RegistrationOutcome.Indie + || EditorCodePatcher.licenseType == UnityLicenseType.UnityPersonalPlus; + + if (RedeemLicenseHelper.I.RegistrationOutcome == RegistrationOutcome.Business + && currentState.loginStatus?.isBusinessLicense != true + && EditorCodePatcher.Running + && (PackageConst.IsAssetStoreBuild || HotReloadPrefs.RateAppShown) + ) { + // Warn asset store users they need to buy a business license + // Website users get reminded after using Hot Reload for 5+ days + RenderBusinessLicenseInfo(style); + } else if (isIndie + && HotReloadPrefs.RateAppShown + && !PackageConst.IsAssetStoreBuild + && EditorCodePatcher.Running + && currentState.loginStatus?.isBusinessLicense != true + && currentState.loginStatus?.isIndieLicense != true + ) { + // Reminder users they need to buy an indie license + RenderIndieLicenseInfo(style); + } + } + + internal static bool CanRenderBars(HotReloadRunTabState currentState) { + return HotReloadWindowStyles.windowScreenHeight > Constants.EventsListHideHeight + && HotReloadWindowStyles.windowScreenWidth > Constants.EventsListHideWidth + && !currentState.starting + && !currentState.stopping + && !currentState.requestingDownloadAndRun + ; + } + + static Texture2D GetFoldoutIcon(AlertEntry alertEntry) { + InvertibleIcon alertIcon = InvertibleIcon.FoldoutClosed; + if (HotReloadTimelineHelper.expandedEntries.Contains(alertEntry)) { + alertIcon = InvertibleIcon.FoldoutOpen; + } + return GUIHelper.GetInvertibleIcon(alertIcon); + } + + static void ToggleEntry(AlertEntry alertEntry) { + if (HotReloadTimelineHelper.expandedEntries.Contains(alertEntry)) { + HotReloadTimelineHelper.expandedEntries.Remove(alertEntry); + } else { + HotReloadTimelineHelper.expandedEntries.Add(alertEntry); + } + } + + static void RenderEntries(TimelineType timelineType) { + List alertEntries; + + alertEntries = timelineType == TimelineType.Suggestions ? HotReloadTimelineHelper.Suggestions : HotReloadTimelineHelper.EventsTimeline; + + bool skipChildren = false; + for (int i = 0; i < alertEntries.Count; i++) { + var alertEntry = alertEntries[i]; + if (i > HotReloadTimelineHelper.maxVisibleEntries && alertEntry.entryType != EntryType.Child) { + break; + } + if (timelineType != TimelineType.Suggestions) { + if (alertEntry.entryType != EntryType.Child + && !enabledFilters.Contains(alertEntry.alertType) + ) { + skipChildren = true; + continue; + } else if (alertEntry.entryType == EntryType.Child && skipChildren) { + continue; + } else { + skipChildren = false; + } + } + + EntryType entryType = alertEntry.entryType; + + string title = $" {alertEntry.title}{(!string.IsNullOrEmpty(alertEntry.shortDescription) ? $": {alertEntry.shortDescription}": "")}"; + Texture2D icon = null; + GUIStyle style; + if (entryType != EntryType.Child) { + icon = GUIHelper.GetLocalIcon(HotReloadTimelineHelper.alertIconString[alertEntry.iconType]); + } + if (entryType == EntryType.Child) { + style = HotReloadWindowStyles.ChildBarStyle; + } else if (entryType == EntryType.Foldout) { + style = HotReloadWindowStyles.FoldoutBarStyle; + } else { + style = HotReloadWindowStyles.BarStyle; + } + + Rect startRect; + using (new EditorGUILayout.HorizontalScope()) { + GUILayout.Space(0); + Rect spaceRect = GUILayoutUtility.GetLastRect(); + // entry header foldout arrow + if (entryType == EntryType.Foldout) { + GUI.Label(new Rect(spaceRect.x + 3, spaceRect.y, 20, 20), new GUIContent(GetFoldoutIcon(alertEntry))); + } else if (entryType == EntryType.Child) { + GUI.Label(new Rect(spaceRect.x + 26, spaceRect.y + 2, 20, 20), new GUIContent(GetFoldoutIcon(alertEntry))); + } + // a workaround to limit the width of the label + GUILayout.Label(new GUIContent(""), style); + startRect = GUILayoutUtility.GetLastRect(); + GUI.Label(startRect, new GUIContent(title, icon), style); + } + + bool clickableDescription = alertEntry.title == "Unsupported change" || alertEntry.title == "Compile error" || alertEntry.title == "Failed applying patch to method"; + + if (HotReloadTimelineHelper.expandedEntries.Contains(alertEntry) || alertEntry.alertType == AlertType.CompileError) { + using (new EditorGUILayout.VerticalScope()) { + using (new EditorGUILayout.HorizontalScope()) { + using (new EditorGUILayout.VerticalScope(entryType == EntryType.Child ? HotReloadWindowStyles.ChildEntryBoxStyle : HotReloadWindowStyles.EntryBoxStyle)) { + if (alertEntry.alertType == AlertType.Suggestion) { + GUILayout.Label(alertEntry.description, HotReloadWindowStyles.LabelStyle); + } else if (!clickableDescription) { + string text = alertEntry.description; + GUILayout.TextArea(text, HotReloadWindowStyles.StacktraceTextAreaStyle); + } + if (alertEntry.actionData != null) { + alertEntry.actionData.Invoke(); + } + GUILayout.Space(5f); + } + } + } + } + + // remove button + if (timelineType == TimelineType.Suggestions && alertEntry.hasExitButton) { + var isClick = GUI.Button(new Rect(startRect.x + startRect.width - 20, startRect.y + 2, 20, 20), new GUIContent(GUIHelper.GetInvertibleIcon(InvertibleIcon.Close)), HotReloadWindowStyles.RemoveIconStyle); + if (isClick) { + HotReloadTimelineHelper.EventsTimeline.Remove(alertEntry); + var kind = HotReloadSuggestionsHelper.FindSuggestionKind(alertEntry); + if (kind != null) { + HotReloadSuggestionsHelper.SetSuggestionInactive((HotReloadSuggestionKind)kind); + } + _instantRepaint = true; + } + } + + // Extend background to whole entry + var endRect = GUILayoutUtility.GetLastRect(); + if (GUI.Button(new Rect(startRect) { height = endRect.y - startRect.y + endRect.height}, new GUIContent(""), HotReloadWindowStyles.BarBackgroundStyle) && (entryType == EntryType.Child || entryType == EntryType.Foldout)) { + ToggleEntry(alertEntry); + } + + if (alertEntry.alertType != AlertType.Suggestion && HotReloadWindowStyles.windowScreenWidth > 400 && entryType != EntryType.Child) { + using (new EditorGUILayout.HorizontalScope()) { + GUI.Label(new Rect(startRect.x + startRect.width - 60, startRect.y, 80, 20), $"{alertEntry.timestamp.Hour:D2}:{alertEntry.timestamp.Minute:D2}:{alertEntry.timestamp.Second:D2}", HotReloadWindowStyles.TimestampStyle); + } + } + + GUILayout.Space(1f); + } + if (timelineType != TimelineType.Suggestions && HotReloadTimelineHelper.GetRunTabTimelineEventCount() > 40) { + GUILayout.Space(3f); + GUILayout.Label(Constants.Only40EntriesShown, HotReloadWindowStyles.EmptyListText); + } + } + + private static List _enabledFilters; + private static List enabledFilters { + get { + if (_enabledFilters == null) { + _enabledFilters = new List(); + } + + if (HotReloadPrefs.RunTabUnsupportedChangesFilter && !_enabledFilters.Contains(AlertType.UnsupportedChange)) + _enabledFilters.Add(AlertType.UnsupportedChange); + if (!HotReloadPrefs.RunTabUnsupportedChangesFilter && _enabledFilters.Contains(AlertType.UnsupportedChange)) + _enabledFilters.Remove(AlertType.UnsupportedChange); + + if (HotReloadPrefs.RunTabCompileErrorFilter && !_enabledFilters.Contains(AlertType.CompileError)) + _enabledFilters.Add(AlertType.CompileError); + if (!HotReloadPrefs.RunTabCompileErrorFilter && _enabledFilters.Contains(AlertType.CompileError)) + _enabledFilters.Remove(AlertType.CompileError); + + if (HotReloadPrefs.RunTabPartiallyAppliedPatchesFilter && !_enabledFilters.Contains(AlertType.PartiallySupportedChange)) + _enabledFilters.Add(AlertType.PartiallySupportedChange); + if (!HotReloadPrefs.RunTabPartiallyAppliedPatchesFilter && _enabledFilters.Contains(AlertType.PartiallySupportedChange)) + _enabledFilters.Remove(AlertType.PartiallySupportedChange); + + if (HotReloadPrefs.RunTabAppliedPatchesFilter && !_enabledFilters.Contains(AlertType.AppliedChange)) + _enabledFilters.Add(AlertType.AppliedChange); + if (!HotReloadPrefs.RunTabAppliedPatchesFilter && _enabledFilters.Contains(AlertType.AppliedChange)) + _enabledFilters.Remove(AlertType.AppliedChange); + + return _enabledFilters; + } + } + + private Vector2 suggestionsScroll; + static GUILayoutOption[] timelineButtonOptions = new[] { GUILayout.Height(27), GUILayout.Width(100) }; + + internal static void RenderBars(HotReloadRunTabState currentState) { + if (currentState.suggestionCount > 0) { + GUILayout.Space(5f); + + using (new EditorGUILayout.HorizontalScope(HotReloadWindowStyles.Section)) { + using (new EditorGUILayout.VerticalScope()) { + HotReloadPrefs.RunTabEventsSuggestionsFoldout = EditorGUILayout.Foldout(HotReloadPrefs.RunTabEventsSuggestionsFoldout, "", true, HotReloadWindowStyles.CustomFoldoutStyle); + GUILayout.Space(-23); + if (GUILayout.Button($"Suggestions ({currentState.suggestionCount.ToString()})", HotReloadWindowStyles.ClickableLabelBoldStyle, GUILayout.Height(27))) { + HotReloadPrefs.RunTabEventsSuggestionsFoldout = !HotReloadPrefs.RunTabEventsSuggestionsFoldout; + } + if (HotReloadPrefs.RunTabEventsSuggestionsFoldout) { + using (new EditorGUILayout.VerticalScope(HotReloadWindowStyles.Scroll)) { + RenderEntries(TimelineType.Suggestions); + } + } + } + } + } + GUILayout.Space(5f); + + using (new EditorGUILayout.HorizontalScope(HotReloadWindowStyles.Section)) { + using (new EditorGUILayout.VerticalScope()) { + HotReloadPrefs.RunTabEventsTimelineFoldout = EditorGUILayout.Foldout(HotReloadPrefs.RunTabEventsTimelineFoldout, "", true, HotReloadWindowStyles.CustomFoldoutStyle); + GUILayout.Space(-23); + if (GUILayout.Button("Timeline", HotReloadWindowStyles.ClickableLabelBoldStyle, timelineButtonOptions)) { + HotReloadPrefs.RunTabEventsTimelineFoldout = !HotReloadPrefs.RunTabEventsTimelineFoldout; + } + if (HotReloadPrefs.RunTabEventsTimelineFoldout) { + GUILayout.Space(-10); + var noteShown = HotReloadTimelineHelper.GetRunTabTimelineEventCount() == 0 || !currentState.running; + using (new EditorGUILayout.HorizontalScope()) { + if (noteShown) { + GUILayout.Space(2f); + using (new EditorGUILayout.VerticalScope()) { + GUILayout.Space(2f); + string text; + if (currentState.redeemStage != RedeemStage.None) { + text = "Complete registration before using Hot Reload"; + } else if (!currentState.running) { + text = "Use the Start button to activate Hot Reload"; + } else if (enabledFilters.Count < 4 && HotReloadTimelineHelper.EventsTimeline.Count != 0) { + text = "Enable filters to see events"; + } else { + text = "Make code changes to see events"; + } + GUILayout.Label(text, HotReloadWindowStyles.EmptyListText); + } + GUILayout.FlexibleSpace(); + } else { + GUILayout.FlexibleSpace(); + if (HotReloadTimelineHelper.EventsTimeline.Count > 0 && GUILayout.Button("Clear")) { + HotReloadTimelineHelper.ClearEntries(); + if (HotReloadWindow.Current) { + HotReloadWindow.Current.Repaint(); + } + } + GUILayout.Space(3); + } + } + if (!noteShown) { + GUILayout.Space(2f); + using (new EditorGUILayout.VerticalScope(HotReloadWindowStyles.Scroll)) { + RenderEntries(TimelineType.Timeline); + } + } + } + } + } + } + + internal static void RenderConsumption(LoginStatusResponse loginStatus) { + if (loginStatus == null) { + return; + } + EditorGUILayout.Space(); + + EditorGUILayout.LabelField($"Hot Reload Limited", HotReloadWindowStyles.H3CenteredTitleStyle); + EditorGUILayout.Space(); + if (loginStatus.consumptionsUnavailableReason == ConsumptionsUnavailableReason.NetworkUnreachable) { + EditorGUILayout.HelpBox("Something went wrong. Please check your internet connection.", MessageType.Warning); + } else if (loginStatus.consumptionsUnavailableReason == ConsumptionsUnavailableReason.UnrecoverableError) { + EditorGUILayout.HelpBox("Something went wrong. Please contact support if the issue persists.", MessageType.Error); + } else if (loginStatus.freeSessionFinished) { + var now = DateTime.UtcNow; + var sessionRefreshesAt = (now.AddDays(1).Date - now).Add(TimeSpan.FromMinutes(5)); + var sessionRefreshString = $"Next Session: {(sessionRefreshesAt.Hours > 0 ? $"{sessionRefreshesAt.Hours}h " : "")}{sessionRefreshesAt.Minutes}min"; + HotReloadGUIHelper.HelpBox(sessionRefreshString, MessageType.Warning, fontSize: 11); + } else if (loginStatus.freeSessionRunning && loginStatus.freeSessionEndTime != null) { + var sessionEndsAt = loginStatus.freeSessionEndTime.Value - DateTime.Now; + var sessionString = $"Daily Session: {(sessionEndsAt.Hours > 0 ? $"{sessionEndsAt.Hours}h " : "")}{sessionEndsAt.Minutes}min Left"; + HotReloadGUIHelper.HelpBox(sessionString, MessageType.Info, fontSize: 11); + } else if (loginStatus.freeSessionEndTime == null) { + HotReloadGUIHelper.HelpBox("Daily Session: Make code changes to start", MessageType.Info, fontSize: 11); + } + } + + static bool _repaint; + static bool _instantRepaint; + static DateTime _lastRepaint; + private EditorIndicationState.IndicationStatus _lastStatus; + public override void Update() { + if (EditorIndicationState.SpinnerActive) { + _repaint = true; + } + if (EditorCodePatcher.DownloadRequired) { + _repaint = true; + } + if (EditorIndicationState.IndicationIconPath == Spinner.SpinnerIconPath) { + _repaint = true; + } + try { + // workaround: hovering over non-buttons doesn't repain by default + if (EditorWindow.mouseOverWindow == HotReloadWindow.Current) { + _repaint = true; + } + if (EditorWindow.mouseOverWindow + && EditorWindow.mouseOverWindow?.GetType() == typeof(PopupWindow) + && HotReloadEventPopup.I.open + ) { + _repaint = true; + } + } catch (NullReferenceException) { + // Unity randomly throws nullrefs when EditorWindow.mouseOverWindow gets accessed + } + if (_repaint && DateTime.UtcNow - _lastRepaint > TimeSpan.FromMilliseconds(33)) { + _repaint = false; + _instantRepaint = true; + } + // repaint on status change + var status = EditorIndicationState.CurrentIndicationStatus; + if (_lastStatus != status) { + _lastStatus = status; + _instantRepaint = true; + } + if (_instantRepaint) { + Repaint(); + HotReloadEventPopup.I.Repaint(); + _instantRepaint = false; + _repaint = false; + _lastRepaint = DateTime.UtcNow; + } + } + + public static void RepaintInstant() { + _instantRepaint = true; + } + + private void RenderRecompileButton() { + string recompileText = HotReloadWindowStyles.windowScreenWidth > Constants.RecompileButtonTextHideWidth ? " Recompile" : ""; + var recompileButton = new GUIContent(recompileText, GUIHelper.GetInvertibleIcon(InvertibleIcon.Recompile)); + if (!GUILayout.Button(recompileButton, HotReloadWindowStyles.RecompileButton)) { + return; + } + RecompileWithChecks(); + } + + public static void RecompileWithChecks() { + var firstDialoguePass = HotReloadPrefs.RecompileDialogueShown + || EditorUtility.DisplayDialog( + title: "Hot Reload auto-applies changes", + message: "Using the Recompile button is only necessary when Hot Reload fails to apply your changes. \n\nDo you wish to proceed?", + ok: "Recompile", + cancel: "Not now"); + HotReloadPrefs.RecompileDialogueShown = true; + if (!firstDialoguePass) { + return; + } + var secondDialoguePass = !Application.isPlaying + || EditorUtility.DisplayDialog( + title: "Stop Play Mode and Recompile?", + message: "Using the Recompile button will stop Play Mode.\n\nDo you wish to proceed?", + ok: "Stop and Recompile", + cancel: "Cancel"); + if (!secondDialoguePass) { + return; + } + Recompile(); + } + + public static bool recompiling; + public static void Recompile() { + recompiling = true; + EditorApplication.isPlaying = false; + + CompileMethodDetourer.Reset(); + AssetDatabase.Refresh(); + CompilationPipeline.RequestScriptCompilation(); + } + + private void RenderIndicationButtons() { + if (currentState.requestingDownloadAndRun || currentState.starting || currentState.stopping || currentState.redeemStage != RedeemStage.None) { + return; + } + + if (!currentState.running && (currentState.startupProgress?.Item1 ?? 0) == 0) { + string startText = HotReloadWindowStyles.windowScreenWidth > Constants.StartButtonTextHideWidth ? " Start" : ""; + if (GUILayout.Button(new GUIContent(startText, GUIHelper.GetInvertibleIcon(InvertibleIcon.Start)), HotReloadWindowStyles.StartButton)) { + EditorCodePatcher.DownloadAndRun().Forget(); + } + } else if (currentState.running && !currentState.starting) { + if (HotReloadWindowStyles.windowScreenWidth > 150 && HotReloadTimelineHelper.CompileErrorsCount == 0) { + RenderRecompileButton(); + } + string stopText = HotReloadWindowStyles.windowScreenWidth > Constants.StartButtonTextHideWidth ? " Stop" : ""; + if (GUILayout.Button(new GUIContent(stopText, GUIHelper.GetInvertibleIcon(InvertibleIcon.Stop)), HotReloadWindowStyles.StopButton)) { + if (!EditorCodePatcher.StoppedServerRecently()) { + EditorCodePatcher.StopCodePatcher().Forget(); + } + } + } + } + + void RenderIndicationPanel() { + using (new EditorGUILayout.HorizontalScope(HotReloadWindowStyles.SectionInnerBox)) { + RenderIndication(); + if (HotReloadWindowStyles.windowScreenWidth > Constants.IndicationTextHideWidth) { + GUILayout.FlexibleSpace(); + } + RenderIndicationButtons(); + if (HotReloadWindowStyles.windowScreenWidth <= Constants.IndicationTextHideWidth) { + GUILayout.FlexibleSpace(); + } + } + if (currentState.requestingDownloadAndRun || currentState.starting) { + RenderProgressBar(); + } + if (HotReloadWindowStyles.windowScreenWidth > Constants.ConsumptionsHideWidth + && HotReloadWindowStyles.windowScreenHeight > Constants.ConsumptionsHideHeight + ) { + RenderLicenseInfo(currentState); + } + } + + internal static void RenderLicenseInfo(HotReloadRunTabState currentState) { + var showRedeem = currentState.redeemStage != RedeemStage.None; + var showConsumptions = ShouldRenderConsumption(currentState); + if (!showConsumptions && !showRedeem) { + return; + } + using (new EditorGUILayout.VerticalScope()) { + // space needed only for consumptions because of Stop/Start button's margin + if (showConsumptions) { + GUILayout.Space(6); + } + using (new EditorGUILayout.VerticalScope(HotReloadWindowStyles.Section)) { + if (showRedeem) { + RedeemLicenseHelper.I.RenderStage(currentState); + } else { + RenderConsumption(currentState.loginStatus); + GUILayout.Space(10); + RenderLicenseInfo(currentState, currentState.loginStatus); + RenderLicenseButtons(currentState); + GUILayout.Space(10); + } + } + GUILayout.Space(6); + } + } + + private Spinner _spinner = new Spinner(85); + private void RenderIndication() { + using (new EditorGUILayout.HorizontalScope(HotReloadWindowStyles.IndicationBox)) { + // icon box + if (HotReloadWindowStyles.windowScreenWidth <= Constants.IndicationTextHideWidth) { + GUILayout.FlexibleSpace(); + } + + using (new EditorGUILayout.HorizontalScope(HotReloadWindowStyles.IndicationHelpBox)) { + var text = HotReloadWindowStyles.windowScreenWidth > Constants.IndicationTextHideWidth ? $" {currentState.indicationStatusText}" : ""; + if (currentState.indicationIconPath == Spinner.SpinnerIconPath) { + GUILayout.Label(new GUIContent(text, _spinner.GetIcon()), style: HotReloadWindowStyles.IndicationIcon); + } else if (currentState.indicationIconPath != null) { + var style = HotReloadWindowStyles.IndicationIcon; + if (HotReloadTimelineHelper.alertIconString.ContainsValue(currentState.indicationIconPath)) { + style = HotReloadWindowStyles.IndicationAlertIcon; + } + GUILayout.Label(new GUIContent(text, GUIHelper.GetLocalIcon(currentState.indicationIconPath)), style); + } + } + } + } + + static GUIStyle _openSettingsStyle; + static GUIStyle openSettingsStyle => _openSettingsStyle ?? (_openSettingsStyle = new GUIStyle(GUI.skin.button) { + fontStyle = FontStyle.Normal, + fixedHeight = 25, + }); + + static GUILayoutOption[] _bigButtonHeight; + public static GUILayoutOption[] bigButtonHeight => _bigButtonHeight ?? (_bigButtonHeight = new [] {GUILayout.Height(25)}); + + private static GUIContent indieLicenseContent; + private static GUIContent businessLicenseContent; + + internal static void RenderLicenseStatusInfo(HotReloadRunTabState currentState, LoginStatusResponse loginStatus, bool allowHide = true, bool verbose = false) { + string message = null; + MessageType messageType = default(MessageType); + Action customGUI = null; + GUIContent content = null; + if (loginStatus == null) { + // no info + } else if (loginStatus.lastLicenseError != null) { + messageType = !loginStatus.freeSessionFinished ? MessageType.Warning : MessageType.Error; + message = GetMessageFromError(currentState, loginStatus.lastLicenseError); + } else if (loginStatus.isTrial && !PackageConst.IsAssetStoreBuild) { + message = $"Using Trial license, valid until {loginStatus.licenseExpiresAt.ToShortDateString()}"; + messageType = MessageType.Info; + } else if (loginStatus.isIndieLicense) { + if (verbose) { + message = " Indie license active"; + messageType = MessageType.Info; + customGUI = () => { + if (loginStatus.licenseExpiresAt.Date != DateTime.MaxValue.Date) { + EditorGUILayout.LabelField($"License will renew on {loginStatus.licenseExpiresAt.ToShortDateString()}."); + EditorGUILayout.Space(); + } + using (new GUILayout.HorizontalScope()) { + HotReloadAboutTab.manageLicenseButton.OnGUI(); + HotReloadAboutTab.manageAccountButton.OnGUI(); + } + EditorGUILayout.Space(); + }; + if (indieLicenseContent == null) { + indieLicenseContent = new GUIContent(message, EditorGUIUtility.FindTexture("TestPassed")); + } + content = indieLicenseContent; + } + } else if (loginStatus.isBusinessLicense) { + if (verbose) { + message = " Business license active"; + messageType = MessageType.Info; + if (businessLicenseContent == null) { + businessLicenseContent = new GUIContent(message, EditorGUIUtility.FindTexture("TestPassed")); + } + content = businessLicenseContent; + customGUI = () => { + using (new GUILayout.HorizontalScope()) { + HotReloadAboutTab.manageLicenseButton.OnGUI(); + HotReloadAboutTab.manageAccountButton.OnGUI(); + } + EditorGUILayout.Space(); + }; + } + } + + if (messageType != MessageType.Info && HotReloadPrefs.ErrorHidden && allowHide) { + return; + } + if (message != null) { + if (messageType != MessageType.Info) { + using(new EditorGUILayout.HorizontalScope()) { + EditorGUILayout.HelpBox(message, messageType); + var style = HotReloadWindowStyles.HideButtonStyle; + if (Event.current.type == EventType.Repaint) { + style.fixedHeight = GUILayoutUtility.GetLastRect().height; + } + if (allowHide) { + if (GUILayout.Button("Hide", style)) { + HotReloadPrefs.ErrorHidden = true; + } + } + } + } else if (content != null) { + EditorGUILayout.LabelField(content); + EditorGUILayout.Space(); + } else { + EditorGUILayout.LabelField(message); + EditorGUILayout.Space(); + } + customGUI?.Invoke(); + } + } + + const string assetStoreProInfo = "Unity Pro/Enterprise users from company with your number of employees require a Business license. Please upgrade your license on our website."; + internal static void RenderBusinessLicenseInfo(GUIStyle style) { + GUILayout.Space(8); + using (new EditorGUILayout.HorizontalScope()) { + EditorGUILayout.HelpBox(assetStoreProInfo, MessageType.Info); + if (Event.current.type == EventType.Repaint) { + style.fixedHeight = GUILayoutUtility.GetLastRect().height; + } + if (GUILayout.Button("Upgrade", style)) { + Application.OpenURL(Constants.ProductPurchaseBusinessURL); + } + } + } + + internal static void RenderIndieLicenseInfo(GUIStyle style) { + string message; + if (EditorCodePatcher.licenseType == UnityLicenseType.UnityPersonalPlus) { + message = "Unity Plus users require an Indie license. Please upgrade your license on our website."; + } else if (EditorCodePatcher.licenseType == UnityLicenseType.UnityPro) { + message = "Unity Pro/Enterprise users from company with your number of employees require an Indie license. Please upgrade your license on our website."; + } else { + return; + } + GUILayout.Space(8); + using (new EditorGUILayout.HorizontalScope()) { + EditorGUILayout.HelpBox(message, MessageType.Info); + if (Event.current.type == EventType.Repaint) { + style.fixedHeight = GUILayoutUtility.GetLastRect().height; + } + if (GUILayout.Button("Upgrade", style)) { + Application.OpenURL(Constants.ProductPurchaseURL); + } + } + } + + const string GetLicense = "Get License"; + const string ContactSupport = "Contact Support"; + const string UpgradeLicense = "Upgrade License"; + const string ManageLicense = "Manage License"; + internal static Dictionary _licenseErrorData; + internal static Dictionary LicenseErrorData => _licenseErrorData ?? (_licenseErrorData = new Dictionary { + { "DeviceNotLicensedException", new LicenseErrorData(description: "Another device is using your license. Please reach out to customer support for assistance.", showSupportButton: true, supportButtonText: ContactSupport) }, + { "DeviceBlacklistedException", new LicenseErrorData(description: "You device has been blacklisted.") }, + { "DateHeaderInvalidException", new LicenseErrorData(description: $"Your license is not working because your computer's clock is incorrect. Please set the clock to the correct time to restore your license.") }, + { "DateTimeCheatingException", new LicenseErrorData(description: $"Your license is not working because your computer's clock is incorrect. Please set the clock to the correct time to restore your license.") }, + { "LicenseActivationException", new LicenseErrorData(description: "An error has occured while activating your license. Please contact customer support for assistance.", showSupportButton: true, supportButtonText: ContactSupport) }, + { "LicenseDeletedException", new LicenseErrorData(description: $"Your license has been deleted. Please contact customer support for assistance.", showBuyButton: true, buyButtonText: GetLicense, showSupportButton: true, supportButtonText: ContactSupport) }, + { "LicenseDisabledException", new LicenseErrorData(description: $"Your license has been disabled. Please contact customer support for assistance.", showBuyButton: true, buyButtonText: GetLicense, showSupportButton: true, supportButtonText: ContactSupport) }, + { "LicenseExpiredException", new LicenseErrorData(description: $"Your license has expired. Please renew your license subscription using the 'Upgrade License' button below and login with your email/password to activate your license.", showBuyButton: true, buyButtonText: UpgradeLicense, showManageLicenseButton: true, manageLicenseButtonText: ManageLicense) }, + { "LicenseInactiveException", new LicenseErrorData(description: $"Your license is currenty inactive. Please login with your email/password to activate your license.") }, + { "LocalLicenseException", new LicenseErrorData(description: $"Your license file was damaged or corrupted. Please login with your email/password to refresh your license file.") }, + // Note: obsolete + { "MissingParametersException", new LicenseErrorData(description: "An account already exists for this device. Please login with your existing email/password.", showBuyButton: true, buyButtonText: GetLicense) }, + { "NetworkException", new LicenseErrorData(description: "There is an issue connecting to our servers. Please check your internet connection or contact customer support if the issue persists.", showSupportButton: true, supportButtonText: ContactSupport) }, + { "TrialLicenseExpiredException", new LicenseErrorData(description: $"Your trial has expired. Activate a license with unlimited usage or continue using the Free version. View available plans on our website.", showBuyButton: true, buyButtonText: UpgradeLicense) }, + { "InvalidCredentialException", new LicenseErrorData(description: "Incorrect email/password. You can find your initial password in the sign-up email.") }, + // Note: activating free trial with email is not supported anymore. This error shouldn't happen which is why we should rather user the fallback + // { "LicenseNotFoundException", new LicenseErrorData(description: "The account you're trying to access doesn't seem to exist yet. Please enter your email address to create a new account and receive a trial license.", showLoginButton: true, loginButtonText: CreateAccount) }, + { "LicenseIncompatibleException", new LicenseErrorData(description: "Please upgrade your license to continue using hotreload with Unity Pro.", showManageLicenseButton: true, manageLicenseButtonText: ManageLicense) }, + }); + internal static LicenseErrorData defaultLicenseErrorData = new LicenseErrorData(description: "We apologize, an error happened while verifying your license. Please reach out to customer support for assistance.", showSupportButton: true, supportButtonText: ContactSupport); + + internal static string GetMessageFromError(HotReloadRunTabState currentState, string error) { + if (PackageConst.IsAssetStoreBuild && error == "TrialLicenseExpiredException") { + return assetStoreProInfo; + } + return GetLicenseErrorDataOrDefault(currentState, error).description; + } + + internal static LicenseErrorData GetLicenseErrorDataOrDefault(HotReloadRunTabState currentState, string error) { + if (currentState.loginStatus?.isFree == true) { + return default(LicenseErrorData); + } + if (currentState.loginStatus == null || string.IsNullOrEmpty(error) && (!currentState.loginStatus.isLicensed || currentState.loginStatus.isTrial)) { + return new LicenseErrorData(null, showBuyButton: true, buyButtonText: GetLicense); + } + if (string.IsNullOrEmpty(error)) { + return default(LicenseErrorData); + } + if (!LicenseErrorData.ContainsKey(error)) { + return defaultLicenseErrorData; + } + return LicenseErrorData[error]; + } + + internal static void RenderBuyLicenseButton(string buyLicenseButton) { + OpenURLButton.Render(buyLicenseButton, Constants.ProductPurchaseURL); + } + + static void RenderLicenseActionButtons(HotReloadRunTabState currentState) { + var errInfo = GetLicenseErrorDataOrDefault(currentState, currentState.loginStatus?.lastLicenseError); + if (errInfo.showBuyButton || errInfo.showManageLicenseButton) { + using(new EditorGUILayout.HorizontalScope()) { + if (errInfo.showBuyButton) { + RenderBuyLicenseButton(errInfo.buyButtonText); + } + if (errInfo.showManageLicenseButton && !HotReloadPrefs.ErrorHidden) { + OpenURLButton.Render(errInfo.manageLicenseButtonText, Constants.ManageLicenseURL); + } + } + } + if (errInfo.showLoginButton && GUILayout.Button(errInfo.loginButtonText, openSettingsStyle)) { + // show license section + HotReloadWindow.Current.SelectTab(typeof(HotReloadSettingsTab)); + HotReloadWindow.Current.SettingsTab.FocusLicenseFoldout(); + } + if (errInfo.showSupportButton && !HotReloadPrefs.ErrorHidden) { + OpenURLButton.Render(errInfo.supportButtonText, Constants.ContactURL); + } + if (currentState.loginStatus?.lastLicenseError != null) { + HotReloadAboutTab.reportIssueButton.OnGUI(); + } + } + + internal static void RenderLicenseInfo(HotReloadRunTabState currentState, LoginStatusResponse loginStatus, bool verbose = false, bool allowHide = true, string overrideActionButton = null, bool showConsumptions = false) { + HotReloadPrefs.ShowLogin = EditorGUILayout.Foldout(HotReloadPrefs.ShowLogin, "Hot Reload License", true, HotReloadWindowStyles.FoldoutStyle); + if (HotReloadPrefs.ShowLogin) { + EditorGUILayout.Space(); + if ((loginStatus?.isLicensed != true && showConsumptions) && !(loginStatus == null || loginStatus.isFree)) { + RenderConsumption(loginStatus); + } + RenderLicenseStatusInfo(currentState, loginStatus: loginStatus, allowHide: allowHide, verbose: verbose); + + RenderLicenseInnerPanel(currentState, overrideActionButton: overrideActionButton); + + EditorGUILayout.Space(); + EditorGUILayout.Space(); + } + } + + internal void RenderPromoCodes() { + HotReloadPrefs.ShowPromoCodes = EditorGUILayout.Foldout(HotReloadPrefs.ShowPromoCodes, "Promo Codes", true, HotReloadWindowStyles.FoldoutStyle); + if (!HotReloadPrefs.ShowPromoCodes) { + return; + } + if (promoCodeActivatedThisSession) { + EditorGUILayout.HelpBox($"Your promo code has been successfully activated. Free trial has been extended by 3 months.", MessageType.Info); + } else { + if (promoCodeError != null && promoCodeErrorType != MessageType.None) { + EditorGUILayout.HelpBox(promoCodeError, promoCodeErrorType); + } + EditorGUILayout.LabelField("Promo code"); + _pendingPromoCode = EditorGUILayout.TextField(_pendingPromoCode); + EditorGUILayout.Space(); + + using (new EditorGUI.DisabledScope(_requestingActivatePromoCode)) { + if (GUILayout.Button("Activate promo code", HotReloadRunTab.bigButtonHeight)) { + RequestActivatePromoCode().Forget(); + } + } + } + + EditorGUILayout.Space(); + EditorGUILayout.Space(); + } + + private async Task RequestActivatePromoCode() { + _requestingActivatePromoCode = true; + try { + var resp = await RequestHelper.RequestActivatePromoCode(_pendingPromoCode); + if (resp != null && resp.error == null) { + promoCodeActivatedThisSession = true; + } else { + var requestError = resp?.error ?? "Network error"; + var errorType = ToErrorType(requestError); + promoCodeError = ToPrettyErrorMessage(errorType); + promoCodeErrorType = ToMessageType(errorType); + } + } finally { + _requestingActivatePromoCode = false; + } + } + + PromoCodeErrorType ToErrorType(string error) { + switch (error) { + case "Input is missing": return PromoCodeErrorType.MISSING_INPUT; + case "only POST is supported": return PromoCodeErrorType.INVALID_HTTP_METHOD; + case "body is not a valid json": return PromoCodeErrorType.BODY_INVALID; + case "Promo code is not found": return PromoCodeErrorType.PROMO_CODE_NOT_FOUND; + case "Promo code already claimed": return PromoCodeErrorType.PROMO_CODE_CLAIMED; + case "Promo code expired": return PromoCodeErrorType.PROMO_CODE_EXPIRED; + case "License not found": return PromoCodeErrorType.LICENSE_NOT_FOUND; + case "License is not a trial": return PromoCodeErrorType.LICENSE_NOT_TRIAL; + case "License already extended": return PromoCodeErrorType.LICENSE_ALREADY_EXTENDED; + case "conditionalCheckFailed": return PromoCodeErrorType.CONDITIONAL_CHECK_FAILED; + } + if (error.Contains("Updating License Failed with error")) { + return PromoCodeErrorType.UPDATING_LICENSE_FAILED; + } else if (error.Contains("Unknown exception")) { + return PromoCodeErrorType.UNKNOWN_EXCEPTION; + } else if (error.Contains("Unsupported path")) { + return PromoCodeErrorType.UNSUPPORTED_PATH; + } + return PromoCodeErrorType.NONE; + } + + string ToPrettyErrorMessage(PromoCodeErrorType errorType) { + var defaultMsg = "We apologize, an error happened while activating your promo code. Please reach out to customer support for assistance."; + switch (errorType) { + case PromoCodeErrorType.MISSING_INPUT: + case PromoCodeErrorType.INVALID_HTTP_METHOD: + case PromoCodeErrorType.BODY_INVALID: + case PromoCodeErrorType.UNKNOWN_EXCEPTION: + case PromoCodeErrorType.UNSUPPORTED_PATH: + case PromoCodeErrorType.LICENSE_NOT_FOUND: + case PromoCodeErrorType.UPDATING_LICENSE_FAILED: + case PromoCodeErrorType.LICENSE_NOT_TRIAL: + return defaultMsg; + case PromoCodeErrorType.PROMO_CODE_NOT_FOUND: return "Your promo code is invalid. Please ensure that you have entered the correct promo code."; + case PromoCodeErrorType.PROMO_CODE_CLAIMED: return "Your promo code has already been used."; + case PromoCodeErrorType.PROMO_CODE_EXPIRED: return "Your promo code has expired."; + case PromoCodeErrorType.LICENSE_ALREADY_EXTENDED: return "Your license has already been activated with a promo code. Only one promo code activation per license is allowed."; + case PromoCodeErrorType.CONDITIONAL_CHECK_FAILED: return "We encountered an error while activating your promo code. Please try again. If the issue persists, please contact our customer support team for assistance."; + case PromoCodeErrorType.NONE: return "There is an issue connecting to our servers. Please check your internet connection or contact customer support if the issue persists."; + default: return defaultMsg; + } + } + + MessageType ToMessageType(PromoCodeErrorType errorType) { + switch (errorType) { + case PromoCodeErrorType.MISSING_INPUT: return MessageType.Error; + case PromoCodeErrorType.INVALID_HTTP_METHOD: return MessageType.Error; + case PromoCodeErrorType.BODY_INVALID: return MessageType.Error; + case PromoCodeErrorType.PROMO_CODE_NOT_FOUND: return MessageType.Warning; + case PromoCodeErrorType.PROMO_CODE_CLAIMED: return MessageType.Warning; + case PromoCodeErrorType.PROMO_CODE_EXPIRED: return MessageType.Warning; + case PromoCodeErrorType.LICENSE_NOT_FOUND: return MessageType.Error; + case PromoCodeErrorType.LICENSE_NOT_TRIAL: return MessageType.Error; + case PromoCodeErrorType.LICENSE_ALREADY_EXTENDED: return MessageType.Warning; + case PromoCodeErrorType.UPDATING_LICENSE_FAILED: return MessageType.Error; + case PromoCodeErrorType.CONDITIONAL_CHECK_FAILED: return MessageType.Error; + case PromoCodeErrorType.UNKNOWN_EXCEPTION: return MessageType.Error; + case PromoCodeErrorType.UNSUPPORTED_PATH: return MessageType.Error; + case PromoCodeErrorType.NONE: return MessageType.Error; + default: return MessageType.Error; + } + } + + public static void RenderLicenseButtons(HotReloadRunTabState currentState) { + RenderLicenseActionButtons(currentState); + } + + internal static void RenderLicenseInnerPanel(HotReloadRunTabState currentState, string overrideActionButton = null, bool renderLogout = true) { + EditorGUILayout.LabelField("Email"); + GUI.SetNextControlName("email"); + _pendingEmail = EditorGUILayout.TextField(string.IsNullOrEmpty(_pendingEmail) ? HotReloadPrefs.LicenseEmail : _pendingEmail); + _pendingEmail = _pendingEmail.Trim(); + + EditorGUILayout.LabelField("Password"); + GUI.SetNextControlName("password"); + _pendingPassword = EditorGUILayout.PasswordField(string.IsNullOrEmpty(_pendingPassword) ? HotReloadPrefs.LicensePassword : _pendingPassword); + + RenderSwitchAuthMode(); + + var e = Event.current; + using(new EditorGUI.DisabledScope(currentState.requestingLoginInfo)) { + var btnLabel = overrideActionButton; + if (String.IsNullOrEmpty(overrideActionButton)) { + btnLabel = "Login"; + } + using (new EditorGUILayout.HorizontalScope()) { + var focusedControl = GUI.GetNameOfFocusedControl(); + if (GUILayout.Button(btnLabel, bigButtonHeight) + || (focusedControl == "email" + || focusedControl == "password") + && e.type == EventType.KeyUp + && (e.keyCode == KeyCode.Return + || e.keyCode == KeyCode.KeypadEnter) + ) { + var error = ValidateEmail(_pendingEmail); + if (!string.IsNullOrEmpty(error)) { + _activateInfoMessage = new Tuple(error, MessageType.Warning); + } else if (string.IsNullOrEmpty(_pendingPassword)) { + _activateInfoMessage = new Tuple("Please enter your password.", MessageType.Warning); + } else { + HotReloadWindow.Current.SelectTab(typeof(HotReloadRunTab)); + + _activateInfoMessage = null; + if (RedeemLicenseHelper.I.RedeemStage == RedeemStage.Login) { + RedeemLicenseHelper.I.FinishRegistration(RegistrationOutcome.Indie); + } + if (!EditorCodePatcher.RequestingDownloadAndRun && !EditorCodePatcher.Running) { + LoginOnDownloadAndRun(new LoginData(email: _pendingEmail, password: _pendingPassword)).Forget(); + } else { + EditorCodePatcher.RequestLogin(_pendingEmail, _pendingPassword).Forget(); + } + } + } + if (renderLogout) { + RenderLogout(currentState); + } + } + } + if (_activateInfoMessage != null && (e.type == EventType.Layout || e.type == EventType.Repaint)) { + EditorGUILayout.HelpBox(_activateInfoMessage.Item1, _activateInfoMessage.Item2); + } + } + + public static string ValidateEmail(string email) { + if (string.IsNullOrEmpty(email)) { + return "Please enter your email address."; + } else if (!EditorWindowHelper.IsValidEmailAddress(email)) { + return "Please enter a valid email address."; + } else if (email.Contains("+")) { + return "Mail extensions (in a form of 'username+suffix@example.com') are not supported yet. Please provide your original email address (such as 'username@example.com' without '+suffix' part) as we're working on resolving this issue."; + } + return null; + } + + public static void RenderLogout(HotReloadRunTabState currentState) { + if (currentState.loginStatus?.isLicensed != true) { + return; + } + if (GUILayout.Button("Logout", bigButtonHeight)) { + HotReloadWindow.Current.SelectTab(typeof(HotReloadRunTab)); + if (!EditorCodePatcher.RequestingDownloadAndRun && !EditorCodePatcher.Running) { + LogoutOnDownloadAndRun().Forget(); + } else { + RequestLogout().Forget(); + } + } + } + + async static Task LoginOnDownloadAndRun(LoginData loginData = null) { + var ok = await EditorCodePatcher.DownloadAndRun(loginData); + if (ok && loginData != null) { + HotReloadPrefs.ErrorHidden = false; + HotReloadPrefs.LicenseEmail = loginData.email; + HotReloadPrefs.LicensePassword = loginData.password; + } + } + + async static Task LogoutOnDownloadAndRun() { + var ok = await EditorCodePatcher.DownloadAndRun(); + if (!ok) { + return; + } + await RequestLogout(); + } + + private async static Task RequestLogout() { + int i = 0; + while (!EditorCodePatcher.Running && i < 100) { + await Task.Delay(100); + i++; + } + var resp = await RequestHelper.RequestLogout(); + if (!EditorCodePatcher.RequestingLoginInfo && resp != null) { + EditorCodePatcher.HandleStatus(resp); + } + } + + private static void RenderSwitchAuthMode() { + var color = EditorGUIUtility.isProSkin ? new Color32(0x3F, 0x9F, 0xFF, 0xFF) : new Color32(0x0F, 0x52, 0xD7, 0xFF); + if (HotReloadGUIHelper.LinkLabel("Forgot password?", 12, FontStyle.Normal, TextAnchor.MiddleLeft, color)) { + if (EditorUtility.DisplayDialog("Recover password", "Use company code 'naughtycult' and the email you signed up with in order to recover your account.", "Open in browser", "Cancel")) { + Application.OpenURL(Constants.ForgotPasswordURL); + } + } + } + + Texture2D _greenTextureLight; + Texture2D _greenTextureDark; + Texture2D GreenTexture => EditorGUIUtility.isProSkin + ? _greenTextureDark ? _greenTextureDark : (_greenTextureDark = MakeTexture(0.5f)) + : _greenTextureLight ? _greenTextureLight : (_greenTextureLight = MakeTexture(0.85f)); + + private void RenderProgressBar() { + if (currentState.downloadRequired && !currentState.downloadStarted) { + return; + } + + using(var scope = new EditorGUILayout.VerticalScope(HotReloadWindowStyles.MiddleCenterStyle)) { + float progress; + var bg = HotReloadWindowStyles.ProgressBarBarStyle.normal.background; + try { + HotReloadWindowStyles.ProgressBarBarStyle.normal.background = GreenTexture; + var barRect = scope.rect; + + barRect.height = 25; + if (currentState.downloadRequired) { + barRect.width = barRect.width - 65; + using (new EditorGUILayout.HorizontalScope()) { + progress = EditorCodePatcher.DownloadProgress; + EditorGUI.ProgressBar(barRect, Mathf.Clamp(progress, 0f, 1f), ""); + if (GUI.Button(new Rect(barRect) { x = barRect.x + barRect.width + 5, height = barRect.height, width = 60 }, new GUIContent(" Info", GUIHelper.GetLocalIcon("alert_info")))) { + Application.OpenURL(Constants.AdditionalContentURL); + } + } + } else { + progress = EditorCodePatcher.Stopping ? 1 : Mathf.Clamp(EditorCodePatcher.StartupProgress?.Item1 ?? 0f, 0f, 1f); + EditorGUI.ProgressBar(barRect, progress, ""); + } + GUILayout.Space(barRect.height); + } finally { + HotReloadWindowStyles.ProgressBarBarStyle.normal.background = bg; + } + } + } + + private Texture2D MakeTexture(float maxHue) { + var width = 11; + var height = 11; + Color[] pix = new Color[width * height]; + for (int y = 0; y < height; y++) { + var middle = Math.Ceiling(height / (double)2); + var maxGreen = maxHue; + var yCoord = y + 1; + var green = maxGreen - Math.Abs(yCoord - middle) * 0.02; + for (int x = 0; x < width; x++) { + pix[y * width + x] = new Color(0.1f, (float)green, 0.1f, 1.0f); + } + } + var result = new Texture2D(width, height); + result.SetPixels(pix); + result.Apply(); + return result; + } + + + /* + [MenuItem("codepatcher/restart")] + public static void TestRestart() { + CodePatcherCLI.Restart(Application.dataPath, false); + } + */ + + } + + internal static class HotReloadGUIHelper { + public static bool LinkLabel(string labelText, int fontSize, FontStyle fontStyle, TextAnchor alignment, Color? color = null) { + var stl = EditorStyles.label; + + // copy + var origSize = stl.fontSize; + var origStyle = stl.fontStyle; + var origAnchor = stl.alignment; + var origColor = stl.normal.textColor; + + // temporarily modify the built-in style + stl.fontSize = fontSize; + stl.fontStyle = fontStyle; + stl.alignment = alignment; + stl.normal.textColor = color ?? origColor; + stl.active.textColor = color ?? origColor; + stl.focused.textColor = color ?? origColor; + stl.hover.textColor = color ?? origColor; + + try { + return GUILayout.Button(labelText, stl); + } finally{ + // set the editor style (stl) back to normal + stl.fontSize = origSize; + stl.fontStyle = origStyle; + stl.alignment = origAnchor; + stl.normal.textColor = origColor; + stl.active.textColor = origColor; + stl.focused.textColor = origColor; + stl.hover.textColor = origColor; + } + } + + public static void HelpBox(string message, MessageType type, int fontSize) { + var _fontSize = EditorStyles.helpBox.fontSize; + try { + EditorStyles.helpBox.fontSize = fontSize; + EditorGUILayout.HelpBox(message, type); + } finally { + EditorStyles.helpBox.fontSize = _fontSize; + } + } + } + + internal enum PromoCodeErrorType { + NONE, + MISSING_INPUT, + INVALID_HTTP_METHOD, + BODY_INVALID, + PROMO_CODE_NOT_FOUND, + PROMO_CODE_CLAIMED, + PROMO_CODE_EXPIRED, + LICENSE_NOT_FOUND, + LICENSE_NOT_TRIAL, + LICENSE_ALREADY_EXTENDED, + UPDATING_LICENSE_FAILED, + CONDITIONAL_CHECK_FAILED, + UNKNOWN_EXCEPTION, + UNSUPPORTED_PATH, + } + + internal class LoginData { + public readonly string email; + public readonly string password; + + public LoginData(string email, string password) { + this.email = email; + this.password = password; + } + } +} + diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadRunTab.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadRunTab.cs.meta new file mode 100644 index 0000000..55a7ec2 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadRunTab.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 38d0877009d34a9458f7d169d7f1b6a7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadSettingsTab.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadSettingsTab.cs new file mode 100644 index 0000000..bbfbd07 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadSettingsTab.cs @@ -0,0 +1,698 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using SingularityGroup.HotReload.DTO; +using SingularityGroup.HotReload.Editor.Cli; +using UnityEditor; +using UnityEngine; +using EditorGUI = UnityEditor.EditorGUI; + +namespace SingularityGroup.HotReload.Editor { + internal struct HotReloadSettingsTabState { + public readonly bool running; + public readonly bool trialLicense; + public readonly LoginStatusResponse loginStatus; + public readonly bool isServerHealthy; + public readonly bool registrationRequired; + + public HotReloadSettingsTabState( + bool running, + bool trialLicense, + LoginStatusResponse loginStatus, + bool isServerHealthy, + bool registrationRequired + ) { + this.running = running; + this.trialLicense = trialLicense; + this.loginStatus = loginStatus; + this.isServerHealthy = isServerHealthy; + this.registrationRequired = registrationRequired; + } + } + + internal class HotReloadSettingsTab : HotReloadTabBase { + private readonly HotReloadOptionsSection optionsSection; + + // cached because changing built target triggers C# domain reload + // Also I suspect selectedBuildTargetGroup has chance to freeze Unity for several seconds (unconfirmed). + private readonly Lazy currentBuildTarget = new Lazy( + () => BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget)); + + private readonly Lazy isCurrentBuildTargetSupported = new Lazy(() => { + var target = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget); + return HotReloadBuildHelper.IsMonoSupported(target); + }); + + // Resources.Load uses cache, so it's safe to call it every frame. + // Retrying Load every time fixes an issue where you import the package and constructor runs, but resources aren't loadable yet. + private Texture iconCheck => Resources.Load("icon_check_circle"); + private Texture iconWarning => Resources.Load("icon_warning_circle"); + + [SuppressMessage("ReSharper", "Unity.UnknownResource")] // Rider doesn't check packages + public HotReloadSettingsTab(HotReloadWindow window) : base(window, + "Settings", + "_Popup", + "Make changes to a build running on-device.") { + optionsSection = new HotReloadOptionsSection(); + } + + private GUIStyle headlineStyle; + private GUIStyle paddedStyle; + + private Vector2 _settingsTabScrollPos; + + HotReloadSettingsTabState currentState; + public override void OnGUI() { + // HotReloadAboutTabState ensures rendering is consistent between Layout and Repaint calls + // Without it errors like this happen: + // ArgumentException: Getting control 2's position in a group with only 2 controls when doing repaint + // See thread for more context: https://answers.unity.com/questions/17718/argumentexception-getting-control-2s-position-in-a.html + if (Event.current.type == EventType.Layout) { + currentState = new HotReloadSettingsTabState( + running: EditorCodePatcher.Running, + trialLicense: EditorCodePatcher.Status != null && (EditorCodePatcher.Status?.isTrial == true), + loginStatus: EditorCodePatcher.Status, + isServerHealthy: ServerHealthCheck.I.IsServerHealthy, + registrationRequired: RedeemLicenseHelper.I.RegistrationRequired + ); + } + using (var scope = new EditorGUILayout.ScrollViewScope(_settingsTabScrollPos, GUI.skin.horizontalScrollbar, GUI.skin.verticalScrollbar, GUILayout.MaxHeight(Math.Max(HotReloadWindowStyles.windowScreenHeight, 800)), GUILayout.MaxWidth(Math.Max(HotReloadWindowStyles.windowScreenWidth, 800)))) { + _settingsTabScrollPos.x = scope.scrollPosition.x; + _settingsTabScrollPos.y = scope.scrollPosition.y; + using (new EditorGUILayout.VerticalScope(HotReloadWindowStyles.DynamicSectionHelpTab)) { + GUILayout.Space(10); + if (!EditorCodePatcher.LoginNotRequired + && !currentState.registrationRequired + // Delay showing login in settings to not confuse users that they need to login to use Free trial + && (HotReloadPrefs.RateAppShown + || PackageConst.IsAssetStoreBuild) + ) { + using (new EditorGUILayout.HorizontalScope(HotReloadWindowStyles.SectionOuterBoxCompact)) { + using (new EditorGUILayout.HorizontalScope(HotReloadWindowStyles.SectionInnerBoxWide)) { + using (new EditorGUILayout.VerticalScope()) { + RenderLicenseInfoSection(); + } + } + } + } + + using (new EditorGUILayout.HorizontalScope(HotReloadWindowStyles.SectionOuterBoxCompact)) { + using (new EditorGUILayout.HorizontalScope(HotReloadWindowStyles.SectionInnerBoxWide)) { + using (new EditorGUILayout.VerticalScope()) { + HotReloadPrefs.ShowConfiguration = EditorGUILayout.Foldout(HotReloadPrefs.ShowConfiguration, "Configuration", true, HotReloadWindowStyles.FoldoutStyle); + if (HotReloadPrefs.ShowConfiguration) { + EditorGUILayout.Space(); + RenderUnityAutoRefresh(); + RenderAssetRefresh(); + if (HotReloadPrefs.AllAssetChanges) { + using (new EditorGUILayout.VerticalScope(paddedStyle ?? (paddedStyle = new GUIStyle { padding = new RectOffset(20, 0, 0, 0) }))) { + RenderIncludeShaderChanges(); + } + + EditorGUILayout.Space(); + } + using (new EditorGUI.DisabledScope(!EditorCodePatcher.autoRecompileUnsupportedChangesSupported)) { + RenderAutoRecompileUnsupportedChanges(); + if (HotReloadPrefs.AutoRecompileUnsupportedChanges && EditorCodePatcher.autoRecompileUnsupportedChangesSupported) { + using (new EditorGUILayout.VerticalScope(paddedStyle ?? (paddedStyle = new GUIStyle { padding = new RectOffset(20, 0, 0, 0) }))) { + RenderAutoRecompileUnsupportedChangesImmediately(); + RenderAutoRecompileUnsupportedChangesOnExitPlayMode(); + RenderAutoRecompileUnsupportedChangesInPlayMode(); + RenderAutoRecompilePartiallyUnsupportedChanges(); + } + } + EditorGUILayout.Space(); + } + RenderConsoleWindow(); + RenderAutostart(); + + if (EditorWindowHelper.supportsNotifications) { + RenderShowNotifications(); + using (new EditorGUILayout.VerticalScope(paddedStyle ?? (paddedStyle = new GUIStyle { padding = new RectOffset(20, 0, 0, 0) }))) { + RenderShowPatchingNotifications(); + RenderShowCompilingUnsupportedNotifications(); + } + + EditorGUILayout.Space(); + } + EditorGUILayout.Space(); + using (new EditorGUILayout.HorizontalScope()) { + GUILayout.FlexibleSpace(); + HotReloadWindow.RenderShowOnStartup(); + } + } + } + } + } + + if (!EditorCodePatcher.LoginNotRequired && currentState.trialLicense && currentState.running) { + using (new EditorGUILayout.HorizontalScope(HotReloadWindowStyles.SectionOuterBoxCompact)) { + using (new EditorGUILayout.HorizontalScope(HotReloadWindowStyles.SectionInnerBoxWide)) { + using (new EditorGUILayout.VerticalScope()) { + RenderPromoCodeSection(); + } + } + } + } + + using (new EditorGUILayout.HorizontalScope(HotReloadWindowStyles.SectionOuterBoxCompact)) { + using (new EditorGUILayout.HorizontalScope(HotReloadWindowStyles.SectionInnerBoxWide)) { + using (new EditorGUILayout.VerticalScope()) { + RenderOnDevice(); + } + } + } + } + } + } + + void RenderUnityAutoRefresh() { + var newSettings = EditorGUILayout.BeginToggleGroup(new GUIContent("Allow to manage Unity's Auto Compile settings (recommended)"), HotReloadPrefs.AllowDisableUnityAutoRefresh); + if (newSettings != HotReloadPrefs.AllowDisableUnityAutoRefresh) { + HotReloadPrefs.AllowDisableUnityAutoRefresh = newSettings; + } + string toggleDescription; + if (HotReloadPrefs.AllowDisableUnityAutoRefresh) { + toggleDescription = "Hot Reload will manage Unity's Auto Refresh and Script Compilation settings when it's running. Previous settings will be restored when Hot Reload is stopped."; + } else { + toggleDescription = "Enable to allow Hot Reload to manage Unity's Auto Refresh and Script Compilation settings when it's running. If enabled, previous settings will be restored when Hot Reload is stopped."; + } + EditorGUILayout.LabelField(toggleDescription, HotReloadWindowStyles.WrapStyle); + EditorGUILayout.EndToggleGroup(); + EditorGUILayout.Space(3f); + } + + void RenderAssetRefresh() { + var newSettings = EditorGUILayout.BeginToggleGroup(new GUIContent("Asset refresh (recommended)"), HotReloadPrefs.AllAssetChanges); + if (newSettings != HotReloadPrefs.AllAssetChanges) { + HotReloadPrefs.AllAssetChanges = newSettings; + // restart when setting changes + if (ServerHealthCheck.I.IsServerHealthy) { + var restartServer = EditorUtility.DisplayDialog("Hot Reload", + $"When changing 'Asset refresh', the Hot Reload server must be restarted for this to take effect." + + "\nDo you want to restart it now?", + "Restart server", "Don't restart"); + if (restartServer) { + EditorCodePatcher.RestartCodePatcher().Forget(); + } + } + } + string toggleDescription; + if (HotReloadPrefs.AllAssetChanges) { + toggleDescription = "Hot Reload will refresh changed assets in the project."; + } else { + toggleDescription = "Enable to allow Hot Reload to refresh changed assets in the project. All asset types are supported including sprites, prefabs, shaders etc."; + } + EditorGUILayout.LabelField(toggleDescription, HotReloadWindowStyles.WrapStyle); + EditorGUILayout.EndToggleGroup(); + EditorGUILayout.Space(3f); + } + + void RenderIncludeShaderChanges() { + HotReloadPrefs.IncludeShaderChanges = EditorGUILayout.BeginToggleGroup(new GUIContent("Refresh shaders"), HotReloadPrefs.IncludeShaderChanges); + string toggleDescription; + if (HotReloadPrefs.IncludeShaderChanges) { + toggleDescription = "Hot Reload will auto refresh shaders. Note that enabling this setting might impact performance."; + } else { + toggleDescription = "Enable to auto-refresh shaders. Note that enabling this setting might impact performance"; + } + EditorGUILayout.LabelField(toggleDescription, HotReloadWindowStyles.WrapStyle); + EditorGUILayout.EndToggleGroup(); + } + + void RenderConsoleWindow() { + if (!HotReloadCli.CanOpenInBackground) { + return; + } + var newSettings = EditorGUILayout.BeginToggleGroup(new GUIContent("Hide console window on start"), HotReloadPrefs.DisableConsoleWindow); + if (newSettings != HotReloadPrefs.DisableConsoleWindow) { + HotReloadPrefs.DisableConsoleWindow = newSettings; + // restart when setting changes + if (ServerHealthCheck.I.IsServerHealthy) { + var restartServer = EditorUtility.DisplayDialog("Hot Reload", + $"When changing 'Hide console window on start', the Hot Reload server must be restarted for this to take effect." + + "\nDo you want to restart it now?", + "Restart server", "Don't restart"); + if (restartServer) { + EditorCodePatcher.RestartCodePatcher().Forget(); + } + } + } + string toggleDescription; + if (HotReloadPrefs.DisableConsoleWindow) { + toggleDescription = "Hot Reload will start without creating a console window. Logs can be accessed through \"Help\" tab."; + } else { + toggleDescription = "Enable to start Hot Reload without creating a console window."; + } + EditorGUILayout.LabelField(toggleDescription, HotReloadWindowStyles.WrapStyle); + EditorGUILayout.EndToggleGroup(); + EditorGUILayout.Space(3f); + } + + void RenderAutostart() { + var newSettings = EditorGUILayout.BeginToggleGroup(new GUIContent("Autostart on Unity open"), HotReloadPrefs.LaunchOnEditorStart); + if (newSettings != HotReloadPrefs.LaunchOnEditorStart) { + HotReloadPrefs.LaunchOnEditorStart = newSettings; + } + string toggleDescription; + if (HotReloadPrefs.LaunchOnEditorStart) { + toggleDescription = "Hot Reload will be launched when Unity project opens."; + } else { + toggleDescription = "Enable to launch Hot Reload when Unity project opens."; + } + EditorGUILayout.LabelField(toggleDescription, HotReloadWindowStyles.WrapStyle); + EditorGUILayout.EndToggleGroup(); + EditorGUILayout.Space(); + } + + void RenderShowNotifications() { + GUILayout.Label("Indications", HotReloadWindowStyles.NotificationsTitleStyle); + + string toggleDescription; + if (!EditorWindowHelper.supportsNotifications && !UnitySettingsHelper.I.playmodeTintSupported) { + toggleDescription = "Indications are not supported in the Unity version you use."; + } else { + toggleDescription = "Chosen indications are enabled:"; + } + + EditorGUILayout.LabelField(toggleDescription, HotReloadWindowStyles.WrapStyle); + } + + void RenderShowPatchingNotifications() { + HotReloadPrefs.ShowPatchingNotifications = EditorGUILayout.BeginToggleGroup(new GUIContent("Patching Indication"), HotReloadPrefs.ShowPatchingNotifications); + string toggleDescription; + if (!EditorWindowHelper.supportsNotifications) { + toggleDescription = "Patching Notification is not supported in the Unity version you use."; + } else if (!HotReloadPrefs.ShowPatchingNotifications) { + toggleDescription = "Enable to show GameView and SceneView indications when Patching."; + } else { + toggleDescription = "Indications will be shown in GameView and SceneView when Patching."; + } + EditorGUILayout.LabelField(toggleDescription, HotReloadWindowStyles.WrapStyle); + EditorGUILayout.EndToggleGroup(); + } + + void RenderShowCompilingUnsupportedNotifications() { + HotReloadPrefs.ShowCompilingUnsupportedNotifications = EditorGUILayout.BeginToggleGroup(new GUIContent("Compiling Unsupported Changes Indication"), HotReloadPrefs.ShowCompilingUnsupportedNotifications); + string toggleDescription; + if (!EditorWindowHelper.supportsNotifications) { + toggleDescription = "Compiling Unsupported Changes Notification is not supported in the Unity version you use."; + } else if (!HotReloadPrefs.ShowCompilingUnsupportedNotifications) { + toggleDescription = "Enable to show GameView and SceneView indications when compiling unsupported changes."; + } else { + toggleDescription = "Indications will be shown in GameView and SceneView when compiling unsupported changes."; + } + EditorGUILayout.LabelField(toggleDescription, HotReloadWindowStyles.WrapStyle); + EditorGUILayout.EndToggleGroup(); + } + + void RenderAutoRecompileUnsupportedChanges() { + HotReloadPrefs.AutoRecompileUnsupportedChanges = EditorGUILayout.BeginToggleGroup(new GUIContent("Auto recompile unsupported changes (recommended)"), HotReloadPrefs.AutoRecompileUnsupportedChanges && EditorCodePatcher.autoRecompileUnsupportedChangesSupported); + string toggleDescription; + if (!EditorCodePatcher.autoRecompileUnsupportedChangesSupported) { + toggleDescription = "Auto recompiling unsupported changes is not supported in the Unity version you use."; + } else if (HotReloadPrefs.AutoRecompileUnsupportedChanges) { + toggleDescription = "Hot Reload will recompile when unsupported changes are detected."; + } else { + toggleDescription = "Enable to recompile when unsupported changes are detected."; + } + EditorGUILayout.LabelField(toggleDescription, HotReloadWindowStyles.WrapStyle); + EditorGUILayout.EndToggleGroup(); + } + + void RenderAutoRecompilePartiallyUnsupportedChanges() { + HotReloadPrefs.AutoRecompilePartiallyUnsupportedChanges = EditorGUILayout.BeginToggleGroup(new GUIContent("Include partially unsupported changes"), HotReloadPrefs.AutoRecompilePartiallyUnsupportedChanges); + string toggleDescription; + if (HotReloadPrefs.AutoRecompilePartiallyUnsupportedChanges) { + toggleDescription = "Hot Reload will recompile partially unsupported changes."; + } else { + toggleDescription = "Enable to recompile partially unsupported changes."; + } + EditorGUILayout.LabelField(toggleDescription, HotReloadWindowStyles.WrapStyle); + EditorGUILayout.EndToggleGroup(); + } + + void RenderAutoRecompileUnsupportedChangesImmediately() { + HotReloadPrefs.AutoRecompileUnsupportedChangesImmediately = EditorGUILayout.BeginToggleGroup(new GUIContent("Recompile immediately"), HotReloadPrefs.AutoRecompileUnsupportedChangesImmediately); + string toggleDescription; + if (HotReloadPrefs.AutoRecompileUnsupportedChangesImmediately) { + toggleDescription = "Unsupported changes will be recompiled immediately."; + } else { + toggleDescription = "Unsupported changes will be recompiled when editor is focused. Enable to recompile immediately."; + } + EditorGUILayout.LabelField(toggleDescription, HotReloadWindowStyles.WrapStyle); + EditorGUILayout.EndToggleGroup(); + } + + void RenderAutoRecompileUnsupportedChangesInPlayMode() { + HotReloadPrefs.AutoRecompileUnsupportedChangesInPlayMode = EditorGUILayout.BeginToggleGroup(new GUIContent("Recompile in Play Mode"), HotReloadPrefs.AutoRecompileUnsupportedChangesInPlayMode); + string toggleDescription; + if (HotReloadPrefs.AutoRecompileUnsupportedChangesInPlayMode) { + toggleDescription = "Hot Reload will exit Play Mode to recompile unsupported changes."; + } else { + toggleDescription = "Enable to auto exit Play Mode to recompile unsupported changes."; + } + EditorGUILayout.LabelField(toggleDescription, HotReloadWindowStyles.WrapStyle); + EditorGUILayout.EndToggleGroup(); + } + + void RenderAutoRecompileUnsupportedChangesOnExitPlayMode() { + HotReloadPrefs.AutoRecompileUnsupportedChangesOnExitPlayMode = EditorGUILayout.BeginToggleGroup(new GUIContent("Recompile on exit Play Mode"), HotReloadPrefs.AutoRecompileUnsupportedChangesOnExitPlayMode); + string toggleDescription; + if (HotReloadPrefs.AutoRecompileUnsupportedChangesOnExitPlayMode) { + toggleDescription = "Hot Reload will recompile unsupported changes when exiting Play Mode."; + } else { + toggleDescription = "Enable to recompile unsupported changes when exiting Play Mode."; + } + EditorGUILayout.LabelField(toggleDescription, HotReloadWindowStyles.WrapStyle); + EditorGUILayout.EndToggleGroup(); + } + + void RenderOnDevice() { + HotReloadPrefs.ShowOnDevice = EditorGUILayout.Foldout(HotReloadPrefs.ShowOnDevice, "On-Device", true, HotReloadWindowStyles.FoldoutStyle); + if (!HotReloadPrefs.ShowOnDevice) { + return; + } + // header with explainer image + { + if (headlineStyle == null) { + // start with textArea for the background and border colors + headlineStyle = new GUIStyle(GUI.skin.label) { + fontStyle = FontStyle.Bold, + alignment = TextAnchor.MiddleLeft + }; + headlineStyle.normal.textColor = HotReloadWindowStyles.H2TitleStyle.normal.textColor; + + // bg color + if (HotReloadWindowStyles.IsDarkMode) { + headlineStyle.normal.background = EditorTextures.DarkGray40; + } else { + headlineStyle.normal.background = EditorTextures.LightGray225; + } + // layout + headlineStyle.padding = new RectOffset(8, 8, 0, 0); + headlineStyle.margin = new RectOffset(6, 6, 6, 6); + } + GUILayout.Space(9f); // space between logo and headline + + GUILayout.Label("Make changes to a build running on-device", + headlineStyle, GUILayout.MinHeight(EditorGUIUtility.singleLineHeight * 1.4f)); + // image showing how Hot Reload works with a phone + // var bannerBox = GUILayoutUtility.GetRect(flowchart.width * 0.6f, flowchart.height * 0.6f); + // GUI.DrawTexture(bannerBox, flowchart, ScaleMode.ScaleToFit); + } + + GUILayout.Space(16f); + + //ButtonToOpenBuildSettings(); + + { + GUILayout.Label("Manual connect", HotReloadWindowStyles.H3TitleStyle); + EditorGUILayout.Space(); + + GUILayout.BeginHorizontal(); + + // indent all controls (this works with non-labels) + GUILayout.Space(16f); + GUILayout.BeginVertical(); + + string text; + var ip = IpHelper.GetIpAddressCached(); + if (string.IsNullOrEmpty(ip)) { + text = $"If auto-pair fails, find your local IP in OS settings, and use this format to connect: '{{ip}}'"; + } else { + text = $"If auto-pair fails, use this IP to connect: {ip}" + + "\nMake sure you are on the same LAN/WiFi network"; + } + GUILayout.Label(text, HotReloadWindowStyles.H3TitleWrapStyle); + + if (!currentState.isServerHealthy) { + DrawHorizontalCheck(ServerHealthCheck.I.IsServerHealthy, + "Hot Reload is running", + "Hot Reload is not running", + hasFix: false); + } + + if (!HotReloadPrefs.ExposeServerToLocalNetwork) { + var summary = $"Enable '{new ExposeServerOption().ShortSummary}'"; + DrawHorizontalCheck(HotReloadPrefs.ExposeServerToLocalNetwork, + summary, + summary); + } + + // explainer image that shows phone needs same wifi to auto connect ? + + GUILayout.EndVertical(); + GUILayout.EndHorizontal(); + } + + GUILayout.Space(16f); + + // loading again is smooth, pretty sure AssetDatabase.LoadAssetAtPath is caching -Troy + var settingsObject = HotReloadSettingsEditor.LoadSettingsOrDefault(); + var so = new SerializedObject(settingsObject); + + // if you build for Android now, will Hot Reload work? + { + + EditorGUILayout.BeginHorizontal(); + GUILayout.Label("Build Settings Checklist", HotReloadWindowStyles.H3TitleStyle); + EditorGUI.BeginDisabledGroup(isSupported); + // One-click to change each setting to the supported value + if (GUILayout.Button("Fix All", GUILayout.MaxWidth(90f))) { + FixAllUnsupportedSettings(so); + } + EditorGUI.EndDisabledGroup(); + EditorGUILayout.EndHorizontal(); + + + // NOTE: After user changed some build settings, window may not immediately repaint + // (e.g. toggle Development Build in Build Settings window) + // We could show a refresh button (to encourage the user to click the window which makes it repaint). + DrawSectionCheckBuildSupport(so); + } + + + GUILayout.Space(16f); + + // Settings checkboxes (Hot Reload options) + { + GUILayout.Label("Options", HotReloadWindowStyles.H3TitleStyle); + if (settingsObject) { + optionsSection.DrawGUI(so); + } + } + GUILayout.FlexibleSpace(); // needed otherwise vertical scrollbar is appearing for no reason (Unity 2021 glitch perhaps) + } + + private void RenderLicenseInfoSection() { + HotReloadRunTab.RenderLicenseInfo( + _window.RunTabState, + currentState.loginStatus, + verbose: true, + allowHide: false, + overrideActionButton: "Activate License", + showConsumptions: true + ); + } + + private void RenderPromoCodeSection() { + _window.RunTab.RenderPromoCodes(); + } + + public void FocusLicenseFoldout() { + HotReloadPrefs.ShowLogin = true; + } + + // note: changing scripting backend does not force Unity to recreate the GUI, so need to check it when drawing. + private ScriptingImplementation ScriptingBackend => HotReloadBuildHelper.GetCurrentScriptingBackend(); + private ManagedStrippingLevel StrippingLevel => HotReloadBuildHelper.GetCurrentStrippingLevel(); + public bool isSupported = true; + + /// + /// These options are drawn in the On-device tab + /// + // new on-device options should be added here + public static readonly IOption[] allOptions = new IOption[] { + new ExposeServerOption(), + IncludeInBuildOption.I, + new AllowAndroidAppToMakeHttpRequestsOption(), + }; + + /// + /// Change each setting to the value supported by Hot Reload + /// + private void FixAllUnsupportedSettings(SerializedObject so) { + if (!isCurrentBuildTargetSupported.Value) { + // try switch to Android platform + // (we also support Standalone but HotReload on mobile is a better selling point) + if (!TrySwitchToStandalone()) { + // skip changing other options (user won't readthe gray text) - user has to click Fix All again + return; + } + } + + foreach (var buildOption in allOptions) { + if (!buildOption.GetValue(so)) { + buildOption.SetValue(so, true); + } + } + so.ApplyModifiedProperties(); + var settingsObject = so.targetObject as HotReloadSettingsObject; + if (settingsObject) { + // when you click fix all, make sure to save the settings, otherwise ui does not update + HotReloadSettingsEditor.EnsureSettingsCreated(settingsObject); + } + + if (!EditorUserBuildSettings.development) { + EditorUserBuildSettings.development = true; + } + + HotReloadBuildHelper.SetCurrentScriptingBackend(ScriptingImplementation.Mono2x); + HotReloadBuildHelper.SetCurrentStrippingLevel(ManagedStrippingLevel.Disabled); + } + + public static bool TrySwitchToStandalone() { + BuildTarget buildTarget; + if (Application.platform == RuntimePlatform.LinuxEditor) { + buildTarget = BuildTarget.StandaloneLinux64; + } else if (Application.platform == RuntimePlatform.WindowsEditor) { + buildTarget = BuildTarget.StandaloneWindows64; + } else if (Application.platform == RuntimePlatform.OSXEditor) { + buildTarget = BuildTarget.StandaloneOSX; + } else { + return false; + } + var current = EditorUserBuildSettings.activeBuildTarget; + if (current == buildTarget) { + return true; + } + var confirmed = EditorUtility.DisplayDialog("Switch Build Target", + "Switching the build target can take a while depending on project size.", + $"Switch to Standalone", "Cancel"); + if (confirmed) { + EditorUserBuildSettings.SwitchActiveBuildTargetAsync(BuildTargetGroup.Standalone, buildTarget); + Log.Info($"Build target is switching to {buildTarget}."); + return true; + } else { + return false; + } + } + + /// + /// Section that user can check before making a Unity Player build. + /// + /// + /// + /// This section is for confirming your build will work with Hot Reload.
+ /// Options that can be changed after the build is made should be drawn elsewhere. + ///
+ public void DrawSectionCheckBuildSupport(SerializedObject so) { + isSupported = true; + var selectedPlatform = currentBuildTarget.Value; + DrawHorizontalCheck(isCurrentBuildTargetSupported.Value, + $"The {selectedPlatform.ToString()} platform is selected", + $"The current platform is {selectedPlatform.ToString()} which is not supported"); + + using (new EditorGUI.DisabledScope(!isCurrentBuildTargetSupported.Value)) { + foreach (var option in allOptions) { + DrawHorizontalCheck(option.GetValue(so), + $"Enable \"{option.ShortSummary}\"", + $"Enable \"{option.ShortSummary}\""); + } + + DrawHorizontalCheck(EditorUserBuildSettings.development, + "Development Build is enabled", + "Enable \"Development Build\""); + + DrawHorizontalCheck(ScriptingBackend == ScriptingImplementation.Mono2x, + $"Scripting Backend is set to Mono", + $"Set Scripting Backend to Mono"); + + DrawHorizontalCheck(StrippingLevel == ManagedStrippingLevel.Disabled, + $"Stripping Level = {StrippingLevel}", + $"Stripping Level = {StrippingLevel}", + suggestedSolutionText: "Code stripping needs to be disabled to ensure that all methods are available for patching." + ); + } + } + + /// + /// Draw a box with a tick or warning icon on the left, with text describing the tick or warning + /// + /// The condition to check. True to show a tick icon, False to show a warning. + /// Shown when condition is true + /// Shown when condition is false + /// Shown when is false + void DrawHorizontalCheck(bool condition, string okText, string notOkText = null, string suggestedSolutionText = null, bool hasFix = true) { + if (okText == null) { + throw new ArgumentNullException(nameof(okText)); + } + if (notOkText == null) { + notOkText = okText; + } + + // include some horizontal space around the icon + var boxWidth = GUILayout.Width(EditorGUIUtility.singleLineHeight * 1.31f); + var height = GUILayout.Height(EditorGUIUtility.singleLineHeight * 1.01f); + GUILayout.BeginHorizontal(HotReloadWindowStyles.BoxStyle, height, GUILayout.ExpandWidth(true)); + var style = HotReloadWindowStyles.NoPaddingMiddleLeftStyle; + var iconRect = GUILayoutUtility.GetRect( + Mathf.Round(EditorGUIUtility.singleLineHeight * 1.31f), + Mathf.Round(EditorGUIUtility.singleLineHeight * 1.01f), + style, boxWidth, height, GUILayout.ExpandWidth(false)); + // rounded so we can have pixel perfect black circle bg + iconRect.Set(Mathf.Round(iconRect.x), Mathf.Round(iconRect.y), Mathf.CeilToInt(iconRect.width), + Mathf.CeilToInt(iconRect.height)); + var text = condition ? okText : notOkText; + var icon = condition ? iconCheck : iconWarning; + if (GUI.enabled) { + DrawBlackCircle(iconRect); + // resource can be null when building player (Editor Resources not available) + if (icon) { + GUI.DrawTexture(iconRect, icon, ScaleMode.ScaleToFit); + } + } else { + // show something (instead of hiding) so that layout stays same size + DrawDisabledCircle(iconRect); + } + GUILayout.Space(4f); + GUILayout.Label(text, style, height); + + if (!condition && hasFix) { + isSupported = false; + } + + GUILayout.EndHorizontal(); + if (!condition && !String.IsNullOrEmpty(suggestedSolutionText)) { + // suggest to the user how they can resolve the issue + EditorGUI.indentLevel++; + GUILayout.Label(suggestedSolutionText, HotReloadWindowStyles.WrapStyle); + EditorGUI.indentLevel--; + } + } + + void DrawDisabledCircle(Rect rect) => DrawCircleIcon(rect, + Resources.Load("icon_circle_gray"), + Color.clear); // smaller circle draws less attention + + void DrawBlackCircle(Rect rect) => DrawCircleIcon(rect, + Resources.Load("icon_circle_black"), + new Color(0.14f, 0.14f, 0.14f)); // black is too dark in unity light theme + + void DrawCircleIcon(Rect rect, Texture circleIcon, Color borderColor) { + // Note: drawing texture from resources is pixelated on the edges, so it has some transperancy around the edges. + // While building for Android, Resources.Load returns null for our editor Resources. + if (circleIcon != null) { + GUI.DrawTexture(rect, circleIcon, ScaleMode.ScaleToFit); + } + + // Draw smooth circle border + const float borderWidth = 2f; + GUI.DrawTexture(rect, EditorTextures.White, ScaleMode.ScaleToFit, true, + 0f, + borderColor, + new Vector4(borderWidth, borderWidth, borderWidth, borderWidth), + Mathf.Min(rect.height, rect.width) / 2f); + } + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadSettingsTab.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadSettingsTab.cs.meta new file mode 100644 index 0000000..229880e --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/GUI/Tabs/HotReloadSettingsTab.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: fff71bd159424bf2978e2e99eacba9b4 +timeCreated: 1674057842 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/HotReloadWindow.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/HotReloadWindow.cs new file mode 100644 index 0000000..4ee017c --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/HotReloadWindow.cs @@ -0,0 +1,372 @@ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text.RegularExpressions; +using System.Threading; +using SingularityGroup.HotReload.DTO; +using SingularityGroup.HotReload.Editor.Cli; +using SingularityGroup.HotReload.Editor.Semver; +using UnityEditor; +using UnityEditor.Compilation; +using UnityEngine; + +[assembly: InternalsVisibleTo("SingularityGroup.HotReload.EditorSamples")] + +namespace SingularityGroup.HotReload.Editor { + class HotReloadWindow : EditorWindow { + public static HotReloadWindow Current { get; private set; } + + List tabs; + List Tabs => tabs ?? (tabs = new List { + RunTab, + SettingsTab, + AboutTab, + }); + int selectedTab; + + internal static Vector2 scrollPos; + + + HotReloadRunTab runTab; + internal HotReloadRunTab RunTab => runTab ?? (runTab = new HotReloadRunTab(this)); + HotReloadSettingsTab settingsTab; + internal HotReloadSettingsTab SettingsTab => settingsTab ?? (settingsTab = new HotReloadSettingsTab(this)); + HotReloadAboutTab aboutTab; + internal HotReloadAboutTab AboutTab => aboutTab ?? (aboutTab = new HotReloadAboutTab(this)); + + static ShowOnStartupEnum _showOnStartupOption; + + /// + /// This token is cancelled when the EditorWindow is disabled. + /// + /// + /// Use it for all tasks. + /// When token is cancelled, scripts are about to be recompiled and this will cause tasks to fail for weird reasons. + /// + public CancellationToken cancelToken; + CancellationTokenSource cancelTokenSource; + + static readonly PackageUpdateChecker packageUpdateChecker = new PackageUpdateChecker(); + + [MenuItem("Window/Hot Reload &#H")] + internal static void Open() { + // opening the window on CI systems was keeping Unity open indefinitely + if (EditorWindowHelper.IsHumanControllingUs()) { + if (Current) { + Current.Show(); + Current.Focus(); + } else { + Current = GetWindow(); + } + } + } + + void OnEnable() { + Current = this; + if (cancelTokenSource != null) { + cancelTokenSource.Cancel(); + } + // Set min size initially so that full UI is visible + if (!HotReloadPrefs.OpenedWindowAtLeastOnce) { + this.minSize = new Vector2(Constants.RecompileButtonTextHideWidth + 1, Constants.EventsListHideHeight + 70); + HotReloadPrefs.OpenedWindowAtLeastOnce = true; + } + cancelTokenSource = new CancellationTokenSource(); + cancelToken = cancelTokenSource.Token; + + this.titleContent = new GUIContent(" Hot Reload", GUIHelper.GetInvertibleIcon(InvertibleIcon.Logo)); + _showOnStartupOption = HotReloadPrefs.ShowOnStartup; + + packageUpdateChecker.StartCheckingForNewVersion(); + } + + void Update() { + foreach (var tab in Tabs) { + tab.Update(); + } + } + + void OnDisable() { + if (cancelTokenSource != null) { + cancelTokenSource.Cancel(); + cancelTokenSource = null; + } + + if (Current == this) { + Current = null; + } + } + + internal void SelectTab(Type tabType) { + selectedTab = Tabs.FindIndex(x => x.GetType() == tabType); + } + + public HotReloadRunTabState RunTabState { get; private set; } + void OnGUI() { + // TabState ensures rendering is consistent between Layout and Repaint calls + // Without it errors like this happen: + // ArgumentException: Getting control 2's position in a group with only 2 controls when doing repaint + // See thread for more context: https://answers.unity.com/questions/17718/argumentexception-getting-control-2s-position-in-a.html + if (Event.current.type == EventType.Layout) { + RunTabState = HotReloadRunTabState.Current; + } + using(var scope = new EditorGUILayout.ScrollViewScope(scrollPos, false, false)) { + scrollPos = scope.scrollPosition; + // RenderDebug(); + RenderTabs(); + } + GUILayout.FlexibleSpace(); // GUI below will be rendered on the bottom + if (HotReloadWindowStyles.windowScreenHeight > 90) + RenderBottomBar(); + } + + void RenderDebug() { + if (GUILayout.Button("RESET WINDOW")) { + OnDisable(); + + RequestHelper.RequestLogin("test", "test", 1).Forget(); + + HotReloadPrefs.LicenseEmail = null; + HotReloadPrefs.ExposeServerToLocalNetwork = true; + HotReloadPrefs.LicensePassword = null; + HotReloadPrefs.LoggedBurstHint = false; + HotReloadPrefs.DontShowPromptForDownload = false; + HotReloadPrefs.RateAppShown = false; + HotReloadPrefs.ActiveDays = string.Empty; + HotReloadPrefs.LaunchOnEditorStart = false; + HotReloadPrefs.ShowUnsupportedChanges = true; + HotReloadPrefs.RedeemLicenseEmail = null; + HotReloadPrefs.RedeemLicenseInvoice = null; + OnEnable(); + File.Delete(EditorCodePatcher.serverDownloader.GetExecutablePath(HotReloadCli.controller)); + InstallUtility.DebugClearInstallState(); + InstallUtility.CheckForNewInstall(); + EditorPrefs.DeleteKey(Attribution.LastLoginKey); + File.Delete(RedeemLicenseHelper.registerOutcomePath); + + CompileMethodDetourer.Reset(); + AssetDatabase.Refresh(); + } + } + + internal static void RenderLogo(int width = 243) { + var isDarkMode = HotReloadWindowStyles.IsDarkMode; + var tex = Resources.Load(isDarkMode ? "Logo_HotReload_DarkMode" : "Logo_HotReload_LightMode"); + //Can happen during player builds where Editor Resources are unavailable + if(tex == null) { + return; + } + var targetWidth = width; + var targetHeight = 44; + GUILayout.Space(4f); + // background padding top and bottom + float padding = 5f; + // reserve layout space for the texture + var backgroundRect = GUILayoutUtility.GetRect(targetWidth + padding, targetHeight + padding, HotReloadWindowStyles.LogoStyle); + // draw the texture into that reserved space. First the bg then the logo. + if (isDarkMode) { + GUI.DrawTexture(backgroundRect, EditorTextures.DarkGray17, ScaleMode.StretchToFill); + } else { + GUI.DrawTexture(backgroundRect, EditorTextures.LightGray238, ScaleMode.StretchToFill); + } + + var foregroundRect = backgroundRect; + foregroundRect.yMin += padding; + foregroundRect.yMax -= padding; + // during player build (EditorWindow still visible), Resources.Load returns null + if (tex) { + GUI.DrawTexture(foregroundRect, tex, ScaleMode.ScaleToFit); + } + } + + int? collapsedTab; + void RenderTabs() { + using(new EditorGUILayout.VerticalScope(HotReloadWindowStyles.BoxStyle)) { + if (HotReloadWindowStyles.windowScreenHeight > 210 && HotReloadWindowStyles.windowScreenWidth > 375) { + selectedTab = GUILayout.Toolbar( + selectedTab, + Tabs.Select(t => + new GUIContent(t.Title.StartsWith(" ", StringComparison.Ordinal) ? t.Title : " " + t.Title, + t.Icon, t.Tooltip)).ToArray(), + GUILayout.Height(22f) // required, otherwise largest icon height determines toolbar height + ); + if (collapsedTab != null) { + selectedTab = collapsedTab.Value; + collapsedTab = null; + } + } else { + if (collapsedTab == null) { + collapsedTab = selectedTab; + } + // When window is super small, we pretty much can only show run tab + SelectTab(typeof(HotReloadRunTab)); + } + + if (HotReloadWindowStyles.windowScreenHeight > 250 && HotReloadWindowStyles.windowScreenWidth > 275) { + RenderLogo(); + } + + Tabs[selectedTab].OnGUI(); + } + } + + void RenderBottomBar() { + SemVersion newVersion; + var updateAvailable = packageUpdateChecker.TryGetNewVersion(out newVersion); + + if (HotReloadWindowStyles.windowScreenWidth > Constants.RateAppHideWidth + && HotReloadWindowStyles.windowScreenHeight > Constants.RateAppHideHeight + ) { + RenderRateApp(); + } + + if (updateAvailable) { + RenderUpdateButton(newVersion); + } + + using(new EditorGUILayout.HorizontalScope("ProjectBrowserBottomBarBg", GUILayout.ExpandWidth(true), GUILayout.Height(25f))) { + RenderBottomBarCore(); + } + } + + static GUIStyle _renderAppBoxStyle; + static GUIStyle renderAppBoxStyle => _renderAppBoxStyle ?? (_renderAppBoxStyle = new GUIStyle(GUI.skin.box) { + padding = new RectOffset(10, 10, 0, 0) + }); + + static GUILayoutOption[] _nonExpandable; + public static GUILayoutOption[] NonExpandableLayout => _nonExpandable ?? (_nonExpandable = new [] {GUILayout.ExpandWidth(false), GUILayout.ExpandHeight(true)}); + + internal static void RenderRateApp() { + if (!ShouldShowRateApp()) { + return; + } + using (new EditorGUILayout.VerticalScope(renderAppBoxStyle)) { + using (new EditorGUILayout.HorizontalScope()) { + HotReloadGUIHelper.HelpBox("Are you enjoying using Hot Reload?", MessageType.Info, 11); + if (GUILayout.Button("Hide", NonExpandableLayout)) { + RequestHelper.RequestEditorEventWithRetry(new Stat(StatSource.Client, StatLevel.Debug, StatFeature.RateApp), new EditorExtraData { { "dismissed", true } }).Forget(); + HotReloadPrefs.RateAppShown = true; + } + } + using (new EditorGUILayout.HorizontalScope()) { + if (GUILayout.Button("Yes")) { + var openedUrl = PackageConst.IsAssetStoreBuild && EditorUtility.DisplayDialog("Rate Hot Reload", "Thank you for using Hot Reload!\n\nPlease consider leaving a review on the Asset Store to support us.", "Open in browser", "Cancel"); + if (openedUrl) { + Application.OpenURL(Constants.UnityStoreRateAppURL); + } + HotReloadPrefs.RateAppShown = true; + var data = new EditorExtraData(); + if (PackageConst.IsAssetStoreBuild) { + data.Add("opened_url", openedUrl); + } + data.Add("enjoy_app", true); + RequestHelper.RequestEditorEventWithRetry(new Stat(StatSource.Client, StatLevel.Debug, StatFeature.RateApp), data).Forget(); + } + if (GUILayout.Button("No")) { + HotReloadPrefs.RateAppShown = true; + var data = new EditorExtraData(); + data.Add("enjoy_app", false); + RequestHelper.RequestEditorEventWithRetry(new Stat(StatSource.Client, StatLevel.Debug, StatFeature.RateApp), data).Forget(); + } + } + } + } + + internal static bool ShouldShowRateApp() { + if (HotReloadPrefs.RateAppShown) { + return false; + } + var activeDays = EditorCodePatcher.GetActiveDaysForRateApp(); + if (activeDays.Count < Constants.DaysToRateApp) { + return false; + } + return true; + } + + void RenderUpdateButton(SemVersion newVersion) { + if (GUILayout.Button($"Update To v{newVersion}", HotReloadWindowStyles.UpgradeButtonStyle)) { + packageUpdateChecker.UpdatePackageAsync(newVersion).Forget(CancellationToken.None); + } + } + + internal static void RenderShowOnStartup() { + var prevLabelWidth = EditorGUIUtility.labelWidth; + try { + EditorGUIUtility.labelWidth = 105f; + using (new GUILayout.VerticalScope()) { + using (new GUILayout.HorizontalScope()) { + GUILayout.Label("Show On Startup"); + Rect buttonRect = GUILayoutUtility.GetLastRect(); + if (EditorGUILayout.DropdownButton(new GUIContent(Regex.Replace(_showOnStartupOption.ToString(), "([a-z])([A-Z])", "$1 $2")), FocusType.Passive, GUILayout.Width(110f))) { + GenericMenu menu = new GenericMenu(); + foreach (ShowOnStartupEnum option in Enum.GetValues(typeof(ShowOnStartupEnum))) { + menu.AddItem(new GUIContent(Regex.Replace(option.ToString(), "([a-z])([A-Z])", "$1 $2")), false, () => { + if (_showOnStartupOption != option) { + _showOnStartupOption = option; + HotReloadPrefs.ShowOnStartup = _showOnStartupOption; + } + }); + } + menu.DropDown(new Rect(buttonRect.x, buttonRect.y, 100, 0)); + } + } + } + } finally { + EditorGUIUtility.labelWidth = prevLabelWidth; + } + } + + internal static readonly OpenURLButton autoRefreshTroubleshootingBtn = new OpenURLButton("Troubleshooting", Constants.TroubleshootingURL); + void RenderBottomBarCore() { + bool troubleshootingShown = EditorCodePatcher.Started && HotReloadWindowStyles.windowScreenWidth >= 400; + bool alertsShown = EditorCodePatcher.Started && HotReloadWindowStyles.windowScreenWidth > Constants.EventFiltersShownHideWidth; + using (new EditorGUILayout.VerticalScope()) { + using (new EditorGUILayout.HorizontalScope(HotReloadWindowStyles.FooterStyle)) { + if (!troubleshootingShown) { + GUILayout.FlexibleSpace(); + if (alertsShown) { + GUILayout.Space(-20); + } + } else { + GUILayout.Space(21); + } + GUILayout.Space(0); + var lastRect = GUILayoutUtility.GetLastRect(); + // show events button when scrolls are hidden + if (!HotReloadRunTab.CanRenderBars(RunTabState) && !RunTabState.starting) { + using (new EditorGUILayout.VerticalScope()) { + GUILayout.FlexibleSpace(); + var icon = HotReloadState.ShowingRedDot ? InvertibleIcon.EventsNew : InvertibleIcon.Events; + if (GUILayout.Button(new GUIContent("", GUIHelper.GetInvertibleIcon(icon)))) { + PopupWindow.Show(new Rect(lastRect.x, lastRect.y, 0, 0), HotReloadEventPopup.I); + } + GUILayout.FlexibleSpace(); + } + GUILayout.Space(3f); + } + if (alertsShown) { + using (new EditorGUILayout.VerticalScope()) { + GUILayout.FlexibleSpace(); + HotReloadTimelineHelper.RenderAlertFilters(); + GUILayout.FlexibleSpace(); + } + } + + GUILayout.FlexibleSpace(); + if (troubleshootingShown) { + using (new EditorGUILayout.VerticalScope()) { + GUILayout.FlexibleSpace(); + autoRefreshTroubleshootingBtn.OnGUI(); + GUILayout.FlexibleSpace(); + } + GUILayout.Space(21); + } + } + } + } + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/HotReloadWindow.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/HotReloadWindow.cs.meta new file mode 100644 index 0000000..926d665 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/HotReloadWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f62a84c0b148b0a4582bdd9f1a69e6d3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/ShowOnStartupEnum.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/ShowOnStartupEnum.cs new file mode 100644 index 0000000..17f2f50 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/ShowOnStartupEnum.cs @@ -0,0 +1,7 @@ +namespace SingularityGroup.HotReload.Editor { + enum ShowOnStartupEnum { + Always, + OnNewVersion, + Never, + } +} \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/ShowOnStartupEnum.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/ShowOnStartupEnum.cs.meta new file mode 100644 index 0000000..25af162 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/ShowOnStartupEnum.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 809f47245f717ad41996974be2443feb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/Styles.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/Styles.meta new file mode 100644 index 0000000..48002b6 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/Styles.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 83e25ceea0bb7cd4ebf04b724bb0584c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/Styles/HotReloadWindowStyles.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/Styles/HotReloadWindowStyles.cs new file mode 100644 index 0000000..4f4ede9 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/Styles/HotReloadWindowStyles.cs @@ -0,0 +1,777 @@ +using UnityEditor; +using UnityEngine; +using System.Reflection; + +namespace SingularityGroup.HotReload.Editor { + internal static class HotReloadWindowStyles { + private static GUIStyle h1TitleStyle; + private static GUIStyle h1TitleCenteredStyle; + private static GUIStyle h2TitleStyle; + private static GUIStyle h3TitleStyle; + private static GUIStyle h3TitleWrapStyle; + private static GUIStyle h4TitleStyle; + private static GUIStyle h5TitleStyle; + private static GUIStyle boxStyle; + private static GUIStyle wrapStyle; + private static GUIStyle noPaddingMiddleLeftStyle; + private static GUIStyle middleLeftStyle; + private static GUIStyle middleCenterStyle; + private static GUIStyle mediumMiddleCenterStyle; + private static GUIStyle textFieldWrapStyle; + private static GUIStyle foldoutStyle; + private static GUIStyle h3CenterTitleStyle; + private static GUIStyle logoStyle; + private static GUIStyle changelogPointersStyle; + private static GUIStyle recompileButtonStyle; + private static GUIStyle indicationIconStyle; + private static GUIStyle indicationAlertIconStyle; + private static GUIStyle startButtonStyle; + private static GUIStyle stopButtonStyle; + private static GUIStyle eventFilters; + private static GUIStyle sectionOuterBoxCompactStyle; + private static GUIStyle sectionInnerBoxStyle; + private static GUIStyle sectionInnerBoxWideStyle; + private static GUIStyle changelogSectionInnerBoxStyle; + private static GUIStyle indicationBoxStyle; + private static GUIStyle linkStyle; + private static GUIStyle labelStyle; + private static GUIStyle progressBarBarStyle; + private static GUIStyle section; + private static GUIStyle scroll; + private static GUIStyle barStyle; + private static GUIStyle barBgStyle; + private static GUIStyle barChildStyle; + private static GUIStyle barFoldoutStyle; + private static GUIStyle timestampStyle; + private static GUIStyle clickableLabelBoldStyle; + private static GUIStyle _footerStyle; + private static GUIStyle _emptyListText; + private static GUIStyle _stacktraceTextAreaStyle; + private static GUIStyle _customFoldoutStyle; + private static GUIStyle _entryBoxStyle; + private static GUIStyle _childEntryBoxStyle; + private static GUIStyle _removeIconStyle; + private static GUIStyle upgradeLicenseButtonStyle; + private static GUIStyle upgradeLicenseButtonOverlayStyle; + private static GUIStyle upgradeButtonStyle; + private static GUIStyle hideButtonStyle; + private static GUIStyle dynamicSection; + private static GUIStyle dynamicSectionHelpTab; + private static GUIStyle helpTabButton; + private static GUIStyle indicationHelpBox; + private static GUIStyle notificationsTitleStyle; + + private static Color32? darkModeLinkColor; + private static Color32? lightModeModeLinkColor; + + public static bool IsDarkMode => EditorGUIUtility.isProSkin; + public static int windowScreenWidth => HotReloadWindow.Current ? (int)HotReloadWindow.Current.position.width : Screen.width; + public static int windowScreenHeight => HotReloadWindow.Current ? (int)HotReloadWindow.Current.position.height : Screen.height; + public static GUIStyle H1TitleStyle { + get { + if (h1TitleStyle == null) { + h1TitleStyle = new GUIStyle(EditorStyles.label); + h1TitleStyle.normal.textColor = EditorStyles.label.normal.textColor; + h1TitleStyle.fontStyle = FontStyle.Bold; + h1TitleStyle.fontSize = 16; + h1TitleStyle.padding.top = 5; + h1TitleStyle.padding.bottom = 5; + } + return h1TitleStyle; + } + } + + public static GUIStyle FooterStyle { + get { + if (_footerStyle == null) { + _footerStyle = new GUIStyle(); + _footerStyle.fixedHeight = 28; + } + return _footerStyle; + } + } + + public static GUIStyle H1TitleCenteredStyle { + get { + if (h1TitleCenteredStyle == null) { + h1TitleCenteredStyle = new GUIStyle(H1TitleStyle); + h1TitleCenteredStyle.alignment = TextAnchor.MiddleCenter; + } + return h1TitleCenteredStyle; + } + } + + public static GUIStyle H2TitleStyle { + get { + if (h2TitleStyle == null) { + h2TitleStyle = new GUIStyle(EditorStyles.label); + h2TitleStyle.normal.textColor = EditorStyles.label.normal.textColor; + h2TitleStyle.fontStyle = FontStyle.Bold; + h2TitleStyle.fontSize = 14; + h2TitleStyle.padding.top = 5; + h2TitleStyle.padding.bottom = 5; + } + return h2TitleStyle; + } + } + + public static GUIStyle H3TitleStyle { + get { + if (h3TitleStyle == null) { + h3TitleStyle = new GUIStyle(EditorStyles.label); + h3TitleStyle.normal.textColor = EditorStyles.label.normal.textColor; + h3TitleStyle.fontStyle = FontStyle.Bold; + h3TitleStyle.fontSize = 12; + h3TitleStyle.padding.top = 5; + h3TitleStyle.padding.bottom = 5; + } + return h3TitleStyle; + } + } + + public static GUIStyle NotificationsTitleStyle { + get { + if (notificationsTitleStyle == null) { + notificationsTitleStyle = new GUIStyle(HotReloadWindowStyles.H3TitleStyle); + notificationsTitleStyle.padding.bottom = 0; + notificationsTitleStyle.padding.top = 0; + } + return notificationsTitleStyle; + } + } + + public static GUIStyle H3TitleWrapStyle { + get { + if (h3TitleWrapStyle == null) { + h3TitleWrapStyle = new GUIStyle(H3TitleStyle); + h3TitleWrapStyle.wordWrap = true; + } + return h3TitleWrapStyle; + } + } + + public static GUIStyle H3CenteredTitleStyle { + get { + if (h3CenterTitleStyle == null) { + h3CenterTitleStyle = new GUIStyle(EditorStyles.label); + h3CenterTitleStyle.normal.textColor = EditorStyles.label.normal.textColor; + h3CenterTitleStyle.fontStyle = FontStyle.Bold; + h3CenterTitleStyle.alignment = TextAnchor.MiddleCenter; + h3CenterTitleStyle.fontSize = 12; + } + return h3CenterTitleStyle; + } + } + + public static GUIStyle H4TitleStyle { + get { + if (h4TitleStyle == null) { + h4TitleStyle = new GUIStyle(EditorStyles.label); + h4TitleStyle.normal.textColor = EditorStyles.label.normal.textColor; + h4TitleStyle.fontStyle = FontStyle.Bold; + h4TitleStyle.fontSize = 11; + } + return h4TitleStyle; + } + } + + public static GUIStyle H5TitleStyle { + get { + if (h5TitleStyle == null) { + h5TitleStyle = new GUIStyle(EditorStyles.label); + h5TitleStyle.normal.textColor = EditorStyles.label.normal.textColor; + h5TitleStyle.fontStyle = FontStyle.Bold; + h5TitleStyle.fontSize = 10; + } + return h5TitleStyle; + } + } + + public static GUIStyle LabelStyle { + get { + if (labelStyle == null) { + labelStyle = new GUIStyle(EditorStyles.label); + labelStyle.fontSize = 12; + labelStyle.clipping = TextClipping.Clip; + labelStyle.wordWrap = true; + } + return labelStyle; + } + } + + public static GUIStyle BoxStyle { + get { + if (boxStyle == null) { + boxStyle = new GUIStyle(EditorStyles.helpBox); + boxStyle.normal.textColor = GUI.skin.label.normal.textColor; + boxStyle.fontStyle = FontStyle.Bold; + boxStyle.alignment = TextAnchor.UpperLeft; + } + if (!IsDarkMode) { + boxStyle.normal.background = Texture2D.blackTexture; + } + return boxStyle; + } + } + + public static GUIStyle WrapStyle { + get { + if (wrapStyle == null) { + wrapStyle = new GUIStyle(EditorStyles.label); + wrapStyle.fontStyle = FontStyle.Normal; + wrapStyle.wordWrap = true; + } + return wrapStyle; + } + } + + public static GUIStyle NoPaddingMiddleLeftStyle { + get { + if (noPaddingMiddleLeftStyle == null) { + noPaddingMiddleLeftStyle = new GUIStyle(EditorStyles.label); + noPaddingMiddleLeftStyle.normal.textColor = GUI.skin.label.normal.textColor; + noPaddingMiddleLeftStyle.padding = new RectOffset(); + noPaddingMiddleLeftStyle.margin = new RectOffset(); + noPaddingMiddleLeftStyle.alignment = TextAnchor.MiddleLeft; + } + return noPaddingMiddleLeftStyle; + } + } + + public static GUIStyle MiddleLeftStyle { + get { + if (middleLeftStyle == null) { + middleLeftStyle = new GUIStyle(EditorStyles.label); + middleLeftStyle.fontStyle = FontStyle.Normal; + middleLeftStyle.alignment = TextAnchor.MiddleLeft; + } + + return middleLeftStyle; + } + } + + public static GUIStyle MiddleCenterStyle { + get { + if (middleCenterStyle == null) { + middleCenterStyle = new GUIStyle(EditorStyles.label); + middleCenterStyle.fontStyle = FontStyle.Normal; + middleCenterStyle.alignment = TextAnchor.MiddleCenter; + } + return middleCenterStyle; + } + } + + public static GUIStyle MediumMiddleCenterStyle { + get { + if (mediumMiddleCenterStyle == null) { + mediumMiddleCenterStyle = new GUIStyle(EditorStyles.label); + mediumMiddleCenterStyle.fontStyle = FontStyle.Normal; + mediumMiddleCenterStyle.fontSize = 12; + mediumMiddleCenterStyle.alignment = TextAnchor.MiddleCenter; + } + return mediumMiddleCenterStyle; + } + } + + public static GUIStyle TextFieldWrapStyle { + get { + if (textFieldWrapStyle == null) { + textFieldWrapStyle = new GUIStyle(EditorStyles.textField); + textFieldWrapStyle.wordWrap = true; + } + return textFieldWrapStyle; + } + } + + public static GUIStyle FoldoutStyle { + get { + if (foldoutStyle == null) { + foldoutStyle = new GUIStyle(EditorStyles.foldout); + foldoutStyle.normal.textColor = GUI.skin.label.normal.textColor; + foldoutStyle.alignment = TextAnchor.MiddleLeft; + foldoutStyle.fontStyle = FontStyle.Bold; + foldoutStyle.fontSize = 12; + } + return foldoutStyle; + } + } + + public static GUIStyle LogoStyle { + get { + if (logoStyle == null) { + logoStyle = new GUIStyle(); + logoStyle.margin = new RectOffset(6, 6, 0, 0); + logoStyle.padding = new RectOffset(16, 16, 0, 0); + } + return logoStyle; + } + } + + public static GUIStyle ChangelogPointerStyle { + get { + if (changelogPointersStyle == null) { + changelogPointersStyle = new GUIStyle(EditorStyles.label); + changelogPointersStyle.wordWrap = true; + changelogPointersStyle.fontSize = 12; + changelogPointersStyle.padding.left = 20; + } + return changelogPointersStyle; + } + } + + public static GUIStyle IndicationIcon { + get { + if (indicationIconStyle == null) { + indicationIconStyle = new GUIStyle(H2TitleStyle); + indicationIconStyle.fixedHeight = 20; + } + indicationIconStyle.padding = new RectOffset(left: windowScreenWidth > Constants.IndicationTextHideWidth ? 7 : 5, right: windowScreenWidth > Constants.IndicationTextHideWidth ? 0 : -10, top: 1, bottom: 1); + return indicationIconStyle; + } + } + + public static GUIStyle IndicationAlertIcon { + get { + if (indicationAlertIconStyle == null) { + indicationAlertIconStyle = new GUIStyle(H2TitleStyle); + indicationAlertIconStyle.padding = new RectOffset(left: 5, right: -7, top: 1, bottom: 1); + indicationAlertIconStyle.fixedHeight = 20; + } + return indicationAlertIconStyle; + } + } + + public static GUIStyle RecompileButton { + get { + if (recompileButtonStyle == null) { + recompileButtonStyle = new GUIStyle(EditorStyles.miniButton); + recompileButtonStyle.margin.top = 17; + recompileButtonStyle.fixedHeight = 25; + recompileButtonStyle.margin.right = 5; + } + recompileButtonStyle.fixedWidth = windowScreenWidth > Constants.RecompileButtonTextHideWidth ? 95 : 30; + return recompileButtonStyle; + } + } + + public static GUIStyle StartButton { + get { + if (startButtonStyle == null) { + startButtonStyle = new GUIStyle(EditorStyles.miniButton); + startButtonStyle.fixedHeight = 25; + startButtonStyle.padding.top = 6; + startButtonStyle.padding.bottom = 6; + startButtonStyle.margin.top = 17; + } + startButtonStyle.fixedWidth = windowScreenWidth > Constants.StartButtonTextHideWidth ? 70 : 30; + return startButtonStyle; + } + } + + public static GUIStyle StopButton { + get { + if (stopButtonStyle == null) { + stopButtonStyle = new GUIStyle(EditorStyles.miniButton); + stopButtonStyle.fixedHeight = 25; + stopButtonStyle.margin.top = 17; + } + stopButtonStyle.fixedWidth = HotReloadWindowStyles.windowScreenWidth > Constants.StartButtonTextHideWidth ? 70 : 30; + return stopButtonStyle; + } + } + + internal static GUIStyle EventFiltersStyle { + get { + if (eventFilters == null) { + eventFilters = new GUIStyle(EditorStyles.toolbarButton); + eventFilters.fontSize = 13; + // gets overwritten to content size + eventFilters.fixedHeight = 26; + eventFilters.fixedWidth = 50; + eventFilters.margin = new RectOffset(0, 0, 0, 0); + eventFilters.padding = new RectOffset(0, 0, 6, 6); + } + return eventFilters; + } + } + + private static Texture2D _clearBackground; + private static Texture2D clearBackground { + get { + if (_clearBackground == null) { + _clearBackground = new Texture2D(1, 1); + _clearBackground.SetPixel(0, 0, Color.clear); + _clearBackground.Apply(); + } + return _clearBackground; + + } + } + + public static GUIStyle SectionOuterBoxCompact { + get { + if (sectionOuterBoxCompactStyle == null) { + sectionOuterBoxCompactStyle = new GUIStyle(); + sectionOuterBoxCompactStyle.padding.top = 10; + sectionOuterBoxCompactStyle.padding.bottom = 10; + } + // Looks better without a background + sectionOuterBoxCompactStyle.normal.background = clearBackground; + return sectionOuterBoxCompactStyle; + } + } + + public static GUIStyle SectionInnerBox { + get { + if (sectionInnerBoxStyle == null) { + sectionInnerBoxStyle = new GUIStyle(); + } + sectionInnerBoxStyle.padding = new RectOffset(left: 0, right: 0, top: 15, bottom: 0); + return sectionInnerBoxStyle; + } + } + + public static GUIStyle SectionInnerBoxWide { + get { + if (sectionInnerBoxWideStyle == null) { + sectionInnerBoxWideStyle = new GUIStyle(EditorStyles.helpBox); + sectionInnerBoxWideStyle.padding.top = 15; + sectionInnerBoxWideStyle.padding.bottom = 15; + sectionInnerBoxWideStyle.padding.left = 10; + sectionInnerBoxWideStyle.padding.right = 10; + } + return sectionInnerBoxWideStyle; + } + } + + public static GUIStyle DynamiSection { + get { + if (dynamicSection == null) { + dynamicSection = new GUIStyle(); + } + var defaultPadding = 13; + if (windowScreenWidth > 600) { + var dynamicPadding = (windowScreenWidth - 600) / 2; + dynamicSection.padding.left = defaultPadding + dynamicPadding; + dynamicSection.padding.right = defaultPadding + dynamicPadding; + } else if (windowScreenWidth < Constants.IndicationTextHideWidth) { + dynamicSection.padding.left = 0; + dynamicSection.padding.right = 0; + } else { + dynamicSection.padding.left = 13; + dynamicSection.padding.right = 13; + } + return dynamicSection; + } + } + + public static GUIStyle DynamicSectionHelpTab { + get { + if (dynamicSectionHelpTab == null) { + dynamicSectionHelpTab = new GUIStyle(DynamiSection); + } + dynamicSectionHelpTab.padding.left = DynamiSection.padding.left - 3; + dynamicSectionHelpTab.padding.right = DynamiSection.padding.right - 3; + return dynamicSectionHelpTab; + } + } + + public static GUIStyle ChangelogSectionInnerBox { + get { + if (changelogSectionInnerBoxStyle == null) { + changelogSectionInnerBoxStyle = new GUIStyle(EditorStyles.helpBox); + changelogSectionInnerBoxStyle.margin.bottom = 10; + changelogSectionInnerBoxStyle.margin.top = 10; + } + return changelogSectionInnerBoxStyle; + } + } + + public static GUIStyle IndicationBox { + get { + if (indicationBoxStyle == null) { + indicationBoxStyle = new GUIStyle(); + } + indicationBoxStyle.margin.bottom = windowScreenWidth < 141 ? 0 : 10; + return indicationBoxStyle; + } + } + + + public static GUIStyle LinkStyle { + get { + if (linkStyle == null) { + linkStyle = new GUIStyle(EditorStyles.label); + linkStyle.fontStyle = FontStyle.Bold; + } + var color = IsDarkMode ? DarkModeLinkColor : LightModeModeLinkColor; + linkStyle.normal.textColor = color; + return linkStyle; + } + } + + private static Color32 DarkModeLinkColor { + get { + if (darkModeLinkColor == null) { + darkModeLinkColor = new Color32(0x3F, 0x9F, 0xFF, 0xFF); + } + return darkModeLinkColor.Value; + } + } + + + private static Color32 LightModeModeLinkColor { + get { + if (lightModeModeLinkColor == null) { + lightModeModeLinkColor = new Color32(0x0F, 0x52, 0xD7, 0xFF); + } + return lightModeModeLinkColor.Value; + } + } + public static GUIStyle ProgressBarBarStyle { + get { + if (progressBarBarStyle != null) { + return progressBarBarStyle; + } + var styles = (EditorStyles)typeof(EditorStyles) + .GetField("s_Current", BindingFlags.Static | BindingFlags.NonPublic) + ?.GetValue(null); + var style = styles?.GetType() + .GetField("m_ProgressBarBar", BindingFlags.NonPublic | BindingFlags.Instance) + ?.GetValue(styles); + progressBarBarStyle = style != null ? (GUIStyle)style : GUIStyle.none; + return progressBarBarStyle; + } + } + + internal static GUIStyle Section { + get { + if (section == null) { + section = new GUIStyle(EditorStyles.helpBox); + section.padding = new RectOffset(left: 10, right: 10, top: 10, bottom: 10); + section.margin = new RectOffset(left: 0, right: 0, top: 0, bottom: 0); + } + return section; + } + } + internal static GUIStyle Scroll { + get { + if (scroll == null) { + scroll = new GUIStyle(EditorStyles.helpBox); + } + if (IsDarkMode) { + scroll.normal.background = GUIHelper.ConvertTextureToColor(new Color(0,0,0,0.05f)); + } else { + scroll.normal.background = GUIHelper.ConvertTextureToColor(new Color(0,0,0,0.03f)); + } + return scroll; + } + } + + internal static GUIStyle BarStyle { + get { + if (barStyle == null) { + barStyle = new GUIStyle(GUI.skin.label); + barStyle.fontSize = 12; + barStyle.alignment = TextAnchor.MiddleLeft; + barStyle.fixedHeight = 20; + barStyle.padding = new RectOffset(10, 5, 2, 2); + } + return barStyle; + } + } + + internal static GUIStyle BarBackgroundStyle { + get { + if (barBgStyle == null) { + barBgStyle = new GUIStyle(); + } + barBgStyle.normal.background = GUIHelper.ConvertTextureToColor(Color.clear); + barBgStyle.hover.background = GUIHelper.ConvertTextureToColor(new Color(0, 0, 0, 0.1f)); + barBgStyle.focused.background = GUIHelper.ConvertTextureToColor(Color.clear); + barBgStyle.active.background = null; + return barBgStyle; + } + } + + internal static GUIStyle ChildBarStyle { + get { + if (barChildStyle == null) { + barChildStyle = new GUIStyle(BarStyle); + barChildStyle.padding = new RectOffset(43, barChildStyle.padding.right, barChildStyle.padding.top, barChildStyle.padding.bottom); + } + return barChildStyle; + } + } + + internal static GUIStyle FoldoutBarStyle { + get { + if (barFoldoutStyle == null) { + barFoldoutStyle = new GUIStyle(BarStyle); + barFoldoutStyle.padding = new RectOffset(23, barFoldoutStyle.padding.right, barFoldoutStyle.padding.top, barFoldoutStyle.padding.bottom); + } + return barFoldoutStyle; + } + } + + public static GUIStyle TimestampStyle { + get { + if (timestampStyle == null) { + timestampStyle = new GUIStyle(GUI.skin.label); + } + if (IsDarkMode) { + timestampStyle.normal.textColor = new Color(0.5f, 0.5f, 0.5f); + } else { + timestampStyle.normal.textColor = new Color(0.5f, 0.5f, 0.5f); + } + timestampStyle.hover = timestampStyle.normal; + return timestampStyle; + } + } + + internal static GUIStyle ClickableLabelBoldStyle { + get { + if (clickableLabelBoldStyle == null) { + clickableLabelBoldStyle = new GUIStyle(LabelStyle); + clickableLabelBoldStyle.fontStyle = FontStyle.Bold; + clickableLabelBoldStyle.fontSize = 14; + clickableLabelBoldStyle.margin.left = 17; + clickableLabelBoldStyle.active.textColor = clickableLabelBoldStyle.normal.textColor; + } + return clickableLabelBoldStyle; + } + } + + internal static GUIStyle EmptyListText { + get { + if (_emptyListText == null) { + _emptyListText = new GUIStyle(); + _emptyListText.fontSize = 11; + _emptyListText.padding.left = 15; + _emptyListText.padding.top = 10; + _emptyListText.alignment = TextAnchor.MiddleCenter; + _emptyListText.normal.textColor = Color.gray; + } + + return _emptyListText; + } + } + + internal static GUIStyle StacktraceTextAreaStyle { + get { + if (_stacktraceTextAreaStyle == null) { + _stacktraceTextAreaStyle = new GUIStyle(EditorStyles.textArea); + _stacktraceTextAreaStyle.border = new RectOffset(0, 0, 0, 0); + } + return _stacktraceTextAreaStyle; + } + } + + internal static GUIStyle EntryBoxStyle { + get { + if (_entryBoxStyle == null) { + _entryBoxStyle = new GUIStyle(); + _entryBoxStyle.margin.left = 30; + } + return _entryBoxStyle; + } + } + + internal static GUIStyle ChildEntryBoxStyle { + get { + if (_childEntryBoxStyle == null) { + _childEntryBoxStyle = new GUIStyle(); + _childEntryBoxStyle.margin.left = 45; + } + return _childEntryBoxStyle; + } + } + + internal static GUIStyle CustomFoldoutStyle { + get { + if (_customFoldoutStyle == null) { + _customFoldoutStyle = new GUIStyle(EditorStyles.foldout); + _customFoldoutStyle.margin.top = 4; + _customFoldoutStyle.margin.left = 0; + _customFoldoutStyle.padding.left = 0; + _customFoldoutStyle.fixedWidth = 100; + } + return _customFoldoutStyle; + } + } + + internal static GUIStyle RemoveIconStyle { + get { + if (_removeIconStyle == null) { + _removeIconStyle = new GUIStyle(); + _removeIconStyle.margin.top = 5; + _removeIconStyle.fixedWidth = 17; + _removeIconStyle.fixedHeight = 17; + } + return _removeIconStyle; + } + } + + internal static GUIStyle UpgradeLicenseButtonStyle { + get { + if (upgradeLicenseButtonStyle == null) { + upgradeLicenseButtonStyle = new GUIStyle(GUI.skin.button); + upgradeLicenseButtonStyle.padding = new RectOffset(5, 5, 0, 0); + } + return upgradeLicenseButtonStyle; + } + } + + internal static GUIStyle UpgradeLicenseButtonOverlayStyle { + get { + if (upgradeLicenseButtonOverlayStyle == null) { + upgradeLicenseButtonOverlayStyle = new GUIStyle(UpgradeLicenseButtonStyle); + } + return upgradeLicenseButtonOverlayStyle; + } + } + + internal static GUIStyle UpgradeButtonStyle { + get { + if (upgradeButtonStyle == null) { + upgradeButtonStyle = new GUIStyle(EditorStyles.miniButton); + upgradeButtonStyle.fontStyle = FontStyle.Bold; + upgradeButtonStyle.fontSize = 14; + upgradeButtonStyle.fixedHeight = 24; + } + return upgradeButtonStyle; + } + } + + internal static GUIStyle HideButtonStyle { + get { + if (hideButtonStyle == null) { + hideButtonStyle = new GUIStyle(GUI.skin.button); + } + return hideButtonStyle; + } + } + + internal static GUIStyle HelpTabButton { + get { + if (helpTabButton == null) { + helpTabButton = new GUIStyle(GUI.skin.button); + helpTabButton.alignment = TextAnchor.MiddleLeft; + helpTabButton.padding.left = 10; + } + return helpTabButton; + } + } + + internal static GUIStyle IndicationHelpBox { + get { + if (indicationHelpBox == null) { + indicationHelpBox = new GUIStyle(EditorStyles.helpBox); + indicationHelpBox.margin.right = 0; + indicationHelpBox.margin.left = 0; + } + return indicationHelpBox; + } + } + } +} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/Styles/HotReloadWindowStyles.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/Styles/HotReloadWindowStyles.cs.meta new file mode 100644 index 0000000..7bffb7f --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Editor/Window/Styles/HotReloadWindowStyles.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c06a986e9e8c3874f9578f0002ff3a2d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/LICENSE.md b/Playvoi.Client/Packages/com.singularitygroup.hotreload/LICENSE.md new file mode 100644 index 0000000..b9eb62e --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/LICENSE.md @@ -0,0 +1,45 @@ +End User License Agreement (“EULA”) for Hot Reload for Unity (“Software”) +Please read this End-User License Agreement ("Agreement") carefully before purchasing, downloading, or using Hot Reload for Unity ("Software"). + +By purchasing, downloading or using the Software, you, the individual or entity (“End-User”), agree to be bound by this EULA as well as by our Terms and Conditions. + +If End-User does not agree to the terms of this Agreement, do not purchase, download or use the Software. + +The subject matter of this EULA is the licensing of the Software to End-User. The Software is licensed, not sold. + +License + +The Naughty Cult Ltd. (“Licensor”) grants End-User a revocable, non-exclusive, worldwide, non-transferable, limited license to download, install and use the Software for personal and commercial purposes in accordance with the terms of this Agreement and the terms set out in the Terms and Conditions. + +The Software is owned and copyrighted by The Naughty Cult Ltd.. Your license confers no title or ownership in the Software and should not be construed as a sale of any right in the Software. + +The Software is protected by copyright law and international treaty provisions. You acknowledge that no ownership of the intellectual property in the Software is transferred to you. You further acknowledge that The Naughty Cult Ltd. retains full ownership rights to the Software, and you will not acquire any rights to the Software except as outlined in this license. You agree that any copies of the Software will include the same proprietary notices found on and within the original Software. + +End-User's Rights and Obligations + +End-User may use the licensed Software only for its intended purpose. End-User may not modify, reproduce, distribute, sublicense, rent, lease or lend the Software. +Each active license allows End-User to install and use the Software on a maximum of two devices associated with one specific Unity seat. End-User may not share the Software or the license key with any third party. + +You may not modify the Software or disable any licensing or control features of the Software without express permission from the Licensor. You agree that you will not attempt to reverse compile, modify, translate, or disassemble the Software in whole or in part. + +Once End-User's active license is terminated, End-User will not receive any new updates to the Software, and may not download, install, integrate or otherwise use versions of the Software released at any time hereafter, unless a license is activated. + +Termination +This EULA will terminate automatically if End-User fails to comply with any of the terms and conditions of this Agreement. In such event, End-User must immediately stop using the Software and destroy all copies of the Software in End-User's possession. + +Governing Law +This EULA shall be governed by the laws of the country in which the Licensor is headquartered without regard to its conflict of law provisions. We reserve the right to terminate or suspend your account, without notice or liability, for any reason, including breach of the Terms and Conditions and/or EULA. + +Limitation of Liability +The Naughty Cult Ltd. and its affiliates shall not be held liable for any indirect, incidental, special, consequential or punitive damages, including without limitation, loss of profits, data, use, goodwill, or other intangible losses, resulting from your use of or inability to use the Service, any conduct or content of any third party on the Service, any content obtained from the Service, or unauthorized access or alteration of your transmissions or content. This limitation applies regardless of whether the damages are based on warranty, contract, tort (including negligence), or any other legal theory, and even if we have been advised of the possibility of such damages. + + +Disclaimer of Warranties + +The Service is provided on an "as is" and "as available" basis without any warranties of any kind, either express or implied. We do not warrant that the Service will be uninterrupted or error-free, or that any defects will be corrected. We also do not guarantee that the Service will meet your requirements. + +Waiver and Severability +Our failure to enforce any right or provision of this EULA will not be deemed a waiver of such right or provision. In the event that any provision of these EULA is held to be invalid or unenforceable, the remaining provisions will remain in full force and effect. + +Entire Agreement +This EULA constitutes the entire agreement between End-User and Licensor regarding the use of the Software and supersedes all prior agreements and understandings, whether written or oral. diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/LICENSE.md.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/LICENSE.md.meta new file mode 100644 index 0000000..ad379b9 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/LICENSE.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0f0ed454ae8a66041bea966cdcee0f2e +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/README.md b/Playvoi.Client/Packages/com.singularitygroup.hotreload/README.md new file mode 100644 index 0000000..1c30967 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/README.md @@ -0,0 +1,9 @@ +![HotReloadLogo](https://hotreload.net/logo.png?w=256&q=75) + +# Hot Reload for Unity + +Edit **any C# function** and get immediate updates in your game. Hot Reload works with your existing project, no code changes required. + +Install instructions on https://hotreload.net/ + +![Modify2dJumpingGameDemo](https://hot-reload-assets.s3.amazonaws.com/assets/hotreload_jump_demo.gif) diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/README.md.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/README.md.meta new file mode 100644 index 0000000..f81e08a --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/README.md.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bdb53603710c4ae3b491b7885e5ff702 +timeCreated: 1674514875 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime.meta new file mode 100644 index 0000000..2b0c282 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8026562867072c3409c904654ec3c17f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/AppCallbackListener.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/AppCallbackListener.cs new file mode 100644 index 0000000..bad45db --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/AppCallbackListener.cs @@ -0,0 +1,55 @@ +#if ENABLE_MONO && (DEVELOPMENT_BUILD || UNITY_EDITOR) +using System; +using System.Collections; +using UnityEngine; + +namespace SingularityGroup.HotReload { + class AppCallbackListener : MonoBehaviour { + /// + /// Reliable on Android and in the editor. + /// + /// + /// On iOS, OnApplicationPause is not called at expected moments + /// if the app has some background modes enabled in PlayerSettings -Troy. + /// + public static event Action onApplicationPause; + + /// + /// Reliable on Android, iOS and in the editor. + /// + public static event Action onApplicationFocus; + + static AppCallbackListener instance; + public static AppCallbackListener I => instance; + + // Must be called early from Unity main thread (before any usages of the singleton I). + public static AppCallbackListener Init() { + if(instance) return instance; + var go = new GameObject("AppCallbackListener"); + go.hideFlags |= HideFlags.HideInHierarchy; + DontDestroyOnLoad(go); + return instance = go.AddComponent(); + } + + public bool Paused { get; private set; } = false; + + public void DelayedQuit(float seconds) { + StartCoroutine(delayedQuitRoutine(seconds)); + } + + IEnumerator delayedQuitRoutine(float seconds) { + yield return new WaitForSeconds(seconds); + Application.Quit(); + } + + void OnApplicationPause(bool paused) { + Paused = paused; + onApplicationPause?.Invoke(paused); + } + + void OnApplicationFocus(bool playing) { + onApplicationFocus?.Invoke(playing); + } + } +} +#endif diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/AppCallbackListener.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/AppCallbackListener.cs.meta new file mode 100644 index 0000000..7d6b636 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/AppCallbackListener.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a989a17330b04c6fb8f91aa41ac14471 +timeCreated: 1674216227 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/BuildInfo.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/BuildInfo.cs new file mode 100644 index 0000000..35162f8 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/BuildInfo.cs @@ -0,0 +1,166 @@ +#if ENABLE_MONO && (DEVELOPMENT_BUILD || UNITY_EDITOR) +using System; +using System.Collections.Generic; +using System.IO; +using JetBrains.Annotations; +using SingularityGroup.HotReload.Newtonsoft.Json; +using UnityEngine; +using UnityEngine.Serialization; + +namespace SingularityGroup.HotReload { + /// + /// Information about the Unity Player build. + /// + /// + /// + /// This info is used by the HotReload Server to compile your project in the same way that the Unity Player build was compiled.
+ /// For example, when building for Android, Unity sets a bunch of define symbols like UNITY_ANDROID. + ///
+ /// + /// Information that changes between builds is generated at build-time and put in StreamingAssets/.
+ /// This approach means that builds do not need to modify a project file (making file dirty in git). For example, + /// whenever user makes a mono build, the CommitHash changes and we need to regenerate the BuildInfo. + ///
+ ///
+ [Serializable] + class BuildInfo { + /// + /// Uniquely identifies the Unity project. + /// + /// + /// Used on-device to check if Hot Reload server is compatible with the Unity project (same project).
+ /// When your computer has multiple Unity projects open, each project should provide a different value.
+ /// This identifier must also be the same between two different computers that are collaborating on the same project. + /// + /// + /// Edge-case: when a user copy pastes an entire Unity project and has both open at once, + /// then it's fine for this identifier to be the same. + /// + ///
+ public string projectIdentifier; + + /// + /// Git commit hash + /// + /// + /// Used to detect that your code is different to when the build was made. + /// + public string commitHash; + + /// + /// List of define symbols that were active when this build was made. + /// + /// + /// Separate the symbols with a semi-colon character ';' + /// + public string defineSymbols; + + /// + /// A regex of C# project names (*.csproj) to be omitted from compilation. + /// + /// + /// "MyTests|MyEditorAssembly" + /// + [FormerlySerializedAs("projectExclusionRegex")] + public string projectOmissionRegex; + + /// + /// The computer that made the Android (or Standalone etc) build.
+ /// The hostname (ip address) where Hot Reload server would be listening. + ///
+ public string buildMachineHostName; + + /// + /// The computer that made the Android (or Standalone etc) build.
+ /// The port where Hot Reload server would be listening. + ///
+ public int buildMachinePort; + + /// + /// Selected build target in Unity Editor. + /// + public string activeBuildTarget; + + [JsonIgnore] + public HashSet DefineSymbolsAsHashSet { + get { + var symbols = defineSymbols.Trim().Split(';'); + // split on an empty string produces 1 empty string + if (symbols.Length == 1 && symbols[0] == string.Empty) { + return new HashSet(); + } + return new HashSet(symbols); + } + } + + [JsonIgnore] + public PatchServerInfo BuildMachineServer { + get { + if (buildMachineHostName == null || buildMachinePort == 0) { + return null; + } + return new PatchServerInfo(buildMachineHostName, buildMachinePort, commitHash, null); + } + } + + public string ToJson() { + return JsonConvert.SerializeObject(this); + } + + [CanBeNull] + public static BuildInfo FromJson(string json) { + if (string.IsNullOrEmpty(json)) { + return null; + } + return JsonConvert.DeserializeObject(json); + } + + /// + /// Path to read/write the json file to. + /// + /// A filepath that is inside the player build + public static string GetStoredPath() { + return Path.Combine(Application.streamingAssetsPath, GetStoredName()); + } + + public static string GetStoredName() { + return "HotReload_BuildInfo.json"; + } + + /// True if the commit hashes are definately different, otherwise False + public bool IsDifferentCommit(string remoteCommit) { + if (commitHash == PatchServerInfo.UnknownCommitHash) { + return false; + } + + return !SameCommit(commitHash, remoteCommit); + } + + /// + /// Checks whether the commits are equivalent. + /// + /// + /// + /// False if the commit hashes are definately different, otherwise True + public static bool SameCommit(string commitA, string commitB) { + if (commitA == null) { + // unknown commit hash, so approve anything + return true; + } + + if (commitA.Length == commitB.Length) { + return commitA == commitB; + } else if (commitA.Length >= 6 && commitB.Length >= 6) { + // depending on OS, the git log pretty output has different length (7 or 8 chars) + // if the longer hash starts with the shorter hash, return true + // Assumption: commits have different length. + var longer = commitA.Length > commitB.Length ? commitA : commitB; + var shorter = commitA.Length > commitB.Length ? commitB : commitA; + + return longer.StartsWith(shorter); + } + return false; + } + } +} +#endif diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/BuildInfo.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/BuildInfo.cs.meta new file mode 100644 index 0000000..5569a02 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/BuildInfo.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 39bb7d4cd9324f31b1882354b1cde762 +timeCreated: 1673776105 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Burst.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Burst.meta new file mode 100644 index 0000000..f58389b --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Burst.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d10d24dc13744197a80f50ac50f5d1a1 +timeCreated: 1675449699 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Burst/JobHotReloadUtility.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Burst/JobHotReloadUtility.cs new file mode 100644 index 0000000..344095d --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Burst/JobHotReloadUtility.cs @@ -0,0 +1,24 @@ +#if ENABLE_MONO && (DEVELOPMENT_BUILD || UNITY_EDITOR) +using System.Reflection; +using SingularityGroup.HotReload.DTO; + +namespace SingularityGroup.HotReload.Burst { + public static class JobHotReloadUtility { + public static void HotReloadBurstCompiledJobs(CodePatch patch, Module module) { + JobPatchUtility.PatchBurstCompiledJobs(patch, module, unityMajorVersion: + #if UNITY_2022_2_OR_NEWER + 2022 + #elif UNITY_2021_3_OR_NEWER + 2021 + #elif UNITY_2020_3_OR_NEWER + 2020 + #elif UNITY_2019_4_OR_NEWER + 2019 + #else + 2018 + #endif + ); + } + } +} +#endif diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Burst/JobHotReloadUtility.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Burst/JobHotReloadUtility.cs.meta new file mode 100644 index 0000000..0aefa34 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Burst/JobHotReloadUtility.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b9980b40e3ff447b94e71de238a37fb7 +timeCreated: 1676825622 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/BurstChecker.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/BurstChecker.cs new file mode 100644 index 0000000..af64873 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/BurstChecker.cs @@ -0,0 +1,41 @@ +#if ENABLE_MONO && (DEVELOPMENT_BUILD || UNITY_EDITOR) +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace SingularityGroup.HotReload { + static class BurstChecker { + //Use names instead of the types directly for compat with older unity versions + const string whitelistAttrName = "BurstCompileAttribute"; + const string blacklistAttrName = "BurstDiscardAttribute"; + + public static bool IsBurstCompiled(MethodBase method) { + //blacklist has precedence over whitelist + if(HasAttr(method.GetCustomAttributes(), blacklistAttrName)) { + return false; + } + if(HasAttr(method.GetCustomAttributes(), whitelistAttrName)) { + return true; + } + //Static methods inside a [BurstCompile] type are not burst compiled by default + if(method.DeclaringType == null || method.IsStatic) { + return false; + } + if(HasAttr(method.DeclaringType.GetCustomAttributes(), whitelistAttrName)) { + return true; + } + //No matching attributes + return false; + } + + static bool HasAttr(IEnumerable attributes, string name) { + foreach (var attr in attributes) { + if(attr.GetType().Name == name) { + return true; + } + } + return false; + } + } +} +#endif diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/BurstChecker.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/BurstChecker.cs.meta new file mode 100644 index 0000000..0164e4a --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/BurstChecker.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 20dfd902e9fc4485aeef90b9add39c0a +timeCreated: 1675404225 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/CodePatcher.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/CodePatcher.cs new file mode 100644 index 0000000..e97a499 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/CodePatcher.cs @@ -0,0 +1,423 @@ +#if ENABLE_MONO && (DEVELOPMENT_BUILD || UNITY_EDITOR) + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Threading; +using System.Threading.Tasks; +using SingularityGroup.HotReload.DTO; +using JetBrains.Annotations; +using SingularityGroup.HotReload.Burst; +using SingularityGroup.HotReload.HarmonyLib; +using SingularityGroup.HotReload.JsonConverters; +using SingularityGroup.HotReload.Newtonsoft.Json; +using SingularityGroup.HotReload.RuntimeDependencies; +using UnityEngine; +using UnityEngine.SceneManagement; + +[assembly: InternalsVisibleTo("SingularityGroup.HotReload.Editor")] + +namespace SingularityGroup.HotReload { + class RegisterPatchesResult { + public readonly List patchedMethods = new List(); + public readonly List addedMethods = new List(); + public readonly List> patchFailures = new List>(); + } + + class CodePatcher { + public static readonly CodePatcher I = new CodePatcher(); + /// Tag for use in Debug.Log. + public const string TAG = "HotReload"; + + internal int PatchesApplied { get; private set; } + string PersistencePath {get;} + + List pendingPatches; + readonly List patchHistory; + readonly HashSet seenResponses = new HashSet(); + string[] assemblySearchPaths; + SymbolResolver symbolResolver; + readonly string tmpDir; + + CodePatcher() { + pendingPatches = new List(); + patchHistory = new List(); + if(UnityHelper.IsEditor) { + tmpDir = PackageConst.LibraryCachePath; + } else { + tmpDir = UnityHelper.TemporaryCachePath; + } + if(!UnityHelper.IsEditor) { + PersistencePath = Path.Combine(UnityHelper.PersistentDataPath, "HotReload", "patches.json"); + try { + LoadPatches(PersistencePath); + } catch(Exception ex) { + Log.Error("Encountered exception when loading patches from disk:\n{0}", ex); + } + } + } + + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] + static void InitializeUnityEvents() { + UnityEventHelper.Initialize(); + } + + + void LoadPatches(string filePath) { + PlayerLog("Loading patches from file {0}", filePath); + var file = new FileInfo(filePath); + if(file.Exists) { + var bytes = File.ReadAllText(filePath); + var patches = JsonConvert.DeserializeObject>(bytes); + PlayerLog("Loaded {0} patches from disk", patches.Count.ToString()); + foreach (var patch in patches) { + RegisterPatches(patch, persist: false); + } + } + } + + + internal IReadOnlyList PendingPatches => pendingPatches; + internal SymbolResolver SymbolResolver => symbolResolver; + + + internal string[] GetAssemblySearchPaths() { + EnsureSymbolResolver(); + return assemblySearchPaths; + } + + internal RegisterPatchesResult RegisterPatches(MethodPatchResponse patches, bool persist) { + PlayerLog("Register patches.\nWarnings: {0} \nMethods:\n{1}", string.Join("\n", patches.failures), string.Join("\n", patches.patches.SelectMany(p => p.modifiedMethods).Select(m => m.displayName))); + pendingPatches.Add(patches); + return ApplyPatches(persist); + } + + RegisterPatchesResult ApplyPatches(bool persist) { + PlayerLog("ApplyPatches. {0} patches pending.", pendingPatches.Count); + EnsureSymbolResolver(); + + var result = new RegisterPatchesResult(); + + try { + int count = 0; + foreach(var response in pendingPatches) { + if (seenResponses.Contains(response.id)) { + continue; + } + HandleMethodPatchResponse(response, result); + patchHistory.Add(response); + + seenResponses.Add(response.id); + count += response.patches.Length; + } + if (count > 0) { + Dispatch.OnHotReload().Forget(); + } + } catch(Exception ex) { + Log.Warning("Exception occured when handling method patch. Exception:\n{0}", ex); + } finally { + pendingPatches.Clear(); + } + + if(PersistencePath != null && persist) { + SaveAppliedPatches(PersistencePath).Forget(); + } + + PatchesApplied++; + return result; + } + + internal void ClearPatchedMethods() { + PatchesApplied = 0; + } + + static bool didLog; + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)] + static void WarnOnSceneLoad() { + SceneManager.sceneLoaded += (_, __) => { + if (didLog || !UnityEventHelper.UnityMethodsAdded()) { + return; + } + Log.Warning("A new Scene was loaded while new unity event methods were added at runtime. MonoBehaviours in the Scene will not trigger these new events."); + didLog = true; + }; + } + + void HandleMethodPatchResponse(MethodPatchResponse response, RegisterPatchesResult result) { + EnsureSymbolResolver(); + + foreach(var patch in response.patches) { + try { + var asm = Assembly.Load(patch.patchAssembly, patch.patchPdb); + + var module = asm.GetLoadedModules()[0]; + foreach(var sMethod in patch.newMethods) { + var newMethod = module.ResolveMethod(sMethod.metadataToken); + try { + UnityEventHelper.EnsureUnityEventMethod(newMethod); + } catch(Exception ex) { + Log.Warning("Encountered exception in EnsureUnityEventMethod: {0} {1}", ex.GetType().Name, ex.Message); + } + MethodUtils.DisableVisibilityChecks(newMethod); + if (!patch.patchMethods.Any(m => m.metadataToken == sMethod.metadataToken)) { + result.addedMethods.Add(sMethod); + } + } + + symbolResolver.AddAssembly(asm); + for (int i = 0; i < patch.modifiedMethods.Length; i++) { + var sOriginalMethod = patch.modifiedMethods[i]; + var sPatchMethod = patch.patchMethods[i]; + var err = PatchMethod(module: module, sOriginalMethod: sOriginalMethod, sPatchMethod: sPatchMethod, containsBurstJobs: patch.unityJobs.Length > 0, patchesResult: result); + if (!string.IsNullOrEmpty(err)) { + result.patchFailures.Add(Tuple.Create(sOriginalMethod, err)); + } + } + JobHotReloadUtility.HotReloadBurstCompiledJobs(patch, module); + } catch(Exception ex) { + Log.Warning("Failed to apply patch with id: {0}\n{1}", patch.patchId, ex); + } + } + } + + string PatchMethod(Module module, SMethod sOriginalMethod, SMethod sPatchMethod, bool containsBurstJobs, RegisterPatchesResult patchesResult) { + try { + var patchMethod = module.ResolveMethod(sPatchMethod.metadataToken); + var start = DateTime.UtcNow; + var state = TryResolveMethod(sOriginalMethod, patchMethod); + + if (DateTime.UtcNow - start > TimeSpan.FromMilliseconds(500)) { + Log.Info("Hot Reload apply took {0}", (DateTime.UtcNow - start).TotalMilliseconds); + } + + if(state.match == null) { + var error = + "Method mismatch: {0}, patch: {1}. This can have multiple reasons:\n" + + "1. You are running the Editor multiple times for the same project using symlinks, and are making changes from the symlink project\n" + + "2. A bug in Hot Reload. Please send us a reproduce (code before/after), and we'll get it fixed for you\n" + ; + Log.Warning(error, sOriginalMethod.simpleName, patchMethod.Name); + + return string.Format(error, sOriginalMethod.simpleName, patchMethod.Name); + } + + PlayerLog("Detour method {0:X8} {1}, offset: {2}", sOriginalMethod.metadataToken, patchMethod.Name, state.offset); + DetourResult result; + DetourApi.DetourMethod(state.match, patchMethod, out result); + if (result.success) { + patchesResult.patchedMethods.Add(sOriginalMethod); + try { + Dispatch.OnHotReloadLocal(state.match, patchMethod); + } catch { + // best effort + } + return null; + } else { + if(result.exception is InvalidProgramException && containsBurstJobs) { + //ignore. The method is likely burst compiled and can't be patched + return null; + } else { + return HandleMethodPatchFailure(sOriginalMethod, result.exception); + } + } + } catch(Exception ex) { + return HandleMethodPatchFailure(sOriginalMethod, ex); + } + } + + struct ResolveMethodState { + public readonly SMethod originalMethod; + public readonly int offset; + public readonly bool tryLowerTokens; + public readonly bool tryHigherTokens; + public readonly MethodBase match; + public ResolveMethodState(SMethod originalMethod, int offset, bool tryLowerTokens, bool tryHigherTokens, MethodBase match) { + this.originalMethod = originalMethod; + this.offset = offset; + this.tryLowerTokens = tryLowerTokens; + this.tryHigherTokens = tryHigherTokens; + this.match = match; + } + + public ResolveMethodState With(bool? tryLowerTokens = null, bool? tryHigherTokens = null, MethodBase match = null, int? offset = null) { + return new ResolveMethodState( + originalMethod, + offset ?? this.offset, + tryLowerTokens ?? this.tryLowerTokens, + tryHigherTokens ?? this.tryHigherTokens, + match ?? this.match); + } + } + + struct ResolveMethodResult { + public readonly MethodBase resolvedMethod; + public readonly bool tokenOutOfRange; + public ResolveMethodResult(MethodBase resolvedMethod, bool tokenOutOfRange) { + this.resolvedMethod = resolvedMethod; + this.tokenOutOfRange = tokenOutOfRange; + } + } + + ResolveMethodState TryResolveMethod(SMethod originalMethod, MethodBase patchMethod) { + var state = new ResolveMethodState(originalMethod, offset: 0, tryLowerTokens: true, tryHigherTokens: true, match: null); + var result = TryResolveMethodCore(state.originalMethod, patchMethod, 0); + if(result.resolvedMethod != null) { + return state.With(match: result.resolvedMethod); + } + state = state.With(offset: 1); + const int tries = 100000; + while(state.offset <= tries && (state.tryHigherTokens || state.tryLowerTokens)) { + if(state.tryHigherTokens) { + result = TryResolveMethodCore(originalMethod, patchMethod, state.offset); + if(result.resolvedMethod != null) { + return state.With(match: result.resolvedMethod); + } else if(result.tokenOutOfRange) { + state = state.With(tryHigherTokens: false); + } + } + if(state.tryLowerTokens) { + result = TryResolveMethodCore(originalMethod, patchMethod, -state.offset); + if(result.resolvedMethod != null) { + return state.With(match: result.resolvedMethod); + } else if(result.tokenOutOfRange) { + state = state.With(tryLowerTokens: false); + } + } + state = state.With(offset: state.offset + 1); + } + return state; + } + + + ResolveMethodResult TryResolveMethodCore(SMethod methodToResolve, MethodBase patchMethod, int offset) { + bool tokenOutOfRange = false; + MethodBase resolvedMethod = null; + try { + resolvedMethod = TryGetMethodBaseWithRelativeToken(methodToResolve, offset); + if(!MethodCompatiblity.AreMethodsCompatible(resolvedMethod, patchMethod)) { + resolvedMethod = null; + } + } catch (SymbolResolvingFailedException ex) when(ex.InnerException is ArgumentOutOfRangeException) { + tokenOutOfRange = true; + } catch (ArgumentOutOfRangeException) { + tokenOutOfRange = true; + } + return new ResolveMethodResult(resolvedMethod, tokenOutOfRange); + } + + MethodBase TryGetMethodBaseWithRelativeToken(SMethod sOriginalMethod, int offset) { + return symbolResolver.Resolve(new SMethod(sOriginalMethod.assemblyName, + sOriginalMethod.displayName, + sOriginalMethod.metadataToken + offset, + sOriginalMethod.genericTypeArguments, + sOriginalMethod.genericTypeArguments, + sOriginalMethod.simpleName)); + } + + string HandleMethodPatchFailure(SMethod method, Exception exception) { + var err = $"Failed to apply patch for method {method.displayName} in assembly {method.assemblyName}\n{exception}"; + Log.Warning(err); + return err; + } + + void EnsureSymbolResolver() { + if (symbolResolver == null) { + var searchPaths = new HashSet(); + var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + var assembliesByName = new Dictionary>(); + for (var i = 0; i < assemblies.Length; i++) { + var name = assemblies[i].GetNameSafe(); + List list; + if (!assembliesByName.TryGetValue(name, out list)) { + assembliesByName.Add(name, list = new List()); + } + list.Add(assemblies[i]); + + if(assemblies[i].IsDynamic) continue; + + var location = assemblies[i].Location; + if(File.Exists(location)) { + searchPaths.Add(Path.GetDirectoryName(Path.GetFullPath(location))); + } + } + symbolResolver = new SymbolResolver(assembliesByName); + assemblySearchPaths = searchPaths.ToArray(); + } + } + + + //Allow one save operation at a time. + readonly SemaphoreSlim gate = new SemaphoreSlim(1); + public async Task SaveAppliedPatches(string filePath) { + await gate.WaitAsync(); + try { + await SaveAppliedPatchesNoLock(filePath); + } finally { + gate.Release(); + } + } + + async Task SaveAppliedPatchesNoLock(string filePath) { + if (filePath == null) { + throw new ArgumentNullException(nameof(filePath)); + } + filePath = Path.GetFullPath(filePath); + var dir = Path.GetDirectoryName(filePath); + if(string.IsNullOrEmpty(dir)) { + throw new ArgumentException("Invalid path: " + filePath, nameof(filePath)); + } + Directory.CreateDirectory(dir); + var history = patchHistory.ToList(); + + PlayerLog("Saving {0} applied patches to {1}", history.Count, filePath); + + await Task.Run(() => { + using (FileStream fs = File.Create(filePath)) + using (StreamWriter sw = new StreamWriter(fs)) + using (JsonWriter writer = new JsonTextWriter(sw)) { + JsonSerializer serializer = JsonSerializer.Create(new JsonSerializerSettings { + Converters = new List { new MethodPatchResponsesConverter() } + }); + serializer.Serialize(writer, history); + } + }); + } + + public void InitPatchesBlocked(string filePath) { + seenResponses.Clear(); + var file = new FileInfo(filePath); + if (file.Exists) { + using(var fs = new FileStream(file.FullName, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.SequentialScan)) + using (StreamReader sr = new StreamReader(fs)) + using (JsonReader reader = new JsonTextReader(sr)) { + JsonSerializer serializer = JsonSerializer.Create(new JsonSerializerSettings { + Converters = new List { new MethodPatchResponsesConverter() } + }); + pendingPatches = serializer.Deserialize>(reader); + } + ApplyPatches(persist: false); + } + } + + + [StringFormatMethod("format")] + static void PlayerLog(string format, params object[] args) { +#if !UNITY_EDITOR + HotReload.Log.Info(format, args); +#endif //!UNITY_EDITOR + } + + class SimpleMethodComparer : IEqualityComparer { + public static readonly SimpleMethodComparer I = new SimpleMethodComparer(); + SimpleMethodComparer() { } + public bool Equals(SMethod x, SMethod y) => x.metadataToken == y.metadataToken; + public int GetHashCode(SMethod x) { + return x.metadataToken; + } + } + } +} +#endif diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/CodePatcher.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/CodePatcher.cs.meta new file mode 100644 index 0000000..a9af2f1 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/CodePatcher.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b6c8477b90c3f384f8124d62a5dc6e74 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo.meta new file mode 100644 index 0000000..d67b179 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 55206f9d10104e838249bf8ac177e332 +timeCreated: 1677091847 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes.meta new file mode 100644 index 0000000..a16c17b --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c895e9065d763824f9211fa8054f7c2e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBasicDemo.unity b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBasicDemo.unity new file mode 100644 index 0000000..a967bee --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBasicDemo.unity @@ -0,0 +1,1121 @@ +%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.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 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: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.18028378, g: 0.22571412, b: 0.30692285, 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: 1 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + 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: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + 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: 463b4a464af955e4d8d6b0a2923d94d0, 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 &19295889 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 19295893} + - component: {fileID: 19295892} + - component: {fileID: 19295891} + - component: {fileID: 19295890} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!65 &19295890 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 19295889} + 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 &19295891 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 19295889} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &19295892 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 19295889} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &19295893 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 19295889} + 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_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &249270788 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 249270791} + - component: {fileID: 249270790} + - component: {fileID: 249270789} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &249270789 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249270788} + m_Enabled: 1 +--- !u!20 &249270790 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249270788} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, 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: 0.3 + far clip plane: 1000 + 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 &249270791 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249270788} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &460271676 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 460271677} + - component: {fileID: 460271679} + - component: {fileID: 460271678} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &460271677 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 460271676} + 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: 511172213} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -28.681885, y: -20.492146} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &460271678 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 460271676} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 1 + m_MinSize: 24 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Open Script +--- !u!222 &460271679 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 460271676} + m_CullTransparentMesh: 0 +--- !u!1 &511172212 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 511172213} + - component: {fileID: 511172216} + - component: {fileID: 511172215} + - component: {fileID: 511172214} + m_Layer: 5 + m_Name: Button open script + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &511172213 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 511172212} + 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: 460271677} + m_Father: {fileID: 649153321} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -256.6, y: 118} + m_SizeDelta: {x: 392.12805, y: 72.27574} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &511172214 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 511172212} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 511172215} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &511172215 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 511172212} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &511172216 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 511172212} + m_CullTransparentMesh: 0 +--- !u!1 &649153317 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 649153321} + - component: {fileID: 649153320} + - component: {fileID: 649153319} + - component: {fileID: 649153318} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &649153318 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 649153317} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &649153319 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 649153317} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1280, y: 720} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &649153320 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 649153317} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 1 + m_Camera: {fileID: 249270790} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &649153321 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 649153317} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1537524790} + - {fileID: 1847025553} + - {fileID: 511172213} + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &700195177 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 700195180} + - component: {fileID: 700195179} + - component: {fileID: 700195178} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &700195178 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 700195177} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &700195179 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 700195177} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &700195180 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 700195177} + 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_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &965437870 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 965437872} + - component: {fileID: 965437871} + 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 &965437871 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 965437870} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + 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 &965437872 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 965437870} + 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_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1101930858 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1101930859} + - component: {fileID: 1101930861} + - component: {fileID: 1101930860} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1101930859 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1101930858} + 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: 1847025553} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -28.681885, y: -20.492146} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1101930860 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1101930858} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 1 + m_MinSize: 24 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Open Editor tab +--- !u!222 &1101930861 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1101930858} + m_CullTransparentMesh: 0 +--- !u!1 &1537524789 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1537524790} + - component: {fileID: 1537524792} + - component: {fileID: 1537524791} + m_Layer: 5 + m_Name: InformationText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1537524790 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1537524789} + 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: 649153321} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -0.00000095367, y: 215.4} + m_SizeDelta: {x: 861.9848, y: 122.55513} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1537524791 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1537524789} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Hot Reload is not running yet +--- !u!222 &1537524792 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1537524789} + m_CullTransparentMesh: 0 +--- !u!1 &1847025552 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1847025553} + - component: {fileID: 1847025556} + - component: {fileID: 1847025555} + - component: {fileID: 1847025554} + m_Layer: 5 + m_Name: Button open editor tab + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1847025553 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1847025552} + 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: 1101930859} + m_Father: {fileID: 649153321} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 218.9, y: 118} + m_SizeDelta: {x: 392.12805, y: 72.27574} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1847025554 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1847025552} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1847025555} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1847025555 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1847025552} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1847025556 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1847025552} + m_CullTransparentMesh: 0 +--- !u!1 &2132145875 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2132145876} + - component: {fileID: 2132145877} + m_Layer: 0 + m_Name: HotReloadDemo + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2132145876 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2132145875} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 18.716805, y: 53.419094, z: 92.546875} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2132145877 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2132145875} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5a2e4d3f095a9441688c70278068eee0, type: 3} + m_Name: + m_EditorClassIdentifier: + cube: {fileID: 19295889} + informationText: {fileID: 1537524791} + openWindowButton: {fileID: 1847025554} + openScriptButton: {fileID: 511172214} + thisScript: {fileID: 11500000, guid: 5a2e4d3f095a9441688c70278068eee0, type: 3} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBasicDemo.unity.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBasicDemo.unity.meta new file mode 100644 index 0000000..4b337ae --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBasicDemo.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ae744488364b34fcf8c80218eadc721c +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBurstDemo.unity b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBurstDemo.unity new file mode 100644 index 0000000..9ad180f --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBurstDemo.unity @@ -0,0 +1,9607 @@ +%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.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 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: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.18028378, g: 0.22571412, b: 0.30692285, 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: 1 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + 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: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + 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: 961e97ae3d4011b47a1198a930f5c30d, 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 &19295889 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 19295893} + - component: {fileID: 19295892} + - component: {fileID: 19295891} + - component: {fileID: 19295890} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!65 &19295890 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 19295889} + 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 &19295891 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 19295889} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &19295892 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 19295889} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &19295893 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 19295889} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -4.19, y: 0.8224261, z: 0.0616778} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &40618803 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 40618804} + - component: {fileID: 40618807} + - component: {fileID: 40618806} + - component: {fileID: 40618805} + m_Layer: 0 + m_Name: Cube (48) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &40618804 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 40618803} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1.73, y: 2.4375737, z: 0.0616778} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &40618805 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 40618803} + 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 &40618806 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 40618803} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &40618807 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 40618803} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &53988356 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 53988357} + - component: {fileID: 53988360} + - component: {fileID: 53988359} + - component: {fileID: 53988358} + m_Layer: 0 + m_Name: Cube (75) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &53988357 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 53988356} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -4.19, y: 2.427574, z: 5.4483223} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &53988358 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 53988356} + 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 &53988359 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 53988356} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &53988360 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 53988356} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &69029314 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 69029315} + - component: {fileID: 69029318} + - component: {fileID: 69029317} + - component: {fileID: 69029316} + m_Layer: 0 + m_Name: Cube (16) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &69029315 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 69029314} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -7, y: -1.6699998, z: 1.85} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &69029316 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 69029314} + 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 &69029317 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 69029314} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &69029318 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 69029314} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &121342030 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 121342031} + - component: {fileID: 121342034} + - component: {fileID: 121342033} + - component: {fileID: 121342032} + m_Layer: 0 + m_Name: Cube (43) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &121342031 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 121342030} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1.73, y: 4.92, z: 0.0616778} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &121342032 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 121342030} + 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 &121342033 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 121342030} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &121342034 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 121342030} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &127719937 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 127719938} + - component: {fileID: 127719941} + - component: {fileID: 127719940} + - component: {fileID: 127719939} + m_Layer: 0 + m_Name: Cube (67) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &127719938 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 127719937} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.36, y: 2.4375737, z: 3.66} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &127719939 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 127719937} + 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 &127719940 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 127719937} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &127719941 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 127719937} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &128004585 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 128004586} + - component: {fileID: 128004589} + - component: {fileID: 128004588} + - component: {fileID: 128004587} + m_Layer: 0 + m_Name: Cube (56) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &128004586 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 128004585} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -7, y: 2.427574, z: 1.85} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &128004587 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 128004585} + 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 &128004588 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 128004585} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &128004589 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 128004585} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &132063619 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 132063620} + - component: {fileID: 132063623} + - component: {fileID: 132063622} + - component: {fileID: 132063621} + m_Layer: 0 + m_Name: Cube (4) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &132063620 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 132063619} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 5.4900002, y: 0.8224261, z: 0.0616778} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &132063621 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 132063619} + 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 &132063622 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 132063619} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &132063623 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 132063619} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &133838188 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 133838189} + - component: {fileID: 133838192} + - component: {fileID: 133838191} + - component: {fileID: 133838190} + m_Layer: 0 + m_Name: Cube (62) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &133838189 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 133838188} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.36, y: 4.92, z: 3.66} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &133838190 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 133838188} + 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 &133838191 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 133838188} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &133838192 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 133838188} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &181686442 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 181686443} + - component: {fileID: 181686446} + - component: {fileID: 181686445} + - component: {fileID: 181686444} + m_Layer: 0 + m_Name: Cube (13) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &181686443 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 181686442} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1.73, y: 0.8124263, z: 1.85} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &181686444 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 181686442} + 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 &181686445 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 181686442} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &181686446 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 181686442} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &218081520 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 218081521} + - component: {fileID: 218081524} + - component: {fileID: 218081523} + - component: {fileID: 218081522} + m_Layer: 0 + m_Name: Cube (66) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &218081521 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 218081520} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -7, y: 2.4375737, z: 3.66} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &218081522 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 218081520} + 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 &218081523 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 218081520} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &218081524 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 218081520} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &249270788 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 249270791} + - component: {fileID: 249270790} + - component: {fileID: 249270789} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &249270789 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249270788} + m_Enabled: 1 +--- !u!20 &249270790 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249270788} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, 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: 0.3 + far clip plane: 1000 + 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 &249270791 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249270788} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &249919994 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 249919995} + - component: {fileID: 249919998} + - component: {fileID: 249919997} + - component: {fileID: 249919996} + m_Layer: 0 + m_Name: Cube (50) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &249919995 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249919994} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -4.19, y: 4.91, z: 1.85} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &249919996 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249919994} + 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 &249919997 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249919994} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &249919998 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249919994} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &262969854 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 262969855} + - component: {fileID: 262969858} + - component: {fileID: 262969857} + - component: {fileID: 262969856} + m_Layer: 0 + m_Name: Cube (30) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &262969855 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 262969854} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -4.19, y: 0.8124263, z: 5.4483223} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &262969856 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 262969854} + 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 &262969857 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 262969854} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &262969858 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 262969854} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &266848583 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 266848584} + - component: {fileID: 266848587} + - component: {fileID: 266848586} + - component: {fileID: 266848585} + m_Layer: 0 + m_Name: Cube (21) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &266848584 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 266848583} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -7, y: 0.8224261, z: 3.66} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &266848585 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 266848583} + 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 &266848586 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 266848583} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &266848587 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 266848583} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &280025523 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 280025524} + - component: {fileID: 280025527} + - component: {fileID: 280025526} + - component: {fileID: 280025525} + m_Layer: 0 + m_Name: Cube (8) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &280025524 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 280025523} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1.73, y: -1.6600001, z: 0.0616778} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &280025525 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 280025523} + 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 &280025526 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 280025523} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &280025527 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 280025523} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &282541332 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 282541333} + - component: {fileID: 282541336} + - component: {fileID: 282541335} + - component: {fileID: 282541334} + m_Layer: 0 + m_Name: Cube (52) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &282541333 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 282541332} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.36, y: 4.91, z: 1.85} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &282541334 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 282541332} + 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 &282541335 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 282541332} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &282541336 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 282541332} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &297017159 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 297017160} + - component: {fileID: 297017163} + - component: {fileID: 297017162} + - component: {fileID: 297017161} + m_Layer: 0 + m_Name: Cube (5) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &297017160 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 297017159} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -4.19, y: -1.66, z: 0.0616778} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &297017161 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 297017159} + 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 &297017162 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 297017159} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &297017163 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 297017159} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &297623418 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 297623419} + - component: {fileID: 297623422} + - component: {fileID: 297623421} + - component: {fileID: 297623420} + m_Layer: 0 + m_Name: Cube (76) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &297623419 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 297623418} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -7, y: 2.427574, z: 5.4483223} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &297623420 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 297623418} + 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 &297623421 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 297623418} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &297623422 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 297623418} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &315895885 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 315895886} + - component: {fileID: 315895889} + - component: {fileID: 315895888} + - component: {fileID: 315895887} + m_Layer: 0 + m_Name: Cube (72) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &315895886 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 315895885} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.36, y: 4.91, z: 5.4483223} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &315895887 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 315895885} + 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 &315895888 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 315895885} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &315895889 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 315895885} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &321495839 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 321495840} + m_Layer: 0 + m_Name: Cubes + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &321495840 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 321495839} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.908883, y: -0.8224261, z: -0.0616778} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 19295893} + - {fileID: 323745810} + - {fileID: 582255912} + - {fileID: 1893598706} + - {fileID: 132063620} + - {fileID: 297017160} + - {fileID: 768601852} + - {fileID: 1931512540} + - {fileID: 280025524} + - {fileID: 1281233703} + - {fileID: 1927368435} + - {fileID: 2042268981} + - {fileID: 1682534256} + - {fileID: 181686443} + - {fileID: 351532142} + - {fileID: 1500025043} + - {fileID: 69029315} + - {fileID: 667369431} + - {fileID: 375087532} + - {fileID: 1124320615} + - {fileID: 927111012} + - {fileID: 266848584} + - {fileID: 2063974669} + - {fileID: 1010368909} + - {fileID: 1343033883} + - {fileID: 781926843} + - {fileID: 341472300} + - {fileID: 2136109399} + - {fileID: 677037662} + - {fileID: 1973025879} + - {fileID: 262969855} + - {fileID: 1399883246} + - {fileID: 743324179} + - {fileID: 1586797431} + - {fileID: 1123278460} + - {fileID: 928584462} + - {fileID: 1069134373} + - {fileID: 2014093030} + - {fileID: 792419466} + - {fileID: 1855770257} + - {fileID: 893274498} + - {fileID: 500782909} + - {fileID: 443249060} + - {fileID: 121342031} + - {fileID: 1130193477} + - {fileID: 523436227} + - {fileID: 1600668863} + - {fileID: 2053621922} + - {fileID: 40618804} + - {fileID: 738032838} + - {fileID: 249919995} + - {fileID: 835270569} + - {fileID: 282541333} + - {fileID: 519530843} + - {fileID: 1774902065} + - {fileID: 1019461522} + - {fileID: 128004586} + - {fileID: 1231537575} + - {fileID: 1965297415} + - {fileID: 589500252} + - {fileID: 1218495767} + - {fileID: 778191808} + - {fileID: 133838189} + - {fileID: 1983101811} + - {fileID: 387856195} + - {fileID: 2102038396} + - {fileID: 218081521} + - {fileID: 127719938} + - {fileID: 1555484938} + - {fileID: 1876148967} + - {fileID: 1228425737} + - {fileID: 801020416} + - {fileID: 315895886} + - {fileID: 1768551574} + - {fileID: 1850807847} + - {fileID: 53988357} + - {fileID: 297623419} + - {fileID: 1946060858} + - {fileID: 1380444550} + - {fileID: 643205569} + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &323745809 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 323745810} + - component: {fileID: 323745813} + - component: {fileID: 323745812} + - component: {fileID: 323745811} + m_Layer: 0 + m_Name: Cube (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &323745810 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 323745809} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -7, y: 0.8224261, z: 0.0616778} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &323745811 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 323745809} + 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 &323745812 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 323745809} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &323745813 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 323745809} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &341472299 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 341472300} + - component: {fileID: 341472303} + - component: {fileID: 341472302} + - component: {fileID: 341472301} + m_Layer: 0 + m_Name: Cube (26) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &341472300 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 341472299} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -7, y: -1.6600001, z: 3.66} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &341472301 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 341472299} + 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 &341472302 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 341472299} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &341472303 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 341472299} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &351532141 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 351532142} + - component: {fileID: 351532145} + - component: {fileID: 351532144} + - component: {fileID: 351532143} + m_Layer: 0 + m_Name: Cube (14) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &351532142 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 351532141} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 5.4900002, y: 0.8124263, z: 1.85} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &351532143 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 351532141} + 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 &351532144 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 351532141} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &351532145 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 351532141} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &375087531 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 375087532} + - component: {fileID: 375087535} + - component: {fileID: 375087534} + - component: {fileID: 375087533} + m_Layer: 0 + m_Name: Cube (18) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &375087532 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 375087531} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1.73, y: -1.67, z: 1.85} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &375087533 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 375087531} + 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 &375087534 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 375087531} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &375087535 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 375087531} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &387856194 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 387856195} + - component: {fileID: 387856198} + - component: {fileID: 387856197} + - component: {fileID: 387856196} + m_Layer: 0 + m_Name: Cube (64) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &387856195 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 387856194} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 5.4900002, y: 4.92, z: 3.66} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &387856196 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 387856194} + 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 &387856197 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 387856194} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &387856198 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 387856194} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &443249059 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 443249060} + - component: {fileID: 443249063} + - component: {fileID: 443249062} + - component: {fileID: 443249061} + m_Layer: 0 + m_Name: Cube (42) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &443249060 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 443249059} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.36, y: 4.92, z: 0.0616778} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &443249061 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 443249059} + 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 &443249062 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 443249059} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &443249063 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 443249059} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &460271676 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 460271677} + - component: {fileID: 460271679} + - component: {fileID: 460271678} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &460271677 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 460271676} + 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: 511172213} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -28.681885, y: -20.492146} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &460271678 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 460271676} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 1 + m_MinSize: 24 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Open Script +--- !u!222 &460271679 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 460271676} + m_CullTransparentMesh: 0 +--- !u!1 &500782908 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 500782909} + - component: {fileID: 500782912} + - component: {fileID: 500782911} + - component: {fileID: 500782910} + m_Layer: 0 + m_Name: Cube (41) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &500782909 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 500782908} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -7, y: 4.92, z: 0.0616778} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &500782910 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 500782908} + 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 &500782911 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 500782908} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &500782912 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 500782908} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &511172212 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 511172213} + - component: {fileID: 511172216} + - component: {fileID: 511172215} + - component: {fileID: 511172214} + m_Layer: 5 + m_Name: Button open script + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &511172213 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 511172212} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.6553401, y: 0.6553401, z: 0.6553401} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 460271677} + m_Father: {fileID: 649153321} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 159, y: 36} + m_SizeDelta: {x: 392.12805, y: 72.27574} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &511172214 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 511172212} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 511172215} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &511172215 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 511172212} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &511172216 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 511172212} + m_CullTransparentMesh: 0 +--- !u!1 &519530842 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 519530843} + - component: {fileID: 519530846} + - component: {fileID: 519530845} + - component: {fileID: 519530844} + m_Layer: 0 + m_Name: Cube (53) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &519530843 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519530842} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1.73, y: 4.91, z: 1.85} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &519530844 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519530842} + 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 &519530845 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519530842} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &519530846 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519530842} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &523436226 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 523436227} + - component: {fileID: 523436230} + - component: {fileID: 523436229} + - component: {fileID: 523436228} + m_Layer: 0 + m_Name: Cube (45) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &523436227 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 523436226} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -4.19, y: 2.437574, z: 0.0616778} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &523436228 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 523436226} + 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 &523436229 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 523436226} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &523436230 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 523436226} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &582255911 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 582255912} + - component: {fileID: 582255915} + - component: {fileID: 582255914} + - component: {fileID: 582255913} + m_Layer: 0 + m_Name: Cube (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &582255912 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 582255911} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.36, y: 0.8224261, z: 0.0616778} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &582255913 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 582255911} + 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 &582255914 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 582255911} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &582255915 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 582255911} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &589500251 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 589500252} + - component: {fileID: 589500255} + - component: {fileID: 589500254} + - component: {fileID: 589500253} + m_Layer: 0 + m_Name: Cube (59) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &589500252 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 589500251} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 5.4900002, y: 2.427574, z: 1.85} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &589500253 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 589500251} + 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 &589500254 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 589500251} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &589500255 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 589500251} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &643205568 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 643205569} + - component: {fileID: 643205572} + - component: {fileID: 643205571} + - component: {fileID: 643205570} + m_Layer: 0 + m_Name: Cube (79) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &643205569 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 643205568} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 5.4900002, y: 2.427574, z: 5.4483223} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &643205570 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 643205568} + 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 &643205571 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 643205568} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &643205572 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 643205568} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &649153317 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 649153321} + - component: {fileID: 649153320} + - component: {fileID: 649153319} + - component: {fileID: 649153318} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &649153318 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 649153317} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &649153319 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 649153317} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1000, y: 557} + m_ScreenMatchMode: 1 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &649153320 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 649153317} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &649153321 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 649153317} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1537524790} + - {fileID: 511172213} + - {fileID: 1847025553} + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &667369430 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 667369431} + - component: {fileID: 667369434} + - component: {fileID: 667369433} + - component: {fileID: 667369432} + m_Layer: 0 + m_Name: Cube (17) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &667369431 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 667369430} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.36, y: -1.6699998, z: 1.85} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &667369432 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 667369430} + 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 &667369433 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 667369430} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &667369434 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 667369430} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &677037661 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 677037662} + - component: {fileID: 677037665} + - component: {fileID: 677037664} + - component: {fileID: 677037663} + m_Layer: 0 + m_Name: Cube (28) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &677037662 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 677037661} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1.73, y: -1.6600001, z: 3.66} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &677037663 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 677037661} + 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 &677037664 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 677037661} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &677037665 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 677037661} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &700195177 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 700195180} + - component: {fileID: 700195179} + - component: {fileID: 700195178} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &700195178 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 700195177} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &700195179 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 700195177} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &700195180 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 700195177} + 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_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &738032837 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 738032838} + - component: {fileID: 738032841} + - component: {fileID: 738032840} + - component: {fileID: 738032839} + m_Layer: 0 + m_Name: Cube (49) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &738032838 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 738032837} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 5.4900002, y: 2.4375737, z: 0.0616778} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &738032839 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 738032837} + 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 &738032840 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 738032837} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &738032841 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 738032837} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &743324178 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 743324179} + - component: {fileID: 743324182} + - component: {fileID: 743324181} + - component: {fileID: 743324180} + m_Layer: 0 + m_Name: Cube (32) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &743324179 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 743324178} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.36, y: 0.8124263, z: 5.4483223} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &743324180 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 743324178} + 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 &743324181 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 743324178} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &743324182 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 743324178} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &768601851 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 768601852} + - component: {fileID: 768601855} + - component: {fileID: 768601854} + - component: {fileID: 768601853} + m_Layer: 0 + m_Name: Cube (6) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &768601852 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 768601851} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -7, y: -1.6600001, z: 0.0616778} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &768601853 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 768601851} + 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 &768601854 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 768601851} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &768601855 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 768601851} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &778191807 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 778191808} + - component: {fileID: 778191811} + - component: {fileID: 778191810} + - component: {fileID: 778191809} + m_Layer: 0 + m_Name: Cube (61) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &778191808 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 778191807} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -7, y: 4.92, z: 3.66} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &778191809 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 778191807} + 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 &778191810 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 778191807} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &778191811 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 778191807} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &781926842 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 781926843} + - component: {fileID: 781926846} + - component: {fileID: 781926845} + - component: {fileID: 781926844} + m_Layer: 0 + m_Name: Cube (25) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &781926843 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 781926842} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -4.19, y: -1.66, z: 3.66} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &781926844 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 781926842} + 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 &781926845 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 781926842} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &781926846 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 781926842} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &792419465 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 792419466} + - component: {fileID: 792419469} + - component: {fileID: 792419468} + - component: {fileID: 792419467} + m_Layer: 0 + m_Name: Cube (38) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &792419466 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 792419465} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1.73, y: -1.67, z: 5.4483223} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &792419467 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 792419465} + 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 &792419468 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 792419465} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &792419469 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 792419465} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &801020415 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 801020416} + - component: {fileID: 801020419} + - component: {fileID: 801020418} + - component: {fileID: 801020417} + m_Layer: 0 + m_Name: Cube (71) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &801020416 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 801020415} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -7, y: 4.91, z: 5.4483223} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &801020417 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 801020415} + 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 &801020418 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 801020415} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &801020419 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 801020415} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &835270568 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 835270569} + - component: {fileID: 835270572} + - component: {fileID: 835270571} + - component: {fileID: 835270570} + m_Layer: 0 + m_Name: Cube (51) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &835270569 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 835270568} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -7, y: 4.91, z: 1.85} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &835270570 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 835270568} + 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 &835270571 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 835270568} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &835270572 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 835270568} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &893274497 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 893274498} + - component: {fileID: 893274501} + - component: {fileID: 893274500} + - component: {fileID: 893274499} + m_Layer: 0 + m_Name: Cube (40) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &893274498 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 893274497} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -4.19, y: 4.92, z: 0.0616778} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &893274499 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 893274497} + 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 &893274500 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 893274497} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &893274501 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 893274497} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &927111011 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 927111012} + - component: {fileID: 927111015} + - component: {fileID: 927111014} + - component: {fileID: 927111013} + m_Layer: 0 + m_Name: Cube (20) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &927111012 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 927111011} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -4.19, y: 0.8224261, z: 3.66} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &927111013 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 927111011} + 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 &927111014 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 927111011} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &927111015 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 927111011} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &928584461 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 928584462} + - component: {fileID: 928584465} + - component: {fileID: 928584464} + - component: {fileID: 928584463} + m_Layer: 0 + m_Name: Cube (35) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &928584462 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 928584461} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -4.19, y: -1.6699998, z: 5.4483223} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &928584463 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 928584461} + 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 &928584464 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 928584461} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &928584465 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 928584461} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &965437870 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 965437872} + - component: {fileID: 965437871} + 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 &965437871 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 965437870} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + 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 &965437872 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 965437870} + 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_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1010368908 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1010368909} + - component: {fileID: 1010368912} + - component: {fileID: 1010368911} + - component: {fileID: 1010368910} + m_Layer: 0 + m_Name: Cube (23) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1010368909 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1010368908} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1.73, y: 0.8224261, z: 3.66} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1010368910 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1010368908} + 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 &1010368911 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1010368908} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1010368912 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1010368908} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1019461521 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1019461522} + - component: {fileID: 1019461525} + - component: {fileID: 1019461524} + - component: {fileID: 1019461523} + m_Layer: 0 + m_Name: Cube (55) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1019461522 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1019461521} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -4.19, y: 2.427574, z: 1.85} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1019461523 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1019461521} + 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 &1019461524 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1019461521} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1019461525 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1019461521} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1069134372 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1069134373} + - component: {fileID: 1069134376} + - component: {fileID: 1069134375} + - component: {fileID: 1069134374} + m_Layer: 0 + m_Name: Cube (36) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1069134373 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1069134372} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -7, y: -1.6699998, z: 5.4483223} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1069134374 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1069134372} + 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 &1069134375 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1069134372} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1069134376 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1069134372} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1101930858 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1101930859} + - component: {fileID: 1101930861} + - component: {fileID: 1101930860} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1101930859 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1101930858} + 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: 1847025553} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -28.681885, y: -20.492146} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1101930860 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1101930858} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 1 + m_MinSize: 24 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Open Editor tab +--- !u!222 &1101930861 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1101930858} + m_CullTransparentMesh: 0 +--- !u!1 &1123278459 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1123278460} + - component: {fileID: 1123278463} + - component: {fileID: 1123278462} + - component: {fileID: 1123278461} + m_Layer: 0 + m_Name: Cube (34) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1123278460 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1123278459} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 5.4900002, y: 0.8124263, z: 5.4483223} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1123278461 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1123278459} + 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 &1123278462 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1123278459} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1123278463 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1123278459} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1124320614 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1124320615} + - component: {fileID: 1124320618} + - component: {fileID: 1124320617} + - component: {fileID: 1124320616} + m_Layer: 0 + m_Name: Cube (19) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1124320615 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1124320614} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 5.4900002, y: -1.6699998, z: 1.85} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1124320616 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1124320614} + 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 &1124320617 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1124320614} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1124320618 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1124320614} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1130193476 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1130193477} + - component: {fileID: 1130193480} + - component: {fileID: 1130193479} + - component: {fileID: 1130193478} + m_Layer: 0 + m_Name: Cube (44) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1130193477 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1130193476} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 5.4900002, y: 4.92, z: 0.0616778} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1130193478 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1130193476} + 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 &1130193479 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1130193476} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1130193480 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1130193476} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1218495766 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1218495767} + - component: {fileID: 1218495770} + - component: {fileID: 1218495769} + - component: {fileID: 1218495768} + m_Layer: 0 + m_Name: Cube (60) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1218495767 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1218495766} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -4.19, y: 4.92, z: 3.66} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1218495768 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1218495766} + 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 &1218495769 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1218495766} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1218495770 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1218495766} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1228425736 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1228425737} + - component: {fileID: 1228425740} + - component: {fileID: 1228425739} + - component: {fileID: 1228425738} + m_Layer: 0 + m_Name: Cube (70) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1228425737 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1228425736} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -4.19, y: 4.91, z: 5.4483223} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1228425738 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1228425736} + 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 &1228425739 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1228425736} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1228425740 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1228425736} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1231537574 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1231537575} + - component: {fileID: 1231537578} + - component: {fileID: 1231537577} + - component: {fileID: 1231537576} + m_Layer: 0 + m_Name: Cube (57) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1231537575 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1231537574} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.36, y: 2.427574, z: 1.85} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1231537576 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1231537574} + 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 &1231537577 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1231537574} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1231537578 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1231537574} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1281233702 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1281233703} + - component: {fileID: 1281233706} + - component: {fileID: 1281233705} + - component: {fileID: 1281233704} + m_Layer: 0 + m_Name: Cube (9) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1281233703 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1281233702} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 5.4900002, y: -1.6600001, z: 0.0616778} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1281233704 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1281233702} + 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 &1281233705 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1281233702} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1281233706 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1281233702} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1343033882 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1343033883} + - component: {fileID: 1343033886} + - component: {fileID: 1343033885} + - component: {fileID: 1343033884} + m_Layer: 0 + m_Name: Cube (24) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1343033883 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1343033882} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 5.4900002, y: 0.8224261, z: 3.66} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1343033884 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1343033882} + 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 &1343033885 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1343033882} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1343033886 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1343033882} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1380444549 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1380444550} + - component: {fileID: 1380444553} + - component: {fileID: 1380444552} + - component: {fileID: 1380444551} + m_Layer: 0 + m_Name: Cube (78) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1380444550 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1380444549} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1.73, y: 2.4275737, z: 5.4483223} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1380444551 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1380444549} + 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 &1380444552 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1380444549} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1380444553 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1380444549} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1399883245 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1399883246} + - component: {fileID: 1399883249} + - component: {fileID: 1399883248} + - component: {fileID: 1399883247} + m_Layer: 0 + m_Name: Cube (31) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1399883246 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1399883245} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -7, y: 0.8124263, z: 5.4483223} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1399883247 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1399883245} + 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 &1399883248 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1399883245} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1399883249 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1399883245} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1500025042 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1500025043} + - component: {fileID: 1500025046} + - component: {fileID: 1500025045} + - component: {fileID: 1500025044} + m_Layer: 0 + m_Name: Cube (15) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1500025043 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1500025042} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -4.19, y: -1.6699998, z: 1.85} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1500025044 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1500025042} + 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 &1500025045 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1500025042} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1500025046 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1500025042} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1537524789 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1537524790} + - component: {fileID: 1537524792} + - component: {fileID: 1537524791} + m_Layer: 5 + m_Name: InformationText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1537524790 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1537524789} + 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: 649153321} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -0.00000095367, y: 253} + m_SizeDelta: {x: 861.9848, y: 122.55513} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1537524791 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1537524789} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 56 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Hot Reload is not running yet +--- !u!222 &1537524792 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1537524789} + m_CullTransparentMesh: 0 +--- !u!1 &1555484937 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1555484938} + - component: {fileID: 1555484941} + - component: {fileID: 1555484940} + - component: {fileID: 1555484939} + m_Layer: 0 + m_Name: Cube (68) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1555484938 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1555484937} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1.73, y: 2.4375737, z: 3.66} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1555484939 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1555484937} + 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 &1555484940 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1555484937} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1555484941 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1555484937} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1586797430 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1586797431} + - component: {fileID: 1586797434} + - component: {fileID: 1586797433} + - component: {fileID: 1586797432} + m_Layer: 0 + m_Name: Cube (33) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1586797431 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1586797430} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1.73, y: 0.8124263, z: 5.4483223} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1586797432 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1586797430} + 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 &1586797433 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1586797430} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1586797434 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1586797430} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1600668862 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1600668863} + - component: {fileID: 1600668866} + - component: {fileID: 1600668865} + - component: {fileID: 1600668864} + m_Layer: 0 + m_Name: Cube (46) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1600668863 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1600668862} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -7, y: 2.4375737, z: 0.0616778} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1600668864 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1600668862} + 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 &1600668865 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1600668862} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1600668866 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1600668862} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1682534255 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1682534256} + - component: {fileID: 1682534259} + - component: {fileID: 1682534258} + - component: {fileID: 1682534257} + m_Layer: 0 + m_Name: Cube (12) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1682534256 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1682534255} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.36, y: 0.8124263, z: 1.85} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1682534257 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1682534255} + 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 &1682534258 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1682534255} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1682534259 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1682534255} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1768551573 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1768551574} + - component: {fileID: 1768551577} + - component: {fileID: 1768551576} + - component: {fileID: 1768551575} + m_Layer: 0 + m_Name: Cube (73) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1768551574 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768551573} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1.73, y: 4.91, z: 5.4483223} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1768551575 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768551573} + 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 &1768551576 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768551573} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1768551577 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768551573} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1774902064 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1774902065} + - component: {fileID: 1774902068} + - component: {fileID: 1774902067} + - component: {fileID: 1774902066} + m_Layer: 0 + m_Name: Cube (54) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1774902065 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1774902064} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 5.4900002, y: 4.91, z: 1.85} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1774902066 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1774902064} + 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 &1774902067 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1774902064} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1774902068 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1774902064} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1847025552 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1847025553} + - component: {fileID: 1847025556} + - component: {fileID: 1847025555} + - component: {fileID: 1847025554} + m_Layer: 5 + m_Name: Button open editor tab + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1847025553 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1847025552} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.65534, y: 0.65534, z: 0.65534} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1101930859} + m_Father: {fileID: 649153321} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -153, y: 36} + m_SizeDelta: {x: 393.12805, y: 73.27576} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1847025554 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1847025552} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1847025555} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1847025555 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1847025552} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1847025556 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1847025552} + m_CullTransparentMesh: 0 +--- !u!1 &1850807846 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1850807847} + - component: {fileID: 1850807850} + - component: {fileID: 1850807849} + - component: {fileID: 1850807848} + m_Layer: 0 + m_Name: Cube (74) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1850807847 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1850807846} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 5.4900002, y: 4.91, z: 5.4483223} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1850807848 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1850807846} + 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 &1850807849 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1850807846} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1850807850 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1850807846} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1855770256 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1855770257} + - component: {fileID: 1855770260} + - component: {fileID: 1855770259} + - component: {fileID: 1855770258} + m_Layer: 0 + m_Name: Cube (39) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1855770257 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1855770256} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 5.4900002, y: -1.6699998, z: 5.4483223} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1855770258 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1855770256} + 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 &1855770259 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1855770256} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1855770260 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1855770256} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1876148966 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1876148967} + - component: {fileID: 1876148970} + - component: {fileID: 1876148969} + - component: {fileID: 1876148968} + m_Layer: 0 + m_Name: Cube (69) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1876148967 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1876148966} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 5.4900002, y: 2.4375737, z: 3.66} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1876148968 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1876148966} + 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 &1876148969 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1876148966} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1876148970 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1876148966} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1893598705 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1893598706} + - component: {fileID: 1893598709} + - component: {fileID: 1893598708} + - component: {fileID: 1893598707} + m_Layer: 0 + m_Name: Cube (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1893598706 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1893598705} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1.73, y: 0.8224261, z: 0.0616778} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1893598707 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1893598705} + 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 &1893598708 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1893598705} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1893598709 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1893598705} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1927368434 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1927368435} + - component: {fileID: 1927368438} + - component: {fileID: 1927368437} + - component: {fileID: 1927368436} + m_Layer: 0 + m_Name: Cube (10) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1927368435 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1927368434} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -4.19, y: 0.8124263, z: 1.85} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1927368436 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1927368434} + 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 &1927368437 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1927368434} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1927368438 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1927368434} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1931512539 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1931512540} + - component: {fileID: 1931512543} + - component: {fileID: 1931512542} + - component: {fileID: 1931512541} + m_Layer: 0 + m_Name: Cube (7) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1931512540 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1931512539} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.36, y: -1.6600001, z: 0.0616778} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1931512541 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1931512539} + 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 &1931512542 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1931512539} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1931512543 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1931512539} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1946060857 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1946060858} + - component: {fileID: 1946060861} + - component: {fileID: 1946060860} + - component: {fileID: 1946060859} + m_Layer: 0 + m_Name: Cube (77) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1946060858 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1946060857} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.36, y: 2.427574, z: 5.4483223} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1946060859 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1946060857} + 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 &1946060860 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1946060857} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1946060861 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1946060857} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1965297414 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1965297415} + - component: {fileID: 1965297418} + - component: {fileID: 1965297417} + - component: {fileID: 1965297416} + m_Layer: 0 + m_Name: Cube (58) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1965297415 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1965297414} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1.73, y: 2.4275737, z: 1.85} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1965297416 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1965297414} + 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 &1965297417 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1965297414} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1965297418 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1965297414} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1973025878 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1973025879} + - component: {fileID: 1973025882} + - component: {fileID: 1973025881} + - component: {fileID: 1973025880} + m_Layer: 0 + m_Name: Cube (29) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1973025879 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1973025878} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 5.4900002, y: -1.6600001, z: 3.66} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1973025880 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1973025878} + 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 &1973025881 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1973025878} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1973025882 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1973025878} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1983101810 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1983101811} + - component: {fileID: 1983101814} + - component: {fileID: 1983101813} + - component: {fileID: 1983101812} + m_Layer: 0 + m_Name: Cube (63) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1983101811 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1983101810} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1.73, y: 4.92, z: 3.66} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1983101812 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1983101810} + 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 &1983101813 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1983101810} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &1983101814 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1983101810} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2014093029 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2014093030} + - component: {fileID: 2014093033} + - component: {fileID: 2014093032} + - component: {fileID: 2014093031} + m_Layer: 0 + m_Name: Cube (37) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2014093030 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2014093029} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.36, y: -1.6699998, z: 5.4483223} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &2014093031 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2014093029} + 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 &2014093032 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2014093029} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &2014093033 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2014093029} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2042268980 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2042268981} + - component: {fileID: 2042268984} + - component: {fileID: 2042268983} + - component: {fileID: 2042268982} + m_Layer: 0 + m_Name: Cube (11) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2042268981 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042268980} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -7, y: 0.8124263, z: 1.85} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &2042268982 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042268980} + 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 &2042268983 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042268980} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &2042268984 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042268980} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2053621921 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2053621922} + - component: {fileID: 2053621925} + - component: {fileID: 2053621924} + - component: {fileID: 2053621923} + m_Layer: 0 + m_Name: Cube (47) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2053621922 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2053621921} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.36, y: 2.4375737, z: 0.0616778} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &2053621923 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2053621921} + 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 &2053621924 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2053621921} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &2053621925 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2053621921} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2063974668 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2063974669} + - component: {fileID: 2063974672} + - component: {fileID: 2063974671} + - component: {fileID: 2063974670} + m_Layer: 0 + m_Name: Cube (22) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2063974669 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2063974668} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.36, y: 0.8224261, z: 3.66} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &2063974670 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2063974668} + 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 &2063974671 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2063974668} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &2063974672 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2063974668} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2102038395 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2102038396} + - component: {fileID: 2102038399} + - component: {fileID: 2102038398} + - component: {fileID: 2102038397} + m_Layer: 0 + m_Name: Cube (65) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2102038396 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2102038395} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -4.19, y: 2.437574, z: 3.66} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &2102038397 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2102038395} + 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 &2102038398 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2102038395} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &2102038399 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2102038395} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2132145875 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2132145876} + - component: {fileID: 2132145877} + m_Layer: 0 + m_Name: HotReloadDemo + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2132145876 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2132145875} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 18.716805, y: 53.419094, z: 172.31} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2132145877 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2132145875} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e09948cf1f317d04fbaf410dbfe91656, type: 3} + m_Name: + m_EditorClassIdentifier: + cubes: + - {fileID: 19295893} + - {fileID: 323745810} + - {fileID: 582255912} + - {fileID: 1893598706} + - {fileID: 132063620} + - {fileID: 297017160} + - {fileID: 768601852} + - {fileID: 1931512540} + - {fileID: 280025524} + - {fileID: 1281233703} + - {fileID: 1927368435} + - {fileID: 2042268981} + - {fileID: 1682534256} + - {fileID: 181686443} + - {fileID: 351532142} + - {fileID: 1500025043} + - {fileID: 69029315} + - {fileID: 667369431} + - {fileID: 375087532} + - {fileID: 1124320615} + - {fileID: 927111012} + - {fileID: 266848584} + - {fileID: 2063974669} + - {fileID: 1010368909} + - {fileID: 1343033883} + - {fileID: 781926843} + - {fileID: 341472300} + - {fileID: 2136109399} + - {fileID: 677037662} + - {fileID: 1973025879} + - {fileID: 262969855} + - {fileID: 1399883246} + - {fileID: 743324179} + - {fileID: 1586797431} + - {fileID: 1123278460} + - {fileID: 928584462} + - {fileID: 1069134373} + - {fileID: 2014093030} + - {fileID: 792419466} + - {fileID: 1855770257} + - {fileID: 893274498} + - {fileID: 500782909} + - {fileID: 443249060} + - {fileID: 121342031} + - {fileID: 1130193477} + - {fileID: 523436227} + - {fileID: 1600668863} + - {fileID: 2053621922} + - {fileID: 40618804} + - {fileID: 738032838} + - {fileID: 249919995} + - {fileID: 835270569} + - {fileID: 282541333} + - {fileID: 519530843} + - {fileID: 1774902065} + - {fileID: 1019461522} + - {fileID: 128004586} + - {fileID: 1231537575} + - {fileID: 1965297415} + - {fileID: 589500252} + - {fileID: 1218495767} + - {fileID: 778191808} + - {fileID: 133838189} + - {fileID: 1983101811} + - {fileID: 387856195} + - {fileID: 2102038396} + - {fileID: 218081521} + - {fileID: 127719938} + - {fileID: 1555484938} + - {fileID: 1876148967} + - {fileID: 1228425737} + - {fileID: 801020416} + - {fileID: 315895886} + - {fileID: 1768551574} + - {fileID: 1850807847} + - {fileID: 53988357} + - {fileID: 297623419} + - {fileID: 1946060858} + - {fileID: 1380444550} + - {fileID: 643205569} + informationText: {fileID: 1537524791} + openWindowButton: {fileID: 1847025554} + openScriptButton: {fileID: 511172214} + thisScript: {fileID: 11500000, guid: e09948cf1f317d04fbaf410dbfe91656, type: 3} +--- !u!1 &2136109398 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2136109399} + - component: {fileID: 2136109402} + - component: {fileID: 2136109401} + - component: {fileID: 2136109400} + m_Layer: 0 + m_Name: Cube (27) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2136109399 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2136109398} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.36, y: -1.6600001, z: 3.66} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 321495840} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &2136109400 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2136109398} + 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 &2136109401 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2136109398} + 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: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + 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 &2136109402 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2136109398} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBurstDemo.unity.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBurstDemo.unity.meta new file mode 100644 index 0000000..96e2a8a --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBurstDemo.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: fad9aa54ab3335844b5a35b9eb6ae286 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBurstDemoSettings.lighting b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBurstDemoSettings.lighting new file mode 100644 index 0000000..3c301a1 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBurstDemoSettings.lighting @@ -0,0 +1,66 @@ +%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: HotReloadBurstDemoSettings + serializedVersion: 6 + m_GIWorkflowMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + 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_LightmapCompression: 3 + 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: 512 + m_PVREnvironmentReferencePointCount: 2048 + m_LightProbeSampleCountMultiplier: 4 + m_PVRBounces: 2 + m_PVRMinBounces: 2 + m_PVREnvironmentImportanceSampling: 0 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + 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 + m_PVRTiledBaking: 0 + m_NumRaysToShootPerTexel: -1 + m_RespectSceneVisibilityWhenBakingGI: 0 diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBurstDemoSettings.lighting.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBurstDemoSettings.lighting.meta new file mode 100644 index 0000000..4939637 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scenes/HotReloadBurstDemoSettings.lighting.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 961e97ae3d4011b47a1198a930f5c30d +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 4890085278179872738 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts.meta new file mode 100644 index 0000000..f542db8 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 30c72b28fb747184ba79468d3571dea4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/HotReloadBasicDemo.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/HotReloadBasicDemo.cs new file mode 100644 index 0000000..724abdd --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/HotReloadBasicDemo.cs @@ -0,0 +1,179 @@ +#if ENABLE_MONO && (DEVELOPMENT_BUILD || UNITY_EDITOR) +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using UnityEngine.UI; + +namespace SingularityGroup.HotReload.Demo { + class HotReloadBasicDemo : MonoBehaviour { + + public GameObject cube; + public Text informationText; + public Button openWindowButton; + public Button openScriptButton; + public TextAsset thisScript; + + void Start() { + if(Application.isEditor) { + openWindowButton.onClick.AddListener(Demo.I.OpenHotReloadWindow); + openScriptButton.onClick.AddListener(() => Demo.I.OpenScriptFile(thisScript, 31, 13)); + } else { + openWindowButton.gameObject.SetActive(false); + openScriptButton.gameObject.SetActive(false); + informationText.gameObject.SetActive(false); + } + } + + // Update is called once per frame + void Update() { + if (Demo.I.IsServerRunning()) { + informationText.text = "Hot Reload is running"; + } else { + informationText.text = "Hot Reload is not running"; + } + + // // 1. Editing functions in monobehaviours, normal classes or static classes + // // Edit the vector to rotate the cube in the scene differently or change the speed + // var speed = 100; + // cube.transform.Rotate(new Vector3(0, 1, 0) * Time.deltaTime * speed); + + // // 1. Editing functions in monobehaviours, normal classes or static classes + // // Uncomment this code to scale the cube + // cube.transform.localScale = Mathf.Sin(Time.time) * Vector3.one; + + // // 1. Editing functions in monobehaviours, normal classes or static classes + // // Uncomment this code to make the cube move from left to right and back + // var newPos = cube.transform.position += (cube.transform.localScale.x < 0.5 ? Vector3.left : Vector3.right) * Time.deltaTime; + // if(Mathf.Abs(newPos.x) > 10) { + // cube.transform.position = Vector3.zero; + // } + } + + // 2. Editing lambda methods + static Func addFunction = x => { + var result = x + 10; + Debug.Log("Add: " + result); + // // uncomment to change the operator to multiply and log the result + // result = x * 10; + // Debug.Log("Multiply: " + result); + return result; + }; + + // 3. Editing async/await methods + async Task AsyncMethod() { + // await Task.Delay(500); + // Debug.Log("AsyncMethod"); + + // // silicense warning + await Task.CompletedTask; + } + + // 4. Editing properties (get/set) + public static string SomeString { + // edit the get method + get { + var someStringHere = "This is some string"; + return someStringHere; + } + } + + // 5. Editing indexers (square bracket access such as dictionaries) + class CustomDictionary : Dictionary { + public new int this[string key] { + get { + // // uncomment to change the indexer and log a different entry based on case + // return base[key.ToLower()]; + return base[key.ToUpper()]; + } + set { + base[key.ToUpper()] = value; + } + } + } + CustomDictionary randomDict = new CustomDictionary { + { "a", 4 }, + { "A", 5 }, + { "b", 9 }, + { "B", 10 }, + { "c", 14 }, + { "C", 15 }, + { "d", 19 }, + { "D", 20 } + }; + + // 6. Editing operators methods (explicit and implicit operators) + public class Email { + public string Value { get; } + + public Email(string value) { + Value = value; + } + + // Define implicit operator + public static implicit operator string(Email value) + // Uncomment to change the implicit operator + // => value.Value + " FOO"; + => value.Value; + + // // Uncomment to change add an implicit operator + // public static implicit operator byte[](Email value) + // => Encoding.UTF8.GetBytes(value.Value); + + // Define explicit operator + public static explicit operator Email(string value) + => new Email(value); + } + + void LateUpdate() { + // // 2. Editing lambda methods + // addFunction(10); + + + // // 3. Editing async/await methods + // AsyncMethod().Forget(); + + + // // 4. Editing properties (get/set) + // Debug.Log(SomeString); + + + // // 5. Editing indexers (square bracket access such as dictionaries) + // Debug.Log(randomDict["A"]); + + + // // 6. Editing operators methods (explicit and implicit operators) + Email email = new Email("example@example.com"); + // string stringEmail = email; + // Debug.Log(stringEmail); + + // // Uncomment new operator in Email class + Uncomment this to add byte implicit operator + // byte[] byteEmail = email; + // var hexRepresentation = BitConverter.ToString(byteEmail); + // Debug.Log(hexRepresentation); + // Debug.Log(Encoding.UTF8.GetString(byteEmail)); + + // // 7. Editing lambda methods with closures + // // Uncomment to log sorted array + // // Switch a and b to reverse the sorting + // int[] numbers = { 5, 3, 8, 1, 9 }; + // Array.Sort(numbers, (b, a) => a.CompareTo(b)); + // Debug.Log(string.Join(", ", numbers)); + + } + + // This function gets invoked every time it's patched + [InvokeOnHotReloadLocal] + static void OnHotReloadMe() { + // change the string to see the method getting invoked + Debug.Log("Hello there"); + } + + // // 8. Adding event functions + // void OnDisable() { + // Debug.Log("OnDisable"); + // } + } +} +#endif diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/HotReloadBasicDemo.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/HotReloadBasicDemo.cs.meta new file mode 100644 index 0000000..d03cd77 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/HotReloadBasicDemo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5a2e4d3f095a9441688c70278068eee0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/HotReloadBurstJobsDemo.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/HotReloadBurstJobsDemo.cs new file mode 100644 index 0000000..b7a1fe3 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/HotReloadBurstJobsDemo.cs @@ -0,0 +1,63 @@ +#if ENABLE_MONO && (DEVELOPMENT_BUILD || UNITY_EDITOR) +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Jobs; +using UnityEngine.UI; + +namespace SingularityGroup.HotReload.Demo { + public class HotReloadBurstJobsDemo : MonoBehaviour { + public Transform[] cubes; + public Text informationText; + public Button openWindowButton; + public Button openScriptButton; + public TextAsset thisScript; + + TransformAccessArray cubeTransforms; + CubeJob job; + void Awake() { + cubeTransforms = new TransformAccessArray(cubes); + if(Application.isEditor) { + openWindowButton.onClick.AddListener(Demo.I.OpenHotReloadWindow); + openScriptButton.onClick.AddListener(() => Demo.I.OpenScriptFile(thisScript, 49, 17)); + } else { + openWindowButton.gameObject.SetActive(false); + openScriptButton.gameObject.SetActive(false); + } + informationText.gameObject.SetActive(true); + } + + void Update() { + job.deltaTime = Time.deltaTime; + job.time = Time.time; + var handle = job.Schedule(cubeTransforms); + handle.Complete(); + + if (Demo.I.IsServerRunning()) { + informationText.text = "Hot Reload is running"; + } else { + informationText.text = "Hot Reload is not running"; + } + } + + struct CubeJob : IJobParallelForTransform { + public float deltaTime; + public float time; + public void Execute(int index, TransformAccess transform) { + transform.localRotation *= Quaternion.Euler(50 * deltaTime, 0, 0); + + // Uncomment this code to scale the cubes + // var scale = Mathf.Abs(Mathf.Sin(time)); + // transform.localScale = new Vector3(scale, scale, scale); + + // Uncomment this code to make the cube move from left to right and back + // transform.position += (transform.localScale.x < 0.5 ? Vector3.left : Vector3.right) * deltaTime; + } + } + + void OnDestroy() { + cubeTransforms.Dispose(); + } + } +} +#endif diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/HotReloadBurstJobsDemo.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/HotReloadBurstJobsDemo.cs.meta new file mode 100644 index 0000000..d93b94b --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/HotReloadBurstJobsDemo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e09948cf1f317d04fbaf410dbfe91656 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/IDemo.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/IDemo.cs new file mode 100644 index 0000000..ca2034a --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/IDemo.cs @@ -0,0 +1,29 @@ +#if ENABLE_MONO && (DEVELOPMENT_BUILD || UNITY_EDITOR) +using UnityEngine; + +namespace SingularityGroup.HotReload.Demo { + public interface IDemo { + bool IsServerRunning(); + void OpenHotReloadWindow(); + void OpenScriptFile(TextAsset textAsset, int line, int column); + } + + public static class Demo { + public static IDemo I = new PlayerDemo(); + } + + public class PlayerDemo : IDemo { + public bool IsServerRunning() { + return ServerHealthCheck.I.IsServerHealthy; + } + + public void OpenHotReloadWindow() { + //no-op + } + + public void OpenScriptFile(TextAsset textAsset, int line, int column) { + //no-op + } + } +} +#endif diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/IDemo.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/IDemo.cs.meta new file mode 100644 index 0000000..b13d9d5 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Demo/Scripts/IDemo.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 04dccdcced0245f1830021fdcad1d28a +timeCreated: 1677321944 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/HotReloadPrompts.prefab b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/HotReloadPrompts.prefab new file mode 100644 index 0000000..3edba4b --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/HotReloadPrompts.prefab @@ -0,0 +1,3018 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1013787301382345451 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3597930498506735329} + - component: {fileID: 5263297665501092759} + - component: {fileID: 8191138318542799492} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3597930498506735329 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1013787301382345451} + 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: 8361365728969909008} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5263297665501092759 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1013787301382345451} + m_CullTransparentMesh: 0 +--- !u!114 &8191138318542799492 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1013787301382345451} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.11320752, g: 0.11320752, b: 0.11320752, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 22 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Cancel +--- !u!1 &1057795414473985365 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8361365728969909008} + - component: {fileID: 9109116132926969505} + - component: {fileID: 6961214002816918688} + - component: {fileID: 5585168207715079851} + m_Layer: 5 + m_Name: ButtonMoreEffort + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8361365728969909008 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1057795414473985365} + 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: 3597930498506735329} + m_Father: {fileID: 6484505723585156786} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -423.1, y: -64.9} + m_SizeDelta: {x: 141.6914, y: 45.0679} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &9109116132926969505 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1057795414473985365} + m_CullTransparentMesh: 0 +--- !u!114 &6961214002816918688 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1057795414473985365} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &5585168207715079851 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1057795414473985365} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 0.9622642, g: 0.9622642, b: 0.9622642, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 6961214002816918688} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &1335534115928082901 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5505278863775282652} + - component: {fileID: 882497356905571160} + - component: {fileID: 6369210938302316831} + m_Layer: 5 + m_Name: TextSummary + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5505278863775282652 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1335534115928082901} + 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: 6484505723585156786} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 30, y: -39.233} + m_SizeDelta: {x: -105.96521, y: 54.542114} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &882497356905571160 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1335534115928082901} + m_CullTransparentMesh: 0 +--- !u!114 &6369210938302316831 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1335534115928082901} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 24 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Editor and current build are on different commits +--- !u!1 &1390084864838268853 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1221019002237951643} + - component: {fileID: 8358362994993817161} + - component: {fileID: 1980611848569999305} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1221019002237951643 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1390084864838268853} + 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: 7107734678944665722} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -35.811356, y: -12.790634} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8358362994993817161 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1390084864838268853} + m_CullTransparentMesh: 0 +--- !u!114 &1980611848569999305 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1390084864838268853} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.103773594, g: 0.103773594, b: 0.103773594, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 24 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 21 + m_MaxSize: 28 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Continue +--- !u!1 &2338911661825597671 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4216036513099635638} + - component: {fileID: 594918778888372109} + - component: {fileID: 2127224386387722146} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4216036513099635638 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2338911661825597671} + 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: 4911193491485015256} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &594918778888372109 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2338911661825597671} + m_CullTransparentMesh: 0 +--- !u!114 &2127224386387722146 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2338911661825597671} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.103773594, g: 0.103773594, b: 0.103773594, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: More Info +--- !u!1 &2557231470263189725 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6280529082113425347} + m_Layer: 5 + m_Name: Information + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6280529082113425347 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2557231470263189725} + 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: 3344052376368028088} + - {fileID: 7593666350427564864} + m_Father: {fileID: 4967086678334773008} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 30, y: -13.59} + m_SizeDelta: {x: -106.39874, y: -142.43198} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &2582527480827036942 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6528462525361087078} + - component: {fileID: 5585154964765544786} + - component: {fileID: 5675038352245823804} + m_Layer: 5 + m_Name: TextSuggestion + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6528462525361087078 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2582527480827036942} + 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: 6484505723585156786} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 30.217, y: 6.0687} + m_SizeDelta: {x: -106.3987, y: -145.1455} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5585154964765544786 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2582527480827036942} + m_CullTransparentMesh: 0 +--- !u!114 &5675038352245823804 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2582527480827036942} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 22 + m_FontStyle: 0 + m_BestFit: 1 + m_MinSize: 21 + m_MaxSize: 28 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1.17 + m_Text: 'This can cause errors when the build was made on an old commit. + +' +--- !u!1 &2945586050721362106 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7593666350427564864} + - component: {fileID: 4488835628498483499} + - component: {fileID: 6495855994796430067} + m_Layer: 5 + m_Name: TextForDebugging + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &7593666350427564864 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2945586050721362106} + 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: 6280529082113425347} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4488835628498483499 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2945586050721362106} + m_CullTransparentMesh: 0 +--- !u!114 &6495855994796430067 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2945586050721362106} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 29 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Make sure you're on the same LAN/WiFi network +--- !u!1 &3342967049223911331 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3344052376368028088} + - component: {fileID: 4147603110869920048} + - component: {fileID: 116564040413298098} + m_Layer: 5 + m_Name: TextSuggestion + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3344052376368028088 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3342967049223911331} + 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: 6280529082113425347} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 5.6499987} + m_SizeDelta: {x: 0, y: 11.300002} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4147603110869920048 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3342967049223911331} + m_CullTransparentMesh: 0 +--- !u!114 &116564040413298098 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3342967049223911331} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 23 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 275 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Make sure you're on the same WiFi network and Hot Reload is running +--- !u!1 &3751191164850618597 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3751191164850618611} + - component: {fileID: 3751191164850618616} + - component: {fileID: 3751191164850618560} + m_Layer: 5 + m_Name: Logo + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3751191164850618611 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3751191164850618597} + 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: 4967086677765351015} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 46.1, y: -43.161} + m_SizeDelta: {x: 54.687653, y: 54.687653} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3751191164850618616 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3751191164850618597} + m_CullTransparentMesh: 0 +--- !u!114 &3751191164850618560 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3751191164850618597} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 90cf8e542151548c6aa3cba26467e144, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &3751191164850618600 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3751191164850618614} + - component: {fileID: 3751191164850618595} + - component: {fileID: 3751191164850618571} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3751191164850618614 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3751191164850618600} + 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: 4967086678661718217} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3751191164850618595 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3751191164850618600} + m_CullTransparentMesh: 0 +--- !u!114 &3751191164850618571 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3751191164850618600} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 22 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Hide +--- !u!1 &3751191164850618601 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3751191164850618615} + - component: {fileID: 3751191164850618620} + - component: {fileID: 3751191164850618564} + m_Layer: 5 + m_Name: Prompts + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3751191164850618615 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3751191164850618601} + 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: 4967086677765351015} + - {fileID: 4967086678334773008} + - {fileID: 6484505723585156786} + m_Father: {fileID: 4967086677379066171} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -0.00024414062, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3751191164850618620 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3751191164850618601} + m_CullTransparentMesh: 0 +--- !u!114 &3751191164850618564 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3751191164850618601} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d92cdbfacafd433ca77184c22a384a6d, type: 3} + m_Name: + m_EditorClassIdentifier: + retryPrompt: {fileID: 4967086678334773011} + connectedPrompt: {fileID: 4967086677765351014} + questionPrompt: {fileID: 6563246299181214611} + fallbackEventSystem: {fileID: 8054601594198067103} +--- !u!1 &3751191164850618602 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3751191164850618608} + - component: {fileID: 3751191164850618621} + - component: {fileID: 3751191164850618565} + m_Layer: 5 + m_Name: Summary + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3751191164850618608 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3751191164850618602} + 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: 4967086677765351015} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 42.160004, y: -43.00023} + m_SizeDelta: {x: -109.740295, y: 54.366207} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3751191164850618621 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3751191164850618602} + m_CullTransparentMesh: 0 +--- !u!114 &3751191164850618565 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3751191164850618602} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 32 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Connecting... +--- !u!1 &4116732687138738479 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8252921096633957241} + - component: {fileID: 4733576179552229060} + - component: {fileID: 2012827545077904779} + - component: {fileID: 3158748587153539730} + m_Layer: 5 + m_Name: ButtonMoreInfo + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8252921096633957241 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4116732687138738479} + 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: 5758986847798381115} + m_Father: {fileID: 6484505723585156786} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -99.72, y: -64.9} + m_SizeDelta: {x: 141.6914, y: 45.0679} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4733576179552229060 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4116732687138738479} + m_CullTransparentMesh: 0 +--- !u!114 &2012827545077904779 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4116732687138738479} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &3158748587153539730 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4116732687138738479} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 0.9622642, g: 0.9622642, b: 0.9622642, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 2012827545077904779} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &4279783835045373039 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8141605075363586685} + - component: {fileID: 1129507980982577600} + - component: {fileID: 3409363427364332004} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8141605075363586685 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4279783835045373039} + 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: 8150310283045374484} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1129507980982577600 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4279783835045373039} + m_CullTransparentMesh: 1 +--- !u!114 &3409363427364332004 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4279783835045373039} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!1 &4471505415598507920 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6235104375140882572} + - component: {fileID: 4057252686040207820} + - component: {fileID: 3554294960250654513} + m_Layer: 5 + m_Name: TextIP + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6235104375140882572 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4471505415598507920} + 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: 4967086678334773008} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -248.5, y: -66.756} + m_SizeDelta: {x: 65, y: 61.4766} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4057252686040207820 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4471505415598507920} + m_CullTransparentMesh: 0 +--- !u!114 &3554294960250654513 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4471505415598507920} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 24 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'IP:' +--- !u!1 &4803576491919660416 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8857299115396528434} + - component: {fileID: 2155891017074897053} + - component: {fileID: 462332990179851889} + m_Layer: 5 + m_Name: Suggestion + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8857299115396528434 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4803576491919660416} + 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: 4967086677765351015} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 42.185, y: -30.900002} + m_SizeDelta: {x: -109.78961, y: -97.906265} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2155891017074897053 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4803576491919660416} + m_CullTransparentMesh: 0 +--- !u!114 &462332990179851889 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4803576491919660416} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 24 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Edit code to see changes on device... +--- !u!1 &4967086676766916185 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4967086676766916190} + - component: {fileID: 4967086676766916188} + - component: {fileID: 4967086676766916191} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4967086676766916190 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086676766916185} + 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: 4967086677112779038} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4967086676766916188 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086676766916185} + m_CullTransparentMesh: 0 +--- !u!114 &4967086676766916191 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086676766916185} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.103773594, g: 0.103773594, b: 0.103773594, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 24 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'Reconnect + +' +--- !u!1 &4967086676871555599 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4967086676871555596} + - component: {fileID: 4967086676871555698} + - component: {fileID: 4967086676871555597} + m_Layer: 5 + m_Name: ImageLogo + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4967086676871555596 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086676871555599} + 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: 4967086678334773008} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 42.06, y: -39.16} + m_SizeDelta: {x: 54.687653, y: 54.687653} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4967086676871555698 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086676871555599} + m_CullTransparentMesh: 0 +--- !u!114 &4967086676871555597 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086676871555599} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 90cf8e542151548c6aa3cba26467e144, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &4967086677112779033 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4967086677112779038} + - component: {fileID: 4967086677112779037} + - component: {fileID: 4967086677112779036} + - component: {fileID: 4967086677112779039} + m_Layer: 5 + m_Name: ButtonRetry + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4967086677112779038 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086677112779033} + 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: 4967086676766916190} + m_Father: {fileID: 4967086678334773008} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 45.1, y: 34.638} + m_SizeDelta: {x: -465.6686, y: 45.06787} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4967086677112779037 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086677112779033} + m_CullTransparentMesh: 0 +--- !u!114 &4967086677112779036 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086677112779033} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4967086677112779039 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086677112779033} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 4967086677112779036} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &4967086677379066170 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4967086677379066171} + - component: {fileID: 3499838185132214990} + - component: {fileID: 3499838185132214991} + - component: {fileID: 3499838185132214988} + m_Layer: 5 + m_Name: HotReloadPrompts + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4967086677379066171 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086677379066170} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3751191164850618615} + - {fileID: 8564535462043123833} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!223 &3499838185132214990 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086677379066170} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!114 &3499838185132214991 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086677379066170} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1280, y: 720} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0.5 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!114 &3499838185132214988 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086677379066170} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!1 &4967086677533727706 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4967086677533727707} + - component: {fileID: 4967086677533727705} + - component: {fileID: 4967086677533727704} + m_Layer: 5 + m_Name: TextSummary + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4967086677533727707 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086677533727706} + 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: 4967086678334773008} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 30, y: -42.7} + m_SizeDelta: {x: -105.96521, y: 61.476562} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4967086677533727705 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086677533727706} + m_CullTransparentMesh: 0 +--- !u!114 &4967086677533727704 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086677533727706} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 24 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Auto-pair ran into an issue +--- !u!1 &4967086677765351014 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4967086677765351015} + - component: {fileID: 4967086677765351013} + - component: {fileID: 4967086677765351012} + - component: {fileID: 235867154863528169} + - component: {fileID: 7034300310699233304} + m_Layer: 5 + m_Name: ConnectionDialog + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &4967086677765351015 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086677765351014} + 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: 3751191164850618611} + - {fileID: 3751191164850618608} + - {fileID: 8857299115396528434} + m_Father: {fileID: 3751191164850618615} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 8, y: 160.00003} + m_SizeDelta: {x: 603.4334, y: 152.50421} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4967086677765351013 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086677765351014} + m_CullTransparentMesh: 0 +--- !u!114 &4967086677765351012 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086677765351014} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.039215688, g: 0.039215688, b: 0.039215688, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &235867154863528169 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086677765351014} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 4967086677765351012} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &7034300310699233304 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086677765351014} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bb1cc47c374f478e861f2c3dade07e1a, type: 3} + m_Name: + m_EditorClassIdentifier: + buttonHide: {fileID: 235867154863528169} + textSummary: {fileID: 3751191164850618565} + textSuggestion: {fileID: 462332990179851889} + pendingPatches: 0 + patchesApplied: 0 +--- !u!1 &4967086678334773011 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4967086678334773008} + - component: {fileID: 4967086678334773014} + - component: {fileID: 4967086678334773009} + - component: {fileID: 3727107046497244783} + m_Layer: 5 + m_Name: RetryDialog + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &4967086678334773008 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086678334773011} + 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: 4967086676871555596} + - {fileID: 4967086677533727707} + - {fileID: 6280529082113425347} + - {fileID: 4967086678661718217} + - {fileID: 4967086677112779038} + - {fileID: 4911193491485015256} + - {fileID: 6235104375140882572} + - {fileID: 8150310283045374484} + m_Father: {fileID: 3751191164850618615} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 8, y: 160} + m_SizeDelta: {x: 603.4334, y: 203.0878} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4967086678334773014 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086678334773011} + m_CullTransparentMesh: 0 +--- !u!114 &4967086678334773009 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086678334773011} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.039215688, g: 0.039215688, b: 0.039215688, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &3727107046497244783 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086678334773011} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7a69f8e8e50a405a84ec22ac7c2f4bdc, type: 3} + m_Name: + m_EditorClassIdentifier: + buttonHide: {fileID: 4967086678661718222} + buttonRetryAutoPair: {fileID: 4967086677112779039} + buttonTroubleshoot: {fileID: 6672458751395352801} + textSummary: {fileID: 4967086677533727704} + textSuggestion: {fileID: 116564040413298098} + ipInput: {fileID: 7429817927027686359} + textForDebugging: {fileID: 6495855994796430067} + enableDebugging: 0 +--- !u!1 &4967086678661718216 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4967086678661718217} + - component: {fileID: 4967086678661718220} + - component: {fileID: 4967086678661718223} + - component: {fileID: 4967086678661718222} + m_Layer: 5 + m_Name: ButtonHide + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4967086678661718217 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086678661718216} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.8, y: 0.8, z: 0.5} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3751191164850618614} + m_Father: {fileID: 4967086678334773008} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -45.7, y: -26} + m_SizeDelta: {x: 95.76041, y: 46.033897} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4967086678661718220 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086678661718216} + m_CullTransparentMesh: 0 +--- !u!114 &4967086678661718223 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086678661718216} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.745283, g: 0.745283, b: 0.745283, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4967086678661718222 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4967086678661718216} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 4967086678661718223} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &5487644203504871490 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4911193491485015256} + - component: {fileID: 3977274743991914834} + - component: {fileID: 2696062604266108078} + - component: {fileID: 6672458751395352801} + m_Layer: 5 + m_Name: ButtonTroubleshoot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4911193491485015256 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5487644203504871490} + 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: 4216036513099635638} + m_Father: {fileID: 4967086678334773008} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 200.54193, y: 34.638} + m_SizeDelta: {x: -447.021, y: 45.0679} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3977274743991914834 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5487644203504871490} + m_CullTransparentMesh: 0 +--- !u!114 &2696062604266108078 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5487644203504871490} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &6672458751395352801 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5487644203504871490} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 2696062604266108078} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &6563246299181214611 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6484505723585156786} + - component: {fileID: 1661502203157216626} + - component: {fileID: 5891534192019788270} + - component: {fileID: 2310985356733911194} + m_Layer: 5 + m_Name: ReusedQuestionDialog + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &6484505723585156786 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6563246299181214611} + 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: 4288889589057652595} + - {fileID: 5505278863775282652} + - {fileID: 6528462525361087078} + - {fileID: 8361365728969909008} + - {fileID: 7107734678944665722} + - {fileID: 8252921096633957241} + m_Father: {fileID: 3751191164850618615} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 8, y: 160} + m_SizeDelta: {x: 603.4334, y: 203.0878} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1661502203157216626 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6563246299181214611} + m_CullTransparentMesh: 0 +--- !u!114 &5891534192019788270 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6563246299181214611} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.039215688, g: 0.039215688, b: 0.039215688, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &2310985356733911194 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6563246299181214611} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ef31038a0ed84685b779466bf22d53a9, type: 3} + m_Name: + m_EditorClassIdentifier: + textSummary: {fileID: 6369210938302316831} + textSuggestion: {fileID: 5675038352245823804} + buttonContinue: {fileID: 5265040605375167127} + buttonCancel: {fileID: 5585168207715079851} + buttonMoreInfo: {fileID: 3158748587153539730} +--- !u!1 &6697092821899816264 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5758986847798381115} + - component: {fileID: 5463465806778337131} + - component: {fileID: 8072588694671228428} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5758986847798381115 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6697092821899816264} + 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: 8252921096633957241} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5463465806778337131 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6697092821899816264} + m_CullTransparentMesh: 0 +--- !u!114 &8072588694671228428 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6697092821899816264} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.11320752, g: 0.11320752, b: 0.11320752, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: More Info +--- !u!1 &7506156204490477245 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7107734678944665722} + - component: {fileID: 677914236431176414} + - component: {fileID: 9047087872360317623} + - component: {fileID: 5265040605375167127} + m_Layer: 5 + m_Name: ButtonContinue + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7107734678944665722 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7506156204490477245} + 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: 1221019002237951643} + m_Father: {fileID: 6484505723585156786} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -261.41, y: -64.89999} + m_SizeDelta: {x: 141.6914, y: 45.0679} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &677914236431176414 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7506156204490477245} + m_CullTransparentMesh: 0 +--- !u!114 &9047087872360317623 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7506156204490477245} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &5265040605375167127 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7506156204490477245} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 9047087872360317623} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &7769261099572506218 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8150310283045374484} + - component: {fileID: 5348576082586449480} + - component: {fileID: 6647422777320841469} + - component: {fileID: 7429817927027686359} + m_Layer: 5 + m_Name: IpInput + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8150310283045374484 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7769261099572506218} + 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: 8207283617714762719} + - {fileID: 8141605075363586685} + m_Father: {fileID: 4967086678334773008} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -125.62808, y: -66.75602} + m_SizeDelta: {x: 180.7402, y: 41.1} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5348576082586449480 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7769261099572506218} + m_CullTransparentMesh: 1 +--- !u!114 &6647422777320841469 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7769261099572506218} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &7429817927027686359 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7769261099572506218} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 6647422777320841469} + m_TextComponent: {fileID: 3409363427364332004} + m_Placeholder: {fileID: 8746367729340876900} + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_CharacterValidation: 0 + m_CharacterLimit: 15 + m_OnSubmit: + m_PersistentCalls: + m_Calls: [] + m_OnDidEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_ShouldActivateOnSelect: 1 +--- !u!1 &8054601594198067103 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8564535462043123833} + - component: {fileID: 7768483217031697610} + - component: {fileID: 1047141224289122821} + m_Layer: 5 + m_Name: FallbackInputProvider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &8564535462043123833 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8054601594198067103} + 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: 4967086677379066171} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &7768483217031697610 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8054601594198067103} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!114 &1047141224289122821 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8054601594198067103} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!1 &8201367103125407330 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8207283617714762719} + - component: {fileID: 2716239957931866459} + - component: {fileID: 8746367729340876900} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8207283617714762719 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8201367103125407330} + 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: 8150310283045374484} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2716239957931866459 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8201367103125407330} + m_CullTransparentMesh: 1 +--- !u!114 &8746367729340876900 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8201367103125407330} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 2 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Enter text... +--- !u!1 &9029651609518542122 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4288889589057652595} + - component: {fileID: 1714143093284739457} + - component: {fileID: 3128017247211677084} + m_Layer: 5 + m_Name: ImageLogo + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4288889589057652595 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9029651609518542122} + 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: 6484505723585156786} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 42.06, y: -39.16} + m_SizeDelta: {x: 54.687653, y: 54.687653} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1714143093284739457 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9029651609518542122} + m_CullTransparentMesh: 0 +--- !u!114 &3128017247211677084 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9029651609518542122} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 90cf8e542151548c6aa3cba26467e144, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/HotReloadPrompts.prefab.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/HotReloadPrompts.prefab.meta new file mode 100644 index 0000000..5c08de4 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/HotReloadPrompts.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0dc8d7047b14c44b7970c5d35665dbe1 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/HotReloadSettingsObject.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/HotReloadSettingsObject.cs new file mode 100644 index 0000000..4a6ac9f --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/HotReloadSettingsObject.cs @@ -0,0 +1,140 @@ +#if ENABLE_MONO && (DEVELOPMENT_BUILD || UNITY_EDITOR) +using System; +using System.Linq; +using JetBrains.Annotations; +using System.IO; +using UnityEngine; + +#if UNITY_EDITOR +using UnityEditor; +#endif + +namespace SingularityGroup.HotReload { + /// + /// HotReload runtime settings. These can be changed while the app is running. + /// + /// + /// ScriptableObject that may be included in Resources/ folder. + /// See also Editor/PrebuildIncludeResources.cs + /// + [Serializable] + class HotReloadSettingsObject : ScriptableObject { + #region singleton + private static HotReloadSettingsObject _I; + public static HotReloadSettingsObject I { + get { + if (_I == null) { + _I = LoadSettingsOrDefault(); + } + return _I; + } + } + + /// Create settings inside Assets/ because user cannot edit files that are included inside a Unity package + /// + /// You can change this in a build script if you want it created somewhere else. + /// + public static string editorAssetPath = "Assets/HotReload/Resources/HotReloadSettingsObject.asset"; + + private static string resourceName => Path.GetFileNameWithoutExtension(editorAssetPath); + + public static bool TryLoadSettings(out HotReloadSettingsObject settings) { + try { + settings = LoadSettings(); + return settings != null; + } catch(FileNotFoundException) { + settings = null; + return false; + } + } + + [NotNull] + private static HotReloadSettingsObject LoadSettingsOrDefault() { + var settings = LoadSettings(); + if (settings == null) { + // load defaults + settings = CreateInstance(); + } + return settings; + } + + [CanBeNull] + private static HotReloadSettingsObject LoadSettings() { + HotReloadSettingsObject settings; + if (Application.isEditor) { + #if UNITY_EDITOR + settings = AssetDatabase.LoadAssetAtPath(editorAssetPath); + #else + settings = null; + #endif + } else { + // load from Resources (assumes that build includes the resource) + settings = Resources.Load(resourceName); + } + return settings; + } + #endregion + + #region settings + + /// Set default values. + /// + /// This is called by the Unity editor when the ScriptableObject is first created. + /// This function is only called in editor mode. + /// + private void Reset() { + EnsurePrefabSetCorrectly(); + } + + /// + /// Path to the prefab asset file. + /// + const string prefabAssetPath = "Packages/com.singularitygroup.hotreload/Runtime/HotReloadPrompts.prefab"; + + // Call this during build, just to be sure the field is correct. (I had some issues with it while editing the prefab) + public void EnsurePrefabSetCorrectly() { +#if UNITY_EDITOR + var prefab = AssetDatabase.LoadAssetAtPath(prefabAssetPath); + if (prefab == null) { + // when you use HotReload as a unitypackage, prefab is somewhere inside your assets folder + var guids = AssetDatabase.FindAssets("HotReloadPrompts t:prefab", new string[]{"Assets"}); + var paths = guids.Select(guid => AssetDatabase.GUIDToAssetPath(guid)); + var promptsPrefabPath = paths.FirstOrDefault(assetpath => Path.GetFileName(assetpath) == "HotReloadPrompts.prefab"); + if (promptsPrefabPath != null) { + prefab = AssetDatabase.LoadAssetAtPath(promptsPrefabPath); + } + } + if (prefab == null) { + throw new Exception("Failed to find PromptsPrefab (are you using Hot Reload as a package?"); + } + PromptsPrefab = prefab; +#endif + } + + public void EnsurePrefabNotInBuild() { +#if UNITY_EDITOR + PromptsPrefab = null; +#endif + } + + + // put the stored settings here + + [Header("Build Settings")] + [Tooltip("Should the Hot Reload runtime be included in development builds? HotReload is never included in release builds.")] + public bool IncludeInBuild = true; + + [Header("Player Settings")] + public bool AllowAndroidAppToMakeHttpRequests = false; + + #region hidden + + /// Reference to the Prefab, for loading it at runtime + [HideInInspector] + public GameObject PromptsPrefab; + #endregion + + #endregion settings + } +} +#endif diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/HotReloadSettingsObject.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/HotReloadSettingsObject.cs.meta new file mode 100644 index 0000000..975db28 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/HotReloadSettingsObject.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 324c6fd3c103e0f418eb4b98c46bf63c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: + - PromptsPrefab: {fileID: 4967086677379066170, guid: 0dc8d7047b14c44b7970c5d35665dbe1, + type: 3} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/IServerHealthCheck.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/IServerHealthCheck.cs new file mode 100644 index 0000000..082f412 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/IServerHealthCheck.cs @@ -0,0 +1,11 @@ +#if ENABLE_MONO && (DEVELOPMENT_BUILD || UNITY_EDITOR) +namespace SingularityGroup.HotReload { + public interface IServerHealthCheck { + bool IsServerHealthy { get; } + } + + internal interface IServerHealthCheckInternal : IServerHealthCheck { + void CheckHealth(); + } +} +#endif diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/IServerHealthCheck.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/IServerHealthCheck.cs.meta new file mode 100644 index 0000000..29afd5f --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/IServerHealthCheck.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bcb0ff221290427182643b815685ea97 +timeCreated: 1675232020 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/InstallQRDialog.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/InstallQRDialog.cs new file mode 100644 index 0000000..50eda6b --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/InstallQRDialog.cs @@ -0,0 +1,27 @@ +#if ENABLE_MONO && (DEVELOPMENT_BUILD || UNITY_EDITOR) +using UnityEngine; +using UnityEngine.UI; + +namespace SingularityGroup.HotReload { + class InstallQRDialog : MonoBehaviour { + public Button buttonGo; + public Button buttonHide; + + private void Start() { + buttonHide.onClick.AddListener(Hide); + + // launch camera app that can scan QR-Code https://singularitygroup.atlassian.net/browse/SG-29495 + buttonGo.onClick.AddListener(() => { + Hide(); + var recommendedQrCodeApp = "com.scanteam.qrcodereader"; + Application.OpenURL($"https://play.google.com/store/apps/details?id={recommendedQrCodeApp}"); + }); + } + + /// hide this dialog + void Hide() { + gameObject.SetActive(false); // this should disable the Update loop? + } + } +} +#endif diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/InstallQRDialog.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/InstallQRDialog.cs.meta new file mode 100644 index 0000000..d9fdb4d --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/InstallQRDialog.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 03d3be3b485a4450b112f9ea3af4fb66 +timeCreated: 1674988075 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/IpHelper.cs b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/IpHelper.cs new file mode 100644 index 0000000..2802b46 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/IpHelper.cs @@ -0,0 +1,64 @@ +#if ENABLE_MONO && (DEVELOPMENT_BUILD || UNITY_EDITOR) +#if UNITY_ANDROID && !UNITY_EDITOR +#define MOBILE_ANDROID +#endif +#if UNITY_IOS && !UNITY_EDITOR +#define MOBILE_IOS +#endif +#if MOBILE_ANDROID || MOBILE_IOS +#define MOBILE +#endif + +using System; +using System.Net.NetworkInformation; +using System.Net.Sockets; + +namespace SingularityGroup.HotReload { + static class IpHelper { + // get my local ip address + + static DateTime cachedAt; + static string ipCached; + public static string GetIpAddressCached() { + if (string.IsNullOrEmpty(ipCached) || DateTime.UtcNow - cachedAt > TimeSpan.FromSeconds(5)) { + ipCached = GetIpAddress(); + cachedAt = DateTime.UtcNow; + } + return ipCached; + } + + public static string GetIpAddress() { + var ip = GetLocalIPv4(NetworkInterfaceType.Wireless80211); + + if (string.IsNullOrEmpty(ip)) { + return GetLocalIPv4(NetworkInterfaceType.Ethernet); + } + return ip; + } + + private static string GetLocalIPv4(NetworkInterfaceType _type) { + string output = ""; + foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces()) { + if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up) { + foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses) { + if (ip.Address.AddressFamily == AddressFamily.InterNetwork && IsLocalIp(ip.Address.MapToIPv4().GetAddressBytes())) { + output = ip.Address.ToString(); + } + } + } + } + return output; + } + + // https://datatracker.ietf.org/doc/html/rfc1918#section-3 + static bool IsLocalIp(byte[] ipAddress) { + return ipAddress[0] == 10 + || ipAddress[0] == 172 + && ipAddress[1] >= 16 + && ipAddress[1] <= 31 + || ipAddress[0] == 192 + && ipAddress[1] == 168; + } + } +} +#endif diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/IpHelper.cs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/IpHelper.cs.meta new file mode 100644 index 0000000..8a633a7 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/IpHelper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4d3a24a25ced4eae8b7e0b9b5a0d5c9d +timeCreated: 1674145172 \ No newline at end of file diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs.meta new file mode 100644 index 0000000..192e762 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 053fc5684eb47f54e8c877cb1ade54d6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs/EditorOnly.meta b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs/EditorOnly.meta new file mode 100644 index 0000000..d961c60 --- /dev/null +++ b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs/EditorOnly.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 520640393141aab41bd6d6b1f43e7037 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs/EditorOnly/SingularityGroup.HotReload.RuntimeDependencies.dll b/Playvoi.Client/Packages/com.singularitygroup.hotreload/Runtime/Libs/EditorOnly/SingularityGroup.HotReload.RuntimeDependencies.dll new file mode 100644 index 0000000000000000000000000000000000000000..99200ef075951c51a987c0507c8004299f64c050 GIT binary patch literal 3010560 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˽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 z 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

NurWlBFLfHA=5Y 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

B!LKcU;nxno$u6!X;t$Cwq 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

J3nrF)jxy!aAIMlWyFwC~YGs3pRe~)d4d!%iL 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 z