├── .gitignore ├── .idea ├── .idea.UnityBrowserBridge │ └── .idea │ │ ├── codeStyles │ │ └── codeStyleConfig.xml │ │ ├── encodings.xml │ │ ├── indexLayout.xml │ │ ├── inspectionProfiles │ │ └── Project_Default.xml │ │ └── projectSettingsUpdater.xml └── .idea.UnityBrowserBridgeExample │ └── .idea │ ├── encodings.xml │ ├── indexLayout.xml │ └── projectSettingsUpdater.xml ├── Assets ├── UnityBrowserBridge.meta ├── UnityBrowserBridge │ ├── Plugins.meta │ ├── Plugins │ │ ├── SeleniumLicense.txt │ │ ├── SeleniumLicense.txt.meta │ │ ├── WebDriver.dll │ │ └── WebDriver.dll.meta │ ├── Prefabs.meta │ ├── Prefabs │ │ ├── UnityBrowserBridge.prefab │ │ └── UnityBrowserBridge.prefab.meta │ ├── Resources.meta │ ├── Resources │ │ ├── delete.png │ │ ├── delete.png.meta │ │ ├── favicon.ico │ │ ├── favicon.ico.meta │ │ ├── index.html │ │ ├── index.html.meta │ │ ├── style.css │ │ ├── style.css.meta │ │ ├── ubb_logo.png │ │ ├── ubb_logo.png.meta │ │ ├── unitybrowserbridge.js │ │ └── unitybrowserbridge.js.meta │ ├── Scripts.meta │ └── Scripts │ │ ├── HttpServer.cs │ │ ├── HttpServer.cs.meta │ │ ├── UnityBrowserBridge.cs │ │ └── UnityBrowserBridge.cs.meta ├── UnityBrowserBridgeExample.meta ├── UnityBrowserBridgeExample │ ├── Images.meta │ ├── Images │ │ ├── Clock.png │ │ └── Clock.png.meta │ ├── Materials.meta │ ├── Materials │ │ ├── Skybox.mat │ │ └── Skybox.mat.meta │ ├── Plugins.meta │ ├── Plugins │ │ ├── BrowserInteraction.jslib │ │ └── BrowserInteraction.jslib.meta │ ├── Scenes.meta │ ├── Scenes │ │ ├── UnityBrowserBridgeExample.unity │ │ └── UnityBrowserBridgeExample.unity.meta │ ├── Scripts.meta │ └── Scripts │ │ ├── MainController.cs │ │ └── MainController.cs.meta ├── WebGLTemplates.meta └── WebGLTemplates │ ├── UBBExample.meta │ └── UBBExample │ ├── TemplateData.meta │ ├── TemplateData │ ├── favicon.ico │ ├── favicon.ico.meta │ ├── jQueryLicense.txt │ ├── jQueryLicense.txt.meta │ ├── jquery-3.6.0.min.js │ ├── jquery-3.6.0.min.js.meta │ ├── myscript.js │ ├── myscript.js.meta │ ├── progress-bar-empty-dark.png │ ├── progress-bar-empty-dark.png.meta │ ├── progress-bar-full-dark.png │ ├── progress-bar-full-dark.png.meta │ ├── style.css │ ├── style.css.meta │ ├── unity-logo-dark.png │ ├── unity-logo-dark.png.meta │ ├── webgl-util.js │ └── webgl-util.js.meta │ ├── index.html │ ├── index.html.meta │ ├── thumbnail.png │ └── thumbnail.png.meta ├── Documentation └── Figures │ ├── OverviewBrowser.graffle │ ├── OverviewBrowser.png │ ├── OverviewCompared.graffle │ ├── OverviewCompared.png │ ├── OverviewEditor.graffle │ ├── OverviewEditor.png │ ├── ScreenshotExamplePage.png │ ├── ScreenshotExampleScene.png │ ├── ScreenshotExampleWebGL.png │ ├── ScreenshotHelloWorldPage.png │ └── ScreenshotUBBConfig.png ├── LICENSE ├── Packages └── manifest.json ├── ProjectSettings ├── AudioManager.asset ├── ClusterInputManager.asset ├── DynamicsManager.asset ├── EditorBuildSettings.asset ├── EditorSettings.asset ├── GraphicsSettings.asset ├── InputManager.asset ├── NavMeshAreas.asset ├── PackageManagerSettings.asset ├── Physics2DSettings.asset ├── PresetManager.asset ├── ProjectSettings.asset ├── ProjectVersion.txt ├── QualitySettings.asset ├── SceneTemplateSettings.json ├── TagManager.asset ├── TimeManager.asset ├── UnityConnectSettings.asset ├── VFXManager.asset ├── VersionControlSettings.asset └── XRSettings.asset └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Temporary files 2 | [Tt]emp/ 3 | [Oo]bj/ 4 | Packages/packages-lock.json 5 | 6 | # Local asset cache 7 | [Ll]ibrary/ 8 | 9 | # Build files 10 | [Bb]uild/ 11 | [Bb]uilds/ 12 | 13 | # User settings 14 | UserSettings/* 15 | *.userprefs 16 | *.sln.DotSettings.user 17 | 18 | # Visual Studio files 19 | *.sln 20 | *.csproj 21 | *.csproj.user 22 | *.unityproj 23 | .vs 24 | .vsconfig 25 | 26 | # Rider files 27 | Assets/Plugins/Editor/JetBrains* 28 | .idea/**/contentModel.xml 29 | .idea/**/workspace.xml 30 | .idea/**/tasks.xml 31 | .idea/**/usage.statistics.xml 32 | .idea/**/dictionaries 33 | .idea/**/shelf 34 | .idea/**/riderModule.iml 35 | 36 | # Visual Studio Code 37 | .vscode/ 38 | 39 | # Log files 40 | log.txt 41 | Logs/* 42 | 43 | # Unity pidb meta files 44 | *.pidb.meta 45 | 46 | # Unity crash reports 47 | sysinfo.txt 48 | mono_crash.* 49 | 50 | # OS generated files 51 | .DS_Store 52 | ._* 53 | Thumbs.db 54 | 55 | -------------------------------------------------------------------------------- /.idea/.idea.UnityBrowserBridge/.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/.idea.UnityBrowserBridge/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/.idea.UnityBrowserBridge/.idea/indexLayout.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/.idea.UnityBrowserBridge/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 45 | -------------------------------------------------------------------------------- /.idea/.idea.UnityBrowserBridge/.idea/projectSettingsUpdater.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/.idea.UnityBrowserBridgeExample/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/.idea.UnityBrowserBridgeExample/.idea/indexLayout.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/.idea.UnityBrowserBridgeExample/.idea/projectSettingsUpdater.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0e7137912f1c74df0a3b0de1403bd0a0 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Plugins.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b29c53f842614432d970059341a57a9f 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Plugins/SeleniumLicense.txt: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright 2022 Software Freedom Conservancy (SFC) 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Plugins/SeleniumLicense.txt.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bdf882914705c4de08a5fca833f060e1 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Plugins/WebDriver.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sropelato/UnityBrowserBridge/9d2ed54e2ae073f2dc4f408470f416e34febda21/Assets/UnityBrowserBridge/Plugins/WebDriver.dll -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Plugins/WebDriver.dll.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 01183d7c97b3740fab2b09a13c1837a5 3 | PluginImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | iconMap: {} 7 | executionOrder: {} 8 | defineConstraints: [] 9 | isPreloaded: 0 10 | isOverridable: 0 11 | isExplicitlyReferenced: 0 12 | validateReferences: 1 13 | platformData: 14 | - first: 15 | Any: 16 | second: 17 | enabled: 1 18 | settings: {} 19 | - first: 20 | Editor: Editor 21 | second: 22 | enabled: 0 23 | settings: 24 | DefaultValueInitialized: true 25 | - first: 26 | Windows Store Apps: WindowsStoreApps 27 | second: 28 | enabled: 0 29 | settings: 30 | CPU: AnyCPU 31 | userData: 32 | assetBundleName: 33 | assetBundleVariant: 34 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Prefabs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 74c8a226f6f534e609ec69fe87149e62 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Prefabs/UnityBrowserBridge.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &1943767788423411991 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 1943767788423411989} 12 | - component: {fileID: 1943767788423411988} 13 | m_Layer: 0 14 | m_Name: UnityBrowserBridge 15 | m_TagString: Untagged 16 | m_Icon: {fileID: 0} 17 | m_NavMeshLayer: 0 18 | m_StaticEditorFlags: 0 19 | m_IsActive: 1 20 | --- !u!4 &1943767788423411989 21 | Transform: 22 | m_ObjectHideFlags: 0 23 | m_CorrespondingSourceObject: {fileID: 0} 24 | m_PrefabInstance: {fileID: 0} 25 | m_PrefabAsset: {fileID: 0} 26 | m_GameObject: {fileID: 1943767788423411991} 27 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 28 | m_LocalPosition: {x: 0, y: 0, z: 0} 29 | m_LocalScale: {x: 1, y: 1, z: 1} 30 | m_Children: [] 31 | m_Father: {fileID: 0} 32 | m_RootOrder: 0 33 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 34 | --- !u!114 &1943767788423411988 35 | MonoBehaviour: 36 | m_ObjectHideFlags: 0 37 | m_CorrespondingSourceObject: {fileID: 0} 38 | m_PrefabInstance: {fileID: 0} 39 | m_PrefabAsset: {fileID: 0} 40 | m_GameObject: {fileID: 1943767788423411991} 41 | m_Enabled: 1 42 | m_EditorHideFlags: 0 43 | m_Script: {fileID: 11500000, guid: 20e679ddcc87f49cd93e72eaa0e674bf, type: 3} 44 | m_Name: 45 | m_EditorClassIdentifier: 46 | httpServerPort: 63388 47 | indexFile: {fileID: 4900000, guid: f9b34a310cdb64b38a68c4c1319bf1a7, type: 3} 48 | includeProjectFiles: [] 49 | includeExternalFiles: [] 50 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Prefabs/UnityBrowserBridge.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b2ca0da73d4214f50b14277cc41e4d3c 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Resources.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c1f6588d1cfcb44b894a2be42a73036e 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Resources/delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sropelato/UnityBrowserBridge/9d2ed54e2ae073f2dc4f408470f416e34febda21/Assets/UnityBrowserBridge/Resources/delete.png -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Resources/delete.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 13a1cd57aa7964f31a1abaf8e70157ef 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | vTOnly: 0 27 | grayScaleToAlpha: 0 28 | generateCubemap: 6 29 | cubemapConvolution: 0 30 | seamlessCubemap: 0 31 | textureFormat: 1 32 | maxTextureSize: 2048 33 | textureSettings: 34 | serializedVersion: 2 35 | filterMode: 1 36 | aniso: 1 37 | mipBias: 0 38 | wrapU: 0 39 | wrapV: 0 40 | wrapW: 0 41 | nPOTScale: 1 42 | lightmap: 0 43 | compressionQuality: 50 44 | spriteMode: 0 45 | spriteExtrude: 1 46 | spriteMeshType: 1 47 | alignment: 0 48 | spritePivot: {x: 0.5, y: 0.5} 49 | spritePixelsToUnits: 100 50 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 51 | spriteGenerateFallbackPhysicsShape: 1 52 | alphaUsage: 1 53 | alphaIsTransparency: 0 54 | spriteTessellationDetail: -1 55 | textureType: 0 56 | textureShape: 1 57 | singleChannelComponent: 0 58 | flipbookRows: 1 59 | flipbookColumns: 1 60 | maxTextureSizeSet: 0 61 | compressionQualitySet: 0 62 | textureFormatSet: 0 63 | ignorePngGamma: 0 64 | applyGammaDecoding: 0 65 | platformSettings: 66 | - serializedVersion: 3 67 | buildTarget: DefaultTexturePlatform 68 | maxTextureSize: 2048 69 | resizeAlgorithm: 0 70 | textureFormat: -1 71 | textureCompression: 1 72 | compressionQuality: 50 73 | crunchedCompression: 0 74 | allowsAlphaSplitting: 0 75 | overridden: 0 76 | androidETC2FallbackOverride: 0 77 | forceMaximumCompressionQuality_BC6H_BC7: 0 78 | spriteSheet: 79 | serializedVersion: 2 80 | sprites: [] 81 | outline: [] 82 | physicsShape: [] 83 | bones: [] 84 | spriteID: 85 | internalID: 0 86 | vertices: [] 87 | indices: 88 | edges: [] 89 | weights: [] 90 | secondaryTextures: [] 91 | spritePackingTag: 92 | pSDRemoveMatte: 0 93 | pSDShowRemoveMatteOption: 0 94 | userData: 95 | assetBundleName: 96 | assetBundleVariant: 97 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Resources/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sropelato/UnityBrowserBridge/9d2ed54e2ae073f2dc4f408470f416e34febda21/Assets/UnityBrowserBridge/Resources/favicon.ico -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Resources/favicon.ico.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2deb7ca0e8ed54fc49aba806fc1cb841 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Resources/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Unity Browser Bridge 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 19 |
20 |
21 |
22 |
loading
23 |
24 |
25 |
Loaded scripts
26 |
27 | 28 |
29 |
30 |
31 |
32 |
33 |
Show live browser calls
34 | 39 | 40 |
41 |
42 |
43 |
44 | 45 |
46 |
47 |
Show live Unity calls
48 | 53 | 54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 | 62 | 63 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Resources/index.html.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f9b34a310cdb64b38a68c4c1319bf1a7 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Resources/style.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | font-family: 'Open Sans', sans-serif; 3 | font-size: 12pt; 4 | height: 100%; 5 | width: 100%; 6 | margin: 0; 7 | padding: 0; 8 | background: #777777 9 | } 10 | 11 | body { 12 | } 13 | 14 | #content { 15 | display: flex; 16 | flex-direction: column; 17 | width: 100%; 18 | min-width: 600px; 19 | height: 100%; 20 | margin: auto; 21 | box-sizing: border-box; 22 | } 23 | 24 | #header { 25 | position: relative; 26 | height: 80px; 27 | flex: 0 0 auto; 28 | padding: 0; 29 | background-color: #172E45; 30 | box-sizing: border-box; 31 | } 32 | 33 | #header_logo { 34 | position: absolute; 35 | width: 48px; 36 | height: 48px; 37 | top: 40px; 38 | left: 15px; 39 | -webkit-transform: translateY(-50%); 40 | -ms-transform: translateY(-50%); 41 | transform: translateY(-50%); 42 | background: url('ubb_logo.png') no-repeat center; 43 | background-size: contain; 44 | } 45 | 46 | #header_text { 47 | position: absolute; 48 | top: 40px; 49 | left: 70px; 50 | -webkit-transform: translateY(-50%); 51 | -ms-transform: translateY(-50%); 52 | transform: translateY(-50%); 53 | font-size: 16pt; 54 | color: #FFFFFF; 55 | } 56 | 57 | #main { 58 | flex: 1 1 auto; 59 | display: flex; 60 | flex-direction: column; 61 | padding: 20px; 62 | min-height: 400px; 63 | box-sizing: border-box; 64 | background-color: #EEEEEE; 65 | } 66 | 67 | #footer { 68 | position: relative; 69 | height: 60px; 70 | flex: 0 0 auto; 71 | background-color: #DDDDDD; 72 | } 73 | 74 | #status { 75 | flex: 0 0 auto; 76 | display: flex; 77 | flex-direction: row; 78 | align-items: center; 79 | width: 100%; 80 | justify-content: flex-end; 81 | } 82 | 83 | #status_light { 84 | width: 20px; 85 | height: 20px; 86 | border-radius: 10px; 87 | margin-right: 6px; 88 | } 89 | 90 | #status_light.red { 91 | background: #810000; 92 | } 93 | 94 | #status_light.amber { 95 | background: #FFCC00; 96 | } 97 | 98 | #status_light.green { 99 | background: #00DA4A; 100 | } 101 | 102 | #status_text { 103 | } 104 | 105 | .title { 106 | font-weight: bold; 107 | margin-bottom: 10px; 108 | } 109 | 110 | #script_list { 111 | flex: 0 0 auto; 112 | min-height: 80px; 113 | background: #DDDDDD; 114 | border-radius: 5px; 115 | padding-left: 10px; 116 | padding-right: 10px; 117 | padding-top: 10px; 118 | padding-bottom: 10px; 119 | } 120 | 121 | .script_list_entry { 122 | display: block; 123 | width: 100%; 124 | text-decoration: none; 125 | color: #333333; 126 | padding: 5px; 127 | box-sizing: border-box; 128 | overflow-wrap: break-word; 129 | } 130 | 131 | .script_list_entry:hover { 132 | background: #CCCCCC; 133 | } 134 | 135 | .script_list_empty { 136 | display: block; 137 | font-style: italic; 138 | width: 100%; 139 | text-decoration: none; 140 | color: #666666; 141 | padding: 5px; 142 | box-sizing: border-box; 143 | overflow-wrap: break-word; 144 | } 145 | 146 | #calls { 147 | flex: 1 1 auto; 148 | display: flex; 149 | flex-direction: row; 150 | margin-top: 20px; 151 | } 152 | 153 | #browser_calls { 154 | display: flex; 155 | flex-direction: column; 156 | flex: 0.5; 157 | box-sizing: border-box; 158 | padding-right: 5px; 159 | } 160 | 161 | #unity_calls { 162 | display: flex; 163 | flex-direction: column; 164 | flex: 0.5; 165 | box-sizing: border-box; 166 | padding-left: 5px; 167 | height: 100%; 168 | } 169 | 170 | .show_calls { 171 | display: flex; 172 | flex-direction: row; 173 | justify-content: left; 174 | align-items: center; 175 | } 176 | 177 | .show_calls .title { 178 | margin: 0; 179 | margin-right: 10px; 180 | font-weight: bold; 181 | } 182 | 183 | #browser_calls_list, #unity_calls_list { 184 | min-height: 100px; 185 | background: #333333; 186 | border-radius: 5px; 187 | margin-top: 10px; 188 | padding-left: 10px; 189 | padding-right: 10px; 190 | padding-top: 10px; 191 | padding-bottom: 10px; 192 | flex: 1 1 auto; 193 | overflow-y: scroll; 194 | height: 50px; 195 | min-height: 100px; 196 | -ms-overflow-style: none; 197 | scrollbar-width: none; 198 | } 199 | 200 | #browser_calls_list::-webkit-scrollbar, #unity_calls_list::-webkit-scrollbar { 201 | display: none; 202 | } 203 | 204 | .calls_list_entry { 205 | font-family: 'Source Code Pro', monospace; 206 | font-size: 10pt; 207 | color: #DDDDDD; 208 | padding: 5px; 209 | box-sizing: border-box; 210 | } 211 | 212 | .calls_list_entry:hover { 213 | background: #555555; 214 | } 215 | 216 | .clear_button { 217 | width: 20px; 218 | height: 20px; 219 | border: 0; 220 | margin-left: 10px; 221 | cursor: pointer; 222 | background: url('delete.png'); 223 | background-size: cover; 224 | background-position: 0 0; 225 | } 226 | 227 | .clear_button:hover { 228 | background-position: 0 100%; 229 | } 230 | 231 | .switch { 232 | position: relative; 233 | display: inline-block; 234 | width: 40px; 235 | height: 20px; 236 | } 237 | 238 | .switch input { 239 | opacity: 0; 240 | width: 0; 241 | height: 0; 242 | } 243 | 244 | .slider { 245 | position: absolute; 246 | cursor: pointer; 247 | top: 0; 248 | left: 0; 249 | right: 0; 250 | bottom: 0; 251 | -webkit-transition: .2s; 252 | transition: .2s; 253 | border-radius: 20px; 254 | } 255 | 256 | .slider:before { 257 | position: absolute; 258 | content: ""; 259 | height: 14px; 260 | width: 14px; 261 | left: 3px; 262 | bottom: 3px; 263 | background-color: white; 264 | -webkit-transition: .2s; 265 | transition: .2s; 266 | border-radius: 50%; 267 | } 268 | 269 | input:checked + .slider:before { 270 | -webkit-transform: translateX(20px); 271 | -ms-transform: translateX(20px); 272 | transform: translateX(20px); 273 | } 274 | 275 | input:not(:checked) + .slider { 276 | background-color: #CCCCCC; 277 | } 278 | 279 | input:checked + .slider { 280 | background-color: #00DA4A; 281 | } 282 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Resources/style.css.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4a46f000fa1744151ba5f65a9d2c2673 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Resources/ubb_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sropelato/UnityBrowserBridge/9d2ed54e2ae073f2dc4f408470f416e34febda21/Assets/UnityBrowserBridge/Resources/ubb_logo.png -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Resources/ubb_logo.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b659818cdb4a6414ca8cb2e7226b87ad 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | vTOnly: 0 27 | grayScaleToAlpha: 0 28 | generateCubemap: 6 29 | cubemapConvolution: 0 30 | seamlessCubemap: 0 31 | textureFormat: 1 32 | maxTextureSize: 2048 33 | textureSettings: 34 | serializedVersion: 2 35 | filterMode: 1 36 | aniso: 1 37 | mipBias: 0 38 | wrapU: 0 39 | wrapV: 0 40 | wrapW: 0 41 | nPOTScale: 1 42 | lightmap: 0 43 | compressionQuality: 50 44 | spriteMode: 0 45 | spriteExtrude: 1 46 | spriteMeshType: 1 47 | alignment: 0 48 | spritePivot: {x: 0.5, y: 0.5} 49 | spritePixelsToUnits: 100 50 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 51 | spriteGenerateFallbackPhysicsShape: 1 52 | alphaUsage: 1 53 | alphaIsTransparency: 0 54 | spriteTessellationDetail: -1 55 | textureType: 0 56 | textureShape: 1 57 | singleChannelComponent: 0 58 | flipbookRows: 1 59 | flipbookColumns: 1 60 | maxTextureSizeSet: 0 61 | compressionQualitySet: 0 62 | textureFormatSet: 0 63 | ignorePngGamma: 0 64 | applyGammaDecoding: 0 65 | platformSettings: 66 | - serializedVersion: 3 67 | buildTarget: DefaultTexturePlatform 68 | maxTextureSize: 2048 69 | resizeAlgorithm: 0 70 | textureFormat: -1 71 | textureCompression: 1 72 | compressionQuality: 50 73 | crunchedCompression: 0 74 | allowsAlphaSplitting: 0 75 | overridden: 0 76 | androidETC2FallbackOverride: 0 77 | forceMaximumCompressionQuality_BC6H_BC7: 0 78 | spriteSheet: 79 | serializedVersion: 2 80 | sprites: [] 81 | outline: [] 82 | physicsShape: [] 83 | bones: [] 84 | spriteID: 85 | internalID: 0 86 | vertices: [] 87 | indices: 88 | edges: [] 89 | weights: [] 90 | secondaryTextures: [] 91 | spritePackingTag: 92 | pSDRemoveMatte: 0 93 | pSDShowRemoveMatteOption: 0 94 | userData: 95 | assetBundleName: 96 | assetBundleVariant: 97 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Resources/unitybrowserbridge.js: -------------------------------------------------------------------------------- 1 | // ready when everything has been loaded 2 | window.addEventListener('load', function () { 3 | // set status to 'ready' 4 | document.getElementById('status_light').className = 'green' 5 | document.getElementById('status_text').innerText = 'ready' 6 | 7 | // send ready to server 8 | const xhttp = new XMLHttpRequest(); 9 | xhttp.open("GET", "ubbReady", true); 10 | xhttp.send(); 11 | }) 12 | 13 | var liveBrowserCalls = false 14 | var liveUnityCalls = false 15 | 16 | // displays the call in the browser call list 17 | _ubb_logBrowserCall = function (call) { 18 | if (!liveBrowserCalls) 19 | return 20 | let callDiv = document.createElement('div') 21 | callDiv.innerHTML = call 22 | callDiv.className = 'calls_list_entry' 23 | document.getElementById('browser_calls_list').appendChild(callDiv) 24 | document.getElementById('browser_calls_list').scrollTop = document.getElementById('browser_calls_list').scrollHeight 25 | } 26 | 27 | // displays the call in the Unity call list 28 | _ubb_logUnityCall = function (call) { 29 | if (!liveUnityCalls) 30 | return 31 | let callDiv = document.createElement('div') 32 | callDiv.innerHTML = call 33 | callDiv.className = 'calls_list_entry' 34 | document.getElementById('unity_calls_list').appendChild(callDiv) 35 | document.getElementById('unity_calls_list').scrollTop = document.getElementById('unity_calls_list').scrollHeight 36 | } 37 | 38 | // toggle display of live browser calls 39 | _ubb_changeLiveBrowserCalls = function () { 40 | liveBrowserCalls = document.getElementById('live_browser_calls_checkbox').checked 41 | } 42 | 43 | // toggle display of live Unity calls 44 | _ubb_changeLiveUnityCalls = function () { 45 | liveUnityCalls = document.getElementById('live_unity_calls_checkbox').checked 46 | } 47 | 48 | // clear browser calls list 49 | _ubb_clearBrowserCalls = function () { 50 | document.getElementById('browser_calls_list').innerHTML = '' 51 | } 52 | 53 | // clear unity calls list 54 | _ubb_clearUnityCalls = function () { 55 | document.getElementById('unity_calls_list').innerHTML = '' 56 | } 57 | 58 | // emulates unityInstance object of Unity's WebGL build with a 'SendMessage' function to invoke methods in Unity game objects 59 | unityInstance = { 60 | SendMessage: function (gameObject, methodName, value) { 61 | // send request to server 62 | const xhttp = new XMLHttpRequest(); 63 | if (typeof (value) == 'undefined') { 64 | xhttp.open("GET", "ubbSendMessage?gameObject=" + encodeURI(gameObject) + "&methodName=" + encodeURI(methodName), true); 65 | _ubb_logUnityCall(gameObject + ' → ' + methodName + '()') 66 | } else if (typeof (value) == 'number') { 67 | xhttp.open("GET", "ubbSendMessage?gameObject=" + encodeURI(gameObject) + "&methodName=" + encodeURI(methodName) + "&valueNum=" + encodeURI(value), true); 68 | _ubb_logUnityCall(gameObject + ' → ' + methodName + '(' + value + ')') 69 | } else { 70 | xhttp.open("GET", "ubbSendMessage?gameObject=" + encodeURI(gameObject) + "&methodName=" + encodeURI(methodName) + "&valueStr=" + encodeURI(value), true); 71 | _ubb_logUnityCall(gameObject + ' → ' + methodName + '("' + String(value).replace(/'/g, "\\'") + '")') 72 | } 73 | xhttp.send(); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Resources/unitybrowserbridge.js.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e759d9b702d0e4033ac6d6abad99cb43 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Scripts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fab7fd828c0884b17b4975365941cf51 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Scripts/HttpServer.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Net; 5 | using System.Text; 6 | using System.Threading; 7 | using UnityEngine; 8 | 9 | namespace UBB 10 | { 11 | /// 12 | /// The HttpServer class implements a simple web browser to offer files to the browser. 13 | /// 14 | public class HttpServer 15 | { 16 | #if UNITY_EDITOR 17 | 18 | // port on which the server listens for connections 19 | private readonly int port; 20 | 21 | // root path where resources are located 22 | private readonly string rootPath; 23 | 24 | // JavaScript files included in the project 25 | private readonly Dictionary jsFiles = new Dictionary(); 26 | 27 | // http listener waiting for connections 28 | private HttpListener httpListener = null; 29 | 30 | // server thread handling requests in the background 31 | private Thread serverThread = null; 32 | 33 | // web server has been stopped 34 | private bool stopped = false; 35 | 36 | /// 37 | /// Creates a new HTTP server with a given port and root path. 38 | /// 39 | /// Port on which the server listens for connections. 40 | /// Root path where resources are located. 41 | public HttpServer(int port, string rootPath) 42 | { 43 | this.port = port; 44 | this.rootPath = rootPath; 45 | } 46 | 47 | /// 48 | /// Starts the web server. 49 | /// 50 | public void Start() 51 | { 52 | httpListener = new HttpListener(); 53 | httpListener.Prefixes.Add("http://*:" + port + "/"); 54 | httpListener.Start(); 55 | serverThread = new Thread(Listen); 56 | serverThread.Start(); 57 | } 58 | 59 | /// 60 | /// Stops the web server. 61 | /// 62 | public void Stop() 63 | { 64 | stopped = true; 65 | serverThread.Abort(); 66 | } 67 | 68 | /// 69 | /// Adds a JavaScript file that's included in the web project. 70 | /// 71 | /// Path of the JavaScript file. 72 | public void AddJSFile(string path) 73 | { 74 | string filename = Path.GetFileName(path); 75 | if (jsFiles.ContainsKey(filename)) 76 | { 77 | Debug.LogError("Unity Browser Bridge - Cannot add two files with the same name (" + filename + ")"); 78 | return; 79 | } 80 | 81 | jsFiles.Add(filename, path); 82 | } 83 | 84 | // listen for connections (serverThread) 85 | private void Listen() 86 | { 87 | while (true) 88 | { 89 | try 90 | { 91 | HttpListenerContext context = httpListener.GetContext(); 92 | ProcessRequest(context); 93 | } 94 | catch (Exception e) 95 | { 96 | if (!stopped) 97 | Debug.LogError("Unity Browser Bridge - Error listening for connections: " + e.Message); 98 | } 99 | } 100 | } 101 | 102 | // process web request 103 | private void ProcessRequest(HttpListenerContext context) 104 | { 105 | string requestPath = context.Request.Url.AbsolutePath; 106 | if (requestPath.Equals("/")) 107 | { 108 | // load index.html file 109 | string indexHtml = File.ReadAllText(Path.Combine(rootPath, "index.html")); 110 | 111 | // replace script placeholders 112 | string headScripts = ""; 113 | string scriptList = ""; 114 | foreach (string jsFile in jsFiles.Keys) 115 | { 116 | string scriptUrl = "/scripts/" + jsFile; 117 | headScripts += (headScripts.Length > 0 ? "\n" : "") + ""; 118 | scriptList += (scriptList.Length > 0 ? "\n" : "") + "" + jsFile + ""; 119 | } 120 | 121 | if (scriptList.Length == 0) 122 | { 123 | scriptList = "
empty
"; 124 | } 125 | 126 | indexHtml = indexHtml.Replace("", headScripts); 127 | indexHtml = indexHtml.Replace("", scriptList); 128 | 129 | // send response 130 | context.Response.StatusCode = (int)HttpStatusCode.OK; 131 | context.Response.ContentType = "text/html"; 132 | byte[] responseBytes = Encoding.UTF8.GetBytes(indexHtml); 133 | context.Response.OutputStream.Write(responseBytes, 0, responseBytes.Length); 134 | } 135 | else if (requestPath.Equals("/ubbReady") || requestPath.Equals("/ubbReady/")) 136 | { 137 | // browser is ready 138 | UnityBrowserBridge.Instance.Ready = true; 139 | Debug.Log("Unity Browser Bridge - Browser is ready"); 140 | 141 | // send response 142 | context.Response.StatusCode = (int)HttpStatusCode.OK; 143 | context.Response.ContentType = "text/plain"; 144 | byte[] responseBytes = Encoding.UTF8.GetBytes("OK"); 145 | context.Response.OutputStream.Write(responseBytes, 0, responseBytes.Length); 146 | } 147 | else if (requestPath.Equals("/ubbSendMessage") || requestPath.Equals("/ubbSendMessage/")) 148 | { 149 | // send message to a Unity game object 150 | string gameObjectName = context.Request.QueryString["gameObject"]; 151 | string methodName = context.Request.QueryString["methodName"]; 152 | if (gameObjectName == null) 153 | { 154 | Debug.LogError("Unity Browser Bridge - gameObject cannot be null."); 155 | 156 | // send response 157 | context.Response.StatusCode = (int)HttpStatusCode.BadRequest; 158 | context.Response.ContentType = "text/plain"; 159 | byte[] responseBytes = Encoding.UTF8.GetBytes("gameObject must be set."); 160 | context.Response.OutputStream.Write(responseBytes, 0, responseBytes.Length); 161 | } 162 | else if (methodName == null) 163 | { 164 | Debug.LogError("Unity Browser Bridge - methodName cannot be null."); 165 | 166 | // send response 167 | context.Response.StatusCode = (int)HttpStatusCode.BadRequest; 168 | context.Response.ContentType = "text/plain"; 169 | byte[] responseBytes = Encoding.UTF8.GetBytes("methodName must be set."); 170 | context.Response.OutputStream.Write(responseBytes, 0, responseBytes.Length); 171 | } 172 | else if (context.Request.QueryString["valueNum"] != null) 173 | { 174 | // send value as number (double) 175 | double num = double.Parse(context.Request.QueryString["valueNum"]); 176 | UnityBrowserBridge.Instance.SendMessageToGameObject(gameObjectName, methodName, num); 177 | 178 | // send response 179 | context.Response.StatusCode = (int)HttpStatusCode.OK; 180 | context.Response.ContentType = "text/plain"; 181 | byte[] responseBytes = Encoding.UTF8.GetBytes("OK"); 182 | context.Response.OutputStream.Write(responseBytes, 0, responseBytes.Length); 183 | } 184 | else if (context.Request.QueryString["valueStr"] != null) 185 | { 186 | // send value as string 187 | string str = context.Request.QueryString["valueStr"]; 188 | UnityBrowserBridge.Instance.SendMessageToGameObject(gameObjectName, methodName, str); 189 | 190 | // send response 191 | context.Response.StatusCode = (int)HttpStatusCode.OK; 192 | context.Response.ContentType = "text/plain"; 193 | byte[] responseBytes = Encoding.UTF8.GetBytes("OK"); 194 | context.Response.OutputStream.Write(responseBytes, 0, responseBytes.Length); 195 | } 196 | else 197 | { 198 | // send without value 199 | UnityBrowserBridge.Instance.SendMessageToGameObject(gameObjectName, methodName); 200 | 201 | // send response 202 | context.Response.StatusCode = (int)HttpStatusCode.OK; 203 | context.Response.ContentType = "text/plain"; 204 | byte[] responseBytes = Encoding.UTF8.GetBytes("OK"); 205 | context.Response.OutputStream.Write(responseBytes, 0, responseBytes.Length); 206 | } 207 | } 208 | else if (requestPath.StartsWith("/scripts/")) 209 | { 210 | // request js file 211 | string filename = requestPath.Substring(9); 212 | if (jsFiles.ContainsKey(filename) && File.Exists(jsFiles[filename])) 213 | { 214 | context.Response.StatusCode = (int)HttpStatusCode.OK; 215 | context.Response.ContentType = "application/javascript"; 216 | byte[] responseBytes = File.ReadAllBytes(jsFiles[filename]); 217 | context.Response.OutputStream.Write(responseBytes, 0, responseBytes.Length); 218 | } 219 | else 220 | { 221 | Debug.LogWarning("Unity Browser Bridge - File not found: " + requestPath); 222 | context.Response.StatusCode = (int)HttpStatusCode.NotFound; 223 | context.Response.ContentType = "text/plain"; 224 | byte[] responseBytes = Encoding.UTF8.GetBytes("Not found"); 225 | context.Response.OutputStream.Write(responseBytes, 0, responseBytes.Length); 226 | } 227 | } 228 | else 229 | { 230 | // request resource 231 | 232 | // remove leading '/' 233 | while (requestPath.StartsWith("/")) 234 | requestPath = requestPath.Substring(1); 235 | string filename = Path.Combine(rootPath, requestPath); 236 | if (File.Exists(filename)) 237 | { 238 | // status code 200 239 | context.Response.StatusCode = (int)HttpStatusCode.OK; 240 | 241 | // set mime type 242 | switch (Path.GetExtension(filename).ToLower()) 243 | { 244 | case ".html": 245 | context.Response.ContentType = "text/html"; 246 | break; 247 | case ".css": 248 | context.Response.ContentType = "text/css"; 249 | break; 250 | case ".js": 251 | context.Response.ContentType = "application/javascript"; 252 | break; 253 | case ".png": 254 | context.Response.ContentType = "image/png"; 255 | break; 256 | case ".jpg": 257 | case ".jpeg": 258 | context.Response.ContentType = "image/jpeg"; 259 | break; 260 | case ".ico": 261 | context.Response.ContentType = "image/x-icon"; 262 | break; 263 | default: 264 | context.Response.ContentType = "application/octet-stream"; 265 | break; 266 | } 267 | 268 | byte[] responseBytes = File.ReadAllBytes(filename); 269 | context.Response.OutputStream.Write(responseBytes, 0, responseBytes.Length); 270 | } 271 | else 272 | { 273 | Debug.LogWarning("Unity Browser Bridge - File not found: " + requestPath); 274 | context.Response.StatusCode = (int)HttpStatusCode.NotFound; 275 | context.Response.ContentType = "text/plain"; 276 | byte[] responseBytes = Encoding.UTF8.GetBytes("Not found"); 277 | context.Response.OutputStream.Write(responseBytes, 0, responseBytes.Length); 278 | } 279 | } 280 | 281 | // flush and close output stream 282 | context.Response.OutputStream.Flush(); 283 | context.Response.OutputStream.Close(); 284 | } 285 | 286 | #endif 287 | } 288 | } -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Scripts/HttpServer.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3446b9f7b3fa40c0973b4edaec4266be 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Scripts/UnityBrowserBridge.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using UnityEngine; 5 | using UnityEditor; 6 | using OpenQA.Selenium; 7 | using OpenQA.Selenium.Chrome; 8 | using OpenQA.Selenium.Edge; 9 | using OpenQA.Selenium.Firefox; 10 | using OpenQA.Selenium.Opera; 11 | using OpenQA.Selenium.Safari; 12 | 13 | namespace UBB 14 | { 15 | /// 16 | /// The UnityBrowserBridge class serves as the gateway between the Unity editor and the web browser. 17 | /// 18 | public class UnityBrowserBridge : MonoBehaviour 19 | { 20 | #if UNITY_EDITOR 21 | 22 | /// 23 | /// Browser selection. 24 | /// 25 | public enum Browser 26 | { 27 | Chrome, 28 | Edge, 29 | Firefox, 30 | Opera, 31 | Safari 32 | } 33 | 34 | /// 35 | /// Static singleton property to access UnityBrowserBridge instance. 36 | /// 37 | public static UnityBrowserBridge Instance { get; private set; } 38 | 39 | /// 40 | /// Browser to be used 41 | /// 42 | public Browser browser = Browser.Chrome; 43 | 44 | /// 45 | /// Path to directory of the web driver. Leave this empty to search the web driver in a directory on the PATH 46 | /// variable. 47 | /// 48 | public string webDriverDirectory = ""; 49 | 50 | /// 51 | /// Arguments that are passed along to the web driver. Does not work for Safari. 52 | /// 53 | public string[] browserArguments = { }; 54 | 55 | /// 56 | /// Port used for the web server. 57 | /// 58 | public int httpServerPort = 63388; 59 | 60 | /// 61 | /// index.html file served by the web server. 62 | /// Other resources such as style sheets or images will be accessed relative to the path of this file. 63 | /// 64 | public TextAsset indexFile; 65 | 66 | /// 67 | /// Path to JavaScript files included in the WebGL project. 68 | /// 69 | public List includeJavaScriptFiles = new List(); 70 | 71 | // HTTP server 72 | private HttpServer httpServer = null; 73 | 74 | // web driver to control the browser 75 | private IWebDriver webDriver = null; 76 | 77 | // messages from the browser to be forwarded to game objects 78 | private readonly Queue> messagesWithoutValue = new Queue>(); 79 | private readonly Queue>> messagesWithValue = new Queue>>(); 80 | 81 | /// 82 | /// Indicate whether the browser is ready to execute JavaScript commands. 83 | /// 84 | /// True after the browser is ready and all resources have been loaded. 85 | public bool Ready { get; set; } = false; 86 | 87 | // sets instance property on awake 88 | private void Awake() 89 | { 90 | Instance = this; 91 | } 92 | 93 | // invoked after application has been terminated 94 | private void OnApplicationQuit() 95 | { 96 | // close web driver 97 | if (webDriver != null) 98 | { 99 | try 100 | { 101 | webDriver.Quit(); 102 | Debug.Log("Unity Browser Bridge - Web driver has been closed."); 103 | } 104 | catch (Exception e) 105 | { 106 | Debug.LogWarning("Unity Browser Bridge - Could not close web driver: " + e.Message); 107 | } 108 | } 109 | 110 | // stop web server 111 | if (httpServer != null) 112 | { 113 | try 114 | { 115 | httpServer.Stop(); 116 | Debug.Log("Unity Browser Bridge - HTTP server has been stopped."); 117 | } 118 | catch (Exception e) 119 | { 120 | Debug.LogWarning("Unity Browser Bridge - Could not stop http server: " + e.Message); 121 | } 122 | } 123 | } 124 | 125 | // initializes UnityBrowserBridge on application start 126 | private void Start() 127 | { 128 | // create web server 129 | httpServer = new HttpServer(httpServerPort, Path.GetDirectoryName(AssetDatabase.GetAssetPath(indexFile))); 130 | httpServer.Start(); 131 | 132 | // add javascript files 133 | foreach (string jsFile in includeJavaScriptFiles) 134 | { 135 | // resolve path relative to 'Assets' folder (if file exists) 136 | if (File.Exists(Path.Combine(Application.dataPath, jsFile))) 137 | httpServer.AddJSFile(Path.Combine(Application.dataPath, jsFile)); 138 | else 139 | httpServer.AddJSFile(jsFile); 140 | } 141 | 142 | // initialize web driver 143 | switch (browser) 144 | { 145 | case Browser.Chrome: 146 | ChromeOptions chromeOptions = new ChromeOptions(); 147 | chromeOptions.AddArguments(browserArguments); 148 | webDriver = string.IsNullOrEmpty(webDriverDirectory) ? new ChromeDriver(chromeOptions) : new ChromeDriver(webDriverDirectory, chromeOptions); 149 | break; 150 | case Browser.Edge: 151 | EdgeOptions edgeOptions = new EdgeOptions(); 152 | edgeOptions.AddArguments(browserArguments); 153 | webDriver = string.IsNullOrEmpty(webDriverDirectory) ? new EdgeDriver(edgeOptions) : new EdgeDriver(webDriverDirectory, edgeOptions); 154 | break; 155 | case Browser.Firefox: 156 | FirefoxOptions firefoxOptions = new FirefoxOptions(); 157 | firefoxOptions.AddArguments(browserArguments); 158 | webDriver = string.IsNullOrEmpty(webDriverDirectory) ? new FirefoxDriver(firefoxOptions) : new FirefoxDriver(webDriverDirectory, firefoxOptions); 159 | break; 160 | case Browser.Opera: 161 | OperaOptions operaOptions = new OperaOptions(); 162 | operaOptions.AddArguments(browserArguments); 163 | webDriver = string.IsNullOrEmpty(webDriverDirectory) ? new OperaDriver(operaOptions) : new OperaDriver(webDriverDirectory, operaOptions); 164 | break; 165 | case Browser.Safari: 166 | SafariOptions safariOptions = new SafariOptions(); 167 | if (browserArguments.Length > 0) 168 | Debug.LogWarning("Unity Browser Bridge - Safari Web Driver does not allow adding generic arguments. Please configure SafariOptions directly."); 169 | webDriver = string.IsNullOrEmpty(webDriverDirectory) ? new SafariDriver(safariOptions) : new SafariDriver(webDriverDirectory, safariOptions); 170 | break; 171 | } 172 | 173 | // open web interface 174 | webDriver.Url = "http://localhost:" + httpServerPort + "/"; 175 | } 176 | 177 | // update 178 | private void Update() 179 | { 180 | // send queued messages to game objects 181 | lock (messagesWithoutValue) 182 | { 183 | while (messagesWithoutValue.Count > 0) 184 | { 185 | KeyValuePair message = messagesWithoutValue.Dequeue(); 186 | string gameObjectName = message.Key; 187 | string methodName = message.Value; 188 | GameObject go = GameObject.Find(gameObjectName); 189 | if (go != null) 190 | go.SendMessage(methodName); 191 | else 192 | Debug.LogError("Unity Browser Bridge - Could not find game object '" + gameObjectName + "'"); 193 | } 194 | } 195 | 196 | // send queued messages to game objects 197 | lock (messagesWithValue) 198 | { 199 | while (messagesWithValue.Count > 0) 200 | { 201 | KeyValuePair> message = messagesWithValue.Dequeue(); 202 | string gameObjectName = message.Key; 203 | string methodName = message.Value.Key; 204 | object value = message.Value.Value; 205 | GameObject go = GameObject.Find(gameObjectName); 206 | if (go != null) 207 | go.SendMessage(methodName, value); 208 | else 209 | Debug.LogError("Unity Browser Bridge - Could not find game object '" + gameObjectName + "'"); 210 | } 211 | } 212 | } 213 | 214 | /// 215 | /// Executes JavaScript command without return value. 216 | /// 217 | /// JavaScript command to be executed. 218 | public void ExecuteJS(string jsCommand) 219 | { 220 | if (!Ready) 221 | { 222 | Debug.LogError("Unity Browser Bridge - Browser is not ready"); 223 | return; 224 | } 225 | 226 | try 227 | { 228 | ((IJavaScriptExecutor)webDriver).ExecuteScript("_ubb_logBrowserCall('" + jsCommand.Replace("'", "'") + "')"); 229 | ((IJavaScriptExecutor)webDriver).ExecuteScript(jsCommand); 230 | } 231 | catch (Exception e) 232 | { 233 | Debug.LogError("Unity Browser Bridge - Could not execute command " + jsCommand + ": " + e.Message); 234 | } 235 | } 236 | 237 | /// 238 | /// Executes JavaScript command with a return value of type T. 239 | /// 240 | /// JavaScript command to be executed. 241 | /// Type of return value. 242 | /// The value returned by the given command or default(T) if the command could not be 243 | /// executed. 244 | public T ExecuteJS(string jsCommand) 245 | { 246 | // abort if browser is not ready 247 | if (!Ready) 248 | { 249 | Debug.LogError("Unity Browser Bridge - Browser is not ready"); 250 | return default; 251 | } 252 | 253 | // execute command 254 | object result; 255 | try 256 | { 257 | ((IJavaScriptExecutor)webDriver).ExecuteScript("_ubb_logBrowserCall('" + jsCommand.Replace("'", "'") + "')"); 258 | result = ((IJavaScriptExecutor)webDriver).ExecuteScript("return " + jsCommand); 259 | } 260 | catch (Exception e) 261 | { 262 | Debug.LogError("Unity Browser Bridge - Could not execute command " + jsCommand + ": " + e.Message); 263 | return default; 264 | } 265 | 266 | // convert type 267 | try 268 | { 269 | return (T)Convert.ChangeType(result, typeof(T)); 270 | } 271 | catch (Exception) 272 | { 273 | Debug.LogError("Unity Browser Bridge - Could not convert return value from " + jsCommand + " to type " + typeof(T)); 274 | return default; 275 | } 276 | } 277 | 278 | /// 279 | /// Enqueues a message without value to be forwarded to the given game object in the next update. 280 | /// 281 | /// Name of the game object. 282 | /// Method name. 283 | public void SendMessageToGameObject(string gameObjectName, string methodName) 284 | { 285 | lock (messagesWithoutValue) 286 | messagesWithoutValue.Enqueue(new KeyValuePair(gameObjectName, methodName)); 287 | } 288 | 289 | 290 | /// 291 | /// Enqueues a message with a value to be forwarded to the given game object in the next update. 292 | /// 293 | /// Name of the game object. 294 | /// Method name. 295 | /// The value sent with the message. 296 | public void SendMessageToGameObject(string gameObjectName, string methodName, object value) 297 | { 298 | lock (messagesWithValue) 299 | messagesWithValue.Enqueue(new KeyValuePair>(gameObjectName, new KeyValuePair(methodName, value))); 300 | } 301 | 302 | # endif 303 | } 304 | } -------------------------------------------------------------------------------- /Assets/UnityBrowserBridge/Scripts/UnityBrowserBridge.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 20e679ddcc87f49cd93e72eaa0e674bf 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridgeExample.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6391fac702e9644f9a4dcf0da421d92e 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridgeExample/Images.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 91dc52d50a5c84a79ad44d019483a3d0 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridgeExample/Images/Clock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sropelato/UnityBrowserBridge/9d2ed54e2ae073f2dc4f408470f416e34febda21/Assets/UnityBrowserBridgeExample/Images/Clock.png -------------------------------------------------------------------------------- /Assets/UnityBrowserBridgeExample/Images/Clock.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e9dbf60fa202d463580724d90a6295c0 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | vTOnly: 0 27 | grayScaleToAlpha: 0 28 | generateCubemap: 6 29 | cubemapConvolution: 0 30 | seamlessCubemap: 0 31 | textureFormat: 1 32 | maxTextureSize: 2048 33 | textureSettings: 34 | serializedVersion: 2 35 | filterMode: 1 36 | aniso: 1 37 | mipBias: 0 38 | wrapU: 1 39 | wrapV: 1 40 | wrapW: 0 41 | nPOTScale: 0 42 | lightmap: 0 43 | compressionQuality: 50 44 | spriteMode: 1 45 | spriteExtrude: 1 46 | spriteMeshType: 1 47 | alignment: 0 48 | spritePivot: {x: 0.5, y: 0.5} 49 | spritePixelsToUnits: 100 50 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 51 | spriteGenerateFallbackPhysicsShape: 1 52 | alphaUsage: 1 53 | alphaIsTransparency: 1 54 | spriteTessellationDetail: -1 55 | textureType: 8 56 | textureShape: 1 57 | singleChannelComponent: 0 58 | flipbookRows: 1 59 | flipbookColumns: 1 60 | maxTextureSizeSet: 0 61 | compressionQualitySet: 0 62 | textureFormatSet: 0 63 | ignorePngGamma: 0 64 | applyGammaDecoding: 0 65 | platformSettings: 66 | - serializedVersion: 3 67 | buildTarget: DefaultTexturePlatform 68 | maxTextureSize: 2048 69 | resizeAlgorithm: 0 70 | textureFormat: -1 71 | textureCompression: 1 72 | compressionQuality: 50 73 | crunchedCompression: 0 74 | allowsAlphaSplitting: 0 75 | overridden: 0 76 | androidETC2FallbackOverride: 0 77 | forceMaximumCompressionQuality_BC6H_BC7: 0 78 | - serializedVersion: 3 79 | buildTarget: Standalone 80 | maxTextureSize: 2048 81 | resizeAlgorithm: 0 82 | textureFormat: -1 83 | textureCompression: 1 84 | compressionQuality: 50 85 | crunchedCompression: 0 86 | allowsAlphaSplitting: 0 87 | overridden: 0 88 | androidETC2FallbackOverride: 0 89 | forceMaximumCompressionQuality_BC6H_BC7: 0 90 | - serializedVersion: 3 91 | buildTarget: WebGL 92 | maxTextureSize: 2048 93 | resizeAlgorithm: 0 94 | textureFormat: -1 95 | textureCompression: 1 96 | compressionQuality: 50 97 | crunchedCompression: 0 98 | allowsAlphaSplitting: 0 99 | overridden: 0 100 | androidETC2FallbackOverride: 0 101 | forceMaximumCompressionQuality_BC6H_BC7: 0 102 | spriteSheet: 103 | serializedVersion: 2 104 | sprites: [] 105 | outline: [] 106 | physicsShape: [] 107 | bones: [] 108 | spriteID: 5e97eb03825dee720800000000000000 109 | internalID: 0 110 | vertices: [] 111 | indices: 112 | edges: [] 113 | weights: [] 114 | secondaryTextures: [] 115 | spritePackingTag: 116 | pSDRemoveMatte: 0 117 | pSDShowRemoveMatteOption: 0 118 | userData: 119 | assetBundleName: 120 | assetBundleVariant: 121 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridgeExample/Materials.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5f76ae8e4b2f5494f984e5fa7cbae57b 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridgeExample/Materials/Skybox.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 6 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: Skybox 11 | m_Shader: {fileID: 104, guid: 0000000000000000f000000000000000, type: 0} 12 | m_ShaderKeywords: 13 | m_LightmapFlags: 4 14 | m_EnableInstancingVariants: 0 15 | m_DoubleSidedGI: 0 16 | m_CustomRenderQueue: -1 17 | stringTagMap: {} 18 | disabledShaderPasses: [] 19 | m_SavedProperties: 20 | serializedVersion: 3 21 | m_TexEnvs: 22 | - _BackTex: 23 | m_Texture: {fileID: 0} 24 | m_Scale: {x: 1, y: 1} 25 | m_Offset: {x: 0, y: 0} 26 | - _BumpMap: 27 | m_Texture: {fileID: 0} 28 | m_Scale: {x: 1, y: 1} 29 | m_Offset: {x: 0, y: 0} 30 | - _DetailAlbedoMap: 31 | m_Texture: {fileID: 0} 32 | m_Scale: {x: 1, y: 1} 33 | m_Offset: {x: 0, y: 0} 34 | - _DetailMask: 35 | m_Texture: {fileID: 0} 36 | m_Scale: {x: 1, y: 1} 37 | m_Offset: {x: 0, y: 0} 38 | - _DetailNormalMap: 39 | m_Texture: {fileID: 0} 40 | m_Scale: {x: 1, y: 1} 41 | m_Offset: {x: 0, y: 0} 42 | - _DownTex: 43 | m_Texture: {fileID: 0} 44 | m_Scale: {x: 1, y: 1} 45 | m_Offset: {x: 0, y: 0} 46 | - _EmissionMap: 47 | m_Texture: {fileID: 0} 48 | m_Scale: {x: 1, y: 1} 49 | m_Offset: {x: 0, y: 0} 50 | - _FrontTex: 51 | m_Texture: {fileID: 0} 52 | m_Scale: {x: 1, y: 1} 53 | m_Offset: {x: 0, y: 0} 54 | - _LeftTex: 55 | m_Texture: {fileID: 0} 56 | m_Scale: {x: 1, y: 1} 57 | m_Offset: {x: 0, y: 0} 58 | - _MainTex: 59 | m_Texture: {fileID: 0} 60 | m_Scale: {x: 1, y: 1} 61 | m_Offset: {x: 0, y: 0} 62 | - _MetallicGlossMap: 63 | m_Texture: {fileID: 0} 64 | m_Scale: {x: 1, y: 1} 65 | m_Offset: {x: 0, y: 0} 66 | - _OcclusionMap: 67 | m_Texture: {fileID: 0} 68 | m_Scale: {x: 1, y: 1} 69 | m_Offset: {x: 0, y: 0} 70 | - _ParallaxMap: 71 | m_Texture: {fileID: 0} 72 | m_Scale: {x: 1, y: 1} 73 | m_Offset: {x: 0, y: 0} 74 | - _RightTex: 75 | m_Texture: {fileID: 0} 76 | m_Scale: {x: 1, y: 1} 77 | m_Offset: {x: 0, y: 0} 78 | - _UpTex: 79 | m_Texture: {fileID: 0} 80 | m_Scale: {x: 1, y: 1} 81 | m_Offset: {x: 0, y: 0} 82 | m_Ints: [] 83 | m_Floats: 84 | - _BumpScale: 1 85 | - _Cutoff: 0.5 86 | - _DetailNormalMapScale: 1 87 | - _DstBlend: 0 88 | - _Exposure: 1 89 | - _GlossMapScale: 1 90 | - _Glossiness: 0.5 91 | - _GlossyReflections: 1 92 | - _Metallic: 0 93 | - _Mode: 0 94 | - _OcclusionStrength: 1 95 | - _Parallax: 0.02 96 | - _Rotation: 0 97 | - _SmoothnessTextureChannel: 0 98 | - _SpecularHighlights: 1 99 | - _SrcBlend: 1 100 | - _UVSec: 0 101 | - _ZWrite: 1 102 | m_Colors: 103 | - _Color: {r: 1, g: 1, b: 1, a: 1} 104 | - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} 105 | - _Tint: {r: 0.2830189, g: 0.3405653, b: 0.3773585, a: 0.5} 106 | m_BuildTextureStacks: [] 107 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridgeExample/Materials/Skybox.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bff43a226ea0e4c15bf58955da3d6a2e 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 0 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridgeExample/Plugins.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3b056e345c9254ea89421ac7f5162cab 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridgeExample/Plugins/BrowserInteraction.jslib: -------------------------------------------------------------------------------- 1 | mergeInto(LibraryManager.library, { 2 | GetDateAndTime: function (locale) { 3 | var returnStr = getDateAndTime(Pointer_stringify(locale)) 4 | var bufferSize = lengthBytesUTF8(returnStr) + 1 5 | var buffer = _malloc(bufferSize) 6 | stringToUTF8(returnStr, buffer, bufferSize) 7 | return buffer 8 | }, 9 | GetDateAndTimeAsync: function (locale) { 10 | getDateAndTimeAsync(Pointer_stringify(locale)) 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridgeExample/Plugins/BrowserInteraction.jslib.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5f1717c5a9aa84724aa4f2a65c62b40c 3 | PluginImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | iconMap: {} 7 | executionOrder: {} 8 | defineConstraints: [] 9 | isPreloaded: 0 10 | isOverridable: 0 11 | isExplicitlyReferenced: 0 12 | validateReferences: 1 13 | platformData: 14 | - first: 15 | Any: 16 | second: 17 | enabled: 0 18 | settings: {} 19 | - first: 20 | Editor: Editor 21 | second: 22 | enabled: 0 23 | settings: 24 | DefaultValueInitialized: true 25 | - first: 26 | WebGL: WebGL 27 | second: 28 | enabled: 1 29 | settings: {} 30 | userData: 31 | assetBundleName: 32 | assetBundleVariant: 33 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridgeExample/Scenes.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3f05c2b15e0264d79868790a4160eaaf 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridgeExample/Scenes/UnityBrowserBridgeExample.unity: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!29 &1 4 | OcclusionCullingSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_OcclusionBakeSettings: 8 | smallestOccluder: 5 9 | smallestHole: 0.25 10 | backfaceThreshold: 100 11 | m_SceneGUID: 00000000000000000000000000000000 12 | m_OcclusionCullingData: {fileID: 0} 13 | --- !u!104 &2 14 | RenderSettings: 15 | m_ObjectHideFlags: 0 16 | serializedVersion: 9 17 | m_Fog: 0 18 | m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} 19 | m_FogMode: 3 20 | m_FogDensity: 0.01 21 | m_LinearFogStart: 0 22 | m_LinearFogEnd: 300 23 | m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} 24 | m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} 25 | m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} 26 | m_AmbientIntensity: 1 27 | m_AmbientMode: 0 28 | m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} 29 | m_SkyboxMaterial: {fileID: 2100000, guid: bff43a226ea0e4c15bf58955da3d6a2e, type: 2} 30 | m_HaloStrength: 0.5 31 | m_FlareStrength: 1 32 | m_FlareFadeSpeed: 3 33 | m_HaloTexture: {fileID: 0} 34 | m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} 35 | m_DefaultReflectionMode: 0 36 | m_DefaultReflectionResolution: 128 37 | m_ReflectionBounces: 1 38 | m_ReflectionIntensity: 1 39 | m_CustomReflection: {fileID: 0} 40 | m_Sun: {fileID: 2116323748} 41 | m_IndirectSpecularColor: {r: 0.28173837, g: 0.339111, b: 0.3757325, a: 1} 42 | m_UseRadianceAmbientProbe: 0 43 | --- !u!157 &3 44 | LightmapSettings: 45 | m_ObjectHideFlags: 0 46 | serializedVersion: 12 47 | m_GIWorkflowMode: 1 48 | m_GISettings: 49 | serializedVersion: 2 50 | m_BounceScale: 1 51 | m_IndirectOutputScale: 1 52 | m_AlbedoBoost: 1 53 | m_EnvironmentLightingMode: 0 54 | m_EnableBakedLightmaps: 1 55 | m_EnableRealtimeLightmaps: 0 56 | m_LightmapEditorSettings: 57 | serializedVersion: 12 58 | m_Resolution: 2 59 | m_BakeResolution: 40 60 | m_AtlasSize: 1024 61 | m_AO: 0 62 | m_AOMaxDistance: 1 63 | m_CompAOExponent: 1 64 | m_CompAOExponentDirect: 0 65 | m_ExtractAmbientOcclusion: 0 66 | m_Padding: 2 67 | m_LightmapParameters: {fileID: 0} 68 | m_LightmapsBakeMode: 1 69 | m_TextureCompression: 1 70 | m_FinalGather: 0 71 | m_FinalGatherFiltering: 1 72 | m_FinalGatherRayCount: 256 73 | m_ReflectionCompression: 2 74 | m_MixedBakeMode: 2 75 | m_BakeBackend: 1 76 | m_PVRSampling: 1 77 | m_PVRDirectSampleCount: 32 78 | m_PVRSampleCount: 500 79 | m_PVRBounces: 2 80 | m_PVREnvironmentSampleCount: 500 81 | m_PVREnvironmentReferencePointCount: 2048 82 | m_PVRFilteringMode: 2 83 | m_PVRDenoiserTypeDirect: 0 84 | m_PVRDenoiserTypeIndirect: 0 85 | m_PVRDenoiserTypeAO: 0 86 | m_PVRFilterTypeDirect: 0 87 | m_PVRFilterTypeIndirect: 0 88 | m_PVRFilterTypeAO: 0 89 | m_PVREnvironmentMIS: 0 90 | m_PVRCulling: 1 91 | m_PVRFilteringGaussRadiusDirect: 1 92 | m_PVRFilteringGaussRadiusIndirect: 5 93 | m_PVRFilteringGaussRadiusAO: 2 94 | m_PVRFilteringAtrousPositionSigmaDirect: 0.5 95 | m_PVRFilteringAtrousPositionSigmaIndirect: 2 96 | m_PVRFilteringAtrousPositionSigmaAO: 1 97 | m_ExportTrainingData: 0 98 | m_TrainingDataDestination: TrainingData 99 | m_LightProbeSampleCountMultiplier: 4 100 | m_LightingDataAsset: {fileID: 0} 101 | m_LightingSettings: {fileID: 0} 102 | --- !u!196 &4 103 | NavMeshSettings: 104 | serializedVersion: 2 105 | m_ObjectHideFlags: 0 106 | m_BuildSettings: 107 | serializedVersion: 2 108 | agentTypeID: 0 109 | agentRadius: 0.5 110 | agentHeight: 2 111 | agentSlope: 45 112 | agentClimb: 0.4 113 | ledgeDropHeight: 0 114 | maxJumpAcrossDistance: 0 115 | minRegionArea: 2 116 | manualCellSize: 0 117 | cellSize: 0.16666667 118 | manualTileSize: 0 119 | tileSize: 256 120 | accuratePlacement: 0 121 | maxJobWorkers: 0 122 | preserveTilesOutsideBounds: 0 123 | debug: 124 | m_Flags: 0 125 | m_NavMeshData: {fileID: 0} 126 | --- !u!1 &62009653 127 | GameObject: 128 | m_ObjectHideFlags: 0 129 | m_CorrespondingSourceObject: {fileID: 0} 130 | m_PrefabInstance: {fileID: 0} 131 | m_PrefabAsset: {fileID: 0} 132 | serializedVersion: 6 133 | m_Component: 134 | - component: {fileID: 62009654} 135 | - component: {fileID: 62009656} 136 | - component: {fileID: 62009655} 137 | m_Layer: 5 138 | m_Name: Text 139 | m_TagString: Untagged 140 | m_Icon: {fileID: 0} 141 | m_NavMeshLayer: 0 142 | m_StaticEditorFlags: 0 143 | m_IsActive: 1 144 | --- !u!224 &62009654 145 | RectTransform: 146 | m_ObjectHideFlags: 0 147 | m_CorrespondingSourceObject: {fileID: 0} 148 | m_PrefabInstance: {fileID: 0} 149 | m_PrefabAsset: {fileID: 0} 150 | m_GameObject: {fileID: 62009653} 151 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 152 | m_LocalPosition: {x: 0, y: 0, z: 0} 153 | m_LocalScale: {x: 1, y: 1, z: 1} 154 | m_Children: [] 155 | m_Father: {fileID: 1733693706} 156 | m_RootOrder: 0 157 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 158 | m_AnchorMin: {x: 0, y: 0} 159 | m_AnchorMax: {x: 1, y: 1} 160 | m_AnchoredPosition: {x: 0, y: 0} 161 | m_SizeDelta: {x: 0, y: 0} 162 | m_Pivot: {x: 0.5, y: 0.5} 163 | --- !u!114 &62009655 164 | MonoBehaviour: 165 | m_ObjectHideFlags: 0 166 | m_CorrespondingSourceObject: {fileID: 0} 167 | m_PrefabInstance: {fileID: 0} 168 | m_PrefabAsset: {fileID: 0} 169 | m_GameObject: {fileID: 62009653} 170 | m_Enabled: 1 171 | m_EditorHideFlags: 0 172 | m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} 173 | m_Name: 174 | m_EditorClassIdentifier: 175 | m_Material: {fileID: 0} 176 | m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} 177 | m_RaycastTarget: 1 178 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 179 | m_Maskable: 1 180 | m_OnCullStateChanged: 181 | m_PersistentCalls: 182 | m_Calls: [] 183 | m_FontData: 184 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 185 | m_FontSize: 24 186 | m_FontStyle: 0 187 | m_BestFit: 0 188 | m_MinSize: 0 189 | m_MaxSize: 40 190 | m_Alignment: 4 191 | m_AlignByGeometry: 0 192 | m_RichText: 1 193 | m_HorizontalOverflow: 0 194 | m_VerticalOverflow: 0 195 | m_LineSpacing: 1 196 | m_Text: Get Date And Time 197 | --- !u!222 &62009656 198 | CanvasRenderer: 199 | m_ObjectHideFlags: 0 200 | m_CorrespondingSourceObject: {fileID: 0} 201 | m_PrefabInstance: {fileID: 0} 202 | m_PrefabAsset: {fileID: 0} 203 | m_GameObject: {fileID: 62009653} 204 | m_CullTransparentMesh: 1 205 | --- !u!1 &314126188 206 | GameObject: 207 | m_ObjectHideFlags: 0 208 | m_CorrespondingSourceObject: {fileID: 0} 209 | m_PrefabInstance: {fileID: 0} 210 | m_PrefabAsset: {fileID: 0} 211 | serializedVersion: 6 212 | m_Component: 213 | - component: {fileID: 314126189} 214 | - component: {fileID: 314126191} 215 | - component: {fileID: 314126190} 216 | m_Layer: 5 217 | m_Name: Text 218 | m_TagString: Untagged 219 | m_Icon: {fileID: 0} 220 | m_NavMeshLayer: 0 221 | m_StaticEditorFlags: 0 222 | m_IsActive: 1 223 | --- !u!224 &314126189 224 | RectTransform: 225 | m_ObjectHideFlags: 0 226 | m_CorrespondingSourceObject: {fileID: 0} 227 | m_PrefabInstance: {fileID: 0} 228 | m_PrefabAsset: {fileID: 0} 229 | m_GameObject: {fileID: 314126188} 230 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 231 | m_LocalPosition: {x: 0, y: 0, z: 0} 232 | m_LocalScale: {x: 1, y: 1, z: 1} 233 | m_Children: [] 234 | m_Father: {fileID: 660355430} 235 | m_RootOrder: 0 236 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 237 | m_AnchorMin: {x: 0, y: 0} 238 | m_AnchorMax: {x: 1, y: 1} 239 | m_AnchoredPosition: {x: 0, y: 0} 240 | m_SizeDelta: {x: 0, y: 0} 241 | m_Pivot: {x: 0.5, y: 0.5} 242 | --- !u!114 &314126190 243 | MonoBehaviour: 244 | m_ObjectHideFlags: 0 245 | m_CorrespondingSourceObject: {fileID: 0} 246 | m_PrefabInstance: {fileID: 0} 247 | m_PrefabAsset: {fileID: 0} 248 | m_GameObject: {fileID: 314126188} 249 | m_Enabled: 1 250 | m_EditorHideFlags: 0 251 | m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} 252 | m_Name: 253 | m_EditorClassIdentifier: 254 | m_Material: {fileID: 0} 255 | m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} 256 | m_RaycastTarget: 1 257 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 258 | m_Maskable: 1 259 | m_OnCullStateChanged: 260 | m_PersistentCalls: 261 | m_Calls: [] 262 | m_FontData: 263 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 264 | m_FontSize: 24 265 | m_FontStyle: 0 266 | m_BestFit: 0 267 | m_MinSize: 0 268 | m_MaxSize: 40 269 | m_Alignment: 4 270 | m_AlignByGeometry: 0 271 | m_RichText: 1 272 | m_HorizontalOverflow: 0 273 | m_VerticalOverflow: 0 274 | m_LineSpacing: 1 275 | m_Text: Get Date And Time (Async) 276 | --- !u!222 &314126191 277 | CanvasRenderer: 278 | m_ObjectHideFlags: 0 279 | m_CorrespondingSourceObject: {fileID: 0} 280 | m_PrefabInstance: {fileID: 0} 281 | m_PrefabAsset: {fileID: 0} 282 | m_GameObject: {fileID: 314126188} 283 | m_CullTransparentMesh: 1 284 | --- !u!1 &650446293 285 | GameObject: 286 | m_ObjectHideFlags: 0 287 | m_CorrespondingSourceObject: {fileID: 0} 288 | m_PrefabInstance: {fileID: 0} 289 | m_PrefabAsset: {fileID: 0} 290 | serializedVersion: 6 291 | m_Component: 292 | - component: {fileID: 650446296} 293 | - component: {fileID: 650446295} 294 | - component: {fileID: 650446294} 295 | m_Layer: 0 296 | m_Name: EventSystem 297 | m_TagString: Untagged 298 | m_Icon: {fileID: 0} 299 | m_NavMeshLayer: 0 300 | m_StaticEditorFlags: 0 301 | m_IsActive: 1 302 | --- !u!114 &650446294 303 | MonoBehaviour: 304 | m_ObjectHideFlags: 0 305 | m_CorrespondingSourceObject: {fileID: 0} 306 | m_PrefabInstance: {fileID: 0} 307 | m_PrefabAsset: {fileID: 0} 308 | m_GameObject: {fileID: 650446293} 309 | m_Enabled: 1 310 | m_EditorHideFlags: 0 311 | m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} 312 | m_Name: 313 | m_EditorClassIdentifier: 314 | m_HorizontalAxis: Horizontal 315 | m_VerticalAxis: Vertical 316 | m_SubmitButton: Submit 317 | m_CancelButton: Cancel 318 | m_InputActionsPerSecond: 10 319 | m_RepeatDelay: 0.5 320 | m_ForceModuleActive: 0 321 | --- !u!114 &650446295 322 | MonoBehaviour: 323 | m_ObjectHideFlags: 0 324 | m_CorrespondingSourceObject: {fileID: 0} 325 | m_PrefabInstance: {fileID: 0} 326 | m_PrefabAsset: {fileID: 0} 327 | m_GameObject: {fileID: 650446293} 328 | m_Enabled: 1 329 | m_EditorHideFlags: 0 330 | m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} 331 | m_Name: 332 | m_EditorClassIdentifier: 333 | m_FirstSelected: {fileID: 0} 334 | m_sendNavigationEvents: 1 335 | m_DragThreshold: 10 336 | --- !u!4 &650446296 337 | Transform: 338 | m_ObjectHideFlags: 0 339 | m_CorrespondingSourceObject: {fileID: 0} 340 | m_PrefabInstance: {fileID: 0} 341 | m_PrefabAsset: {fileID: 0} 342 | m_GameObject: {fileID: 650446293} 343 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 344 | m_LocalPosition: {x: 0, y: 0, z: 0} 345 | m_LocalScale: {x: 1, y: 1, z: 1} 346 | m_Children: [] 347 | m_Father: {fileID: 0} 348 | m_RootOrder: 5 349 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 350 | --- !u!1 &660355429 351 | GameObject: 352 | m_ObjectHideFlags: 0 353 | m_CorrespondingSourceObject: {fileID: 0} 354 | m_PrefabInstance: {fileID: 0} 355 | m_PrefabAsset: {fileID: 0} 356 | serializedVersion: 6 357 | m_Component: 358 | - component: {fileID: 660355430} 359 | - component: {fileID: 660355433} 360 | - component: {fileID: 660355432} 361 | - component: {fileID: 660355431} 362 | m_Layer: 5 363 | m_Name: GetDateAndTimeAsync Button 364 | m_TagString: Untagged 365 | m_Icon: {fileID: 0} 366 | m_NavMeshLayer: 0 367 | m_StaticEditorFlags: 0 368 | m_IsActive: 1 369 | --- !u!224 &660355430 370 | RectTransform: 371 | m_ObjectHideFlags: 0 372 | m_CorrespondingSourceObject: {fileID: 0} 373 | m_PrefabInstance: {fileID: 0} 374 | m_PrefabAsset: {fileID: 0} 375 | m_GameObject: {fileID: 660355429} 376 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 377 | m_LocalPosition: {x: 0, y: 0, z: 0} 378 | m_LocalScale: {x: 1, y: 1, z: 1} 379 | m_Children: 380 | - {fileID: 314126189} 381 | m_Father: {fileID: 1709289843} 382 | m_RootOrder: 5 383 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 384 | m_AnchorMin: {x: 0, y: 0} 385 | m_AnchorMax: {x: 1, y: 0} 386 | m_AnchoredPosition: {x: 0, y: 32} 387 | m_SizeDelta: {x: -64, y: 64} 388 | m_Pivot: {x: 0.5, y: 0} 389 | --- !u!114 &660355431 390 | MonoBehaviour: 391 | m_ObjectHideFlags: 0 392 | m_CorrespondingSourceObject: {fileID: 0} 393 | m_PrefabInstance: {fileID: 0} 394 | m_PrefabAsset: {fileID: 0} 395 | m_GameObject: {fileID: 660355429} 396 | m_Enabled: 1 397 | m_EditorHideFlags: 0 398 | m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} 399 | m_Name: 400 | m_EditorClassIdentifier: 401 | m_Navigation: 402 | m_Mode: 0 403 | m_WrapAround: 0 404 | m_SelectOnUp: {fileID: 0} 405 | m_SelectOnDown: {fileID: 0} 406 | m_SelectOnLeft: {fileID: 0} 407 | m_SelectOnRight: {fileID: 0} 408 | m_Transition: 1 409 | m_Colors: 410 | m_NormalColor: {r: 1, g: 1, b: 1, a: 1} 411 | m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 412 | m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} 413 | m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 414 | m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} 415 | m_ColorMultiplier: 1 416 | m_FadeDuration: 0.1 417 | m_SpriteState: 418 | m_HighlightedSprite: {fileID: 0} 419 | m_PressedSprite: {fileID: 0} 420 | m_SelectedSprite: {fileID: 0} 421 | m_DisabledSprite: {fileID: 0} 422 | m_AnimationTriggers: 423 | m_NormalTrigger: Normal 424 | m_HighlightedTrigger: Highlighted 425 | m_PressedTrigger: Pressed 426 | m_SelectedTrigger: Selected 427 | m_DisabledTrigger: Disabled 428 | m_Interactable: 1 429 | m_TargetGraphic: {fileID: 660355432} 430 | m_OnClick: 431 | m_PersistentCalls: 432 | m_Calls: [] 433 | --- !u!114 &660355432 434 | MonoBehaviour: 435 | m_ObjectHideFlags: 0 436 | m_CorrespondingSourceObject: {fileID: 0} 437 | m_PrefabInstance: {fileID: 0} 438 | m_PrefabAsset: {fileID: 0} 439 | m_GameObject: {fileID: 660355429} 440 | m_Enabled: 1 441 | m_EditorHideFlags: 0 442 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 443 | m_Name: 444 | m_EditorClassIdentifier: 445 | m_Material: {fileID: 0} 446 | m_Color: {r: 1, g: 1, b: 1, a: 1} 447 | m_RaycastTarget: 1 448 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 449 | m_Maskable: 1 450 | m_OnCullStateChanged: 451 | m_PersistentCalls: 452 | m_Calls: [] 453 | m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} 454 | m_Type: 1 455 | m_PreserveAspect: 0 456 | m_FillCenter: 1 457 | m_FillMethod: 4 458 | m_FillAmount: 1 459 | m_FillClockwise: 1 460 | m_FillOrigin: 0 461 | m_UseSpriteMesh: 0 462 | m_PixelsPerUnitMultiplier: 1 463 | --- !u!222 &660355433 464 | CanvasRenderer: 465 | m_ObjectHideFlags: 0 466 | m_CorrespondingSourceObject: {fileID: 0} 467 | m_PrefabInstance: {fileID: 0} 468 | m_PrefabAsset: {fileID: 0} 469 | m_GameObject: {fileID: 660355429} 470 | m_CullTransparentMesh: 1 471 | --- !u!1 &796187669 472 | GameObject: 473 | m_ObjectHideFlags: 0 474 | m_CorrespondingSourceObject: {fileID: 0} 475 | m_PrefabInstance: {fileID: 0} 476 | m_PrefabAsset: {fileID: 0} 477 | serializedVersion: 6 478 | m_Component: 479 | - component: {fileID: 796187670} 480 | - component: {fileID: 796187672} 481 | - component: {fileID: 796187671} 482 | m_Layer: 5 483 | m_Name: Title Text 484 | m_TagString: Untagged 485 | m_Icon: {fileID: 0} 486 | m_NavMeshLayer: 0 487 | m_StaticEditorFlags: 0 488 | m_IsActive: 1 489 | --- !u!224 &796187670 490 | RectTransform: 491 | m_ObjectHideFlags: 0 492 | m_CorrespondingSourceObject: {fileID: 0} 493 | m_PrefabInstance: {fileID: 0} 494 | m_PrefabAsset: {fileID: 0} 495 | m_GameObject: {fileID: 796187669} 496 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 497 | m_LocalPosition: {x: 0, y: 0, z: 0} 498 | m_LocalScale: {x: 1, y: 1, z: 1} 499 | m_Children: [] 500 | m_Father: {fileID: 1709289843} 501 | m_RootOrder: 0 502 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 503 | m_AnchorMin: {x: 0, y: 1} 504 | m_AnchorMax: {x: 1, y: 1} 505 | m_AnchoredPosition: {x: 0, y: -32} 506 | m_SizeDelta: {x: -64, y: 64} 507 | m_Pivot: {x: 0.5, y: 1} 508 | --- !u!114 &796187671 509 | MonoBehaviour: 510 | m_ObjectHideFlags: 0 511 | m_CorrespondingSourceObject: {fileID: 0} 512 | m_PrefabInstance: {fileID: 0} 513 | m_PrefabAsset: {fileID: 0} 514 | m_GameObject: {fileID: 796187669} 515 | m_Enabled: 1 516 | m_EditorHideFlags: 0 517 | m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} 518 | m_Name: 519 | m_EditorClassIdentifier: 520 | m_Material: {fileID: 0} 521 | m_Color: {r: 1, g: 1, b: 1, a: 1} 522 | m_RaycastTarget: 1 523 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 524 | m_Maskable: 1 525 | m_OnCullStateChanged: 526 | m_PersistentCalls: 527 | m_Calls: [] 528 | m_FontData: 529 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 530 | m_FontSize: 36 531 | m_FontStyle: 1 532 | m_BestFit: 0 533 | m_MinSize: 0 534 | m_MaxSize: 100 535 | m_Alignment: 3 536 | m_AlignByGeometry: 0 537 | m_RichText: 1 538 | m_HorizontalOverflow: 0 539 | m_VerticalOverflow: 0 540 | m_LineSpacing: 1 541 | m_Text: Unity Browser Bridge Example 542 | --- !u!222 &796187672 543 | CanvasRenderer: 544 | m_ObjectHideFlags: 0 545 | m_CorrespondingSourceObject: {fileID: 0} 546 | m_PrefabInstance: {fileID: 0} 547 | m_PrefabAsset: {fileID: 0} 548 | m_GameObject: {fileID: 796187669} 549 | m_CullTransparentMesh: 1 550 | --- !u!1 &963194225 551 | GameObject: 552 | m_ObjectHideFlags: 0 553 | m_CorrespondingSourceObject: {fileID: 0} 554 | m_PrefabInstance: {fileID: 0} 555 | m_PrefabAsset: {fileID: 0} 556 | serializedVersion: 6 557 | m_Component: 558 | - component: {fileID: 963194228} 559 | - component: {fileID: 963194227} 560 | - component: {fileID: 963194226} 561 | m_Layer: 0 562 | m_Name: Main Camera 563 | m_TagString: MainCamera 564 | m_Icon: {fileID: 0} 565 | m_NavMeshLayer: 0 566 | m_StaticEditorFlags: 0 567 | m_IsActive: 1 568 | --- !u!81 &963194226 569 | AudioListener: 570 | m_ObjectHideFlags: 0 571 | m_CorrespondingSourceObject: {fileID: 0} 572 | m_PrefabInstance: {fileID: 0} 573 | m_PrefabAsset: {fileID: 0} 574 | m_GameObject: {fileID: 963194225} 575 | m_Enabled: 1 576 | --- !u!20 &963194227 577 | Camera: 578 | m_ObjectHideFlags: 0 579 | m_CorrespondingSourceObject: {fileID: 0} 580 | m_PrefabInstance: {fileID: 0} 581 | m_PrefabAsset: {fileID: 0} 582 | m_GameObject: {fileID: 963194225} 583 | m_Enabled: 1 584 | serializedVersion: 2 585 | m_ClearFlags: 1 586 | m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} 587 | m_projectionMatrixMode: 1 588 | m_GateFitMode: 2 589 | m_FOVAxisMode: 0 590 | m_SensorSize: {x: 36, y: 24} 591 | m_LensShift: {x: 0, y: 0} 592 | m_FocalLength: 50 593 | m_NormalizedViewPortRect: 594 | serializedVersion: 2 595 | x: 0 596 | y: 0 597 | width: 1 598 | height: 1 599 | near clip plane: 0.3 600 | far clip plane: 1000 601 | field of view: 60 602 | orthographic: 0 603 | orthographic size: 5 604 | m_Depth: -1 605 | m_CullingMask: 606 | serializedVersion: 2 607 | m_Bits: 4294967295 608 | m_RenderingPath: -1 609 | m_TargetTexture: {fileID: 0} 610 | m_TargetDisplay: 0 611 | m_TargetEye: 3 612 | m_HDR: 1 613 | m_AllowMSAA: 1 614 | m_AllowDynamicResolution: 0 615 | m_ForceIntoRT: 0 616 | m_OcclusionCulling: 1 617 | m_StereoConvergence: 10 618 | m_StereoSeparation: 0.022 619 | --- !u!4 &963194228 620 | Transform: 621 | m_ObjectHideFlags: 0 622 | m_CorrespondingSourceObject: {fileID: 0} 623 | m_PrefabInstance: {fileID: 0} 624 | m_PrefabAsset: {fileID: 0} 625 | m_GameObject: {fileID: 963194225} 626 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 627 | m_LocalPosition: {x: 0, y: 1, z: -10} 628 | m_LocalScale: {x: 1, y: 1, z: 1} 629 | m_Children: [] 630 | m_Father: {fileID: 0} 631 | m_RootOrder: 2 632 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 633 | --- !u!1 &979398125 634 | GameObject: 635 | m_ObjectHideFlags: 0 636 | m_CorrespondingSourceObject: {fileID: 0} 637 | m_PrefabInstance: {fileID: 0} 638 | m_PrefabAsset: {fileID: 0} 639 | serializedVersion: 6 640 | m_Component: 641 | - component: {fileID: 979398126} 642 | - component: {fileID: 979398128} 643 | - component: {fileID: 979398127} 644 | m_Layer: 5 645 | m_Name: Clock 646 | m_TagString: Untagged 647 | m_Icon: {fileID: 0} 648 | m_NavMeshLayer: 0 649 | m_StaticEditorFlags: 0 650 | m_IsActive: 1 651 | --- !u!224 &979398126 652 | RectTransform: 653 | m_ObjectHideFlags: 0 654 | m_CorrespondingSourceObject: {fileID: 0} 655 | m_PrefabInstance: {fileID: 0} 656 | m_PrefabAsset: {fileID: 0} 657 | m_GameObject: {fileID: 979398125} 658 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 659 | m_LocalPosition: {x: 0, y: 0, z: 0} 660 | m_LocalScale: {x: 1, y: 1, z: 1} 661 | m_Children: [] 662 | m_Father: {fileID: 1709289843} 663 | m_RootOrder: 2 664 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 665 | m_AnchorMin: {x: 0, y: 0} 666 | m_AnchorMax: {x: 0, y: 0} 667 | m_AnchoredPosition: {x: 64, y: 292} 668 | m_SizeDelta: {x: 64, y: 64} 669 | m_Pivot: {x: 0.5, y: 0.5} 670 | --- !u!114 &979398127 671 | MonoBehaviour: 672 | m_ObjectHideFlags: 0 673 | m_CorrespondingSourceObject: {fileID: 0} 674 | m_PrefabInstance: {fileID: 0} 675 | m_PrefabAsset: {fileID: 0} 676 | m_GameObject: {fileID: 979398125} 677 | m_Enabled: 1 678 | m_EditorHideFlags: 0 679 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 680 | m_Name: 681 | m_EditorClassIdentifier: 682 | m_Material: {fileID: 0} 683 | m_Color: {r: 1, g: 1, b: 1, a: 1} 684 | m_RaycastTarget: 1 685 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 686 | m_Maskable: 1 687 | m_OnCullStateChanged: 688 | m_PersistentCalls: 689 | m_Calls: [] 690 | m_Sprite: {fileID: 21300000, guid: e9dbf60fa202d463580724d90a6295c0, type: 3} 691 | m_Type: 0 692 | m_PreserveAspect: 0 693 | m_FillCenter: 1 694 | m_FillMethod: 4 695 | m_FillAmount: 1 696 | m_FillClockwise: 1 697 | m_FillOrigin: 0 698 | m_UseSpriteMesh: 0 699 | m_PixelsPerUnitMultiplier: 1 700 | --- !u!222 &979398128 701 | CanvasRenderer: 702 | m_ObjectHideFlags: 0 703 | m_CorrespondingSourceObject: {fileID: 0} 704 | m_PrefabInstance: {fileID: 0} 705 | m_PrefabAsset: {fileID: 0} 706 | m_GameObject: {fileID: 979398125} 707 | m_CullTransparentMesh: 1 708 | --- !u!1 &1279738475 709 | GameObject: 710 | m_ObjectHideFlags: 0 711 | m_CorrespondingSourceObject: {fileID: 0} 712 | m_PrefabInstance: {fileID: 0} 713 | m_PrefabAsset: {fileID: 0} 714 | serializedVersion: 6 715 | m_Component: 716 | - component: {fileID: 1279738479} 717 | - component: {fileID: 1279738478} 718 | - component: {fileID: 1279738477} 719 | - component: {fileID: 1279738476} 720 | m_Layer: 5 721 | m_Name: Canvas 722 | m_TagString: Untagged 723 | m_Icon: {fileID: 0} 724 | m_NavMeshLayer: 0 725 | m_StaticEditorFlags: 0 726 | m_IsActive: 1 727 | --- !u!114 &1279738476 728 | MonoBehaviour: 729 | m_ObjectHideFlags: 0 730 | m_CorrespondingSourceObject: {fileID: 0} 731 | m_PrefabInstance: {fileID: 0} 732 | m_PrefabAsset: {fileID: 0} 733 | m_GameObject: {fileID: 1279738475} 734 | m_Enabled: 1 735 | m_EditorHideFlags: 0 736 | m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} 737 | m_Name: 738 | m_EditorClassIdentifier: 739 | m_IgnoreReversedGraphics: 1 740 | m_BlockingObjects: 0 741 | m_BlockingMask: 742 | serializedVersion: 2 743 | m_Bits: 4294967295 744 | --- !u!114 &1279738477 745 | MonoBehaviour: 746 | m_ObjectHideFlags: 0 747 | m_CorrespondingSourceObject: {fileID: 0} 748 | m_PrefabInstance: {fileID: 0} 749 | m_PrefabAsset: {fileID: 0} 750 | m_GameObject: {fileID: 1279738475} 751 | m_Enabled: 1 752 | m_EditorHideFlags: 0 753 | m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} 754 | m_Name: 755 | m_EditorClassIdentifier: 756 | m_UiScaleMode: 1 757 | m_ReferencePixelsPerUnit: 100 758 | m_ScaleFactor: 1 759 | m_ReferenceResolution: {x: 1144, y: 1000} 760 | m_ScreenMatchMode: 1 761 | m_MatchWidthOrHeight: 0.496 762 | m_PhysicalUnit: 3 763 | m_FallbackScreenDPI: 96 764 | m_DefaultSpriteDPI: 96 765 | m_DynamicPixelsPerUnit: 1 766 | m_PresetInfoIsWorld: 0 767 | --- !u!223 &1279738478 768 | Canvas: 769 | m_ObjectHideFlags: 0 770 | m_CorrespondingSourceObject: {fileID: 0} 771 | m_PrefabInstance: {fileID: 0} 772 | m_PrefabAsset: {fileID: 0} 773 | m_GameObject: {fileID: 1279738475} 774 | m_Enabled: 1 775 | serializedVersion: 3 776 | m_RenderMode: 0 777 | m_Camera: {fileID: 0} 778 | m_PlaneDistance: 100 779 | m_PixelPerfect: 0 780 | m_ReceivesEvents: 1 781 | m_OverrideSorting: 0 782 | m_OverridePixelPerfect: 0 783 | m_SortingBucketNormalizedSize: 0 784 | m_AdditionalShaderChannelsFlag: 0 785 | m_SortingLayerID: 0 786 | m_SortingOrder: 0 787 | m_TargetDisplay: 0 788 | --- !u!224 &1279738479 789 | RectTransform: 790 | m_ObjectHideFlags: 0 791 | m_CorrespondingSourceObject: {fileID: 0} 792 | m_PrefabInstance: {fileID: 0} 793 | m_PrefabAsset: {fileID: 0} 794 | m_GameObject: {fileID: 1279738475} 795 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 796 | m_LocalPosition: {x: 0, y: 0, z: 0} 797 | m_LocalScale: {x: 0, y: 0, z: 0} 798 | m_Children: 799 | - {fileID: 1709289843} 800 | m_Father: {fileID: 0} 801 | m_RootOrder: 4 802 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 803 | m_AnchorMin: {x: 0, y: 0} 804 | m_AnchorMax: {x: 0, y: 0} 805 | m_AnchoredPosition: {x: 0, y: 0} 806 | m_SizeDelta: {x: 0, y: 0} 807 | m_Pivot: {x: 0, y: 0} 808 | --- !u!1 &1680063253 809 | GameObject: 810 | m_ObjectHideFlags: 0 811 | m_CorrespondingSourceObject: {fileID: 0} 812 | m_PrefabInstance: {fileID: 0} 813 | m_PrefabAsset: {fileID: 0} 814 | serializedVersion: 6 815 | m_Component: 816 | - component: {fileID: 1680063256} 817 | - component: {fileID: 1680063255} 818 | m_Layer: 0 819 | m_Name: Main 820 | m_TagString: Untagged 821 | m_Icon: {fileID: 0} 822 | m_NavMeshLayer: 0 823 | m_StaticEditorFlags: 0 824 | m_IsActive: 1 825 | --- !u!114 &1680063255 826 | MonoBehaviour: 827 | m_ObjectHideFlags: 0 828 | m_CorrespondingSourceObject: {fileID: 0} 829 | m_PrefabInstance: {fileID: 0} 830 | m_PrefabAsset: {fileID: 0} 831 | m_GameObject: {fileID: 1680063253} 832 | m_Enabled: 1 833 | m_EditorHideFlags: 0 834 | m_Script: {fileID: 11500000, guid: 6f98d8b4f95db46e3883cd7e484c41c7, type: 3} 835 | m_Name: 836 | m_EditorClassIdentifier: 837 | dateAndTimeText: {fileID: 1894354749} 838 | getDateAndTimeButton: {fileID: 1733693707} 839 | getDateAndTimeAsyncButton: {fileID: 660355431} 840 | locale: en-GB 841 | --- !u!4 &1680063256 842 | Transform: 843 | m_ObjectHideFlags: 0 844 | m_CorrespondingSourceObject: {fileID: 0} 845 | m_PrefabInstance: {fileID: 0} 846 | m_PrefabAsset: {fileID: 0} 847 | m_GameObject: {fileID: 1680063253} 848 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 849 | m_LocalPosition: {x: 0, y: 0, z: 0} 850 | m_LocalScale: {x: 1, y: 1, z: 1} 851 | m_Children: [] 852 | m_Father: {fileID: 0} 853 | m_RootOrder: 1 854 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 855 | --- !u!1 &1709289842 856 | GameObject: 857 | m_ObjectHideFlags: 0 858 | m_CorrespondingSourceObject: {fileID: 0} 859 | m_PrefabInstance: {fileID: 0} 860 | m_PrefabAsset: {fileID: 0} 861 | serializedVersion: 6 862 | m_Component: 863 | - component: {fileID: 1709289843} 864 | - component: {fileID: 1709289845} 865 | - component: {fileID: 1709289844} 866 | m_Layer: 5 867 | m_Name: Background 868 | m_TagString: Untagged 869 | m_Icon: {fileID: 0} 870 | m_NavMeshLayer: 0 871 | m_StaticEditorFlags: 0 872 | m_IsActive: 1 873 | --- !u!224 &1709289843 874 | RectTransform: 875 | m_ObjectHideFlags: 0 876 | m_CorrespondingSourceObject: {fileID: 0} 877 | m_PrefabInstance: {fileID: 0} 878 | m_PrefabAsset: {fileID: 0} 879 | m_GameObject: {fileID: 1709289842} 880 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 881 | m_LocalPosition: {x: 0, y: 0, z: 0} 882 | m_LocalScale: {x: 1, y: 1, z: 1} 883 | m_Children: 884 | - {fileID: 796187670} 885 | - {fileID: 1713585616} 886 | - {fileID: 979398126} 887 | - {fileID: 1894354748} 888 | - {fileID: 1733693706} 889 | - {fileID: 660355430} 890 | m_Father: {fileID: 1279738479} 891 | m_RootOrder: 0 892 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 893 | m_AnchorMin: {x: 0.5, y: 0.5} 894 | m_AnchorMax: {x: 0.5, y: 0.5} 895 | m_AnchoredPosition: {x: 0, y: 0} 896 | m_SizeDelta: {x: 960, y: 816} 897 | m_Pivot: {x: 0.5, y: 0.5} 898 | --- !u!114 &1709289844 899 | MonoBehaviour: 900 | m_ObjectHideFlags: 0 901 | m_CorrespondingSourceObject: {fileID: 0} 902 | m_PrefabInstance: {fileID: 0} 903 | m_PrefabAsset: {fileID: 0} 904 | m_GameObject: {fileID: 1709289842} 905 | m_Enabled: 1 906 | m_EditorHideFlags: 0 907 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 908 | m_Name: 909 | m_EditorClassIdentifier: 910 | m_Material: {fileID: 0} 911 | m_Color: {r: 0, g: 0, b: 0, a: 0.5019608} 912 | m_RaycastTarget: 1 913 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 914 | m_Maskable: 1 915 | m_OnCullStateChanged: 916 | m_PersistentCalls: 917 | m_Calls: [] 918 | m_Sprite: {fileID: 0} 919 | m_Type: 0 920 | m_PreserveAspect: 0 921 | m_FillCenter: 1 922 | m_FillMethod: 4 923 | m_FillAmount: 1 924 | m_FillClockwise: 1 925 | m_FillOrigin: 0 926 | m_UseSpriteMesh: 0 927 | m_PixelsPerUnitMultiplier: 1 928 | --- !u!222 &1709289845 929 | CanvasRenderer: 930 | m_ObjectHideFlags: 0 931 | m_CorrespondingSourceObject: {fileID: 0} 932 | m_PrefabInstance: {fileID: 0} 933 | m_PrefabAsset: {fileID: 0} 934 | m_GameObject: {fileID: 1709289842} 935 | m_CullTransparentMesh: 1 936 | --- !u!1 &1713585615 937 | GameObject: 938 | m_ObjectHideFlags: 0 939 | m_CorrespondingSourceObject: {fileID: 0} 940 | m_PrefabInstance: {fileID: 0} 941 | m_PrefabAsset: {fileID: 0} 942 | serializedVersion: 6 943 | m_Component: 944 | - component: {fileID: 1713585616} 945 | - component: {fileID: 1713585618} 946 | - component: {fileID: 1713585617} 947 | m_Layer: 5 948 | m_Name: Info Text 949 | m_TagString: Untagged 950 | m_Icon: {fileID: 0} 951 | m_NavMeshLayer: 0 952 | m_StaticEditorFlags: 0 953 | m_IsActive: 1 954 | --- !u!224 &1713585616 955 | RectTransform: 956 | m_ObjectHideFlags: 0 957 | m_CorrespondingSourceObject: {fileID: 0} 958 | m_PrefabInstance: {fileID: 0} 959 | m_PrefabAsset: {fileID: 0} 960 | m_GameObject: {fileID: 1713585615} 961 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 962 | m_LocalPosition: {x: 0, y: 0, z: 0} 963 | m_LocalScale: {x: 1, y: 1, z: 1} 964 | m_Children: [] 965 | m_Father: {fileID: 1709289843} 966 | m_RootOrder: 1 967 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 968 | m_AnchorMin: {x: 0, y: 1} 969 | m_AnchorMax: {x: 1, y: 1} 970 | m_AnchoredPosition: {x: 0, y: -132} 971 | m_SizeDelta: {x: -64, y: 336} 972 | m_Pivot: {x: 0.5, y: 1} 973 | --- !u!114 &1713585617 974 | MonoBehaviour: 975 | m_ObjectHideFlags: 0 976 | m_CorrespondingSourceObject: {fileID: 0} 977 | m_PrefabInstance: {fileID: 0} 978 | m_PrefabAsset: {fileID: 0} 979 | m_GameObject: {fileID: 1713585615} 980 | m_Enabled: 1 981 | m_EditorHideFlags: 0 982 | m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} 983 | m_Name: 984 | m_EditorClassIdentifier: 985 | m_Material: {fileID: 0} 986 | m_Color: {r: 1, g: 1, b: 1, a: 1} 987 | m_RaycastTarget: 1 988 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 989 | m_Maskable: 1 990 | m_OnCullStateChanged: 991 | m_PersistentCalls: 992 | m_Calls: [] 993 | m_FontData: 994 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 995 | m_FontSize: 32 996 | m_FontStyle: 0 997 | m_BestFit: 0 998 | m_MinSize: 0 999 | m_MaxSize: 100 1000 | m_Alignment: 0 1001 | m_AlignByGeometry: 0 1002 | m_RichText: 1 1003 | m_HorizontalOverflow: 0 1004 | m_VerticalOverflow: 1 1005 | m_LineSpacing: 1.1 1006 | m_Text: 'This is an example scene to showcase the functionality of Unity Browser 1007 | Bridge. 1008 | 1009 | When compiled into a WebGL project, the two buttons will invoke 1010 | the getDateAndTime resp. getDateAndTimeAsync 1011 | functions defined in WebGLTemplates/UBBExample/TemplateData/myscript.js. 1012 | 1013 | In 1014 | the Unity editor, the same functions are executed in a web browser via Unity 1015 | Browser Bridge.' 1016 | --- !u!222 &1713585618 1017 | CanvasRenderer: 1018 | m_ObjectHideFlags: 0 1019 | m_CorrespondingSourceObject: {fileID: 0} 1020 | m_PrefabInstance: {fileID: 0} 1021 | m_PrefabAsset: {fileID: 0} 1022 | m_GameObject: {fileID: 1713585615} 1023 | m_CullTransparentMesh: 1 1024 | --- !u!1 &1733693705 1025 | GameObject: 1026 | m_ObjectHideFlags: 0 1027 | m_CorrespondingSourceObject: {fileID: 0} 1028 | m_PrefabInstance: {fileID: 0} 1029 | m_PrefabAsset: {fileID: 0} 1030 | serializedVersion: 6 1031 | m_Component: 1032 | - component: {fileID: 1733693706} 1033 | - component: {fileID: 1733693709} 1034 | - component: {fileID: 1733693708} 1035 | - component: {fileID: 1733693707} 1036 | m_Layer: 5 1037 | m_Name: GetDateAndTime Button 1038 | m_TagString: Untagged 1039 | m_Icon: {fileID: 0} 1040 | m_NavMeshLayer: 0 1041 | m_StaticEditorFlags: 0 1042 | m_IsActive: 1 1043 | --- !u!224 &1733693706 1044 | RectTransform: 1045 | m_ObjectHideFlags: 0 1046 | m_CorrespondingSourceObject: {fileID: 0} 1047 | m_PrefabInstance: {fileID: 0} 1048 | m_PrefabAsset: {fileID: 0} 1049 | m_GameObject: {fileID: 1733693705} 1050 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 1051 | m_LocalPosition: {x: 0, y: 0, z: 0} 1052 | m_LocalScale: {x: 1, y: 1, z: 1} 1053 | m_Children: 1054 | - {fileID: 62009654} 1055 | m_Father: {fileID: 1709289843} 1056 | m_RootOrder: 4 1057 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1058 | m_AnchorMin: {x: 0, y: 0} 1059 | m_AnchorMax: {x: 1, y: 0} 1060 | m_AnchoredPosition: {x: 0, y: 128} 1061 | m_SizeDelta: {x: -64, y: 64} 1062 | m_Pivot: {x: 0.5, y: 0} 1063 | --- !u!114 &1733693707 1064 | MonoBehaviour: 1065 | m_ObjectHideFlags: 0 1066 | m_CorrespondingSourceObject: {fileID: 0} 1067 | m_PrefabInstance: {fileID: 0} 1068 | m_PrefabAsset: {fileID: 0} 1069 | m_GameObject: {fileID: 1733693705} 1070 | m_Enabled: 1 1071 | m_EditorHideFlags: 0 1072 | m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} 1073 | m_Name: 1074 | m_EditorClassIdentifier: 1075 | m_Navigation: 1076 | m_Mode: 0 1077 | m_WrapAround: 0 1078 | m_SelectOnUp: {fileID: 0} 1079 | m_SelectOnDown: {fileID: 0} 1080 | m_SelectOnLeft: {fileID: 0} 1081 | m_SelectOnRight: {fileID: 0} 1082 | m_Transition: 1 1083 | m_Colors: 1084 | m_NormalColor: {r: 1, g: 1, b: 1, a: 1} 1085 | m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 1086 | m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} 1087 | m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 1088 | m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} 1089 | m_ColorMultiplier: 1 1090 | m_FadeDuration: 0.1 1091 | m_SpriteState: 1092 | m_HighlightedSprite: {fileID: 0} 1093 | m_PressedSprite: {fileID: 0} 1094 | m_SelectedSprite: {fileID: 0} 1095 | m_DisabledSprite: {fileID: 0} 1096 | m_AnimationTriggers: 1097 | m_NormalTrigger: Normal 1098 | m_HighlightedTrigger: Highlighted 1099 | m_PressedTrigger: Pressed 1100 | m_SelectedTrigger: Selected 1101 | m_DisabledTrigger: Disabled 1102 | m_Interactable: 1 1103 | m_TargetGraphic: {fileID: 1733693708} 1104 | m_OnClick: 1105 | m_PersistentCalls: 1106 | m_Calls: [] 1107 | --- !u!114 &1733693708 1108 | MonoBehaviour: 1109 | m_ObjectHideFlags: 0 1110 | m_CorrespondingSourceObject: {fileID: 0} 1111 | m_PrefabInstance: {fileID: 0} 1112 | m_PrefabAsset: {fileID: 0} 1113 | m_GameObject: {fileID: 1733693705} 1114 | m_Enabled: 1 1115 | m_EditorHideFlags: 0 1116 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 1117 | m_Name: 1118 | m_EditorClassIdentifier: 1119 | m_Material: {fileID: 0} 1120 | m_Color: {r: 1, g: 1, b: 1, a: 1} 1121 | m_RaycastTarget: 1 1122 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 1123 | m_Maskable: 1 1124 | m_OnCullStateChanged: 1125 | m_PersistentCalls: 1126 | m_Calls: [] 1127 | m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} 1128 | m_Type: 1 1129 | m_PreserveAspect: 0 1130 | m_FillCenter: 1 1131 | m_FillMethod: 4 1132 | m_FillAmount: 1 1133 | m_FillClockwise: 1 1134 | m_FillOrigin: 0 1135 | m_UseSpriteMesh: 0 1136 | m_PixelsPerUnitMultiplier: 1 1137 | --- !u!222 &1733693709 1138 | CanvasRenderer: 1139 | m_ObjectHideFlags: 0 1140 | m_CorrespondingSourceObject: {fileID: 0} 1141 | m_PrefabInstance: {fileID: 0} 1142 | m_PrefabAsset: {fileID: 0} 1143 | m_GameObject: {fileID: 1733693705} 1144 | m_CullTransparentMesh: 1 1145 | --- !u!1 &1894354747 1146 | GameObject: 1147 | m_ObjectHideFlags: 0 1148 | m_CorrespondingSourceObject: {fileID: 0} 1149 | m_PrefabInstance: {fileID: 0} 1150 | m_PrefabAsset: {fileID: 0} 1151 | serializedVersion: 6 1152 | m_Component: 1153 | - component: {fileID: 1894354748} 1154 | - component: {fileID: 1894354750} 1155 | - component: {fileID: 1894354749} 1156 | m_Layer: 5 1157 | m_Name: DateAndTime Text 1158 | m_TagString: Untagged 1159 | m_Icon: {fileID: 0} 1160 | m_NavMeshLayer: 0 1161 | m_StaticEditorFlags: 0 1162 | m_IsActive: 1 1163 | --- !u!224 &1894354748 1164 | RectTransform: 1165 | m_ObjectHideFlags: 0 1166 | m_CorrespondingSourceObject: {fileID: 0} 1167 | m_PrefabInstance: {fileID: 0} 1168 | m_PrefabAsset: {fileID: 0} 1169 | m_GameObject: {fileID: 1894354747} 1170 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 1171 | m_LocalPosition: {x: 0, y: 0, z: 0} 1172 | m_LocalScale: {x: 1, y: 1, z: 1} 1173 | m_Children: [] 1174 | m_Father: {fileID: 1709289843} 1175 | m_RootOrder: 3 1176 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1177 | m_AnchorMin: {x: 0, y: 0} 1178 | m_AnchorMax: {x: 1, y: 0} 1179 | m_AnchoredPosition: {x: 128, y: 292} 1180 | m_SizeDelta: {x: -160, y: 64} 1181 | m_Pivot: {x: 0, y: 0.5} 1182 | --- !u!114 &1894354749 1183 | MonoBehaviour: 1184 | m_ObjectHideFlags: 0 1185 | m_CorrespondingSourceObject: {fileID: 0} 1186 | m_PrefabInstance: {fileID: 0} 1187 | m_PrefabAsset: {fileID: 0} 1188 | m_GameObject: {fileID: 1894354747} 1189 | m_Enabled: 1 1190 | m_EditorHideFlags: 0 1191 | m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} 1192 | m_Name: 1193 | m_EditorClassIdentifier: 1194 | m_Material: {fileID: 0} 1195 | m_Color: {r: 1, g: 1, b: 1, a: 1} 1196 | m_RaycastTarget: 1 1197 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 1198 | m_Maskable: 1 1199 | m_OnCullStateChanged: 1200 | m_PersistentCalls: 1201 | m_Calls: [] 1202 | m_FontData: 1203 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 1204 | m_FontSize: 32 1205 | m_FontStyle: 0 1206 | m_BestFit: 0 1207 | m_MinSize: 0 1208 | m_MaxSize: 100 1209 | m_Alignment: 3 1210 | m_AlignByGeometry: 0 1211 | m_RichText: 1 1212 | m_HorizontalOverflow: 0 1213 | m_VerticalOverflow: 0 1214 | m_LineSpacing: 1 1215 | m_Text: --- 1216 | --- !u!222 &1894354750 1217 | CanvasRenderer: 1218 | m_ObjectHideFlags: 0 1219 | m_CorrespondingSourceObject: {fileID: 0} 1220 | m_PrefabInstance: {fileID: 0} 1221 | m_PrefabAsset: {fileID: 0} 1222 | m_GameObject: {fileID: 1894354747} 1223 | m_CullTransparentMesh: 1 1224 | --- !u!1 &2116323747 1225 | GameObject: 1226 | m_ObjectHideFlags: 0 1227 | m_CorrespondingSourceObject: {fileID: 0} 1228 | m_PrefabInstance: {fileID: 0} 1229 | m_PrefabAsset: {fileID: 0} 1230 | serializedVersion: 6 1231 | m_Component: 1232 | - component: {fileID: 2116323749} 1233 | - component: {fileID: 2116323748} 1234 | m_Layer: 0 1235 | m_Name: Directional Light 1236 | m_TagString: Untagged 1237 | m_Icon: {fileID: 0} 1238 | m_NavMeshLayer: 0 1239 | m_StaticEditorFlags: 0 1240 | m_IsActive: 1 1241 | --- !u!108 &2116323748 1242 | Light: 1243 | m_ObjectHideFlags: 0 1244 | m_CorrespondingSourceObject: {fileID: 0} 1245 | m_PrefabInstance: {fileID: 0} 1246 | m_PrefabAsset: {fileID: 0} 1247 | m_GameObject: {fileID: 2116323747} 1248 | m_Enabled: 1 1249 | serializedVersion: 10 1250 | m_Type: 1 1251 | m_Shape: 0 1252 | m_Color: {r: 1, g: 1, b: 1, a: 1} 1253 | m_Intensity: 1 1254 | m_Range: 10 1255 | m_SpotAngle: 30 1256 | m_InnerSpotAngle: 21.80208 1257 | m_CookieSize: 10 1258 | m_Shadows: 1259 | m_Type: 0 1260 | m_Resolution: -1 1261 | m_CustomResolution: -1 1262 | m_Strength: 1 1263 | m_Bias: 0.05 1264 | m_NormalBias: 0.4 1265 | m_NearPlane: 0.2 1266 | m_CullingMatrixOverride: 1267 | e00: 1 1268 | e01: 0 1269 | e02: 0 1270 | e03: 0 1271 | e10: 0 1272 | e11: 1 1273 | e12: 0 1274 | e13: 0 1275 | e20: 0 1276 | e21: 0 1277 | e22: 1 1278 | e23: 0 1279 | e30: 0 1280 | e31: 0 1281 | e32: 0 1282 | e33: 1 1283 | m_UseCullingMatrixOverride: 0 1284 | m_Cookie: {fileID: 0} 1285 | m_DrawHalo: 0 1286 | m_Flare: {fileID: 0} 1287 | m_RenderMode: 0 1288 | m_CullingMask: 1289 | serializedVersion: 2 1290 | m_Bits: 4294967295 1291 | m_RenderingLayerMask: 1 1292 | m_Lightmapping: 4 1293 | m_LightShadowCasterMode: 0 1294 | m_AreaSize: {x: 1, y: 1} 1295 | m_BounceIntensity: 1 1296 | m_ColorTemperature: 6570 1297 | m_UseColorTemperature: 0 1298 | m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} 1299 | m_UseBoundingSphereOverride: 0 1300 | m_UseViewFrustumForShadowCasterCull: 1 1301 | m_ShadowRadius: 0 1302 | m_ShadowAngle: 0 1303 | --- !u!4 &2116323749 1304 | Transform: 1305 | m_ObjectHideFlags: 0 1306 | m_CorrespondingSourceObject: {fileID: 0} 1307 | m_PrefabInstance: {fileID: 0} 1308 | m_PrefabAsset: {fileID: 0} 1309 | m_GameObject: {fileID: 2116323747} 1310 | m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} 1311 | m_LocalPosition: {x: 0, y: 0, z: 0} 1312 | m_LocalScale: {x: 1, y: 1, z: 1} 1313 | m_Children: [] 1314 | m_Father: {fileID: 0} 1315 | m_RootOrder: 3 1316 | m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} 1317 | --- !u!1001 &1943767788496386506 1318 | PrefabInstance: 1319 | m_ObjectHideFlags: 0 1320 | serializedVersion: 2 1321 | m_Modification: 1322 | m_TransformParent: {fileID: 0} 1323 | m_Modifications: 1324 | - target: {fileID: 1943767788423411988, guid: b2ca0da73d4214f50b14277cc41e4d3c, type: 3} 1325 | propertyPath: browser 1326 | value: 4 1327 | objectReference: {fileID: 0} 1328 | - target: {fileID: 1943767788423411988, guid: b2ca0da73d4214f50b14277cc41e4d3c, type: 3} 1329 | propertyPath: webDriverPath 1330 | value: 1331 | objectReference: {fileID: 0} 1332 | - target: {fileID: 1943767788423411988, guid: b2ca0da73d4214f50b14277cc41e4d3c, type: 3} 1333 | propertyPath: includeProjectFiles.Array.size 1334 | value: 1 1335 | objectReference: {fileID: 0} 1336 | - target: {fileID: 1943767788423411988, guid: b2ca0da73d4214f50b14277cc41e4d3c, type: 3} 1337 | propertyPath: includeExternalFiles.Array.size 1338 | value: 1 1339 | objectReference: {fileID: 0} 1340 | - target: {fileID: 1943767788423411988, guid: b2ca0da73d4214f50b14277cc41e4d3c, type: 3} 1341 | propertyPath: includeJavaScriptFiles.Array.size 1342 | value: 1 1343 | objectReference: {fileID: 0} 1344 | - target: {fileID: 1943767788423411988, guid: b2ca0da73d4214f50b14277cc41e4d3c, type: 3} 1345 | propertyPath: includeProjectFiles.Array.data[0] 1346 | value: 1347 | objectReference: {fileID: 102900000, guid: c0ea40ab106764c34b6cb0a8780ad9e9, type: 3} 1348 | - target: {fileID: 1943767788423411988, guid: b2ca0da73d4214f50b14277cc41e4d3c, type: 3} 1349 | propertyPath: includeExternalFiles.Array.data[0] 1350 | value: WebGLTemplates/UBBExampleTemplate/TemplateData/myscript.js 1351 | objectReference: {fileID: 0} 1352 | - target: {fileID: 1943767788423411988, guid: b2ca0da73d4214f50b14277cc41e4d3c, type: 3} 1353 | propertyPath: includeJavaScriptFiles.Array.data[0] 1354 | value: WebGLTemplates/UBBExample/TemplateData/myscript.js 1355 | objectReference: {fileID: 0} 1356 | - target: {fileID: 1943767788423411989, guid: b2ca0da73d4214f50b14277cc41e4d3c, type: 3} 1357 | propertyPath: m_RootOrder 1358 | value: 0 1359 | objectReference: {fileID: 0} 1360 | - target: {fileID: 1943767788423411989, guid: b2ca0da73d4214f50b14277cc41e4d3c, type: 3} 1361 | propertyPath: m_LocalPosition.x 1362 | value: 0 1363 | objectReference: {fileID: 0} 1364 | - target: {fileID: 1943767788423411989, guid: b2ca0da73d4214f50b14277cc41e4d3c, type: 3} 1365 | propertyPath: m_LocalPosition.y 1366 | value: 0 1367 | objectReference: {fileID: 0} 1368 | - target: {fileID: 1943767788423411989, guid: b2ca0da73d4214f50b14277cc41e4d3c, type: 3} 1369 | propertyPath: m_LocalPosition.z 1370 | value: 0 1371 | objectReference: {fileID: 0} 1372 | - target: {fileID: 1943767788423411989, guid: b2ca0da73d4214f50b14277cc41e4d3c, type: 3} 1373 | propertyPath: m_LocalRotation.w 1374 | value: 1 1375 | objectReference: {fileID: 0} 1376 | - target: {fileID: 1943767788423411989, guid: b2ca0da73d4214f50b14277cc41e4d3c, type: 3} 1377 | propertyPath: m_LocalRotation.x 1378 | value: -0 1379 | objectReference: {fileID: 0} 1380 | - target: {fileID: 1943767788423411989, guid: b2ca0da73d4214f50b14277cc41e4d3c, type: 3} 1381 | propertyPath: m_LocalRotation.y 1382 | value: -0 1383 | objectReference: {fileID: 0} 1384 | - target: {fileID: 1943767788423411989, guid: b2ca0da73d4214f50b14277cc41e4d3c, type: 3} 1385 | propertyPath: m_LocalRotation.z 1386 | value: -0 1387 | objectReference: {fileID: 0} 1388 | - target: {fileID: 1943767788423411989, guid: b2ca0da73d4214f50b14277cc41e4d3c, type: 3} 1389 | propertyPath: m_LocalEulerAnglesHint.x 1390 | value: 0 1391 | objectReference: {fileID: 0} 1392 | - target: {fileID: 1943767788423411989, guid: b2ca0da73d4214f50b14277cc41e4d3c, type: 3} 1393 | propertyPath: m_LocalEulerAnglesHint.y 1394 | value: 0 1395 | objectReference: {fileID: 0} 1396 | - target: {fileID: 1943767788423411989, guid: b2ca0da73d4214f50b14277cc41e4d3c, type: 3} 1397 | propertyPath: m_LocalEulerAnglesHint.z 1398 | value: 0 1399 | objectReference: {fileID: 0} 1400 | - target: {fileID: 1943767788423411991, guid: b2ca0da73d4214f50b14277cc41e4d3c, type: 3} 1401 | propertyPath: m_Name 1402 | value: UnityBrowserBridge 1403 | objectReference: {fileID: 0} 1404 | m_RemovedComponents: [] 1405 | m_SourcePrefab: {fileID: 100100000, guid: b2ca0da73d4214f50b14277cc41e4d3c, type: 3} 1406 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridgeExample/Scenes/UnityBrowserBridgeExample.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9fc0d4010bbf28b4594072e72b869c4f 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridgeExample/Scripts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9acf7425a8cc347e1bf89bbe695cc4f5 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/UnityBrowserBridgeExample/Scripts/MainController.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using UnityEngine.UI; 3 | using UBB; 4 | #if UNITY_WEBGL && !UNITY_EDITOR 5 | using System.Runtime.InteropServices; 6 | #endif 7 | 8 | namespace UBBExample 9 | { 10 | public class MainController : MonoBehaviour 11 | { 12 | public Text dateAndTimeText; 13 | public Button getDateAndTimeButton; 14 | public Button getDateAndTimeAsyncButton; 15 | public string locale = "en-GB"; 16 | 17 | private void Start() 18 | { 19 | getDateAndTimeButton.onClick.AddListener(() => { dateAndTimeText.text = GetDateAndTime(locale); }); 20 | getDateAndTimeAsyncButton.onClick.AddListener(() => 21 | { 22 | GetDateAndTimeAsync(locale); 23 | getDateAndTimeAsyncButton.interactable = false; 24 | }); 25 | } 26 | 27 | // in webgl, these functions are executed directly in the browser 28 | // in the editor, they are executed via UnityBrowserBridge 29 | #if UNITY_WEBGL && !UNITY_EDITOR 30 | [DllImport("__Internal")] 31 | public static extern string GetDateAndTime(string locale); 32 | [DllImport("__Internal")] 33 | public static extern void GetDateAndTimeAsync(string locale); 34 | #else 35 | 36 | /// 37 | /// Get current date and time formatted according to given locale. 38 | /// 39 | /// Name of locale to format date (e.g. "en-GB"). 40 | /// Formatted date and time. 41 | public static string GetDateAndTime(string locale) 42 | { 43 | return UnityBrowserBridge.Instance.ExecuteJS("getDateAndTime('" + locale + "')"); 44 | } 45 | 46 | /// 47 | /// Asynchronously gets the current date and time formatted according to given locale. 48 | /// This will trigger the browser to invoke the SetDateAndTime method with the formatted date and time. 49 | /// 50 | /// Name of locale to format date (e.g. "en-GB"). 51 | public static void GetDateAndTimeAsync(string locale) 52 | { 53 | UnityBrowserBridge.Instance.ExecuteJS("getDateAndTimeAsync('" + locale + "')"); 54 | } 55 | 56 | #endif 57 | 58 | /// 59 | /// Displays the formatted date and time. 60 | /// 61 | /// Formatted date and time. 62 | public void SetDateAndTime(string dateAndTimeString) 63 | { 64 | dateAndTimeText.text = dateAndTimeString; 65 | getDateAndTimeAsyncButton.interactable = true; 66 | } 67 | } 68 | } -------------------------------------------------------------------------------- /Assets/UnityBrowserBridgeExample/Scripts/MainController.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6f98d8b4f95db46e3883cd7e484c41c7 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/WebGLTemplates.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 65da535585a2f44e19242fadac4e0fce 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/WebGLTemplates/UBBExample.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 54209acb56a904a99898904082e6173d 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/WebGLTemplates/UBBExample/TemplateData.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 389c39a1f6a29448d980ac119498b33a 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/WebGLTemplates/UBBExample/TemplateData/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sropelato/UnityBrowserBridge/9d2ed54e2ae073f2dc4f408470f416e34febda21/Assets/WebGLTemplates/UBBExample/TemplateData/favicon.ico -------------------------------------------------------------------------------- /Assets/WebGLTemplates/UBBExample/TemplateData/favicon.ico.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fc3646384cad444fda77ace450803ae0 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/WebGLTemplates/UBBExample/TemplateData/jQueryLicense.txt: -------------------------------------------------------------------------------- 1 | Copyright OpenJS Foundation and other contributors, https://openjsf.org/ 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /Assets/WebGLTemplates/UBBExample/TemplateData/jQueryLicense.txt.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bbdc63eef78c24faa82fa8d0c8807951 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/WebGLTemplates/UBBExample/TemplateData/jquery-3.6.0.min.js.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 488843dcb8fae4eb4a203af01381b8b7 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/WebGLTemplates/UBBExample/TemplateData/myscript.js: -------------------------------------------------------------------------------- 1 | // return string with formatted date and time 2 | getDateAndTime = function (locale) { 3 | return new Date().toLocaleString(locale) 4 | } 5 | 6 | // get formatted date and time and invoke the 'SetDateAndTime' method on the 'Main' game object (after a delay of 1000ms) 7 | getDateAndTimeAsync = function (locale) { 8 | setTimeout(function () { 9 | unityInstance.SendMessage('Main', 'SetDateAndTime', new Date().toLocaleString(locale)) 10 | }, 1000) 11 | } 12 | -------------------------------------------------------------------------------- /Assets/WebGLTemplates/UBBExample/TemplateData/myscript.js.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c1a60368c0f6e4b36ae19a5b0fad9d79 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/WebGLTemplates/UBBExample/TemplateData/progress-bar-empty-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sropelato/UnityBrowserBridge/9d2ed54e2ae073f2dc4f408470f416e34febda21/Assets/WebGLTemplates/UBBExample/TemplateData/progress-bar-empty-dark.png -------------------------------------------------------------------------------- /Assets/WebGLTemplates/UBBExample/TemplateData/progress-bar-empty-dark.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 50edeb91776764db0bcc45827af0e22a 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/WebGLTemplates/UBBExample/TemplateData/progress-bar-full-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sropelato/UnityBrowserBridge/9d2ed54e2ae073f2dc4f408470f416e34febda21/Assets/WebGLTemplates/UBBExample/TemplateData/progress-bar-full-dark.png -------------------------------------------------------------------------------- /Assets/WebGLTemplates/UBBExample/TemplateData/progress-bar-full-dark.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 762f504d66516498c8e38a3ac8d1247f 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/WebGLTemplates/UBBExample/TemplateData/style.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | font-family: 'Open Sans', sans-serif; 3 | font-size: 12pt; 4 | height: 100%; 5 | width: 100%; 6 | margin: 0; 7 | padding: 0; 8 | background: #ffffff 9 | } 10 | 11 | body { 12 | display: flex; 13 | flex-direction: column; 14 | } 15 | 16 | #content { 17 | flex: 1 1 auto; 18 | padding: 20px; 19 | } 20 | 21 | #canvas_container { 22 | position: relative; 23 | width: 100%; 24 | height: 100%; 25 | } 26 | 27 | #canvas { 28 | position: absolute; 29 | background-color: #221f20; 30 | border-radius: 5px; 31 | } 32 | 33 | #loading_bar { 34 | position: absolute; 35 | left: 50%; 36 | top: 50%; 37 | transform: translate(-50%, -50%); 38 | display: none 39 | } 40 | 41 | #loading_bar_logo { 42 | width: 154px; 43 | height: 130px; 44 | background: url('unity-logo-dark.png') no-repeat center; 45 | } 46 | 47 | #loading_bar_empty { 48 | width: 141px; 49 | height: 18px; 50 | margin-top: 10px; 51 | background: url('progress-bar-empty-dark.png') no-repeat center; 52 | } 53 | 54 | #loading_bar_full { 55 | width: 0%; 56 | height: 18px; 57 | margin-top: 10px; 58 | background: url('progress-bar-full-dark.png') no-repeat center 59 | } 60 | 61 | #banner { 62 | position: absolute; 63 | left: 50%; 64 | top: 10px; 65 | transform: translate(-50%); 66 | background: #ffffffee; 67 | border-radius: 5px; 68 | box-shadow: 0px 4px 8px 0px #00000033, 0 6px 20px 0 #00000030; 69 | display: none 70 | } 71 | 72 | .banner_content { 73 | margin: 10px 10px 10px 10px; 74 | padding: 10px; 75 | border: solid 1px; 76 | border-radius: 5px; 77 | background: #eeeeee; 78 | border-color: #dddddd; 79 | } 80 | 81 | .banner_content.warning { 82 | background: #ffee88; 83 | border-color: #ffdd44; 84 | } 85 | 86 | .banner_content.error { 87 | background: #ff6633; 88 | border-color: #ff3300; 89 | } -------------------------------------------------------------------------------- /Assets/WebGLTemplates/UBBExample/TemplateData/style.css.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1eb727c30a3f941889768b724b13fcc7 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/WebGLTemplates/UBBExample/TemplateData/unity-logo-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sropelato/UnityBrowserBridge/9d2ed54e2ae073f2dc4f408470f416e34febda21/Assets/WebGLTemplates/UBBExample/TemplateData/unity-logo-dark.png -------------------------------------------------------------------------------- /Assets/WebGLTemplates/UBBExample/TemplateData/unity-logo-dark.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 61baada2b2d6048ae8222e0fd5e06e67 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/WebGLTemplates/UBBExample/TemplateData/webgl-util.js: -------------------------------------------------------------------------------- 1 | var unityInstance = null 2 | 3 | $(window).on('load', function () { 4 | // disable ajax caching 5 | $.ajaxSetup({ cache: false }) 6 | 7 | // resize canvas 8 | resizeCanvas() 9 | $(window).on('resize', resizeCanvas) 10 | 11 | // show loading bar 12 | $('#loading_bar').css('display', 'block') 13 | 14 | // load game 15 | createUnityInstance($('#canvas').get(0), buildConfig, (progress) => { 16 | $('#loading_bar_full').css('width', 100 * progress + '%') 17 | }).then((unityInstance) => { 18 | this.unityInstance = unityInstance 19 | // hide loading bar 20 | $('#loading_bar').css('display', 'none') 21 | }).catch((message) => { 22 | showBanner(message, 'error') 23 | }) 24 | }) 25 | 26 | showBanner = function (msg, type) { 27 | let msgElement = $('') 28 | msgElement.appendTo('#banner') 29 | if (type == 'error') 30 | msgElement.addClass('error') 31 | else { 32 | if (type == 'warning') 33 | msgElement.addClass('warning') 34 | setTimeout(function () { 35 | msgElement.remove() 36 | updateBannerVisibility() 37 | }, 5000) 38 | } 39 | updateBannerVisibility() 40 | } 41 | 42 | resizeCanvas = function () { 43 | for (let i = 0; i < 2; i++) { 44 | $('#canvas').prop('width', $('#canvas_container').width()) 45 | $('#canvas').prop('height', $('#canvas_container').height()) 46 | } 47 | 48 | } 49 | 50 | updateBannerVisibility = function () { 51 | if ($('#banner').children().length > 0) 52 | $('#banner').css('display', 'block') 53 | else 54 | $('#banner').css('display', 'none') 55 | } 56 | 57 | -------------------------------------------------------------------------------- /Assets/WebGLTemplates/UBBExample/TemplateData/webgl-util.js.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 348945e14faae4d858da31b5ade4de0e 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/WebGLTemplates/UBBExample/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Unity Browser Bridge Example 8 | 9 | 10 | 11 | 12 | 13 | 14 | 29 | 30 | 31 | 32 |
33 |
34 | 35 |
36 | 37 |
38 |
39 |
40 |
41 | 42 |
43 |
44 | 45 | 46 | -------------------------------------------------------------------------------- /Assets/WebGLTemplates/UBBExample/index.html.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 568ff6bd7a4a54ef6834e84ddc4be20b 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/WebGLTemplates/UBBExample/thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sropelato/UnityBrowserBridge/9d2ed54e2ae073f2dc4f408470f416e34febda21/Assets/WebGLTemplates/UBBExample/thumbnail.png -------------------------------------------------------------------------------- /Assets/WebGLTemplates/UBBExample/thumbnail.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4b9d8be684a934e009c43874ff0f534d 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Documentation/Figures/OverviewBrowser.graffle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sropelato/UnityBrowserBridge/9d2ed54e2ae073f2dc4f408470f416e34febda21/Documentation/Figures/OverviewBrowser.graffle -------------------------------------------------------------------------------- /Documentation/Figures/OverviewBrowser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sropelato/UnityBrowserBridge/9d2ed54e2ae073f2dc4f408470f416e34febda21/Documentation/Figures/OverviewBrowser.png -------------------------------------------------------------------------------- /Documentation/Figures/OverviewCompared.graffle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sropelato/UnityBrowserBridge/9d2ed54e2ae073f2dc4f408470f416e34febda21/Documentation/Figures/OverviewCompared.graffle -------------------------------------------------------------------------------- /Documentation/Figures/OverviewCompared.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sropelato/UnityBrowserBridge/9d2ed54e2ae073f2dc4f408470f416e34febda21/Documentation/Figures/OverviewCompared.png -------------------------------------------------------------------------------- /Documentation/Figures/OverviewEditor.graffle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sropelato/UnityBrowserBridge/9d2ed54e2ae073f2dc4f408470f416e34febda21/Documentation/Figures/OverviewEditor.graffle -------------------------------------------------------------------------------- /Documentation/Figures/OverviewEditor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sropelato/UnityBrowserBridge/9d2ed54e2ae073f2dc4f408470f416e34febda21/Documentation/Figures/OverviewEditor.png -------------------------------------------------------------------------------- /Documentation/Figures/ScreenshotExamplePage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sropelato/UnityBrowserBridge/9d2ed54e2ae073f2dc4f408470f416e34febda21/Documentation/Figures/ScreenshotExamplePage.png -------------------------------------------------------------------------------- /Documentation/Figures/ScreenshotExampleScene.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sropelato/UnityBrowserBridge/9d2ed54e2ae073f2dc4f408470f416e34febda21/Documentation/Figures/ScreenshotExampleScene.png -------------------------------------------------------------------------------- /Documentation/Figures/ScreenshotExampleWebGL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sropelato/UnityBrowserBridge/9d2ed54e2ae073f2dc4f408470f416e34febda21/Documentation/Figures/ScreenshotExampleWebGL.png -------------------------------------------------------------------------------- /Documentation/Figures/ScreenshotHelloWorldPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sropelato/UnityBrowserBridge/9d2ed54e2ae073f2dc4f408470f416e34febda21/Documentation/Figures/ScreenshotHelloWorldPage.png -------------------------------------------------------------------------------- /Documentation/Figures/ScreenshotUBBConfig.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sropelato/UnityBrowserBridge/9d2ed54e2ae073f2dc4f408470f416e34febda21/Documentation/Figures/ScreenshotUBBConfig.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Sandro Ropelato 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /Packages/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "com.unity.collab-proxy": "1.5.7", 4 | "com.unity.ide.rider": "3.0.9", 5 | "com.unity.ide.visualstudio": "2.0.9", 6 | "com.unity.ide.vscode": "1.2.3", 7 | "com.unity.test-framework": "1.1.27", 8 | "com.unity.textmeshpro": "3.0.6", 9 | "com.unity.timeline": "1.5.5", 10 | "com.unity.ugui": "1.0.0", 11 | "com.unity.visualscripting": "1.6.1", 12 | "com.unity.modules.ai": "1.0.0", 13 | "com.unity.modules.androidjni": "1.0.0", 14 | "com.unity.modules.animation": "1.0.0", 15 | "com.unity.modules.assetbundle": "1.0.0", 16 | "com.unity.modules.audio": "1.0.0", 17 | "com.unity.modules.cloth": "1.0.0", 18 | "com.unity.modules.director": "1.0.0", 19 | "com.unity.modules.imageconversion": "1.0.0", 20 | "com.unity.modules.imgui": "1.0.0", 21 | "com.unity.modules.jsonserialize": "1.0.0", 22 | "com.unity.modules.particlesystem": "1.0.0", 23 | "com.unity.modules.physics": "1.0.0", 24 | "com.unity.modules.physics2d": "1.0.0", 25 | "com.unity.modules.screencapture": "1.0.0", 26 | "com.unity.modules.terrain": "1.0.0", 27 | "com.unity.modules.terrainphysics": "1.0.0", 28 | "com.unity.modules.tilemap": "1.0.0", 29 | "com.unity.modules.ui": "1.0.0", 30 | "com.unity.modules.uielements": "1.0.0", 31 | "com.unity.modules.umbra": "1.0.0", 32 | "com.unity.modules.unityanalytics": "1.0.0", 33 | "com.unity.modules.unitywebrequest": "1.0.0", 34 | "com.unity.modules.unitywebrequestassetbundle": "1.0.0", 35 | "com.unity.modules.unitywebrequestaudio": "1.0.0", 36 | "com.unity.modules.unitywebrequesttexture": "1.0.0", 37 | "com.unity.modules.unitywebrequestwww": "1.0.0", 38 | "com.unity.modules.vehicles": "1.0.0", 39 | "com.unity.modules.video": "1.0.0", 40 | "com.unity.modules.vr": "1.0.0", 41 | "com.unity.modules.wind": "1.0.0", 42 | "com.unity.modules.xr": "1.0.0" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /ProjectSettings/AudioManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!11 &1 4 | AudioManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Volume: 1 8 | Rolloff Scale: 1 9 | Doppler Factor: 1 10 | Default Speaker Mode: 2 11 | m_SampleRate: 0 12 | m_DSPBufferSize: 1024 13 | m_VirtualVoiceCount: 512 14 | m_RealVoiceCount: 32 15 | m_SpatializerPlugin: 16 | m_AmbisonicDecoderPlugin: 17 | m_DisableAudio: 0 18 | m_VirtualizeEffects: 1 19 | m_RequestedDSPBufferSize: 1024 20 | -------------------------------------------------------------------------------- /ProjectSettings/ClusterInputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!236 &1 4 | ClusterInputManager: 5 | m_ObjectHideFlags: 0 6 | m_Inputs: [] 7 | -------------------------------------------------------------------------------- /ProjectSettings/DynamicsManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!55 &1 4 | PhysicsManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 11 7 | m_Gravity: {x: 0, y: -9.81, z: 0} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_BounceThreshold: 2 10 | m_SleepThreshold: 0.005 11 | m_DefaultContactOffset: 0.01 12 | m_DefaultSolverIterations: 6 13 | m_DefaultSolverVelocityIterations: 1 14 | m_QueriesHitBackfaces: 0 15 | m_QueriesHitTriggers: 1 16 | m_EnableAdaptiveForce: 0 17 | m_ClothInterCollisionDistance: 0 18 | m_ClothInterCollisionStiffness: 0 19 | m_ContactsGeneration: 1 20 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 21 | m_AutoSimulation: 1 22 | m_AutoSyncTransforms: 0 23 | m_ReuseCollisionCallbacks: 1 24 | m_ClothInterCollisionSettingsToggle: 0 25 | m_ContactPairsMode: 0 26 | m_BroadphaseType: 0 27 | m_WorldBounds: 28 | m_Center: {x: 0, y: 0, z: 0} 29 | m_Extent: {x: 250, y: 250, z: 250} 30 | m_WorldSubdivisions: 8 31 | m_FrictionType: 0 32 | m_EnableEnhancedDeterminism: 0 33 | m_EnableUnifiedHeightmaps: 1 34 | m_DefaultMaxAngluarSpeed: 7 35 | -------------------------------------------------------------------------------- /ProjectSettings/EditorBuildSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1045 &1 4 | EditorBuildSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Scenes: 8 | - enabled: 0 9 | path: 10 | guid: 00000000000000000000000000000000 11 | - enabled: 1 12 | path: Assets/UnityBrowserBridgeExample/Scenes/UnityBrowserBridgeExample.unity 13 | guid: 9fc0d4010bbf28b4594072e72b869c4f 14 | m_configObjects: {} 15 | -------------------------------------------------------------------------------- /ProjectSettings/EditorSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!159 &1 4 | EditorSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 11 7 | m_ExternalVersionControlSupport: Visible Meta Files 8 | m_SerializationMode: 2 9 | m_LineEndingsForNewScripts: 0 10 | m_DefaultBehaviorMode: 0 11 | m_PrefabRegularEnvironment: {fileID: 0} 12 | m_PrefabUIEnvironment: {fileID: 0} 13 | m_SpritePackerMode: 0 14 | m_SpritePackerPaddingPower: 1 15 | m_EtcTextureCompressorBehavior: 1 16 | m_EtcTextureFastCompressor: 1 17 | m_EtcTextureNormalCompressor: 2 18 | m_EtcTextureBestCompressor: 4 19 | m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp;asmref 20 | m_ProjectGenerationRootNamespace: 21 | m_CollabEditorSettings: 22 | inProgressEnabled: 1 23 | m_EnableTextureStreamingInEditMode: 1 24 | m_EnableTextureStreamingInPlayMode: 1 25 | m_AsyncShaderCompilation: 1 26 | m_EnterPlayModeOptionsEnabled: 0 27 | m_EnterPlayModeOptions: 3 28 | m_ShowLightmapResolutionOverlay: 1 29 | m_UseLegacyProbeSampleCount: 0 30 | m_SerializeInlineMappingsOnOneLine: 1 -------------------------------------------------------------------------------- /ProjectSettings/GraphicsSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!30 &1 4 | GraphicsSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 13 7 | m_Deferred: 8 | m_Mode: 1 9 | m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} 10 | m_DeferredReflections: 11 | m_Mode: 1 12 | m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} 13 | m_ScreenSpaceShadows: 14 | m_Mode: 1 15 | m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} 16 | m_LegacyDeferred: 17 | m_Mode: 1 18 | m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} 19 | m_DepthNormals: 20 | m_Mode: 1 21 | m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} 22 | m_MotionVectors: 23 | m_Mode: 1 24 | m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} 25 | m_LightHalo: 26 | m_Mode: 1 27 | m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} 28 | m_LensFlare: 29 | m_Mode: 1 30 | m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} 31 | m_AlwaysIncludedShaders: 32 | - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} 33 | - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} 34 | - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} 35 | - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} 36 | - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} 37 | - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} 38 | m_PreloadedShaders: [] 39 | m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, 40 | type: 0} 41 | m_CustomRenderPipeline: {fileID: 0} 42 | m_TransparencySortMode: 0 43 | m_TransparencySortAxis: {x: 0, y: 0, z: 1} 44 | m_DefaultRenderingPath: 1 45 | m_DefaultMobileRenderingPath: 1 46 | m_TierSettings: [] 47 | m_LightmapStripping: 0 48 | m_FogStripping: 0 49 | m_InstancingStripping: 0 50 | m_LightmapKeepPlain: 1 51 | m_LightmapKeepDirCombined: 1 52 | m_LightmapKeepDynamicPlain: 1 53 | m_LightmapKeepDynamicDirCombined: 1 54 | m_LightmapKeepShadowMask: 1 55 | m_LightmapKeepSubtractive: 1 56 | m_FogKeepLinear: 1 57 | m_FogKeepExp: 1 58 | m_FogKeepExp2: 1 59 | m_AlbedoSwatchInfos: [] 60 | m_LightsUseLinearIntensity: 0 61 | m_LightsUseColorTemperature: 0 62 | m_LogWhenShaderIsCompiled: 0 63 | m_AllowEnlightenSupportForUpgradedProject: 0 64 | -------------------------------------------------------------------------------- /ProjectSettings/InputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!13 &1 4 | InputManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Axes: 8 | - serializedVersion: 3 9 | m_Name: Horizontal 10 | descriptiveName: 11 | descriptiveNegativeName: 12 | negativeButton: left 13 | positiveButton: right 14 | altNegativeButton: a 15 | altPositiveButton: d 16 | gravity: 3 17 | dead: 0.001 18 | sensitivity: 3 19 | snap: 1 20 | invert: 0 21 | type: 0 22 | axis: 0 23 | joyNum: 0 24 | - serializedVersion: 3 25 | m_Name: Vertical 26 | descriptiveName: 27 | descriptiveNegativeName: 28 | negativeButton: down 29 | positiveButton: up 30 | altNegativeButton: s 31 | altPositiveButton: w 32 | gravity: 3 33 | dead: 0.001 34 | sensitivity: 3 35 | snap: 1 36 | invert: 0 37 | type: 0 38 | axis: 0 39 | joyNum: 0 40 | - serializedVersion: 3 41 | m_Name: Fire1 42 | descriptiveName: 43 | descriptiveNegativeName: 44 | negativeButton: 45 | positiveButton: left ctrl 46 | altNegativeButton: 47 | altPositiveButton: mouse 0 48 | gravity: 1000 49 | dead: 0.001 50 | sensitivity: 1000 51 | snap: 0 52 | invert: 0 53 | type: 0 54 | axis: 0 55 | joyNum: 0 56 | - serializedVersion: 3 57 | m_Name: Fire2 58 | descriptiveName: 59 | descriptiveNegativeName: 60 | negativeButton: 61 | positiveButton: left alt 62 | altNegativeButton: 63 | altPositiveButton: mouse 1 64 | gravity: 1000 65 | dead: 0.001 66 | sensitivity: 1000 67 | snap: 0 68 | invert: 0 69 | type: 0 70 | axis: 0 71 | joyNum: 0 72 | - serializedVersion: 3 73 | m_Name: Fire3 74 | descriptiveName: 75 | descriptiveNegativeName: 76 | negativeButton: 77 | positiveButton: left shift 78 | altNegativeButton: 79 | altPositiveButton: mouse 2 80 | gravity: 1000 81 | dead: 0.001 82 | sensitivity: 1000 83 | snap: 0 84 | invert: 0 85 | type: 0 86 | axis: 0 87 | joyNum: 0 88 | - serializedVersion: 3 89 | m_Name: Jump 90 | descriptiveName: 91 | descriptiveNegativeName: 92 | negativeButton: 93 | positiveButton: space 94 | altNegativeButton: 95 | altPositiveButton: 96 | gravity: 1000 97 | dead: 0.001 98 | sensitivity: 1000 99 | snap: 0 100 | invert: 0 101 | type: 0 102 | axis: 0 103 | joyNum: 0 104 | - serializedVersion: 3 105 | m_Name: Mouse X 106 | descriptiveName: 107 | descriptiveNegativeName: 108 | negativeButton: 109 | positiveButton: 110 | altNegativeButton: 111 | altPositiveButton: 112 | gravity: 0 113 | dead: 0 114 | sensitivity: 0.1 115 | snap: 0 116 | invert: 0 117 | type: 1 118 | axis: 0 119 | joyNum: 0 120 | - serializedVersion: 3 121 | m_Name: Mouse Y 122 | descriptiveName: 123 | descriptiveNegativeName: 124 | negativeButton: 125 | positiveButton: 126 | altNegativeButton: 127 | altPositiveButton: 128 | gravity: 0 129 | dead: 0 130 | sensitivity: 0.1 131 | snap: 0 132 | invert: 0 133 | type: 1 134 | axis: 1 135 | joyNum: 0 136 | - serializedVersion: 3 137 | m_Name: Mouse ScrollWheel 138 | descriptiveName: 139 | descriptiveNegativeName: 140 | negativeButton: 141 | positiveButton: 142 | altNegativeButton: 143 | altPositiveButton: 144 | gravity: 0 145 | dead: 0 146 | sensitivity: 0.1 147 | snap: 0 148 | invert: 0 149 | type: 1 150 | axis: 2 151 | joyNum: 0 152 | - serializedVersion: 3 153 | m_Name: Horizontal 154 | descriptiveName: 155 | descriptiveNegativeName: 156 | negativeButton: 157 | positiveButton: 158 | altNegativeButton: 159 | altPositiveButton: 160 | gravity: 0 161 | dead: 0.19 162 | sensitivity: 1 163 | snap: 0 164 | invert: 0 165 | type: 2 166 | axis: 0 167 | joyNum: 0 168 | - serializedVersion: 3 169 | m_Name: Vertical 170 | descriptiveName: 171 | descriptiveNegativeName: 172 | negativeButton: 173 | positiveButton: 174 | altNegativeButton: 175 | altPositiveButton: 176 | gravity: 0 177 | dead: 0.19 178 | sensitivity: 1 179 | snap: 0 180 | invert: 1 181 | type: 2 182 | axis: 1 183 | joyNum: 0 184 | - serializedVersion: 3 185 | m_Name: Fire1 186 | descriptiveName: 187 | descriptiveNegativeName: 188 | negativeButton: 189 | positiveButton: joystick button 0 190 | altNegativeButton: 191 | altPositiveButton: 192 | gravity: 1000 193 | dead: 0.001 194 | sensitivity: 1000 195 | snap: 0 196 | invert: 0 197 | type: 0 198 | axis: 0 199 | joyNum: 0 200 | - serializedVersion: 3 201 | m_Name: Fire2 202 | descriptiveName: 203 | descriptiveNegativeName: 204 | negativeButton: 205 | positiveButton: joystick button 1 206 | altNegativeButton: 207 | altPositiveButton: 208 | gravity: 1000 209 | dead: 0.001 210 | sensitivity: 1000 211 | snap: 0 212 | invert: 0 213 | type: 0 214 | axis: 0 215 | joyNum: 0 216 | - serializedVersion: 3 217 | m_Name: Fire3 218 | descriptiveName: 219 | descriptiveNegativeName: 220 | negativeButton: 221 | positiveButton: joystick button 2 222 | altNegativeButton: 223 | altPositiveButton: 224 | gravity: 1000 225 | dead: 0.001 226 | sensitivity: 1000 227 | snap: 0 228 | invert: 0 229 | type: 0 230 | axis: 0 231 | joyNum: 0 232 | - serializedVersion: 3 233 | m_Name: Jump 234 | descriptiveName: 235 | descriptiveNegativeName: 236 | negativeButton: 237 | positiveButton: joystick button 3 238 | altNegativeButton: 239 | altPositiveButton: 240 | gravity: 1000 241 | dead: 0.001 242 | sensitivity: 1000 243 | snap: 0 244 | invert: 0 245 | type: 0 246 | axis: 0 247 | joyNum: 0 248 | - serializedVersion: 3 249 | m_Name: Submit 250 | descriptiveName: 251 | descriptiveNegativeName: 252 | negativeButton: 253 | positiveButton: return 254 | altNegativeButton: 255 | altPositiveButton: joystick button 0 256 | gravity: 1000 257 | dead: 0.001 258 | sensitivity: 1000 259 | snap: 0 260 | invert: 0 261 | type: 0 262 | axis: 0 263 | joyNum: 0 264 | - serializedVersion: 3 265 | m_Name: Submit 266 | descriptiveName: 267 | descriptiveNegativeName: 268 | negativeButton: 269 | positiveButton: enter 270 | altNegativeButton: 271 | altPositiveButton: space 272 | gravity: 1000 273 | dead: 0.001 274 | sensitivity: 1000 275 | snap: 0 276 | invert: 0 277 | type: 0 278 | axis: 0 279 | joyNum: 0 280 | - serializedVersion: 3 281 | m_Name: Cancel 282 | descriptiveName: 283 | descriptiveNegativeName: 284 | negativeButton: 285 | positiveButton: escape 286 | altNegativeButton: 287 | altPositiveButton: joystick button 1 288 | gravity: 1000 289 | dead: 0.001 290 | sensitivity: 1000 291 | snap: 0 292 | invert: 0 293 | type: 0 294 | axis: 0 295 | joyNum: 0 296 | -------------------------------------------------------------------------------- /ProjectSettings/NavMeshAreas.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!126 &1 4 | NavMeshProjectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | areas: 8 | - name: Walkable 9 | cost: 1 10 | - name: Not Walkable 11 | cost: 1 12 | - name: Jump 13 | cost: 2 14 | - name: 15 | cost: 1 16 | - name: 17 | cost: 1 18 | - name: 19 | cost: 1 20 | - name: 21 | cost: 1 22 | - name: 23 | cost: 1 24 | - name: 25 | cost: 1 26 | - name: 27 | cost: 1 28 | - name: 29 | cost: 1 30 | - name: 31 | cost: 1 32 | - name: 33 | cost: 1 34 | - name: 35 | cost: 1 36 | - name: 37 | cost: 1 38 | - name: 39 | cost: 1 40 | - name: 41 | cost: 1 42 | - name: 43 | cost: 1 44 | - name: 45 | cost: 1 46 | - name: 47 | cost: 1 48 | - name: 49 | cost: 1 50 | - name: 51 | cost: 1 52 | - name: 53 | cost: 1 54 | - name: 55 | cost: 1 56 | - name: 57 | cost: 1 58 | - name: 59 | cost: 1 60 | - name: 61 | cost: 1 62 | - name: 63 | cost: 1 64 | - name: 65 | cost: 1 66 | - name: 67 | cost: 1 68 | - name: 69 | cost: 1 70 | - name: 71 | cost: 1 72 | m_LastAgentTypeID: -887442657 73 | m_Settings: 74 | - serializedVersion: 2 75 | agentTypeID: 0 76 | agentRadius: 0.5 77 | agentHeight: 2 78 | agentSlope: 45 79 | agentClimb: 0.75 80 | ledgeDropHeight: 0 81 | maxJumpAcrossDistance: 0 82 | minRegionArea: 2 83 | manualCellSize: 0 84 | cellSize: 0.16666667 85 | manualTileSize: 0 86 | tileSize: 256 87 | accuratePlacement: 0 88 | debug: 89 | m_Flags: 0 90 | m_SettingNames: 91 | - Humanoid 92 | -------------------------------------------------------------------------------- /ProjectSettings/PackageManagerSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &1 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 61 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} 13 | m_Name: 14 | m_EditorClassIdentifier: 15 | m_EnablePreReleasePackages: 0 16 | m_EnablePackageDependencies: 0 17 | m_AdvancedSettingsExpanded: 1 18 | m_ScopedRegistriesSettingsExpanded: 1 19 | m_SeeAllPackageVersions: 0 20 | oneTimeWarningShown: 0 21 | m_Registries: 22 | - m_Id: main 23 | m_Name: 24 | m_Url: https://packages.unity.com 25 | m_Scopes: [] 26 | m_IsDefault: 1 27 | m_Capabilities: 7 28 | m_UserSelectedRegistryName: 29 | m_UserAddingNewScopedRegistry: 0 30 | m_RegistryInfoDraft: 31 | m_ErrorMessage: 32 | m_Original: 33 | m_Id: 34 | m_Name: 35 | m_Url: 36 | m_Scopes: [] 37 | m_IsDefault: 0 38 | m_Capabilities: 0 39 | m_Modified: 0 40 | m_Name: 41 | m_Url: 42 | m_Scopes: 43 | - 44 | m_SelectedScopeIndex: 0 45 | m_LoadAssets: 0 46 | -------------------------------------------------------------------------------- /ProjectSettings/Physics2DSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!19 &1 4 | Physics2DSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 4 7 | m_Gravity: {x: 0, y: -9.81} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_VelocityIterations: 8 10 | m_PositionIterations: 3 11 | m_VelocityThreshold: 1 12 | m_MaxLinearCorrection: 0.2 13 | m_MaxAngularCorrection: 8 14 | m_MaxTranslationSpeed: 100 15 | m_MaxRotationSpeed: 360 16 | m_BaumgarteScale: 0.2 17 | m_BaumgarteTimeOfImpactScale: 0.75 18 | m_TimeToSleep: 0.5 19 | m_LinearSleepTolerance: 0.01 20 | m_AngularSleepTolerance: 2 21 | m_DefaultContactOffset: 0.01 22 | m_JobOptions: 23 | serializedVersion: 2 24 | useMultithreading: 0 25 | useConsistencySorting: 0 26 | m_InterpolationPosesPerJob: 100 27 | m_NewContactsPerJob: 30 28 | m_CollideContactsPerJob: 100 29 | m_ClearFlagsPerJob: 200 30 | m_ClearBodyForcesPerJob: 200 31 | m_SyncDiscreteFixturesPerJob: 50 32 | m_SyncContinuousFixturesPerJob: 50 33 | m_FindNearestContactsPerJob: 100 34 | m_UpdateTriggerContactsPerJob: 100 35 | m_IslandSolverCostThreshold: 100 36 | m_IslandSolverBodyCostScale: 1 37 | m_IslandSolverContactCostScale: 10 38 | m_IslandSolverJointCostScale: 10 39 | m_IslandSolverBodiesPerJob: 50 40 | m_IslandSolverContactsPerJob: 50 41 | m_AutoSimulation: 1 42 | m_QueriesHitTriggers: 1 43 | m_QueriesStartInColliders: 1 44 | m_CallbacksOnDisable: 1 45 | m_ReuseCollisionCallbacks: 1 46 | m_AutoSyncTransforms: 0 47 | m_AlwaysShowColliders: 0 48 | m_ShowColliderSleep: 1 49 | m_ShowColliderContacts: 0 50 | m_ShowColliderAABB: 0 51 | m_ContactArrowScale: 0.2 52 | m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} 53 | m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} 54 | m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} 55 | m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} 56 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 57 | -------------------------------------------------------------------------------- /ProjectSettings/PresetManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1386491679 &1 4 | PresetManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_DefaultPresets: {} 8 | -------------------------------------------------------------------------------- /ProjectSettings/ProjectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!129 &1 4 | PlayerSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 22 7 | productGUID: 33bdd3e85941444249ffbf15b1361992 8 | AndroidProfiler: 0 9 | AndroidFilterTouchesWhenObscured: 0 10 | AndroidEnableSustainedPerformanceMode: 0 11 | defaultScreenOrientation: 4 12 | targetDevice: 2 13 | useOnDemandResources: 0 14 | accelerometerFrequency: 60 15 | companyName: net.ropelato 16 | productName: Unity Browser Bridge 17 | defaultCursor: {fileID: 0} 18 | cursorHotspot: {x: 0, y: 0} 19 | m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} 20 | m_ShowUnitySplashScreen: 1 21 | m_ShowUnitySplashLogo: 1 22 | m_SplashScreenOverlayOpacity: 1 23 | m_SplashScreenAnimation: 1 24 | m_SplashScreenLogoStyle: 1 25 | m_SplashScreenDrawMode: 0 26 | m_SplashScreenBackgroundAnimationZoom: 1 27 | m_SplashScreenLogoAnimationZoom: 1 28 | m_SplashScreenBackgroundLandscapeAspect: 1 29 | m_SplashScreenBackgroundPortraitAspect: 1 30 | m_SplashScreenBackgroundLandscapeUvs: 31 | serializedVersion: 2 32 | x: 0 33 | y: 0 34 | width: 1 35 | height: 1 36 | m_SplashScreenBackgroundPortraitUvs: 37 | serializedVersion: 2 38 | x: 0 39 | y: 0 40 | width: 1 41 | height: 1 42 | m_SplashScreenLogos: [] 43 | m_VirtualRealitySplashScreen: {fileID: 0} 44 | m_HolographicTrackingLossScreen: {fileID: 0} 45 | defaultScreenWidth: 1024 46 | defaultScreenHeight: 768 47 | defaultScreenWidthWeb: 960 48 | defaultScreenHeightWeb: 600 49 | m_StereoRenderingPath: 0 50 | m_ActiveColorSpace: 0 51 | m_MTRendering: 1 52 | mipStripping: 0 53 | numberOfMipsStripped: 0 54 | m_StackTraceTypes: 010000000100000001000000010000000100000001000000 55 | iosShowActivityIndicatorOnLoading: -1 56 | androidShowActivityIndicatorOnLoading: -1 57 | iosUseCustomAppBackgroundBehavior: 0 58 | iosAllowHTTPDownload: 1 59 | allowedAutorotateToPortrait: 1 60 | allowedAutorotateToPortraitUpsideDown: 1 61 | allowedAutorotateToLandscapeRight: 1 62 | allowedAutorotateToLandscapeLeft: 1 63 | useOSAutorotation: 1 64 | use32BitDisplayBuffer: 1 65 | preserveFramebufferAlpha: 0 66 | disableDepthAndStencilBuffers: 0 67 | androidStartInFullscreen: 1 68 | androidRenderOutsideSafeArea: 1 69 | androidUseSwappy: 1 70 | androidBlitType: 0 71 | defaultIsNativeResolution: 1 72 | macRetinaSupport: 1 73 | runInBackground: 1 74 | captureSingleScreen: 0 75 | muteOtherAudioSources: 0 76 | Prepare IOS For Recording: 0 77 | Force IOS Speakers When Recording: 0 78 | deferSystemGesturesMode: 0 79 | hideHomeButton: 0 80 | submitAnalytics: 1 81 | usePlayerLog: 1 82 | bakeCollisionMeshes: 0 83 | forceSingleInstance: 0 84 | useFlipModelSwapchain: 1 85 | resizableWindow: 0 86 | useMacAppStoreValidation: 0 87 | macAppStoreCategory: public.app-category.games 88 | gpuSkinning: 1 89 | xboxPIXTextureCapture: 0 90 | xboxEnableAvatar: 0 91 | xboxEnableKinect: 0 92 | xboxEnableKinectAutoTracking: 0 93 | xboxEnableFitness: 0 94 | visibleInBackground: 1 95 | allowFullscreenSwitch: 1 96 | fullscreenMode: 1 97 | xboxSpeechDB: 0 98 | xboxEnableHeadOrientation: 0 99 | xboxEnableGuest: 0 100 | xboxEnablePIXSampling: 0 101 | metalFramebufferOnly: 0 102 | xboxOneResolution: 0 103 | xboxOneSResolution: 0 104 | xboxOneXResolution: 3 105 | xboxOneMonoLoggingLevel: 0 106 | xboxOneLoggingLevel: 1 107 | xboxOneDisableEsram: 0 108 | xboxOneEnableTypeOptimization: 0 109 | xboxOnePresentImmediateThreshold: 0 110 | switchQueueCommandMemory: 0 111 | switchQueueControlMemory: 16384 112 | switchQueueComputeMemory: 262144 113 | switchNVNShaderPoolsGranularity: 33554432 114 | switchNVNDefaultPoolsGranularity: 16777216 115 | switchNVNOtherPoolsGranularity: 16777216 116 | switchNVNMaxPublicTextureIDCount: 0 117 | switchNVNMaxPublicSamplerIDCount: 0 118 | stadiaPresentMode: 0 119 | stadiaTargetFramerate: 0 120 | vulkanNumSwapchainBuffers: 3 121 | vulkanEnableSetSRGBWrite: 0 122 | vulkanEnablePreTransform: 0 123 | vulkanEnableLateAcquireNextImage: 0 124 | vulkanEnableCommandBufferRecycling: 1 125 | m_SupportedAspectRatios: 126 | 4:3: 1 127 | 5:4: 1 128 | 16:10: 1 129 | 16:9: 1 130 | Others: 1 131 | bundleVersion: 1.0.0 132 | preloadedAssets: [] 133 | metroInputSource: 0 134 | wsaTransparentSwapchain: 0 135 | m_HolographicPauseOnTrackingLoss: 1 136 | xboxOneDisableKinectGpuReservation: 1 137 | xboxOneEnable7thCore: 1 138 | vrSettings: 139 | enable360StereoCapture: 0 140 | isWsaHolographicRemotingEnabled: 0 141 | enableFrameTimingStats: 0 142 | useHDRDisplay: 0 143 | D3DHDRBitDepth: 0 144 | m_ColorGamuts: 00000000 145 | targetPixelDensity: 30 146 | resolutionScalingMode: 0 147 | androidSupportedAspectRatio: 1 148 | androidMaxAspectRatio: 2.1 149 | applicationIdentifier: {} 150 | buildNumber: 151 | Standalone: 0 152 | iPhone: 0 153 | tvOS: 0 154 | overrideDefaultApplicationIdentifier: 0 155 | AndroidBundleVersionCode: 1 156 | AndroidMinSdkVersion: 19 157 | AndroidTargetSdkVersion: 0 158 | AndroidPreferredInstallLocation: 1 159 | aotOptions: 160 | stripEngineCode: 1 161 | iPhoneStrippingLevel: 0 162 | iPhoneScriptCallOptimization: 0 163 | ForceInternetPermission: 0 164 | ForceSDCardPermission: 0 165 | CreateWallpaper: 0 166 | APKExpansionFiles: 0 167 | keepLoadedShadersAlive: 0 168 | StripUnusedMeshComponents: 1 169 | VertexChannelCompressionMask: 4054 170 | iPhoneSdkVersion: 988 171 | iOSTargetOSVersionString: 11.0 172 | tvOSSdkVersion: 0 173 | tvOSRequireExtendedGameController: 0 174 | tvOSTargetOSVersionString: 11.0 175 | uIPrerenderedIcon: 0 176 | uIRequiresPersistentWiFi: 0 177 | uIRequiresFullScreen: 1 178 | uIStatusBarHidden: 1 179 | uIExitOnSuspend: 0 180 | uIStatusBarStyle: 0 181 | appleTVSplashScreen: {fileID: 0} 182 | appleTVSplashScreen2x: {fileID: 0} 183 | tvOSSmallIconLayers: [] 184 | tvOSSmallIconLayers2x: [] 185 | tvOSLargeIconLayers: [] 186 | tvOSLargeIconLayers2x: [] 187 | tvOSTopShelfImageLayers: [] 188 | tvOSTopShelfImageLayers2x: [] 189 | tvOSTopShelfImageWideLayers: [] 190 | tvOSTopShelfImageWideLayers2x: [] 191 | iOSLaunchScreenType: 0 192 | iOSLaunchScreenPortrait: {fileID: 0} 193 | iOSLaunchScreenLandscape: {fileID: 0} 194 | iOSLaunchScreenBackgroundColor: 195 | serializedVersion: 2 196 | rgba: 0 197 | iOSLaunchScreenFillPct: 100 198 | iOSLaunchScreenSize: 100 199 | iOSLaunchScreenCustomXibPath: 200 | iOSLaunchScreeniPadType: 0 201 | iOSLaunchScreeniPadImage: {fileID: 0} 202 | iOSLaunchScreeniPadBackgroundColor: 203 | serializedVersion: 2 204 | rgba: 0 205 | iOSLaunchScreeniPadFillPct: 100 206 | iOSLaunchScreeniPadSize: 100 207 | iOSLaunchScreeniPadCustomXibPath: 208 | iOSLaunchScreenCustomStoryboardPath: 209 | iOSLaunchScreeniPadCustomStoryboardPath: 210 | iOSDeviceRequirements: [] 211 | iOSURLSchemes: [] 212 | iOSBackgroundModes: 0 213 | iOSMetalForceHardShadows: 0 214 | metalEditorSupport: 1 215 | metalAPIValidation: 1 216 | iOSRenderExtraFrameOnPause: 0 217 | iosCopyPluginsCodeInsteadOfSymlink: 0 218 | appleDeveloperTeamID: 219 | iOSManualSigningProvisioningProfileID: 220 | tvOSManualSigningProvisioningProfileID: 221 | iOSManualSigningProvisioningProfileType: 0 222 | tvOSManualSigningProvisioningProfileType: 0 223 | appleEnableAutomaticSigning: 0 224 | iOSRequireARKit: 0 225 | iOSAutomaticallyDetectAndAddCapabilities: 1 226 | appleEnableProMotion: 0 227 | shaderPrecisionModel: 0 228 | clonedFromGUID: c0afd0d1d80e3634a9dac47e8a0426ea 229 | templatePackageId: com.unity.template.3d@5.0.4 230 | templateDefaultScene: Assets/Scenes/SampleScene.unity 231 | useCustomMainManifest: 0 232 | useCustomLauncherManifest: 0 233 | useCustomMainGradleTemplate: 0 234 | useCustomLauncherGradleManifest: 0 235 | useCustomBaseGradleTemplate: 0 236 | useCustomGradlePropertiesTemplate: 0 237 | useCustomProguardFile: 0 238 | AndroidTargetArchitectures: 1 239 | AndroidSplashScreenScale: 0 240 | androidSplashScreen: {fileID: 0} 241 | AndroidKeystoreName: 242 | AndroidKeyaliasName: 243 | AndroidBuildApkPerCpuArchitecture: 0 244 | AndroidTVCompatibility: 0 245 | AndroidIsGame: 1 246 | AndroidEnableTango: 0 247 | androidEnableBanner: 1 248 | androidUseLowAccuracyLocation: 0 249 | androidUseCustomKeystore: 0 250 | m_AndroidBanners: 251 | - width: 320 252 | height: 180 253 | banner: {fileID: 0} 254 | androidGamepadSupportLevel: 0 255 | AndroidMinifyWithR8: 0 256 | AndroidMinifyRelease: 0 257 | AndroidMinifyDebug: 0 258 | AndroidValidateAppBundleSize: 1 259 | AndroidAppBundleSizeToValidate: 150 260 | m_BuildTargetIcons: [] 261 | m_BuildTargetPlatformIcons: [] 262 | m_BuildTargetBatching: 263 | - m_BuildTarget: Standalone 264 | m_StaticBatching: 1 265 | m_DynamicBatching: 0 266 | - m_BuildTarget: tvOS 267 | m_StaticBatching: 1 268 | m_DynamicBatching: 0 269 | - m_BuildTarget: Android 270 | m_StaticBatching: 1 271 | m_DynamicBatching: 0 272 | - m_BuildTarget: iPhone 273 | m_StaticBatching: 1 274 | m_DynamicBatching: 0 275 | - m_BuildTarget: WebGL 276 | m_StaticBatching: 0 277 | m_DynamicBatching: 0 278 | m_BuildTargetGraphicsJobs: 279 | - m_BuildTarget: MacStandaloneSupport 280 | m_GraphicsJobs: 0 281 | - m_BuildTarget: Switch 282 | m_GraphicsJobs: 1 283 | - m_BuildTarget: MetroSupport 284 | m_GraphicsJobs: 1 285 | - m_BuildTarget: AppleTVSupport 286 | m_GraphicsJobs: 0 287 | - m_BuildTarget: BJMSupport 288 | m_GraphicsJobs: 1 289 | - m_BuildTarget: LinuxStandaloneSupport 290 | m_GraphicsJobs: 1 291 | - m_BuildTarget: PS4Player 292 | m_GraphicsJobs: 1 293 | - m_BuildTarget: iOSSupport 294 | m_GraphicsJobs: 0 295 | - m_BuildTarget: WindowsStandaloneSupport 296 | m_GraphicsJobs: 1 297 | - m_BuildTarget: XboxOnePlayer 298 | m_GraphicsJobs: 1 299 | - m_BuildTarget: LuminSupport 300 | m_GraphicsJobs: 0 301 | - m_BuildTarget: AndroidPlayer 302 | m_GraphicsJobs: 0 303 | - m_BuildTarget: WebGLSupport 304 | m_GraphicsJobs: 0 305 | m_BuildTargetGraphicsJobMode: 306 | - m_BuildTarget: PS4Player 307 | m_GraphicsJobMode: 0 308 | - m_BuildTarget: XboxOnePlayer 309 | m_GraphicsJobMode: 0 310 | m_BuildTargetGraphicsAPIs: 311 | - m_BuildTarget: AndroidPlayer 312 | m_APIs: 150000000b000000 313 | m_Automatic: 0 314 | - m_BuildTarget: iOSSupport 315 | m_APIs: 10000000 316 | m_Automatic: 1 317 | - m_BuildTarget: AppleTVSupport 318 | m_APIs: 10000000 319 | m_Automatic: 1 320 | - m_BuildTarget: WebGLSupport 321 | m_APIs: 0b000000 322 | m_Automatic: 1 323 | m_BuildTargetVRSettings: 324 | - m_BuildTarget: Standalone 325 | m_Enabled: 0 326 | m_Devices: 327 | - Oculus 328 | - OpenVR 329 | openGLRequireES31: 0 330 | openGLRequireES31AEP: 0 331 | openGLRequireES32: 0 332 | m_TemplateCustomTags: {} 333 | mobileMTRendering: 334 | Android: 1 335 | iPhone: 1 336 | tvOS: 1 337 | m_BuildTargetGroupLightmapEncodingQuality: 338 | - m_BuildTarget: WebGL 339 | m_EncodingQuality: 1 340 | m_BuildTargetGroupLightmapSettings: [] 341 | m_BuildTargetNormalMapEncoding: [] 342 | playModeTestRunnerEnabled: 0 343 | runPlayModeTestAsEditModeTest: 0 344 | actionOnDotNetUnhandledException: 1 345 | enableInternalProfiler: 0 346 | logObjCUncaughtExceptions: 1 347 | enableCrashReportAPI: 0 348 | cameraUsageDescription: 349 | locationUsageDescription: 350 | microphoneUsageDescription: 351 | switchNMETAOverride: 352 | switchNetLibKey: 353 | switchSocketMemoryPoolSize: 6144 354 | switchSocketAllocatorPoolSize: 128 355 | switchSocketConcurrencyLimit: 14 356 | switchScreenResolutionBehavior: 2 357 | switchUseCPUProfiler: 0 358 | switchUseGOLDLinker: 0 359 | switchLTOSetting: 0 360 | switchApplicationID: 0x01004b9000490000 361 | switchNSODependencies: 362 | switchTitleNames_0: 363 | switchTitleNames_1: 364 | switchTitleNames_2: 365 | switchTitleNames_3: 366 | switchTitleNames_4: 367 | switchTitleNames_5: 368 | switchTitleNames_6: 369 | switchTitleNames_7: 370 | switchTitleNames_8: 371 | switchTitleNames_9: 372 | switchTitleNames_10: 373 | switchTitleNames_11: 374 | switchTitleNames_12: 375 | switchTitleNames_13: 376 | switchTitleNames_14: 377 | switchTitleNames_15: 378 | switchPublisherNames_0: 379 | switchPublisherNames_1: 380 | switchPublisherNames_2: 381 | switchPublisherNames_3: 382 | switchPublisherNames_4: 383 | switchPublisherNames_5: 384 | switchPublisherNames_6: 385 | switchPublisherNames_7: 386 | switchPublisherNames_8: 387 | switchPublisherNames_9: 388 | switchPublisherNames_10: 389 | switchPublisherNames_11: 390 | switchPublisherNames_12: 391 | switchPublisherNames_13: 392 | switchPublisherNames_14: 393 | switchPublisherNames_15: 394 | switchIcons_0: {fileID: 0} 395 | switchIcons_1: {fileID: 0} 396 | switchIcons_2: {fileID: 0} 397 | switchIcons_3: {fileID: 0} 398 | switchIcons_4: {fileID: 0} 399 | switchIcons_5: {fileID: 0} 400 | switchIcons_6: {fileID: 0} 401 | switchIcons_7: {fileID: 0} 402 | switchIcons_8: {fileID: 0} 403 | switchIcons_9: {fileID: 0} 404 | switchIcons_10: {fileID: 0} 405 | switchIcons_11: {fileID: 0} 406 | switchIcons_12: {fileID: 0} 407 | switchIcons_13: {fileID: 0} 408 | switchIcons_14: {fileID: 0} 409 | switchIcons_15: {fileID: 0} 410 | switchSmallIcons_0: {fileID: 0} 411 | switchSmallIcons_1: {fileID: 0} 412 | switchSmallIcons_2: {fileID: 0} 413 | switchSmallIcons_3: {fileID: 0} 414 | switchSmallIcons_4: {fileID: 0} 415 | switchSmallIcons_5: {fileID: 0} 416 | switchSmallIcons_6: {fileID: 0} 417 | switchSmallIcons_7: {fileID: 0} 418 | switchSmallIcons_8: {fileID: 0} 419 | switchSmallIcons_9: {fileID: 0} 420 | switchSmallIcons_10: {fileID: 0} 421 | switchSmallIcons_11: {fileID: 0} 422 | switchSmallIcons_12: {fileID: 0} 423 | switchSmallIcons_13: {fileID: 0} 424 | switchSmallIcons_14: {fileID: 0} 425 | switchSmallIcons_15: {fileID: 0} 426 | switchManualHTML: 427 | switchAccessibleURLs: 428 | switchLegalInformation: 429 | switchMainThreadStackSize: 1048576 430 | switchPresenceGroupId: 431 | switchLogoHandling: 0 432 | switchReleaseVersion: 0 433 | switchDisplayVersion: 1.0.0 434 | switchStartupUserAccount: 0 435 | switchTouchScreenUsage: 0 436 | switchSupportedLanguagesMask: 0 437 | switchLogoType: 0 438 | switchApplicationErrorCodeCategory: 439 | switchUserAccountSaveDataSize: 0 440 | switchUserAccountSaveDataJournalSize: 0 441 | switchApplicationAttribute: 0 442 | switchCardSpecSize: -1 443 | switchCardSpecClock: -1 444 | switchRatingsMask: 0 445 | switchRatingsInt_0: 0 446 | switchRatingsInt_1: 0 447 | switchRatingsInt_2: 0 448 | switchRatingsInt_3: 0 449 | switchRatingsInt_4: 0 450 | switchRatingsInt_5: 0 451 | switchRatingsInt_6: 0 452 | switchRatingsInt_7: 0 453 | switchRatingsInt_8: 0 454 | switchRatingsInt_9: 0 455 | switchRatingsInt_10: 0 456 | switchRatingsInt_11: 0 457 | switchRatingsInt_12: 0 458 | switchLocalCommunicationIds_0: 459 | switchLocalCommunicationIds_1: 460 | switchLocalCommunicationIds_2: 461 | switchLocalCommunicationIds_3: 462 | switchLocalCommunicationIds_4: 463 | switchLocalCommunicationIds_5: 464 | switchLocalCommunicationIds_6: 465 | switchLocalCommunicationIds_7: 466 | switchParentalControl: 0 467 | switchAllowsScreenshot: 1 468 | switchAllowsVideoCapturing: 1 469 | switchAllowsRuntimeAddOnContentInstall: 0 470 | switchDataLossConfirmation: 0 471 | switchUserAccountLockEnabled: 0 472 | switchSystemResourceMemory: 16777216 473 | switchSupportedNpadStyles: 22 474 | switchNativeFsCacheSize: 32 475 | switchIsHoldTypeHorizontal: 0 476 | switchSupportedNpadCount: 8 477 | switchSocketConfigEnabled: 0 478 | switchTcpInitialSendBufferSize: 32 479 | switchTcpInitialReceiveBufferSize: 64 480 | switchTcpAutoSendBufferSizeMax: 256 481 | switchTcpAutoReceiveBufferSizeMax: 256 482 | switchUdpSendBufferSize: 9 483 | switchUdpReceiveBufferSize: 42 484 | switchSocketBufferEfficiency: 4 485 | switchSocketInitializeEnabled: 1 486 | switchNetworkInterfaceManagerInitializeEnabled: 1 487 | switchPlayerConnectionEnabled: 1 488 | switchUseNewStyleFilepaths: 0 489 | switchUseMicroSleepForYield: 1 490 | switchMicroSleepForYieldTime: 25 491 | ps4NPAgeRating: 12 492 | ps4NPTitleSecret: 493 | ps4NPTrophyPackPath: 494 | ps4ParentalLevel: 11 495 | ps4ContentID: ED1633-NPXX51362_00-0000000000000000 496 | ps4Category: 0 497 | ps4MasterVersion: 01.00 498 | ps4AppVersion: 01.00 499 | ps4AppType: 0 500 | ps4ParamSfxPath: 501 | ps4VideoOutPixelFormat: 0 502 | ps4VideoOutInitialWidth: 1920 503 | ps4VideoOutBaseModeInitialWidth: 1920 504 | ps4VideoOutReprojectionRate: 60 505 | ps4PronunciationXMLPath: 506 | ps4PronunciationSIGPath: 507 | ps4BackgroundImagePath: 508 | ps4StartupImagePath: 509 | ps4StartupImagesFolder: 510 | ps4IconImagesFolder: 511 | ps4SaveDataImagePath: 512 | ps4SdkOverride: 513 | ps4BGMPath: 514 | ps4ShareFilePath: 515 | ps4ShareOverlayImagePath: 516 | ps4PrivacyGuardImagePath: 517 | ps4ExtraSceSysFile: 518 | ps4NPtitleDatPath: 519 | ps4RemotePlayKeyAssignment: -1 520 | ps4RemotePlayKeyMappingDir: 521 | ps4PlayTogetherPlayerCount: 0 522 | ps4EnterButtonAssignment: 1 523 | ps4ApplicationParam1: 0 524 | ps4ApplicationParam2: 0 525 | ps4ApplicationParam3: 0 526 | ps4ApplicationParam4: 0 527 | ps4DownloadDataSize: 0 528 | ps4GarlicHeapSize: 2048 529 | ps4ProGarlicHeapSize: 2560 530 | playerPrefsMaxSize: 32768 531 | ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ 532 | ps4pnSessions: 1 533 | ps4pnPresence: 1 534 | ps4pnFriends: 1 535 | ps4pnGameCustomData: 1 536 | playerPrefsSupport: 0 537 | enableApplicationExit: 0 538 | resetTempFolder: 1 539 | restrictedAudioUsageRights: 0 540 | ps4UseResolutionFallback: 0 541 | ps4ReprojectionSupport: 0 542 | ps4UseAudio3dBackend: 0 543 | ps4UseLowGarlicFragmentationMode: 1 544 | ps4SocialScreenEnabled: 0 545 | ps4ScriptOptimizationLevel: 0 546 | ps4Audio3dVirtualSpeakerCount: 14 547 | ps4attribCpuUsage: 0 548 | ps4PatchPkgPath: 549 | ps4PatchLatestPkgPath: 550 | ps4PatchChangeinfoPath: 551 | ps4PatchDayOne: 0 552 | ps4attribUserManagement: 0 553 | ps4attribMoveSupport: 0 554 | ps4attrib3DSupport: 0 555 | ps4attribShareSupport: 0 556 | ps4attribExclusiveVR: 0 557 | ps4disableAutoHideSplash: 0 558 | ps4videoRecordingFeaturesUsed: 0 559 | ps4contentSearchFeaturesUsed: 0 560 | ps4CompatibilityPS5: 0 561 | ps4AllowPS5Detection: 0 562 | ps4GPU800MHz: 1 563 | ps4attribEyeToEyeDistanceSettingVR: 0 564 | ps4IncludedModules: [] 565 | ps4attribVROutputEnabled: 0 566 | monoEnv: 567 | splashScreenBackgroundSourceLandscape: {fileID: 0} 568 | splashScreenBackgroundSourcePortrait: {fileID: 0} 569 | blurSplashScreenBackground: 1 570 | spritePackerPolicy: 571 | webGLMemorySize: 16 572 | webGLExceptionSupport: 1 573 | webGLNameFilesAsHashes: 0 574 | webGLDataCaching: 1 575 | webGLDebugSymbols: 0 576 | webGLEmscriptenArgs: 577 | webGLModulesDirectory: 578 | webGLTemplate: PROJECT:UBBExample 579 | webGLAnalyzeBuildSize: 0 580 | webGLUseEmbeddedResources: 0 581 | webGLCompressionFormat: 1 582 | webGLWasmArithmeticExceptions: 0 583 | webGLLinkerTarget: 1 584 | webGLThreadsSupport: 0 585 | webGLDecompressionFallback: 1 586 | scriptingDefineSymbols: {} 587 | additionalCompilerArguments: {} 588 | platformArchitecture: {} 589 | scriptingBackend: {} 590 | il2cppCompilerConfiguration: {} 591 | managedStrippingLevel: {} 592 | incrementalIl2cppBuild: {} 593 | suppressCommonWarnings: 1 594 | allowUnsafeCode: 0 595 | useDeterministicCompilation: 1 596 | enableRoslynAnalyzers: 1 597 | additionalIl2CppArgs: 598 | scriptingRuntimeVersion: 1 599 | gcIncremental: 1 600 | assemblyVersionValidation: 1 601 | gcWBarrierValidation: 0 602 | apiCompatibilityLevelPerPlatform: 603 | WebGL: 3 604 | m_RenderingPath: 1 605 | m_MobileRenderingPath: 1 606 | metroPackageName: Template_3D 607 | metroPackageVersion: 608 | metroCertificatePath: 609 | metroCertificatePassword: 610 | metroCertificateSubject: 611 | metroCertificateIssuer: 612 | metroCertificateNotAfter: 0000000000000000 613 | metroApplicationDescription: Template_3D 614 | wsaImages: {} 615 | metroTileShortName: 616 | metroTileShowName: 0 617 | metroMediumTileShowName: 0 618 | metroLargeTileShowName: 0 619 | metroWideTileShowName: 0 620 | metroSupportStreamingInstall: 0 621 | metroLastRequiredScene: 0 622 | metroDefaultTileSize: 1 623 | metroTileForegroundText: 2 624 | metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} 625 | metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1} 626 | metroSplashScreenUseBackgroundColor: 0 627 | platformCapabilities: {} 628 | metroTargetDeviceFamilies: {} 629 | metroFTAName: 630 | metroFTAFileTypes: [] 631 | metroProtocolName: 632 | XboxOneProductId: 633 | XboxOneUpdateKey: 634 | XboxOneSandboxId: 635 | XboxOneContentId: 636 | XboxOneTitleId: 637 | XboxOneSCId: 638 | XboxOneGameOsOverridePath: 639 | XboxOnePackagingOverridePath: 640 | XboxOneAppManifestOverridePath: 641 | XboxOneVersion: 1.0.0.0 642 | XboxOnePackageEncryption: 0 643 | XboxOnePackageUpdateGranularity: 2 644 | XboxOneDescription: 645 | XboxOneLanguage: 646 | - enus 647 | XboxOneCapability: [] 648 | XboxOneGameRating: {} 649 | XboxOneIsContentPackage: 0 650 | XboxOneEnhancedXboxCompatibilityMode: 0 651 | XboxOneEnableGPUVariability: 1 652 | XboxOneSockets: {} 653 | XboxOneSplashScreen: {fileID: 0} 654 | XboxOneAllowedProductIds: [] 655 | XboxOnePersistentLocalStorageSize: 0 656 | XboxOneXTitleMemory: 8 657 | XboxOneOverrideIdentityName: 658 | XboxOneOverrideIdentityPublisher: 659 | vrEditorSettings: {} 660 | cloudServicesEnabled: 661 | UNet: 1 662 | luminIcon: 663 | m_Name: 664 | m_ModelFolderPath: 665 | m_PortalFolderPath: 666 | luminCert: 667 | m_CertPath: 668 | m_SignPackage: 1 669 | luminIsChannelApp: 0 670 | luminVersion: 671 | m_VersionCode: 1 672 | m_VersionName: 673 | apiCompatibilityLevel: 6 674 | activeInputHandler: 0 675 | cloudProjectId: 676 | framebufferDepthMemorylessMode: 0 677 | qualitySettingsNames: [] 678 | projectName: 679 | organizationId: 680 | cloudEnabled: 0 681 | legacyClampBlendShapeWeights: 0 682 | virtualTexturingSupportEnabled: 0 683 | -------------------------------------------------------------------------------- /ProjectSettings/ProjectVersion.txt: -------------------------------------------------------------------------------- 1 | m_EditorVersion: 2021.1.14f1 2 | m_EditorVersionWithRevision: 2021.1.14f1 (51d2f824827f) 3 | -------------------------------------------------------------------------------- /ProjectSettings/QualitySettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!47 &1 4 | QualitySettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 5 7 | m_CurrentQuality: 5 8 | m_QualitySettings: 9 | - serializedVersion: 2 10 | name: Very Low 11 | pixelLightCount: 0 12 | shadows: 0 13 | shadowResolution: 0 14 | shadowProjection: 1 15 | shadowCascades: 1 16 | shadowDistance: 15 17 | shadowNearPlaneOffset: 3 18 | shadowCascade2Split: 0.33333334 19 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 20 | shadowmaskMode: 0 21 | blendWeights: 1 22 | textureQuality: 1 23 | anisotropicTextures: 0 24 | antiAliasing: 0 25 | softParticles: 0 26 | softVegetation: 0 27 | realtimeReflectionProbes: 0 28 | billboardsFaceCameraPosition: 0 29 | vSyncCount: 0 30 | lodBias: 0.3 31 | maximumLODLevel: 0 32 | streamingMipmapsActive: 0 33 | streamingMipmapsAddAllCameras: 1 34 | streamingMipmapsMemoryBudget: 512 35 | streamingMipmapsRenderersPerFrame: 512 36 | streamingMipmapsMaxLevelReduction: 2 37 | streamingMipmapsMaxFileIORequests: 1024 38 | particleRaycastBudget: 4 39 | asyncUploadTimeSlice: 2 40 | asyncUploadBufferSize: 16 41 | asyncUploadPersistentBuffer: 1 42 | resolutionScalingFixedDPIFactor: 1 43 | excludedTargetPlatforms: [] 44 | - serializedVersion: 2 45 | name: Low 46 | pixelLightCount: 0 47 | shadows: 0 48 | shadowResolution: 0 49 | shadowProjection: 1 50 | shadowCascades: 1 51 | shadowDistance: 20 52 | shadowNearPlaneOffset: 3 53 | shadowCascade2Split: 0.33333334 54 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 55 | shadowmaskMode: 0 56 | blendWeights: 2 57 | textureQuality: 0 58 | anisotropicTextures: 0 59 | antiAliasing: 0 60 | softParticles: 0 61 | softVegetation: 0 62 | realtimeReflectionProbes: 0 63 | billboardsFaceCameraPosition: 0 64 | vSyncCount: 0 65 | lodBias: 0.4 66 | maximumLODLevel: 0 67 | streamingMipmapsActive: 0 68 | streamingMipmapsAddAllCameras: 1 69 | streamingMipmapsMemoryBudget: 512 70 | streamingMipmapsRenderersPerFrame: 512 71 | streamingMipmapsMaxLevelReduction: 2 72 | streamingMipmapsMaxFileIORequests: 1024 73 | particleRaycastBudget: 16 74 | asyncUploadTimeSlice: 2 75 | asyncUploadBufferSize: 16 76 | asyncUploadPersistentBuffer: 1 77 | resolutionScalingFixedDPIFactor: 1 78 | excludedTargetPlatforms: [] 79 | - serializedVersion: 2 80 | name: Medium 81 | pixelLightCount: 1 82 | shadows: 1 83 | shadowResolution: 0 84 | shadowProjection: 1 85 | shadowCascades: 1 86 | shadowDistance: 20 87 | shadowNearPlaneOffset: 3 88 | shadowCascade2Split: 0.33333334 89 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 90 | shadowmaskMode: 0 91 | blendWeights: 2 92 | textureQuality: 0 93 | anisotropicTextures: 1 94 | antiAliasing: 0 95 | softParticles: 0 96 | softVegetation: 0 97 | realtimeReflectionProbes: 0 98 | billboardsFaceCameraPosition: 0 99 | vSyncCount: 1 100 | lodBias: 0.7 101 | maximumLODLevel: 0 102 | streamingMipmapsActive: 0 103 | streamingMipmapsAddAllCameras: 1 104 | streamingMipmapsMemoryBudget: 512 105 | streamingMipmapsRenderersPerFrame: 512 106 | streamingMipmapsMaxLevelReduction: 2 107 | streamingMipmapsMaxFileIORequests: 1024 108 | particleRaycastBudget: 64 109 | asyncUploadTimeSlice: 2 110 | asyncUploadBufferSize: 16 111 | asyncUploadPersistentBuffer: 1 112 | resolutionScalingFixedDPIFactor: 1 113 | excludedTargetPlatforms: [] 114 | - serializedVersion: 2 115 | name: High 116 | pixelLightCount: 2 117 | shadows: 2 118 | shadowResolution: 1 119 | shadowProjection: 1 120 | shadowCascades: 2 121 | shadowDistance: 40 122 | shadowNearPlaneOffset: 3 123 | shadowCascade2Split: 0.33333334 124 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 125 | shadowmaskMode: 1 126 | blendWeights: 2 127 | textureQuality: 0 128 | anisotropicTextures: 1 129 | antiAliasing: 0 130 | softParticles: 0 131 | softVegetation: 1 132 | realtimeReflectionProbes: 1 133 | billboardsFaceCameraPosition: 1 134 | vSyncCount: 1 135 | lodBias: 1 136 | maximumLODLevel: 0 137 | streamingMipmapsActive: 0 138 | streamingMipmapsAddAllCameras: 1 139 | streamingMipmapsMemoryBudget: 512 140 | streamingMipmapsRenderersPerFrame: 512 141 | streamingMipmapsMaxLevelReduction: 2 142 | streamingMipmapsMaxFileIORequests: 1024 143 | particleRaycastBudget: 256 144 | asyncUploadTimeSlice: 2 145 | asyncUploadBufferSize: 16 146 | asyncUploadPersistentBuffer: 1 147 | resolutionScalingFixedDPIFactor: 1 148 | excludedTargetPlatforms: [] 149 | - serializedVersion: 2 150 | name: Very High 151 | pixelLightCount: 3 152 | shadows: 2 153 | shadowResolution: 2 154 | shadowProjection: 1 155 | shadowCascades: 2 156 | shadowDistance: 70 157 | shadowNearPlaneOffset: 3 158 | shadowCascade2Split: 0.33333334 159 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 160 | shadowmaskMode: 1 161 | blendWeights: 4 162 | textureQuality: 0 163 | anisotropicTextures: 2 164 | antiAliasing: 2 165 | softParticles: 1 166 | softVegetation: 1 167 | realtimeReflectionProbes: 1 168 | billboardsFaceCameraPosition: 1 169 | vSyncCount: 1 170 | lodBias: 1.5 171 | maximumLODLevel: 0 172 | streamingMipmapsActive: 0 173 | streamingMipmapsAddAllCameras: 1 174 | streamingMipmapsMemoryBudget: 512 175 | streamingMipmapsRenderersPerFrame: 512 176 | streamingMipmapsMaxLevelReduction: 2 177 | streamingMipmapsMaxFileIORequests: 1024 178 | particleRaycastBudget: 1024 179 | asyncUploadTimeSlice: 2 180 | asyncUploadBufferSize: 16 181 | asyncUploadPersistentBuffer: 1 182 | resolutionScalingFixedDPIFactor: 1 183 | excludedTargetPlatforms: [] 184 | - serializedVersion: 2 185 | name: Ultra 186 | pixelLightCount: 4 187 | shadows: 2 188 | shadowResolution: 2 189 | shadowProjection: 1 190 | shadowCascades: 4 191 | shadowDistance: 150 192 | shadowNearPlaneOffset: 3 193 | shadowCascade2Split: 0.33333334 194 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 195 | shadowmaskMode: 1 196 | blendWeights: 4 197 | textureQuality: 0 198 | anisotropicTextures: 2 199 | antiAliasing: 2 200 | softParticles: 1 201 | softVegetation: 1 202 | realtimeReflectionProbes: 1 203 | billboardsFaceCameraPosition: 1 204 | vSyncCount: 1 205 | lodBias: 2 206 | maximumLODLevel: 0 207 | streamingMipmapsActive: 0 208 | streamingMipmapsAddAllCameras: 1 209 | streamingMipmapsMemoryBudget: 512 210 | streamingMipmapsRenderersPerFrame: 512 211 | streamingMipmapsMaxLevelReduction: 2 212 | streamingMipmapsMaxFileIORequests: 1024 213 | particleRaycastBudget: 4096 214 | asyncUploadTimeSlice: 2 215 | asyncUploadBufferSize: 16 216 | asyncUploadPersistentBuffer: 1 217 | resolutionScalingFixedDPIFactor: 1 218 | excludedTargetPlatforms: [] 219 | m_PerPlatformDefaultQuality: 220 | Android: 2 221 | Lumin: 5 222 | Nintendo 3DS: 5 223 | Nintendo Switch: 5 224 | PS4: 5 225 | PSP2: 2 226 | Stadia: 5 227 | Standalone: 5 228 | WebGL: 3 229 | Windows Store Apps: 5 230 | XboxOne: 5 231 | iPhone: 2 232 | tvOS: 2 233 | -------------------------------------------------------------------------------- /ProjectSettings/SceneTemplateSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "templatePinStates": [], 3 | "dependencyTypeInfos": [ 4 | { 5 | "userAdded": false, 6 | "type": "UnityEngine.AnimationClip", 7 | "ignore": false, 8 | "defaultInstantiationMode": 0, 9 | "supportsModification": true 10 | }, 11 | { 12 | "userAdded": false, 13 | "type": "UnityEditor.Animations.AnimatorController", 14 | "ignore": false, 15 | "defaultInstantiationMode": 0, 16 | "supportsModification": true 17 | }, 18 | { 19 | "userAdded": false, 20 | "type": "UnityEngine.AnimatorOverrideController", 21 | "ignore": false, 22 | "defaultInstantiationMode": 0, 23 | "supportsModification": true 24 | }, 25 | { 26 | "userAdded": false, 27 | "type": "UnityEditor.Audio.AudioMixerController", 28 | "ignore": false, 29 | "defaultInstantiationMode": 0, 30 | "supportsModification": true 31 | }, 32 | { 33 | "userAdded": false, 34 | "type": "UnityEngine.ComputeShader", 35 | "ignore": true, 36 | "defaultInstantiationMode": 1, 37 | "supportsModification": true 38 | }, 39 | { 40 | "userAdded": false, 41 | "type": "UnityEngine.Cubemap", 42 | "ignore": false, 43 | "defaultInstantiationMode": 0, 44 | "supportsModification": true 45 | }, 46 | { 47 | "userAdded": false, 48 | "type": "UnityEngine.GameObject", 49 | "ignore": false, 50 | "defaultInstantiationMode": 0, 51 | "supportsModification": true 52 | }, 53 | { 54 | "userAdded": false, 55 | "type": "UnityEditor.LightingDataAsset", 56 | "ignore": false, 57 | "defaultInstantiationMode": 0, 58 | "supportsModification": false 59 | }, 60 | { 61 | "userAdded": false, 62 | "type": "UnityEngine.LightingSettings", 63 | "ignore": false, 64 | "defaultInstantiationMode": 0, 65 | "supportsModification": true 66 | }, 67 | { 68 | "userAdded": false, 69 | "type": "UnityEngine.Material", 70 | "ignore": false, 71 | "defaultInstantiationMode": 0, 72 | "supportsModification": true 73 | }, 74 | { 75 | "userAdded": false, 76 | "type": "UnityEditor.MonoScript", 77 | "ignore": true, 78 | "defaultInstantiationMode": 1, 79 | "supportsModification": true 80 | }, 81 | { 82 | "userAdded": false, 83 | "type": "UnityEngine.PhysicMaterial", 84 | "ignore": false, 85 | "defaultInstantiationMode": 0, 86 | "supportsModification": true 87 | }, 88 | { 89 | "userAdded": false, 90 | "type": "UnityEngine.PhysicsMaterial2D", 91 | "ignore": false, 92 | "defaultInstantiationMode": 0, 93 | "supportsModification": true 94 | }, 95 | { 96 | "userAdded": false, 97 | "type": "UnityEngine.Rendering.PostProcessing.PostProcessProfile", 98 | "ignore": false, 99 | "defaultInstantiationMode": 0, 100 | "supportsModification": true 101 | }, 102 | { 103 | "userAdded": false, 104 | "type": "UnityEngine.Rendering.PostProcessing.PostProcessResources", 105 | "ignore": false, 106 | "defaultInstantiationMode": 0, 107 | "supportsModification": true 108 | }, 109 | { 110 | "userAdded": false, 111 | "type": "UnityEngine.Rendering.VolumeProfile", 112 | "ignore": false, 113 | "defaultInstantiationMode": 0, 114 | "supportsModification": true 115 | }, 116 | { 117 | "userAdded": false, 118 | "type": "UnityEditor.SceneAsset", 119 | "ignore": false, 120 | "defaultInstantiationMode": 0, 121 | "supportsModification": false 122 | }, 123 | { 124 | "userAdded": false, 125 | "type": "UnityEngine.Shader", 126 | "ignore": true, 127 | "defaultInstantiationMode": 1, 128 | "supportsModification": true 129 | }, 130 | { 131 | "userAdded": false, 132 | "type": "UnityEngine.ShaderVariantCollection", 133 | "ignore": true, 134 | "defaultInstantiationMode": 1, 135 | "supportsModification": true 136 | }, 137 | { 138 | "userAdded": false, 139 | "type": "UnityEngine.Texture", 140 | "ignore": false, 141 | "defaultInstantiationMode": 0, 142 | "supportsModification": true 143 | }, 144 | { 145 | "userAdded": false, 146 | "type": "UnityEngine.Texture2D", 147 | "ignore": false, 148 | "defaultInstantiationMode": 0, 149 | "supportsModification": true 150 | }, 151 | { 152 | "userAdded": false, 153 | "type": "UnityEngine.Timeline.TimelineAsset", 154 | "ignore": false, 155 | "defaultInstantiationMode": 0, 156 | "supportsModification": true 157 | } 158 | ], 159 | "defaultDependencyTypeInfo": { 160 | "userAdded": false, 161 | "type": "", 162 | "ignore": false, 163 | "defaultInstantiationMode": 1, 164 | "supportsModification": true 165 | }, 166 | "newSceneOverride": 0 167 | } -------------------------------------------------------------------------------- /ProjectSettings/TagManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!78 &1 4 | TagManager: 5 | serializedVersion: 2 6 | tags: [] 7 | layers: 8 | - Default 9 | - TransparentFX 10 | - Ignore Raycast 11 | - 12 | - Water 13 | - UI 14 | - 15 | - 16 | - 17 | - 18 | - 19 | - 20 | - 21 | - 22 | - 23 | - 24 | - 25 | - 26 | - 27 | - 28 | - 29 | - 30 | - 31 | - 32 | - 33 | - 34 | - 35 | - 36 | - 37 | - 38 | - 39 | - 40 | m_SortingLayers: 41 | - name: Default 42 | uniqueID: 0 43 | locked: 0 44 | -------------------------------------------------------------------------------- /ProjectSettings/TimeManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!5 &1 4 | TimeManager: 5 | m_ObjectHideFlags: 0 6 | Fixed Timestep: 0.02 7 | Maximum Allowed Timestep: 0.33333334 8 | m_TimeScale: 1 9 | Maximum Particle Timestep: 0.03 10 | -------------------------------------------------------------------------------- /ProjectSettings/UnityConnectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!310 &1 4 | UnityConnectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 1 7 | m_Enabled: 0 8 | m_TestMode: 0 9 | m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events 10 | m_EventUrl: https://cdp.cloud.unity3d.com/v1/events 11 | m_ConfigUrl: https://config.uca.cloud.unity3d.com 12 | m_DashboardUrl: https://dashboard.unity3d.com 13 | m_TestInitMode: 0 14 | CrashReportingSettings: 15 | m_EventUrl: https://perf-events.cloud.unity3d.com 16 | m_Enabled: 0 17 | m_LogBufferSize: 10 18 | m_CaptureEditorExceptions: 1 19 | UnityPurchasingSettings: 20 | m_Enabled: 0 21 | m_TestMode: 0 22 | UnityAnalyticsSettings: 23 | m_Enabled: 0 24 | m_TestMode: 0 25 | m_InitializeOnStartup: 1 26 | UnityAdsSettings: 27 | m_Enabled: 0 28 | m_InitializeOnStartup: 1 29 | m_TestMode: 0 30 | m_IosGameId: 31 | m_AndroidGameId: 32 | m_GameIds: {} 33 | m_GameId: 34 | PerformanceReportingSettings: 35 | m_Enabled: 0 36 | -------------------------------------------------------------------------------- /ProjectSettings/VFXManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!937362698 &1 4 | VFXManager: 5 | m_ObjectHideFlags: 0 6 | m_IndirectShader: {fileID: 0} 7 | m_CopyBufferShader: {fileID: 0} 8 | m_SortShader: {fileID: 0} 9 | m_StripUpdateShader: {fileID: 0} 10 | m_RenderPipeSettingsPath: 11 | m_FixedTimeStep: 0.016666668 12 | m_MaxDeltaTime: 0.05 13 | -------------------------------------------------------------------------------- /ProjectSettings/VersionControlSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!890905787 &1 4 | VersionControlSettings: 5 | m_ObjectHideFlags: 0 6 | m_Mode: Hidden Meta Files 7 | m_CollabEditorSettings: 8 | inProgressEnabled: 1 9 | -------------------------------------------------------------------------------- /ProjectSettings/XRSettings.asset: -------------------------------------------------------------------------------- 1 | { 2 | "m_SettingKeys": [ 3 | "VR Device Disabled", 4 | "VR Device User Alert" 5 | ], 6 | "m_SettingValues": [ 7 | "False", 8 | "False" 9 | ] 10 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Unity Browser Bridge 2 | 3 | When building a Unity project for the web, you can interact with the web browser's JavaScript engine directly from your script code (see [WebGL: Interacting with browser scripting](https://docs.unity3d.com/Manual/webgl-interactingwithbrowserscripting.html)). 4 | 5 | To test these browser interactions, you need to build the project and run it in the web browser. This can be rather time-consuming as compiling for WebGL tends to take a while. 6 | 7 | Unity Browser Bridge (UBB) allows you to test browser interactions directly from the Unity editor. 8 | 9 | 10 | ## How does it work? 11 | 12 | In a WebGL build, browser interaction is implemented by integrating the functions you defined in the _.jslib_ file into the your script code, which eventually gets translated into JavaScript. Similarly, the browser can invoke methods in your code using the SendMessage function on the Unity instance. 13 | 14 | Within the Unity editor, there is no direct way of accessing a JavaScript engine present in web browsers. UBB therefore uses [Selenium WebDriver](https://www.selenium.dev/documentation/webdriver) to control a web browser with which your script code interacts. 15 | 16 | The remote-controlled browser connects to a local HTTP server from where it loads an interface page including user-defined JavaScript files. Your script code then invokes the _ExecuteJS_ method with the JavaScript command to be executed in the browser. UBB instructs the web driver to execute the command and returns the result as return value (if there is any). 17 | 18 | The interface page contains a mockup of the Unity instance (which would be present in a WebGL build) to emulate the _SendMessage_ function. When invoked, the _SendMessage_ function sends a request to the local HTTP server which forwards the message to the corresponding game object on the Unity side. Please note that, like in the real WebGL build, messages from the browser to your script code are unidirectional (i.e. they have no return values). Figure 1 gives a high-level overview of the components involved in the interaction between your project and the web browser. 19 | 20 | ![Overview browser interaction](Documentation/Figures/OverviewCompared.png) 21 | _Figure 1: Overview of the interaction between your Unity project and the web browser when compiled into a WebGL build (left) and using Unity Browser Bridge in the Unity editor (right)._ 22 | 23 | 24 | ## How do I use it? 25 | 26 | #### Prerequisites 27 | 28 | Here's what you need in order to use Unity Browser Bridge: 29 | 30 | * Unity version 2021.1 or higher 31 | * Unity project targeting the WebGL platform 32 | * Web browser and its corresponding [web driver](https://www.selenium.dev/documentation/webdriver/getting_started/install_drivers) 33 | * The Unity Browser Bridge package ([UnityBrowserBridge_v1.0.0.unitypackage](https://github.com/sropelato/UnityBrowserBridge/releases/download/v1.0.0/UnityBrowserBridge_v1.0.0.unitypackage)) 34 | 35 | #### Import Unity Browser Bridge 36 | 37 | Import _UnityBrowserBridge_v1.0.0.unitypackage_ into your project. Drag the _UnityBrowserBridge_ prefab (in _UnityBrowserBridge/Prefabs_) into your scene. In the inspector, you can see the following following settings: 38 | 39 | Setting | Description 40 | --------|------------ 41 | Browser | The web browser which will be controlled by Unity Browser Bridge. The browser and the web driver must be installed for this to work. 42 | Web Driver Directory | Path to the directory in which the web driver is located. If this is left empty, the web driver will be searched on your system's PATH. 43 | HTTP Server Port | The port on which the local HTTP server will listen for connections. 44 | Index file | The index file opened when the browser connects to Unity Browser Bridge. Changing this may result in UBB not woking properly. 45 | Include JavaScript Files | Your JavaScript files included in the WebGL project. The path will first be resolved relative to the _Assets_ directory or, if not successful, as an absolute path. 46 | 47 | #### Configure your script to use Unity Browser Bridge 48 | 49 | Assume you want to execute a simple JavaScript command, for example ```console.log('hello world')```, from your script code. For this to work, you need to define this command in the _.jslib_ file. This could look something like this: 50 | 51 | ``` 52 | mergeInto(LibraryManager.library, { 53 | PrintHelloWorld: function() { 54 | console.log('hello world') 55 | } 56 | }) 57 | ``` 58 | 59 | In your script code, you would then define the _PrintHelloWorld_ function like this: 60 | 61 | ``` 62 | [DllImport("__Internal")] 63 | public static extern void PrintHelloWorld(); 64 | ``` 65 | 66 | Now you can call ```PrintHelloWorld()``` from anywhere in your script code and it should execute the _console.log_ command above when compiled into a WebGL build. 67 | 68 | To make it work in the editor, the _PrintHelloWorld()_ method needs to be changed as follows: 69 | 70 | ``` 71 | public static void PrintHelloWorld() { 72 | UnityBrowserBridge.Instance.ExecuteJS("console.log('hello world')"); 73 | } 74 | ``` 75 | 76 | If everything has been configured correctly, running your project in the Unity editor should open a browser window and display the UBB overview page. Turning on _Show live browser calls_ allows you to see the JavaScript commands that UBB executes in the browser, in this example, the ```console.log('hello world')``` command. 77 | 78 | ![Screenshot UBB with 'hello world' example](Documentation/Figures/ScreenshotHelloWorldPage.png) 79 | _Figure 2: Unity Browser Bridge status page displayed in the remote-controlled web browser. It shows a list of included JavaScript files, if any, and a log of commands executed in the browser and messages sent from the browser to Unity. For performance reasons, both logs are disabled by default._ 80 | 81 | In a next step, you can use Unity's platform-dependent macros to avoid having to change the definition of the _PrintHelloWorld_ function every time you want to build your project: 82 | 83 | ``` 84 | #if UNITY_WEBGL && !UNITY_EDITOR 85 | [DllImport("__Internal")] 86 | public static extern void PrintHelloWorld(); 87 | #else 88 | public static void PrintHelloWorld() { 89 | UnityBrowserBridge.Instance.ExecuteJS("console.log('hello world')"); 90 | } 91 | #endif 92 | ``` 93 | 94 | With this in place, your project can be run in the Unity editor and compiled into a WebGL build, both with working browser interaction. 95 | 96 | 97 | ## The example project 98 | 99 | The example project ([UnityBrowserBridgeExample_v1.0.0.unitypackage](https://github.com/sropelato/UnityBrowserBridge/releases/download/v1.0.0/UnityBrowserBridgeExample_v1.0.0.unitypackage)) contains a sample with a fully-configured UBB setup. It demonstrates how to invoke JavaScript functions with parameters and return types and how to handle function calls from the browser. 100 | 101 | _Please note that the example project does not include the Unity Browser Bridge implementation. In order to work, the main package ___UnityBrowserBridge_v1.0.0.unitypackage___ must be imported as well._ 102 | 103 | #### Contents 104 | 105 | The ___WebGLTemplates/UBBExample___ folder contains all files required to define a WebGL template which will be used when compiling the project to a WebGL build. The file ___TemplateData/myscript.js___ is included in the template and defines the functions _getDateAndTime_ and _getDateAndTimeAsync_ which return a formatted date string. 106 | 107 | ___Plugins/BrowserInteraction.json___ defines the two wrapper functions _GetDateAndTime_ and _GetDateAndTimeAsync_ which will invoke the JavaScript functions in _myscript.js_. 108 | 109 | The controller (___Scripts/MainController.cs___) handles the calls to the wrapper functions (using UBB when run in the editor, or directly when compiled to WebGL). 110 | 111 | The example scene (___Scenes/UnityBrowserBridgeExample.scene___) contains a simple UI with two buttons to display the current date (Figure 3), a game object with the _MainController_ script, and the _UnityBrowserBridge_ object (from _UnityBrowserBridge/Prefabs/UnityBrowserBridge.prefab_). Note that the _myscript.js_ file is listed under _Include JavaScript Files_. 112 | 113 | 114 | ![Screenshot UBB example scene](Documentation/Figures/ScreenshotExampleScene.png) 115 | _Figure 3: Unity Browser Bridge example project. Two buttons can be used to get and display the current date and time from the browser._ 116 | 117 | 118 | 119 | #### How to run the example project 120 | 121 | Configure Unity Browser Bridge to use the browser of your choice. Make sure the appropriate web driver is installed. If the executable is not on your system's PATH, set the directory containing the driver executable in _Web Driver Directory_ (Figure 4). 122 | 123 | If configured correctly, a browser window displaying the UBB status page should appear when you enter play mode (Figure 5). Pressing the first button, _Get Date And Time_, invokes the _getDateAndTime_ function which directly returns the formatted date string. _Get Date And Time (Async)_ invokes _getDateAndTimeAsync_ respectively which invokes the _SetDateAndTime_ callback method in _MainController.cs_ (after a 1000 ms delay). 124 | 125 | As in the _hello world_ example above, we use Unity's macros to make our code work in the WebGL build as well as in the editor. When compiled to WebGL, _GetDateAndTime_ and _GetDateAndTimeAsync_ are linked to the wrapper functions in _BrowserInteraction.json_. In the editor, they use Unity Browser Bridge instead. The example shows that ```ExecuteJS()``` has a return type ```T``` while ```ExecuteJS()``` (without the diamond) has no return type: 126 | 127 | ``` 128 | ... 129 | 130 | #if UNITY_WEBGL && !UNITY_EDITOR 131 | 132 | [DllImport("__Internal")] 133 | public static extern string GetDateAndTime(string locale); 134 | [DllImport("__Internal")] 135 | public static extern void GetDateAndTimeAsync(string locale); 136 | 137 | #else 138 | 139 | public static string GetDateAndTime(string locale) { 140 | return UnityBrowserBridge.Instance.ExecuteJS("getDateAndTime('" + locale + "')"); 141 | } 142 | 143 | public static void GetDateAndTimeAsync(string locale) { 144 | UnityBrowserBridge.Instance.ExecuteJS("getDateAndTimeAsync('" + locale + "')"); 145 | } 146 | 147 | #endif 148 | 149 | public void SetDateAndTime(string dateAndTimeString) { 150 | dateAndTimeText.text = dateAndTimeString; 151 | getDateAndTimeAsyncButton.interactable = true; 152 | } 153 | 154 | ... 155 | 156 | ``` 157 | 158 | ![Screenshot UBB configuration](Documentation/Figures/ScreenshotUBBConfig.png) 159 | _Figure 4: Unity Browser Bridge configuration. The web driver executable (here chromedriver) is located in /usr/local/bin which is defined as the Web Driver Directory. The myscript.js file is listed to be included in the web project so its functions can be accessed by Unity Browser Bridge._ 160 | 161 | ![Screenshot UBB with example project](Documentation/Figures/ScreenshotExamplePage.png) 162 | _Figure 5: Unity Browser Bridge status page of the example project with the included myscript.js file. Enabling the live calls shows the browser calls from Unity and the messages sent to Unity._ 163 | 164 | Of course, the example project can be built as a WebGL project and should show the same behavior like when tested in the Unity editor (Figure 6). Make sure to use the UBBExample WebGL template as it contains the required _myscript.js_ file. 165 | 166 | ![Screenshot example project WebGL](Documentation/Figures/ScreenshotExampleWebGL.png) 167 | _Figure 6: Example project compiled to WebGL._ 168 | 169 | 170 | ## License 171 | 172 | The source code, binaries and all included assets of Unity Browser Bridge are released under the [MIT license](LICENSE). 173 | 174 | #### Included software 175 | 176 | The Selenium framework (used to interact with the web driver) is licensed under the Apache 2.0 license (License file included in [Assets/UnityBrowserBridge/Plugins/SeleniumLicense.txt](Assets/UnityBrowserBridge/Plugins/SeleniumLicense.txt)). 177 | 178 | jQuery (used in the example WebGL template) is licensed under the MIT license (License file included in [Assets/WebGLTemplates/UBBExample/TemplateData/jQueryLicense.txt](Assets/WebGLTemplates/UBBExample/TemplateData/jQueryLicense.txt)). 179 | --------------------------------------------------------------------------------