diff --git a/.idea/.idea.localization-toolkit/.idea/.gitignore b/.idea/.idea.localization-toolkit/.idea/.gitignore deleted file mode 100644 index e311544..0000000 --- a/.idea/.idea.localization-toolkit/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Rider ignored files -/modules.xml -/.idea.localization-toolkit.iml -/projectSettingsUpdater.xml -/contentModel.xml diff --git a/.idea/.idea.localization-toolkit/.idea/encodings.xml b/.idea/.idea.localization-toolkit/.idea/encodings.xml deleted file mode 100644 index df87cf9..0000000 --- a/.idea/.idea.localization-toolkit/.idea/encodings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/.idea.localization-toolkit/.idea/indexLayout.xml b/.idea/.idea.localization-toolkit/.idea/indexLayout.xml deleted file mode 100644 index 7b08163..0000000 --- a/.idea/.idea.localization-toolkit/.idea/indexLayout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/.idea.localization-toolkit/.idea/vcs.xml b/.idea/.idea.localization-toolkit/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/.idea.localization-toolkit/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Logs/Packages-Update.log b/Logs/Packages-Update.log deleted file mode 100644 index 1d7a9e8..0000000 --- a/Logs/Packages-Update.log +++ /dev/null @@ -1,75 +0,0 @@ - -=== Tue Mar 8 11:15:31 2022 - -Packages were changed. -Update Mode: resetToDefaultDependencies - -The following packages were added: - com.unity.collab-proxy@1.15.7 - com.unity.ide.rider@3.0.9 - com.unity.ide.visualstudio@2.0.12 - com.unity.ide.vscode@1.2.4 - com.unity.modules.ai@1.0.0 - com.unity.modules.androidjni@1.0.0 - com.unity.modules.animation@1.0.0 - com.unity.modules.assetbundle@1.0.0 - com.unity.modules.audio@1.0.0 - com.unity.modules.cloth@1.0.0 - com.unity.modules.director@1.0.0 - com.unity.modules.imageconversion@1.0.0 - com.unity.modules.imgui@1.0.0 - com.unity.modules.jsonserialize@1.0.0 - com.unity.modules.particlesystem@1.0.0 - com.unity.modules.physics@1.0.0 - com.unity.modules.physics2d@1.0.0 - com.unity.modules.screencapture@1.0.0 - com.unity.modules.terrain@1.0.0 - com.unity.modules.terrainphysics@1.0.0 - com.unity.modules.tilemap@1.0.0 - com.unity.modules.ui@1.0.0 - com.unity.modules.uielements@1.0.0 - com.unity.modules.umbra@1.0.0 - com.unity.modules.unityanalytics@1.0.0 - com.unity.modules.unitywebrequest@1.0.0 - com.unity.modules.unitywebrequestassetbundle@1.0.0 - com.unity.modules.unitywebrequestaudio@1.0.0 - com.unity.modules.unitywebrequesttexture@1.0.0 - com.unity.modules.unitywebrequestwww@1.0.0 - com.unity.modules.vehicles@1.0.0 - com.unity.modules.video@1.0.0 - com.unity.modules.vr@1.0.0 - com.unity.modules.wind@1.0.0 - com.unity.modules.xr@1.0.0 - com.unity.test-framework@1.1.29 - com.unity.textmeshpro@3.0.6 - com.unity.timeline@1.6.3 - com.unity.ugui@1.0.0 - com.unity.visualscripting@1.7.6 - -=== Sat Jul 16 10:47:50 2022 - -Packages were changed. -Update Mode: updateDependencies - -The following packages were updated: - com.unity.collab-proxy from version 1.15.7 to 1.17.0 - com.unity.ide.rider from version 3.0.9 to 3.0.15 - com.unity.ide.visualstudio from version 2.0.12 to 2.0.16 - com.unity.ide.vscode from version 1.2.4 to 1.2.5 - com.unity.test-framework from version 1.1.29 to 1.1.31 - com.unity.timeline from version 1.6.3 to 1.7.1 - com.unity.visualscripting from version 1.7.6 to 1.7.8 - -=== Sat Jan 21 19:31:16 2023 - -Packages were changed. -Update Mode: updateDependencies - -The following packages were added: - com.unity.ai.navigation@1.1.1 -The following packages were updated: - com.unity.collab-proxy from version 1.17.1 to 1.17.7 - com.unity.ide.rider from version 3.0.15 to 3.0.17 - com.unity.ide.visualstudio from version 2.0.16 to 2.0.17 - com.unity.test-framework from version 1.1.31 to 1.1.33 - com.unity.visualscripting from version 1.7.8 to 1.8.0 diff --git a/Logs/shadercompiler-UnityShaderCompiler0.log b/Logs/shadercompiler-UnityShaderCompiler0.log deleted file mode 100644 index f34cb45..0000000 --- a/Logs/shadercompiler-UnityShaderCompiler0.log +++ /dev/null @@ -1,102 +0,0 @@ -Base path: '/Applications/Unity/2022.2.2f1/Unity.app/Contents', plugins path '/Applications/Unity/2022.2.2f1/Unity.app/Contents/PlaybackEngines' -Cmd: initializeCompiler - -Cmd: preprocess - insize=2414 file=Packages/com.unity.textmeshpro/Editor Resources/Shaders/TMP_SDF Internal Editor.shader surfaceOnly=0 buildPlatform=2 pKW=SHADER_API_DESKTOP dKW=UNITY_NO_DXT5nm UNITY_ENABLE_REFLECTION_BUFFERS UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_RGBM_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL ok=1 outsize=2035 - -Cmd: compileSnippet - insize=1622 file=Assets/DefaultResourcesExtra/Hidden/BlitCopy pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Vertex platform=metal reqs=33 mask=6 start=11 ok=1 outsize=1488 - -Cmd: compileSnippet - insize=1622 file=Assets/DefaultResourcesExtra/Hidden/BlitCopy pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Fragment platform=metal reqs=33 mask=6 start=11 ok=1 outsize=893 - -Cmd: compileSnippet - insize=5069 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUIRoundedRect pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Vertex platform=metal reqs=33 mask=6 start=155 ok=1 outsize=2467 - -Cmd: compileSnippet - insize=5069 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUIRoundedRect pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Fragment platform=metal reqs=33 mask=6 start=155 ok=1 outsize=6352 - -Cmd: compileSnippet - insize=5069 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUIRoundedRect pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Vertex platform=metal reqs=33 mask=6 start=167 ok=1 outsize=2467 - -Cmd: compileSnippet - insize=5069 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUIRoundedRect pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Fragment platform=metal reqs=33 mask=6 start=167 ok=1 outsize=6352 - -Cmd: compileSnippet - insize=7893 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUIRoundedRectWithColorPerBorder pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Vertex platform=metal reqs=33 mask=6 start=223 ok=1 outsize=2467 - -Cmd: compileSnippet - insize=7893 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUIRoundedRectWithColorPerBorder pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Fragment platform=metal reqs=33 mask=6 start=223 ok=1 outsize=8632 - -Cmd: compileSnippet - insize=7893 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUIRoundedRectWithColorPerBorder pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Vertex platform=metal reqs=33 mask=6 start=235 ok=1 outsize=2467 - -Cmd: compileSnippet - insize=7893 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUIRoundedRectWithColorPerBorder pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Fragment platform=metal reqs=33 mask=6 start=235 ok=1 outsize=8632 - -Cmd: compileSnippet - insize=1381 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUITexture pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Vertex platform=metal reqs=1 mask=6 start=59 ok=1 outsize=1599 - -Cmd: compileSnippet - insize=1381 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUITexture pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Fragment platform=metal reqs=1 mask=6 start=59 ok=1 outsize=862 - -Cmd: compileSnippet - insize=1381 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUITexture pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Vertex platform=metal reqs=1 mask=6 start=75 ok=1 outsize=1599 - -Cmd: compileSnippet - insize=1381 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUITexture pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Fragment platform=metal reqs=1 mask=6 start=75 ok=1 outsize=862 - -Cmd: compileSnippet - insize=1918 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUITextureBlit pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Vertex platform=metal reqs=1 mask=6 start=71 ok=1 outsize=2383 - -Cmd: compileSnippet - insize=1918 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUITextureBlit pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Fragment platform=metal reqs=1 mask=6 start=71 ok=1 outsize=1770 - -Cmd: compileSnippet - insize=1918 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUITextureBlit pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Vertex platform=metal reqs=1 mask=6 start=84 ok=1 outsize=2383 - -Cmd: compileSnippet - insize=1918 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUITextureBlit pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Fragment platform=metal reqs=1 mask=6 start=84 ok=1 outsize=1770 - -Cmd: compileSnippet - insize=1882 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUITextureClip pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Vertex platform=metal reqs=1 mask=6 start=70 ok=1 outsize=2383 - -Cmd: compileSnippet - insize=1882 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUITextureClip pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Fragment platform=metal reqs=1 mask=6 start=70 ok=1 outsize=1776 - -Cmd: compileSnippet - insize=1882 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUITextureClip pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Vertex platform=metal reqs=1 mask=6 start=83 ok=1 outsize=2383 - -Cmd: compileSnippet - insize=1882 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUITextureClip pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Fragment platform=metal reqs=1 mask=6 start=83 ok=1 outsize=1776 - -Cmd: compileSnippet - insize=1741 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUITextureClipText pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Vertex platform=metal reqs=1 mask=6 start=64 ok=1 outsize=2420 - -Cmd: compileSnippet - insize=1741 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUITextureClipText pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Fragment platform=metal reqs=1 mask=6 start=64 ok=1 outsize=1188 - -Cmd: compileSnippet - insize=1741 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUITextureClipText pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Vertex platform=metal reqs=1 mask=6 start=77 ok=1 outsize=2420 - -Cmd: compileSnippet - insize=1741 file=Assets/DefaultResourcesExtra/Hidden/Internal-GUITextureClipText pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Fragment platform=metal reqs=1 mask=6 start=77 ok=1 outsize=1188 - -Cmd: compileSnippet - insize=4180 file=Assets/DefaultResourcesExtra/Internal/UIElements/Hidden/Internal-UIRAtlasBlitCopy pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Vertex platform=metal reqs=33 mask=6 start=20 ok=1 outsize=3093 - -Cmd: compileSnippet - insize=4180 file=Assets/DefaultResourcesExtra/Internal/UIElements/Hidden/Internal-UIRAtlasBlitCopy pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Fragment platform=metal reqs=33 mask=6 start=20 ok=1 outsize=2777 - -Cmd: compileSnippet - insize=802 file=Assets/DefaultResourcesExtra/Internal/UIElements/Hidden/UIElements/EditorUIE pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Vertex platform=metal reqs=4075 mask=6 start=54 ok=1 outsize=7724 - -Cmd: compileSnippet - insize=802 file=Assets/DefaultResourcesExtra/Internal/UIElements/Hidden/UIElements/EditorUIE pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Fragment platform=metal reqs=4075 mask=6 start=54 ok=1 outsize=23514 - -Cmd: compileSnippet - insize=16617 file=Assets/DefaultResourcesExtra/Skybox/Procedural pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW=_SUNDISK_SIMPLE dKW=_SUNDISK_NONE _SUNDISK_HIGH_QUALITY UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Vertex platform=metal reqs=33 mask=6 start=20 ok=1 outsize=10107 - -Cmd: compileSnippet - insize=16617 file=Assets/DefaultResourcesExtra/Skybox/Procedural pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW=_SUNDISK_SIMPLE dKW=_SUNDISK_NONE _SUNDISK_HIGH_QUALITY UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Fragment platform=metal reqs=33 mask=6 start=20 ok=1 outsize=1821 - diff --git a/Logs/shadercompiler-UnityShaderCompiler1.log b/Logs/shadercompiler-UnityShaderCompiler1.log deleted file mode 100644 index b57b34e..0000000 --- a/Logs/shadercompiler-UnityShaderCompiler1.log +++ /dev/null @@ -1,6 +0,0 @@ -Base path: '/Applications/Unity/2022.2.2f1/Unity.app/Contents', plugins path '/Applications/Unity/2022.2.2f1/Unity.app/Contents/PlaybackEngines' -Cmd: initializeCompiler - -Cmd: compileSnippet - insize=857 file=Packages/com.unity.textmeshpro/Editor Resources/Shaders/Hidden/TMP/Internal/Editor/Distance Field SSD pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=OUTLINE_ON UNDERLAY_ON UNDERLAY_INNER UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Vertex platform=metal reqs=33 mask=6 start=58 ok=1 outsize=4152 - diff --git a/Logs/shadercompiler-UnityShaderCompiler2.log b/Logs/shadercompiler-UnityShaderCompiler2.log deleted file mode 100644 index 76dad26..0000000 --- a/Logs/shadercompiler-UnityShaderCompiler2.log +++ /dev/null @@ -1,6 +0,0 @@ -Base path: '/Applications/Unity/2022.2.2f1/Unity.app/Contents', plugins path '/Applications/Unity/2022.2.2f1/Unity.app/Contents/PlaybackEngines' -Cmd: initializeCompiler - -Cmd: compileSnippet - insize=857 file=Packages/com.unity.textmeshpro/Editor Resources/Shaders/Hidden/TMP/Internal/Editor/Distance Field SSD pass= ppOnly=0 stripLineD=0 buildPlatform=2 rsLen=0 pKW=UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DESKTOP UNITY_COLORSPACE_GAMMA UNITY_LIGHT_PROBE_PROXY_VOLUME UNITY_LIGHTMAP_RGBM_ENCODING uKW= dKW=OUTLINE_ON UNDERLAY_ON UNDERLAY_INNER UNITY_NO_DXT5nm UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_METAL_SHADOWS_USE_POINT_FILTERING UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF2 UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER UNITY_HARDWARE_TIER1 UNITY_HARDWARE_TIER2 UNITY_HARDWARE_TIER3 UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS UNITY_LIGHTMAP_DLDR_ENCODING UNITY_LIGHTMAP_FULL_HDR UNITY_VIRTUAL_TEXTURING UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION UNITY_ASTC_NORMALMAP_ENCODING SHADER_API_GLES30 UNITY_UNIFIED_SHADER_PRECISION_MODEL flags=0 lang=0 type=Fragment platform=metal reqs=33 mask=6 start=58 ok=1 outsize=1917 - diff --git a/Packages/com.unity.asset-store-tools/CHANGELOG.md b/Packages/com.unity.asset-store-tools/CHANGELOG.md new file mode 100644 index 0000000..8f39a77 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/CHANGELOG.md @@ -0,0 +1,182 @@ +# Changelog +All notable changes to this package will be documented in this file. + +## [11.2.1] - 2023-01-17 + +### Uploader Changes + +- Added a more informative error when exporting content with clashing guid meta files in hidden folders +- Fixed a compilation issue for Unity 2020.1 and 2020.2 +- Fixed a rare error condition when queueing multiple package uploads in quick succession +- Fixed Asset Store Uploader state not being properly reset if the uploading process fails + +### Validator Changes + +- Updated the Asset Store Validator description +- Fixed a rare memory overflow issue when performing package validation + +## [11.2.0] - 2022-11-03 + +### Uploader Changes + +- Uploader will now use the custom package exporter by default + - An option to use the legacy (native) exporter can be found in the Asset Store Publishing Tools' settings window +- When exporting from the Assets folder, package dependencies can now be selected individually instead of being a choice between 'All' or 'None' + - This option is only available with the custom exporter +- Changed the way the Uploader reports completed uploading tasks + - Modal pop-up has been replaced by a new UI view state + - Added an option to the Asset Store Publishing Tools' Settings to display the pop-up after a completed upload +- Changed exported .unitypackage files to have distinguishable file names +- Fixed the Uploader window indefinitely stalling at 100% upload progress when a response from the Asset Store server is not received +- Fixed native package exporter producing broken packages when the export path contained hidden folders +- Fixed an issue with high CPU usage when uploading packages +- Fixed Asset Store Publishing Tools' settings not being saved between Editor sessions on macOS +- Other minor changes and tweaks + +### Validator Changes + +- Added two new tests: + - 'Types have namespaces': checks whether scripts and native libraries under the validated path are nested under a namespace + - 'Consistent line endings': checks whether scripts under the validated path have consistent line endings. This is similar to the warning from the Unity Editor compilation pipeline when a script contains both Windows and UNIX line endings. +- Improved 'Reset Prefabs' test to display and be more informative about prefabs with unusually low transform values +- Improved 'SpeedTree asset inclusion' test to search for '.st' files +- Improved 'Documentation inclusion' test to treat '.md' files as valid documentation files +- Improved 'Lossy audio file inclusion' test to treat '.aif' and '.aiff' files as valid non-lossy audio files +- Improved 'Lossy audio file inclusion' test to search the project for non-lossy variants of existing lossy audio files +- Removed 'Duplicate animation names' test +- Tweaked validation severities for several tests +- Other minor changes and tweaks + +## [11.1.0] - 2022-09-14 + +### Uploader Changes + +- Package Publisher Portal links can now be opened for all packages regardless of package status +- External Dependency Manager can now be selected as a 'Special Folder' if found in the root Assets folder + +### Validator Changes + +- Added category selection for the Validator + - Categories help determine the outcome of package validation more accurately. For example, documentation is not crucial for art packages, but is required for tooling packages. +- Added a list of prefabs with missing mesh references to 'Meshes have Prefabs' test when the test fails +- Corrected the message for a passing 'Shader compilation errors' test +- Improved the floating point precision accuracy of 'Reset Prefabs' test +- Fixed 'Missing Components in Assets' test checking all project folders instead of only the set path +- Fixed 'Prefabs for meshes' test not checking meshes in certain paths +- Fixed 'Reset Prefabs' test failing because of Prefabs with a Rect Transform Component +- Fixed 'Reset Prefabs' test ignoring Transform rotation +- Fixed test description text overlapping in some cases +- Other minor changes and tweaks + +## [11.0.2] - 2022-08-09 + +- Corrected some namespaces which were causing issues when deriving classes from Editor class + +## [11.0.1] - 2022-08-05 + +### Uploader Changes + +- Added Settings window (Asset Store Tools > Settings) +- Added Soft/Junction Symlink support (enable through Settings) +- Added workflow and path selection serialization (workflow saved locally, paths locally and online) +- No more logs when using the `-nullable` compiler option (thanks @alfish) +- Some API refactoring in preparation for CLI support +- Other minor fixes/improvements + +**Note:** when updating Asset Store Tools from the Package Manager, don't forget to remove the old version from the project (V11.0.0) before importing the new one (V11.0.1) + + +## [11.0.0] - 2022-07-20 + +### Uploader changes + +- UI has been reworked using UI Toolkit +- New login window, allowing to login using Unity Cloud Services +- Improved top bar, including search and sorting +- Draft packages moved to the top +- Added category, size, and last modified date next to the package +- Added a link to the publishing portal next to the package +- New uploading flow: “Pre-exported .unitypackage” +- Previous uploading flow (folder selection) has been renamed to “From Assets Folder” +- Dependencies check has been renamed to “Include Package Manifest” for clarity +- Special Folders can now be selected and uploaded together with the package’s main folder (i.e. StreamingAssets, Plugins) +- You can now upload to multiple packages at the same time without waiting for the first one to finish +- Package can now be validated in the Uploading window by pressing the “Validate” button +- Added refresh and logout buttons to the bottom toolbar for easier access +- Packages caching - package information will no longer be redownloaded every time you open the Uploader window during the same Editor session +- (Experimental) Custom exporter - will export your package ~2 times faster, but may miss some asset previews in the final product. To enable it - click three dots on the top left side of the window and enable “Use Custom Exporting” + + +### Validator changes + +- UI has been reworked using UI Toolkit +- New tests based on the new guidelines +- Updated tests’ titles, descriptions, and error reporting + +## [5.0.5] - 2021-11-04 + +- Fixed namespace issues + +## [5.0.4] - 2020-07-28 + +- Fixed issues with Unity 2020.1 + +## [5.0.3] - 2020-05-07 + +- Remove "Remove Standard Assets" check + +## [5.0.2] - 2020-04-21 + +- Enable auto login with Unity account +- Upload package with thread + +## [5.0.1] - 2020-03-23 + +- Fix domain resolve issue + +## [5.0.0] - 2019-10-09 + +- Added "Package Validator" tool +- Added Help window +- Added logout confirmation popup +- Updated toolbar menu layout +- Removed "Mass Labeler" tool +- Updated layout of Login and Package Upload windows +- Error messages are now more elaborate and user-friendly +- Removed deprecated "Main Assets" step from the Package Upload window +- Package Upload window now has a step for including package manager dependencies +- Tooltips are now added to each upload process step + + +## [4.1.0] - 2018-05-14 + +- Made Tool compatible with 2017.1 + +## [4.0.7] - 2017-07-10 + +- Tweaked menu items. + +## [4.0.6] - 2016-07-15 + +- Improved error messages. + +## [4.0.5] - 2016-03-17 + +- Enabling upload of fbm files. + +## [4.0.4] - 2015-11-16 + +- Login improvements + +## [4.0.3] - 2015-11-16 + +- Prepare the Tools for Unity 5.3 + +## [4.0.2] - 2015-10-23 + +- Fixed issue where Upload button would not work for some projects. +- Fixed issues for publishers that only had one package. + +## [4.0.0] - 2015-09-01 + +- Replaced Package Manager with Package Upload. Package management is now handled by Publisher Administration \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/CHANGELOG.md.meta b/Packages/com.unity.asset-store-tools/CHANGELOG.md.meta new file mode 100644 index 0000000..0db1ee3 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 06607220dbd46414e8f66bf9c5e3eb79 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor.meta b/Packages/com.unity.asset-store-tools/Editor.meta new file mode 100644 index 0000000..8521ad6 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 166da5c6fc70e814a8262463903b2714 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/AssemblyInfo.cs b/Packages/com.unity.asset-store-tools/Editor/AssemblyInfo.cs new file mode 100644 index 0000000..8785f9b --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; +[assembly: InternalsVisibleTo("Unity.AssetStoreTools.Editor.Tests.asmdef")] +[assembly: InternalsVisibleTo("ab-builder")] \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/AssemblyInfo.cs.meta b/Packages/com.unity.asset-store-tools/Editor/AssemblyInfo.cs.meta new file mode 100644 index 0000000..972ae52 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssemblyInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ccfd7faf75ab3c74a98015e772288d86 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreTools.cs b/Packages/com.unity.asset-store-tools/Editor/AssetStoreTools.cs new file mode 100644 index 0000000..8b43159 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreTools.cs @@ -0,0 +1,53 @@ +using UnityEditor; +using UnityEngine; +using System; +using AssetStoreTools.Uploader; +using AssetStoreTools.Validator; +using AssetStoreTools.Utility; + +namespace AssetStoreTools +{ + internal class AssetStoreTools : EditorWindow + { + [MenuItem("Asset Store Tools/Asset Store Uploader", false, 0)] + public static void ShowAssetStoreToolsUploader() + { + Type inspectorType = Type.GetType("UnityEditor.InspectorWindow,UnityEditor.dll"); + var wnd = GetWindow(inspectorType); + wnd.Show(); + } + + + [MenuItem("Asset Store Tools/Asset Store Validator", false, 1)] + public static void ShowAssetStoreToolsValidator() + { + Type inspectorType = Type.GetType("UnityEditor.InspectorWindow,UnityEditor.dll"); + var wnd = GetWindow(typeof(AssetStoreUploader), inspectorType); + wnd.Show(); + } + + [MenuItem("Asset Store Tools/Publisher Portal", false, 20)] + public static void OpenPublisherPortal() + { + Application.OpenURL("https://publisher.unity.com/"); + } + + [MenuItem("Asset Store Tools/Submission Guidelines", false, 21)] + public static void OpenSubmissionGuidelines() + { + Application.OpenURL("https://assetstore.unity.com/publishing/submission-guidelines/"); + } + + [MenuItem("Asset Store Tools/Provide Feedback", false, 22)] + public static void OpenFeedback() + { + Application.OpenURL("https://forum.unity.com/threads/new-asset-store-tools-version-coming-july-20th-2022.1310939/"); + } + + [MenuItem("Asset Store Tools/Settings", false, 50)] + public static void OpenSettings() + { + ASToolsPreferencesProvider.OpenSettings(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreTools.cs.meta b/Packages/com.unity.asset-store-tools/Editor/AssetStoreTools.cs.meta new file mode 100644 index 0000000..9452bb0 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreTools.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6060eef206afc844caaa1732538e8890 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreToolsWindow.cs b/Packages/com.unity.asset-store-tools/Editor/AssetStoreToolsWindow.cs new file mode 100644 index 0000000..5aacde9 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreToolsWindow.cs @@ -0,0 +1,22 @@ +using UnityEditor; +using UnityEngine; +using System; + +namespace AssetStoreTools +{ + internal abstract class AssetStoreToolsWindow : EditorWindow + { + protected abstract string WindowTitle { get; } + + protected virtual void Init() + { + titleContent = new GUIContent(WindowTitle); + } + + private void OnEnable() + { + Init(); + } + + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreToolsWindow.cs.meta b/Packages/com.unity.asset-store-tools/Editor/AssetStoreToolsWindow.cs.meta new file mode 100644 index 0000000..2fe87e5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreToolsWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c1057a05baaa45942808573065c02a03 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader.meta b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader.meta new file mode 100644 index 0000000..b4b8661 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9722d52df16aab742b26fe301782c74c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/AssetStoreUploader.cs b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/AssetStoreUploader.cs new file mode 100644 index 0000000..f6ad217 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/AssetStoreUploader.cs @@ -0,0 +1,222 @@ +using AssetStoreTools.Utility.Json; +using System; +using System.Collections.Generic; +using AssetStoreTools.Utility; +using UnityEditor; +using UnityEditor.UIElements; +using UnityEngine; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Uploader +{ + internal class AssetStoreUploader : AssetStoreToolsWindow + { + public const string MinRequiredPackageVersion = "2020.3"; + + private const string MainWindowVisualTree = "Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Styles/Base/BaseWindow_Main"; + private const string DebugPhrase = "debug"; + + // UI Windows + private LoginWindow _loginWindow; + private UploadWindow _uploadWindow; + + private readonly List _debugBuffer = new List(); + + public static bool ShowPackageVersionDialog + { + get => string.Compare(Application.unityVersion, MinRequiredPackageVersion, StringComparison.Ordinal) == -1 && ASToolsPreferences.Instance.UploadVersionCheck; + set { ASToolsPreferences.Instance.UploadVersionCheck = value; ASToolsPreferences.Instance.Save(); } + } + + protected override string WindowTitle => "Asset Store Uploader"; + + protected override void Init() + { + if (_loginWindow != null && _uploadWindow != null) + return; + + minSize = new Vector2(400, 430); + this.SetAntiAliasing(4); + + base.Init(); + + VisualElement root = rootVisualElement; + root.AddToClassList("root"); + + // Getting a reference to the UXML Document and adding to the root + var visualTree = AssetDatabase.LoadAssetAtPath($"{MainWindowVisualTree}.uxml"); + VisualElement uxmlRoot = visualTree.CloneTree(); + uxmlRoot.style.flexGrow = 1; + root.Add(uxmlRoot); + + StyleSelector.SetStyle(root, StyleSelector.Style.Base, !EditorGUIUtility.isProSkin); + + // Find necessary windows / views and sets up appropriate functionality + SetupCoreElements(); + + if (!AssetStoreAPI.IsUploading) + { + // Should only authenticate if the session is available. Other authentications are only available + // in the login window. See "SetupLoginElements". + HideElement(_uploadWindow); + Authenticate(); + } + else + { + ShowUploadWindow(); + } + } + + private void OnGUI() + { + CheckForDebugMode(); + } + + private void OnDestroy() + { + if (AssetStoreAPI.IsUploading) + EditorUtility.DisplayDialog("Notice", "Assets are still being uploaded to the Asset Store. " + + "If you wish to check on the progress, please re-open the Asset Store Uploader window", "OK"); + } + + private void SetupCoreElements() + { + _loginWindow = rootVisualElement.Q("LoginWindow"); + _uploadWindow = rootVisualElement.Q("UploadWindow"); + + _loginWindow.SetupLoginElements(OnLoginSuccess, OnLoginFail); + _uploadWindow.SetupWindows(OnLogout, OnPackageDownloadFail); + } + + #region Login Interface + + private async void Authenticate() + { + ShowLoginWindow(); + + // 1 - Check if there's an active session + // 2 - Check if there's a saved session + // 3 - Attempt to login via Cloud session token + // 4 - Prompt manual login + EnableLoginWindow(false); + var result = await AssetStoreAPI.LoginWithSessionAsync(); + if (result.Success) + OnLoginSuccess(result.Response); + else if (result.SilentFail) + OnLoginFailSession(); + else + OnLoginFail(result.Error); + } + + private void OnLoginFail(ASError error) + { + Debug.LogError(error.Message); + + _loginWindow.EnableErrorBox(true, error.Message); + EnableLoginWindow(true); + } + + private void OnLoginFailSession() + { + // All previous login methods are unavailable + EnableLoginWindow(true); + } + + private void OnLoginSuccess(JsonValue json) + { + ASDebug.Log($"Login json\n{json}"); + + if (!AssetStoreAPI.IsPublisherValid(json, out var error)) + { + EnableLoginWindow(true); + _loginWindow.EnableErrorBox(true, error.Message); + ASDebug.Log($"Publisher {json["name"]} is invalid."); + return; + } + + ASDebug.Log($"Publisher {json["name"]} is valid."); + AssetStoreAPI.SavedSessionId = json["xunitysession"].AsString(); + AssetStoreAPI.LastLoggedInUser = json["username"].AsString(); + + ShowUploadWindow(); + } + + private void OnPackageDownloadFail(ASError error) + { + _loginWindow.EnableErrorBox(true, error.Message); + EnableLoginWindow(true); + ShowLoginWindow(); + } + + private void OnLogout() + { + AssetStoreAPI.SavedSessionId = String.Empty; + AssetStoreCache.ClearTempCache(); + + _loginWindow.ClearLoginBoxes(); + ShowLoginWindow(); + EnableLoginWindow(true); + } + + #endregion + + #region UI Window Utils + private void ShowLoginWindow() + { + HideElement(_uploadWindow); + ShowElement(_loginWindow); + } + + private void ShowUploadWindow() + { + HideElement(_loginWindow); + ShowElement(_uploadWindow); + + _uploadWindow.ShowAllPackagesView(); + _uploadWindow.ShowPublisherEmail(AssetStoreAPI.LastLoggedInUser); + _uploadWindow.LoadPackages(true, OnPackageDownloadFail); + } + + private void ShowElement(params VisualElement[] elements) + { + foreach(var e in elements) + e.style.display = DisplayStyle.Flex; + } + + private void HideElement(params VisualElement[] elements) + { + foreach(var e in elements) + e.style.display = DisplayStyle.None; + } + + private void EnableLoginWindow(bool enable) + { + _loginWindow.SetEnabled(enable); + } + + #endregion + + #region Debug Utility + + private void CheckForDebugMode() + { + Event e = Event.current; + + if (e.type != EventType.KeyDown || e.keyCode == KeyCode.None) + return; + + _debugBuffer.Add(e.keyCode.ToString().ToLower()[0]); + if (_debugBuffer.Count > DebugPhrase.Length) + _debugBuffer.RemoveAt(0); + + if (string.Join(string.Empty, _debugBuffer.ToArray()) != DebugPhrase) + return; + + ASDebug.DebugModeEnabled = !ASDebug.DebugModeEnabled; + ASDebug.Log($"DEBUG MODE ENABLED: {ASDebug.DebugModeEnabled}"); + _debugBuffer.Clear(); + } + + #endregion + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/AssetStoreUploader.cs.meta b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/AssetStoreUploader.cs.meta new file mode 100644 index 0000000..ef78266 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/AssetStoreUploader.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7b5319699cc84194a9a768ad33b86c21 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Icons.meta b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Icons.meta new file mode 100644 index 0000000..7026063 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Icons.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ab9d0e254817f4f4589a6a378d77babc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Icons/open-in-browser.png b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Icons/open-in-browser.png new file mode 100644 index 0000000..245875b Binary files /dev/null and b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Icons/open-in-browser.png differ diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Icons/open-in-browser.png.meta b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Icons/open-in-browser.png.meta new file mode 100644 index 0000000..26ccaa5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Icons/open-in-browser.png.meta @@ -0,0 +1,147 @@ +fileFormatVersion: 2 +guid: e7df43612bbf44d4692de879c751902a +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Icons/publisher_portal_black.png b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Icons/publisher_portal_black.png new file mode 100644 index 0000000..621e906 Binary files /dev/null and b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Icons/publisher_portal_black.png differ diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Icons/publisher_portal_black.png.meta b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Icons/publisher_portal_black.png.meta new file mode 100644 index 0000000..305aa31 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Icons/publisher_portal_black.png.meta @@ -0,0 +1,128 @@ +fileFormatVersion: 2 +guid: 8e0749dce5b14cc46b73b0303375c162 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Icons/publisher_portal_white.png b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Icons/publisher_portal_white.png new file mode 100644 index 0000000..70f4703 Binary files /dev/null and b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Icons/publisher_portal_white.png differ diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Icons/publisher_portal_white.png.meta b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Icons/publisher_portal_white.png.meta new file mode 100644 index 0000000..a0f1369 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Icons/publisher_portal_white.png.meta @@ -0,0 +1,128 @@ +fileFormatVersion: 2 +guid: 003e2710f9b29d94c87632022a3c7c48 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 18 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 2 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 2 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 2 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 2 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts.meta b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts.meta new file mode 100644 index 0000000..63c6efc --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 15b24ad8f9d236249910fb8eef1e30ea +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/ASAnalytics.cs b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/ASAnalytics.cs new file mode 100644 index 0000000..a0feb73 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/ASAnalytics.cs @@ -0,0 +1,47 @@ +using UnityEditor; +using UnityEngine.Analytics; + +namespace AssetStoreTools.Uploader +{ + internal static class ASAnalytics + { + private const int VersionId = 3; + private const int MaxEventsPerHour = 20; + private const int MaxNumberOfElements = 1000; + + private const string VendorKey = "unity.assetStoreTools"; + private const string EventName = "assetStoreTools"; + + static bool EnableAnalytics() + { + var result = EditorAnalytics.RegisterEventWithLimit(EventName, MaxEventsPerHour, MaxNumberOfElements, VendorKey, VersionId); + return result == AnalyticsResult.Ok; + } + + [System.Serializable] + public struct AnalyticsData + { + public string ToolVersion; + public string PackageId; + public string Category; + public bool UsedValidator; + public string ValidatorResults; + public string UploadFinishedReason; + public double TimeTaken; + public long PackageSize; + public string Workflow; + public string EndpointUrl; + } + + public static void SendUploadingEvent(AnalyticsData data) + { + if (!EditorAnalytics.enabled) + return; + + if (!EnableAnalytics()) + return; + + EditorAnalytics.SendEventWithLimit(EventName, data, VersionId); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/ASAnalytics.cs.meta b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/ASAnalytics.cs.meta new file mode 100644 index 0000000..22a47b1 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/ASAnalytics.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1095145789a64767a6add837eea19786 +timeCreated: 1658832954 \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/ASDebug.cs b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/ASDebug.cs new file mode 100644 index 0000000..ed116ab --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/ASDebug.cs @@ -0,0 +1,64 @@ +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Uploader +{ + internal static class ASDebug + { + private enum LogType + { + Log, + Warning, + Error + } + + private static bool s_debugModeEnabled = EditorPrefs.GetBool("ASTDebugMode"); + + public static bool DebugModeEnabled + { + get => s_debugModeEnabled; + set + { + s_debugModeEnabled = value; + EditorPrefs.SetBool("ASTDebugMode", value); + } + } + + public static void Log(object message) + { + LogMessage(message, LogType.Log); + } + + public static void LogWarning(object message) + { + LogMessage(message, LogType.Warning); + } + + public static void LogError(object message) + { + LogMessage(message, LogType.Error); + } + + private static void LogMessage(object message, LogType type) + { + if (!DebugModeEnabled) + return; + + switch (type) + { + case LogType.Log: + Debug.Log(message); + break; + case LogType.Warning: + Debug.LogWarning(message); + break; + case LogType.Error: + Debug.LogError(message); + break; + default: + Debug.Log(message); + break; + } + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/ASDebug.cs.meta b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/ASDebug.cs.meta new file mode 100644 index 0000000..2f4aab7 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/ASDebug.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 478caa497d99100429a0509fa487bfe4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/ASError.cs b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/ASError.cs new file mode 100644 index 0000000..142d5d5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/ASError.cs @@ -0,0 +1,93 @@ +using System; +using System.Net; +using System.Net.Http; + +namespace AssetStoreTools.Uploader +{ + /// + /// A structure for retrieving and converting errors from Asset Store Tools class methods + /// + internal class ASError + { + public string Message { get; private set; } + public Exception Exception { get; private set; } + + public ASError() { } + + public static ASError GetGenericError(Exception ex) + { + ASError error = new ASError() + { + Message = ex.Message, + Exception = ex + }; + + return error; + } + + public static ASError GetLoginError(HttpResponseMessage response) => GetLoginError(response, null); + + public static ASError GetLoginError(HttpResponseMessage response, HttpRequestException ex) + { + ASError error = new ASError() { Exception = ex }; + + switch (response.StatusCode) + { + // Add common error codes here + case HttpStatusCode.Unauthorized: + error.Message = "Incorrect email and/or password. Please try again."; + break; + case HttpStatusCode.InternalServerError: + error.Message = "Authentication request failed\nIf you were logging in with your Unity Cloud account, please make sure you are still logged in.\n" + + "This might also be caused by too many invalid login attempts - if that is the case, please try again later."; + break; + default: + ParseHtmlMessage(response, out string message); + error.Message = message; + break; + } + + return error; + } + + public static ASError GetPublisherNullError(string publisherName) + { + ASError error = new ASError + { + Message = $"Your Unity ID {publisherName} is not currently connected to a publisher account. " + + $"Please create a publisher profile." + }; + + return error; + } + + private static bool ParseHtmlMessage(HttpResponseMessage response, out string message) + { + message = "An undefined error has been encountered"; + string html = response.Content.ReadAsStringAsync().Result; + + if (!html.Contains("", StringComparison.Ordinal) + "

".Length; + var endIndex = html.IndexOf("

", StringComparison.Ordinal); + + if (startIndex == -1 || endIndex == -1) + return false; + + string htmlBodyMessage = html.Substring(startIndex, (endIndex - startIndex)); + htmlBodyMessage = htmlBodyMessage.Replace("\n", " "); + + message += htmlBodyMessage; + message += "\n\nIf this error message is not very informative, please report this to Unity"; + + return true; + } + + public override string ToString() + { + return Message; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/ASError.cs.meta b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/ASError.cs.meta new file mode 100644 index 0000000..3e3eee6 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/ASError.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 265ad6f65404f8c42aec35d3b8e6f970 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/AssetStoreAPI.cs b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/AssetStoreAPI.cs new file mode 100644 index 0000000..367fa24 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/AssetStoreAPI.cs @@ -0,0 +1,770 @@ +using AssetStoreTools.Utility.Json; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Uploader +{ + /// + /// A class for retrieving data from the Asset Store backend + /// Note: most data retrieval methods require to be set + /// + internal static class AssetStoreAPI + { + public const string ToolVersion = "V6.2.1"; + private const string UnauthSessionId = "26c4202eb475d02864b40827dfff11a14657aa41"; + private const string KharmaSessionId = "kharma.sessionid"; + private const int UploadResponseTimeoutMs = 10000; + + public static string AssetStoreProdUrl = "https://kharma.unity3d.com"; + private static string s_sessionId = EditorPrefs.GetString(KharmaSessionId); + private static HttpClient httpClient = new HttpClient(); + private static CancellationTokenSource s_downloadCancellationSource; + + public static string SavedSessionId + { + get => s_sessionId; + set + { + s_sessionId = value; + EditorPrefs.SetString(KharmaSessionId, value); + httpClient.DefaultRequestHeaders.Clear(); + if (!string.IsNullOrEmpty(value)) + httpClient.DefaultRequestHeaders.Add("X-Unity-Session", SavedSessionId); + } + } + + public static bool IsCloudUserAvailable => CloudProjectSettings.userName != "anonymous"; + public static string LastLoggedInUser = ""; + public static ConcurrentDictionary ActiveUploads = new ConcurrentDictionary(); + public static bool IsUploading => (ActiveUploads.Count > 0); + + static AssetStoreAPI() + { + ServicePointManager.DefaultConnectionLimit = 500; + httpClient.DefaultRequestHeaders.ConnectionClose = false; + httpClient.Timeout = TimeSpan.FromMinutes(1320); + } + + /// + /// A structure used to return the success outcome and the result of Asset Store API calls + /// + internal class APIResult + { + public JsonValue Response; + public bool Success; + public bool SilentFail; + public ASError Error; + + public static implicit operator bool(APIResult value) + { + return value != null && value.Success != false; + } + } + + #region Login API + + /// + /// A login API call that uses the email and password credentials + /// + /// + /// Note: this method only returns a response from the server and does not set the itself + /// + public static async Task LoginWithCredentialsAsync(string email, string password) + { + FormUrlEncodedContent data = GetLoginContent(new Dictionary { { "user", email }, { "pass", password } }); + return await LoginAsync(data); + } + + /// + /// A login API call that uses the + /// + /// + /// Note: this method only returns a response from the server and does not set the itself + /// + public static async Task LoginWithSessionAsync() + { + if (string.IsNullOrEmpty(SavedSessionId)) + return new APIResult() { Success = false, SilentFail = true, Error = ASError.GetGenericError(new Exception("No active session available")) }; + + FormUrlEncodedContent data = GetLoginContent(new Dictionary { { "reuse_session", SavedSessionId }, { "xunitysession", UnauthSessionId } }); + return await LoginAsync(data); + } + + /// + /// A login API call that uses the + /// + /// + /// Note: this method only returns a response from the server and does not set the itself + /// + /// Cloud access token. Can be retrieved by calling + public static async Task LoginWithTokenAsync(string token) + { + FormUrlEncodedContent data = GetLoginContent(new Dictionary { { "user_access_token", token } }); + return await LoginAsync(data); + } + + private static async Task LoginAsync(FormUrlEncodedContent data) + { + OverrideAssetStoreUrl(); + Uri uri = new Uri($"{AssetStoreProdUrl}/login"); + + httpClient.DefaultRequestHeaders.Clear(); + httpClient.DefaultRequestHeaders.Add("Accept", "application/json"); + + try + { + var response = await httpClient.PostAsync(uri, data); + return UploadValuesCompletedLogin(response); + } + catch (Exception e) + { + return new APIResult() { Success = false, Error = ASError.GetGenericError(e) }; + } + } + + private static APIResult UploadValuesCompletedLogin(HttpResponseMessage response) + { + ASDebug.Log($"Upload Values Complete {response.ReasonPhrase}"); + ASDebug.Log($"Login success? {response.IsSuccessStatusCode}"); + try + { + response.EnsureSuccessStatusCode(); + var responseResult = response.Content.ReadAsStringAsync().Result; + var success = JSONParser.AssetStoreResponseParse(responseResult, out ASError error, out JsonValue jsonResult); + if (success) + return new APIResult() { Success = true, Response = jsonResult }; + else + return new APIResult() { Success = false, Error = error }; + } + catch (HttpRequestException ex) + { + return new APIResult() { Success = false, Error = ASError.GetLoginError(response, ex) }; + } + } + + #endregion + + #region Package Metadata API + + private static async Task GetPackageDataMain() + { + return await GetAssetStoreData(APIUri("asset-store-tools", "metadata/0", SavedSessionId)); + } + + private static async Task GetPackageDataExtra() + { + return await GetAssetStoreData(APIUri("management", "packages", SavedSessionId)); + } + + private static async Task GetCategories(bool useCached) + { + if (useCached) + { + if (AssetStoreCache.GetCachedCategories(out JsonValue cachedCategoryJson)) + return cachedCategoryJson; + + ASDebug.LogWarning("Failed to retrieve cached category data. Proceeding to download"); + } + var categoryJson = await GetAssetStoreData(APIUri("management", "categories", SavedSessionId)); + AssetStoreCache.CacheCategories(categoryJson); + + return categoryJson; + } + + /// + /// Retrieve data for all packages associated with the currently logged in account (identified by ) + /// + /// + /// + public static async Task GetFullPackageDataAsync(bool useCached) + { + if (useCached) + { + if (AssetStoreCache.GetCachedPackageMetadata(out JsonValue cachedData)) + return new APIResult() { Success = true, Response = cachedData }; + + ASDebug.LogWarning("Failed to retrieve cached package metadata. Proceeding to download"); + } + + try + { + var jsonMainData = await GetPackageDataMain(); + var jsonExtraData = await GetPackageDataExtra(); + var jsonCategoryData = await GetCategories(useCached); + + var joinedData = MergePackageData(jsonMainData, jsonExtraData, jsonCategoryData); + AssetStoreCache.CachePackageMetadata(joinedData); + + return new APIResult() { Success = true, Response = joinedData }; + } + catch (OperationCanceledException e) + { + ASDebug.Log("Package metadata download operation cancelled"); + DisposeDownloadCancellation(); + return new APIResult() { Success = false, SilentFail = true, Error = ASError.GetGenericError(e) }; + } + catch (Exception e) + { + return new APIResult() { Success = false, Error = ASError.GetGenericError(e) }; + } + } + + /// + /// Retrieve the thumbnail textures for all packages within the provided json structure and perform a given action after each retrieval + /// + /// A json file retrieved from + /// Return cached thumbnails if they are found + /// + /// Action to perform upon a successful thumbnail retrieval + /// - Package Id
+ /// - Associated Thumbnail + /// + /// + /// Action to perform upon a failed thumbnail retrieval + /// - Package Id
+ /// - Associated error + /// + public static async void GetPackageThumbnails(JsonValue packageJson, bool useCached, Action onSuccess, Action onFail) + { + SetupDownloadCancellation(); + var packageDict = packageJson["packages"].AsDict(); + var packageEnum = packageDict.GetEnumerator(); + + for (int i = 0; i < packageDict.Count; i++) + { + packageEnum.MoveNext(); + var package = packageEnum.Current; + + try + { + s_downloadCancellationSource.Token.ThrowIfCancellationRequested(); + + if (package.Value["icon_url"] + .IsNull()) // If no URL is found in the package metadata, use the default image + { + Texture2D fallbackTexture = null; + ASDebug.Log($"Package {package.Key} has no thumbnail. Returning default image"); + onSuccess?.Invoke(package.Key, fallbackTexture); + continue; + } + + if (useCached && + AssetStoreCache.GetCachedTexture(package.Key, + out Texture2D texture)) // Try returning cached thumbnails first + { + ASDebug.Log($"Returning cached thumbnail for package {package.Key}"); + onSuccess?.Invoke(package.Key, texture); + continue; + } + + var textureBytes = + await DownloadPackageThumbnail(package.Value["icon_url"].AsString()); + Texture2D tex = new Texture2D(1, 1, TextureFormat.RGBA32, false); + tex.LoadImage(textureBytes); + AssetStoreCache.CacheTexture(package.Key, tex); + ASDebug.Log($"Returning downloaded thumbnail for package {package.Key}"); + onSuccess?.Invoke(package.Key, tex); + } + catch (OperationCanceledException) + { + DisposeDownloadCancellation(); + ASDebug.Log("Package thumbnail download operation cancelled"); + return; + } + catch (Exception e) + { + onFail?.Invoke(package.Key, ASError.GetGenericError(e)); + } + finally + { + packageEnum.Dispose(); + } + } + } + + private static async Task DownloadPackageThumbnail(string url) + { + // icon_url is presented without http/https + Uri uri = new Uri($"https:{url}"); + + var textureBytes = await httpClient.GetAsync(uri, s_downloadCancellationSource.Token). + ContinueWith((response) => response.Result.Content.ReadAsByteArrayAsync().Result, s_downloadCancellationSource.Token); + s_downloadCancellationSource.Token.ThrowIfCancellationRequested(); + return textureBytes; + } + + /// + /// Retrieve, update the cache and return the updated data for a previously cached package + /// + public static async Task GetRefreshedPackageData(string packageId) + { + try + { + var refreshedDataJson = await GetPackageDataExtra(); + var refreshedPackage = default(JsonValue); + + // Find the updated package data in the latest data json + foreach (var p in refreshedDataJson["packages"].AsList()) + { + if (p["id"] == packageId) + { + refreshedPackage = p["versions"].AsList()[p["versions"].AsList().Count - 1]; + break; + } + } + + if (refreshedPackage.Equals(default(JsonValue))) + return new APIResult() { Success = false, Error = ASError.GetGenericError(new MissingMemberException($"Unable to find downloaded package data for package id {packageId}")) }; + + // Check if the supplied package id data has been cached and if it contains the corresponding package + if (!AssetStoreCache.GetCachedPackageMetadata(out JsonValue cachedData) || + !cachedData["packages"].AsDict().ContainsKey(packageId)) + return new APIResult() { Success = false, Error = ASError.GetGenericError(new MissingMemberException($"Unable to find cached package id {packageId}")) }; + + var cachedPackage = cachedData["packages"].AsDict()[packageId]; + + // Retrieve the category map + var categoryJson = await GetCategories(true); + var categories = CreateCategoryDictionary(categoryJson); + + // Update the package data + cachedPackage["name"] = refreshedPackage["name"].AsString(); + cachedPackage["status"] = refreshedPackage["status"].AsString(); + cachedPackage["extra_info"].AsDict()["category_info"].AsDict()["id"] = refreshedPackage["category_id"].AsString(); + cachedPackage["extra_info"].AsDict()["category_info"].AsDict()["name"] = + categories.ContainsKey(refreshedPackage["category_id"]) ? categories[refreshedPackage["category_id"].AsString()] : "Unknown"; + cachedPackage["extra_info"].AsDict()["modified"] = refreshedPackage["modified"].AsString(); + cachedPackage["extra_info"].AsDict()["size"] = refreshedPackage["size"].AsString(); + + AssetStoreCache.CachePackageMetadata(cachedData); + return new APIResult() { Success = true, Response = cachedPackage }; + } + catch (OperationCanceledException) + { + ASDebug.Log("Package metadata download operation cancelled"); + DisposeDownloadCancellation(); + return new APIResult() { Success = false, SilentFail = true }; + } + catch (Exception e) + { + return new APIResult() { Success = false, Error = ASError.GetGenericError(e) }; + } + } + + /// + /// Retrieve all Unity versions that the given package has already had uploaded content with + /// + /// + /// + /// + public static List GetPackageUploadedVersions(string packageId, string versionId) + { + var versions = new List(); + try + { + // Retrieve the data for already uploaded versions (should prevent interaction with Uploader) + var versionsTask = Task.Run(() => GetAssetStoreData(APIUri("content", $"preview/{packageId}/{versionId}", SavedSessionId))); + if (!versionsTask.Wait(5000)) + throw new TimeoutException("Could not retrieve uploaded versions within a reasonable time interval"); + + var versionsJson = versionsTask.Result; + foreach (var version in versionsJson["content"].AsDict()["unity_versions"].AsList()) + versions.Add(version.AsString()); + } + catch (OperationCanceledException) + { + ASDebug.Log("Package version download operation cancelled"); + DisposeDownloadCancellation(); + } + catch (Exception e) + { + ASDebug.LogError(e); + } + + return versions; + } + + #endregion + + #region Package Upload API + + /// + /// Upload a content file (.unitypackage) to a provided package version + /// + /// + /// Name of the package. Only used for identifying the package in class + /// Path to the .unitypackage file + /// The value of the main content folder for the provided package + /// The local path (relative to the root project folder) of the main content folder for the provided package + /// The path to the project that this package was built from + /// + public static async Task UploadPackageAsync(string versionId, string packageName, string filePath, + string localPackageGuid, string localPackagePath, string localProjectPath) + { + try + { + ASDebug.Log("Upload task starting"); + EditorApplication.LockReloadAssemblies(); + + if (!IsUploading) // Only subscribe before the first upload + EditorApplication.playModeStateChanged += EditorPlayModeStateChangeHandler; + + var progressData = new OngoingUpload(versionId, packageName); + ActiveUploads.TryAdd(versionId, progressData); + + var result = await Task.Run(() => UploadPackageTask(progressData, filePath, localPackageGuid, localPackagePath, localProjectPath)); + + ActiveUploads.TryRemove(versionId, out OngoingUpload _); + + ASDebug.Log("Upload task finished"); + return result; + } + catch (Exception e) + { + ASDebug.LogError("Upload task failed with an exception: " + e); + ActiveUploads.TryRemove(versionId, out OngoingUpload _); + return PackageUploadResult.PackageUploadFail(ASError.GetGenericError(e)); + } + finally + { + if (!IsUploading) // Only unsubscribe after the last upload + EditorApplication.playModeStateChanged -= EditorPlayModeStateChangeHandler; + + EditorApplication.UnlockReloadAssemblies(); + } + } + + private static PackageUploadResult UploadPackageTask(OngoingUpload currentUpload, string filePath, + string localPackageGuid, string localPackagePath, string localProjectPath) + { + ASDebug.Log("Preparing to upload package within API"); + string api = "asset-store-tools"; + string uri = $"package/{currentUpload.VersionId}/unitypackage"; + + Dictionary packageParams = new Dictionary + { + // Note: project_path is currently used to store UI selections + {"root_guid", localPackageGuid}, + {"root_path", localPackagePath}, + {"project_path", localProjectPath} + }; + + ASDebug.Log($"Creating upload request for {currentUpload.VersionId} {currentUpload.PackageName}"); + + FileStream requestFileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read); + + bool responseTimedOut = false; + long chunkSize = 32768; + try + { + ASDebug.Log("Starting upload process..."); + + var content = new StreamContent(requestFileStream, (int)chunkSize); + var response = httpClient.PutAsync(APIUri(api, uri, SavedSessionId, packageParams), content, currentUpload.CancellationToken); + + // Progress tracking + int updateIntervalMs = 100; + bool allBytesSent = false; + DateTime timeOfCompletion = default(DateTime); + + while (!response.IsCompleted) + { + float uploadProgress = (float)requestFileStream.Position / requestFileStream.Length * 100; + currentUpload.UpdateProgress(uploadProgress); + Thread.Sleep(updateIntervalMs); + + // A timeout for rare cases, when package uploading reaches 100%, but PutAsync task IsComplete value remains 'False' + if (requestFileStream.Position == requestFileStream.Length) + { + if (!allBytesSent) + { + allBytesSent = true; + timeOfCompletion = DateTime.UtcNow; + } + else if (DateTime.UtcNow.Subtract(timeOfCompletion).TotalMilliseconds > UploadResponseTimeoutMs) + { + responseTimedOut = true; + currentUpload.Cancel(); + break; + } + } + } + + // 2020.3 - although cancellation token shows a requested cancellation, the HttpClient + // tends to return a false 'IsCanceled' value, thus yielding an exception when attempting to read the response. + // For now we'll just check the token as well, but this needs to be investigated later on. + if (response.IsCanceled || currentUpload.CancellationToken.IsCancellationRequested) + currentUpload.CancellationToken.ThrowIfCancellationRequested(); + + var responseString = response.Result.Content.ReadAsStringAsync().Result; + + var success = JSONParser.AssetStoreResponseParse(responseString, out ASError error, out JsonValue json); + ASDebug.Log("Upload response JSON: " + json.ToString()); + if (success) + return PackageUploadResult.PackageUploadSuccess(); + else + return PackageUploadResult.PackageUploadFail(error); + } + catch (OperationCanceledException) + { + // Uploading is canceled + if (!responseTimedOut) + { + ASDebug.Log("Upload operation cancelled"); + return PackageUploadResult.PackageUploadCancelled(); + } + else + { + ASDebug.LogWarning("All data has been uploaded, but waiting for the response timed out"); + return PackageUploadResult.PackageUploadResponseTimeout(); + } + } + catch (Exception e) + { + ASDebug.LogError("Upload operation encountered an undefined exception: " + e); + var fullError = e.InnerException != null ? ASError.GetGenericError(e.InnerException) : ASError.GetGenericError(e); + return PackageUploadResult.PackageUploadFail(fullError); + } + finally + { + requestFileStream.Dispose(); + currentUpload.Dispose(); + } + } + + /// + /// Cancel the uploading task for a package with the provided package id + /// + public static void AbortPackageUpload(string packageId) + { + ActiveUploads[packageId]?.Cancel(); + } + + #endregion + + #region Utility Methods + private static string GetLicenseHash() + { + return UnityEditorInternal.InternalEditorUtility.GetAuthToken().Substring(0, 40); + } + + private static string GetHardwareHash() + { + return UnityEditorInternal.InternalEditorUtility.GetAuthToken().Substring(40, 40); + } + + private static FormUrlEncodedContent GetLoginContent(Dictionary loginData) + { + loginData.Add("unityversion", Application.unityVersion); + loginData.Add("toolversion", ToolVersion); + loginData.Add("license_hash", GetLicenseHash()); + loginData.Add("hardware_hash", GetHardwareHash()); + + return new FormUrlEncodedContent(loginData); + } + + private static async Task GetAssetStoreData(Uri uri) + { + SetupDownloadCancellation(); + + var response = await httpClient.GetAsync(uri, s_downloadCancellationSource.Token) + .ContinueWith((x) => x.Result.Content.ReadAsStringAsync().Result, s_downloadCancellationSource.Token); + s_downloadCancellationSource.Token.ThrowIfCancellationRequested(); + + if (!JSONParser.AssetStoreResponseParse(response, out var error, out var jsonMainData)) + throw error.Exception; + + return jsonMainData; + } + + private static Uri APIUri(string apiPath, string endPointPath, string sessionId) + { + return APIUri(apiPath, endPointPath, sessionId, null); + } + + // Method borrowed from A$ tools, could maybe be simplified to only retain what is necessary? + private static Uri APIUri(string apiPath, string endPointPath, string sessionId, IDictionary extraQuery) + { + Dictionary extraQueryMerged; + + if (extraQuery == null) + extraQueryMerged = new Dictionary(); + else + extraQueryMerged = new Dictionary(extraQuery); + + extraQueryMerged.Add("unityversion", Application.unityVersion); + extraQueryMerged.Add("toolversion", ToolVersion); + extraQueryMerged.Add("xunitysession", sessionId); + + string uriPath = $"{AssetStoreProdUrl}/api/{apiPath}/{endPointPath}.json"; + UriBuilder uriBuilder = new UriBuilder(uriPath); + + StringBuilder queryToAppend = new StringBuilder(); + foreach (KeyValuePair queryPair in extraQueryMerged) + { + string queryName = queryPair.Key; + string queryValue = Uri.EscapeDataString(queryPair.Value); + + queryToAppend.AppendFormat("&{0}={1}", queryName, queryValue); + } + if (!string.IsNullOrEmpty(uriBuilder.Query)) + uriBuilder.Query = uriBuilder.Query.Substring(1) + queryToAppend; + else + uriBuilder.Query = queryToAppend.Remove(0, 1).ToString(); + + return uriBuilder.Uri; + } + + private static JsonValue MergePackageData(JsonValue mainPackageData, JsonValue extraPackageData, JsonValue categoryData) + { + ASDebug.Log($"Main package data\n{mainPackageData}"); + var mainDataDict = mainPackageData["packages"].AsDict(); + + // Most likely both of them will be true at the same time, but better to be safe + if (mainDataDict.Count == 0 || !extraPackageData.ContainsKey("packages")) + return new JsonValue(); + + ASDebug.Log($"Extra package data\n{extraPackageData}"); + var extraDataDict = extraPackageData["packages"].AsList(); + + var categories = CreateCategoryDictionary(categoryData); + + foreach (var md in mainDataDict) + { + foreach (var ed in extraDataDict) + { + if (ed["id"].AsString() != md.Key) + continue; + + // Create a field for extra data + var extraData = JsonValue.NewDict(); + + // Add category field + var categoryEntry = JsonValue.NewDict(); + + var categoryId = ed["category_id"].AsString(); + var categoryName = categories.ContainsKey(categoryId) ? categories[categoryId] : "Unknown"; + + categoryEntry["id"] = categoryId; + categoryEntry["name"] = categoryName; + + extraData["category_info"] = categoryEntry; + + // Add modified time and size + var versions = ed["versions"].AsList(); + extraData["modified"] = versions[versions.Count - 1]["modified"]; + extraData["size"] = versions[versions.Count - 1]["size"]; + + md.Value.AsDict()["extra_info"] = extraData; + } + } + + mainPackageData.AsDict()["packages"] = new JsonValue(mainDataDict); + return mainPackageData; + } + + private static Dictionary CreateCategoryDictionary(JsonValue json) + { + var categories = new Dictionary(); + + var list = json.AsList(); + + for (int i = 0; i < list.Count; i++) + { + var category = list[i].AsDict(); + if (category["status"].AsString() == "deprecated") + continue; + categories.Add(category["id"].AsString(), category["assetstore_name"].AsString()); + } + + return categories; + } + + /// + /// Check if the account data is for a valid publisher account + /// + /// Json structure retrieved from one of the API login methods + public static bool IsPublisherValid(JsonValue json, out ASError error) + { + error = ASError.GetPublisherNullError(json["name"]); + + if (!json.ContainsKey("publisher")) + return false; + + // If publisher account is not created - let them know + return !json["publisher"].IsNull(); + } + + /// + /// Cancel all data retrieval tasks + /// + public static void AbortDownloadTasks() + { + s_downloadCancellationSource?.Cancel(); + } + + /// + /// Cancel all data uploading tasks + /// + public static void AbortUploadTasks() + { + foreach (var upload in ActiveUploads) + { + AbortPackageUpload(upload.Key); + } + } + + private static void SetupDownloadCancellation() + { + if (s_downloadCancellationSource != null && s_downloadCancellationSource.IsCancellationRequested) + DisposeDownloadCancellation(); + + if (s_downloadCancellationSource == null) + s_downloadCancellationSource = new CancellationTokenSource(); + } + + private static void DisposeDownloadCancellation() + { + s_downloadCancellationSource?.Dispose(); + s_downloadCancellationSource = null; + } + + private static void EditorPlayModeStateChangeHandler(PlayModeStateChange state) + { + if (state != PlayModeStateChange.ExitingEditMode) + return; + + EditorApplication.ExitPlaymode(); + EditorUtility.DisplayDialog("Notice", "Entering Play Mode is not allowed while there's a package upload in progress.\n\n" + + "Please wait until the upload is finished or cancel the upload from the Asset Store Uploader window", "OK"); + } + + private static void OverrideAssetStoreUrl() + { + var args = Environment.GetCommandLineArgs(); + for (var i = 0; i < args.Length; i++) + { + if (!args[i].Equals("-assetStoreUrl")) + continue; + + if (i + 1 >= args.Length) + return; + + ASDebug.Log($"Overriding A$ URL to: {args[i + 1]}"); + AssetStoreProdUrl = args[i + 1]; + return; + } + } + + #endregion + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/AssetStoreAPI.cs.meta b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/AssetStoreAPI.cs.meta new file mode 100644 index 0000000..d248bfe --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/AssetStoreAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 684fca3fffd79d944a32d9b3adbfc007 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/AssetStoreCache.cs b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/AssetStoreCache.cs new file mode 100644 index 0000000..856688e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/AssetStoreCache.cs @@ -0,0 +1,128 @@ +using AssetStoreTools.Utility.Json; +using System.IO; +using System.Text; +using UnityEngine; + +namespace AssetStoreTools.Uploader +{ + internal static class AssetStoreCache + { + public const string TempCachePath = "Temp/AssetStoreToolsCache"; + public const string PersistentCachePath = "Library/AssetStoreToolsCache"; + + private const string PackageDataFile = "PackageMetadata.json"; + private const string CategoryDataFile = "Categories.json"; + + private static void CreateFileInTempCache(string fileName, object content, bool overwrite) + { + CreateCacheFile(TempCachePath, fileName, content, overwrite); + } + + private static void CreateFileInPersistentCache(string fileName, object content, bool overwrite) + { + CreateCacheFile(PersistentCachePath, fileName, content, overwrite); + } + + private static void CreateCacheFile(string rootPath, string fileName, object content, bool overwrite) + { + if (!Directory.Exists(rootPath)) + Directory.CreateDirectory(rootPath); + + var fullPath = Path.Combine(rootPath, fileName); + + if(File.Exists(fullPath)) + { + if (overwrite) + File.Delete(fullPath); + else + return; + } + + switch (content) + { + case byte[] bytes: + File.WriteAllBytes(fullPath, bytes); + break; + default: + File.WriteAllText(fullPath, content.ToString()); + break; + } + } + + public static void ClearTempCache() + { + if (!File.Exists(Path.Combine(TempCachePath, PackageDataFile))) + return; + + // Cache consists of package data and package texture thumbnails. We don't clear + // texture thumbnails here since they are less likely to change. They are still + // deleted and redownloaded every project restart (because of being stored in the 'Temp' folder) + File.Delete(Path.Combine(TempCachePath, PackageDataFile)); + } + + public static void CacheCategories(JsonValue data) + { + CreateFileInTempCache(CategoryDataFile, data, true); + } + + public static bool GetCachedCategories(out JsonValue data) + { + data = new JsonValue(); + var path = Path.Combine(TempCachePath, CategoryDataFile); + if (!File.Exists(path)) + return false; + + data = JSONParser.SimpleParse(File.ReadAllText(path, Encoding.UTF8)); + return true; + } + + public static void CachePackageMetadata(JsonValue data) + { + CreateFileInTempCache(PackageDataFile, data.ToString(), true); + } + + public static bool GetCachedPackageMetadata(out JsonValue data) + { + data = new JsonValue(); + var path = Path.Combine(TempCachePath, PackageDataFile); + if (!File.Exists(path)) + return false; + + data = JSONParser.SimpleParse(File.ReadAllText(path, Encoding.UTF8)); + return true; + } + + public static void CacheTexture(string packageId, Texture2D texture) + { + CreateFileInTempCache($"{packageId}.png", texture.EncodeToPNG(), true); + } + + public static bool GetCachedTexture(string packageId, out Texture2D texture) + { + texture = new Texture2D(1, 1); + var path = Path.Combine(TempCachePath, $"{packageId}.png"); + if (!File.Exists(path)) + return false; + + texture.LoadImage(File.ReadAllBytes(path)); + return true; + } + + public static void CacheUploadSelections(string packageId, JsonValue json) + { + var fileName = $"{packageId}-uploadselection.asset"; + CreateFileInPersistentCache(fileName, json.ToString(), true); + } + + public static bool GetCachedUploadSelections(string packageId, out JsonValue json) + { + json = new JsonValue(); + var path = Path.Combine(PersistentCachePath, $"{packageId}-uploadselection.asset"); + if (!File.Exists(path)) + return false; + + json = JSONParser.SimpleParse(File.ReadAllText(path, Encoding.UTF8)); + return true; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/AssetStoreCache.cs.meta b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/AssetStoreCache.cs.meta new file mode 100644 index 0000000..fca787f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/AssetStoreCache.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2e5fee0cad7655f458d9b600f4ae6d02 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/LoginWindow.meta b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/LoginWindow.meta new file mode 100644 index 0000000..3a2c655 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/LoginWindow.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6390238ed687a564cb0236e8d6ba8cd9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/LoginWindow/LoginWindow.cs b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/LoginWindow/LoginWindow.cs new file mode 100644 index 0000000..8afd509 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreUploader/Scripts/LoginWindow/LoginWindow.cs @@ -0,0 +1,231 @@ +using AssetStoreTools.Utility.Json; +using System; +using UnityEditor; +using UnityEngine; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Uploader +{ + internal class LoginWindow : VisualElement + { + private readonly string REGISTER_URL = "https://publisher.unity.com/access"; + private readonly string FORGOT_PASSWORD_URL = "https://id.unity.com/password/new"; + + private Button _cloudLoginButton; + private Button _credentialsLoginButton; + + private Label _cloudLoginLabel; + + private TextField _emailField; + private TextField _passwordField; + + private Box _errorBox; + private Label _errorLabel; + + private double _cloudLoginRefreshTime = 1d; + private double _lastRefreshTime; + + public new class UxmlFactory : UxmlFactory { } + + public LoginWindow() + { + StyleSelector.SetStyle(this, StyleSelector.Style.Login, !EditorGUIUtility.isProSkin); + ConstructLoginWindow(); + EditorApplication.update += UpdateCloudLoginButton; + } + + public void SetupLoginElements(Action onSuccess, Action onFail) + { + this.SetEnabled(true); + + _cloudLoginLabel = _cloudLoginButton.Q