├── .github └── workflows │ ├── activate.yml │ └── push.yml ├── .gitignore ├── Assets ├── Editor.meta ├── Editor │ ├── Builder.cs │ └── Builder.cs.meta ├── Scenes.meta ├── Scenes │ ├── MainScene.unity │ └── MainScene.unity.meta ├── Scripts.meta ├── Scripts │ ├── EntryPoint.cs │ ├── EntryPoint.cs.meta │ ├── MessageSink.cs │ └── MessageSink.cs.meta ├── Vendor.meta └── Vendor │ ├── Mono.Options.dll │ ├── Mono.Options.dll.meta │ ├── xunit.abstractions.dll │ ├── xunit.abstractions.dll.meta │ ├── xunit.abstractions.xml │ ├── xunit.abstractions.xml.meta │ ├── xunit.runner.utility.net452.dll │ ├── xunit.runner.utility.net452.dll.meta │ ├── xunit.runner.utility.net452.xml │ └── xunit.runner.utility.net452.xml.meta ├── CHANGES.md ├── LICENSE ├── Packages ├── manifest.json └── packages-lock.json ├── ProjectSettings ├── AudioManager.asset ├── ClusterInputManager.asset ├── DynamicsManager.asset ├── EditorBuildSettings.asset ├── EditorSettings.asset ├── GraphicsSettings.asset ├── InputManager.asset ├── MemorySettings.asset ├── NavMeshAreas.asset ├── PackageManagerSettings.asset ├── Physics2DSettings.asset ├── PresetManager.asset ├── ProjectSettings.asset ├── ProjectVersion.txt ├── QualitySettings.asset ├── TagManager.asset ├── TimeManager.asset ├── UnityConnectSettings.asset ├── VFXManager.asset ├── VersionControlSettings.asset ├── XRSettings.asset └── boot.config ├── README.md └── release.sh /.github/workflows/activate.yml: -------------------------------------------------------------------------------- 1 | name: activate 2 | on: 3 | workflow_dispatch: {} 4 | 5 | jobs: 6 | activate: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v2 10 | - uses: dahlia/actions/setup-yq@main 11 | - id: get-project-version 12 | run: | 13 | yq e \ 14 | '"::set-output name=version::" + .m_EditorVersion' \ 15 | ProjectSettings/ProjectVersion.txt 16 | - id: get-license-file 17 | uses: game-ci/unity-request-activation-file@v2 18 | with: 19 | unityVersion: ${{ steps.get-project-version.outputs.version }} 20 | - uses: actions/upload-artifact@v2 21 | with: 22 | name: ${{ steps.get-license-file.outputs.filePath }} 23 | path: ${{ steps.get-license-file.outputs.filePath }} 24 | -------------------------------------------------------------------------------- /.github/workflows/push.yml: -------------------------------------------------------------------------------- 1 | on: [push, pull_request] 2 | 3 | name: push 4 | jobs: 5 | build: 6 | runs-on: ubuntu-latest 7 | strategy: 8 | matrix: 9 | target: 10 | - StandaloneLinux64 11 | - StandaloneOSX 12 | - StandaloneWindows64 13 | steps: 14 | - uses: actions/checkout@v2 15 | - uses: actions/cache@v2 16 | with: 17 | path: Library 18 | key: Library-${{ matrix.target }} 19 | restore-keys: Library- 20 | - uses: game-ci/unity-builder@v2 21 | with: 22 | targetPlatform: ${{ matrix.target }} 23 | buildsPath: build/ 24 | versioning: Tag 25 | buildMethod: Builder.Build 26 | env: 27 | UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} 28 | - run: | 29 | mkdir -p /tmp/dist 30 | pushd "build/${{ matrix.target }}/" 31 | tar cvfj "/tmp/dist/${{ matrix.target }}.tar.bz2" ./* 32 | popd 33 | - uses: actions/upload-artifact@v2 34 | with: 35 | name: ${{ matrix.target }} 36 | path: /tmp/dist/${{ matrix.target }}.tar.bz2 37 | release: 38 | if: startsWith(github.ref, 'refs/tags/') 39 | needs: [build] 40 | runs-on: ubuntu-latest 41 | steps: 42 | - uses: actions/checkout@v2 43 | - uses: actions/download-artifact@v2 44 | with: 45 | name: StandaloneLinux64 46 | path: Dist/ 47 | - uses: actions/download-artifact@v2 48 | with: 49 | name: StandaloneOSX 50 | path: Dist/ 51 | - uses: actions/download-artifact@v2 52 | with: 53 | name: StandaloneWindows64 54 | path: Dist/ 55 | - run: ./release.sh 56 | env: 57 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 58 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # This .gitignore file should be placed at the root of your Unity project directory 2 | # 3 | # Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore 4 | # 5 | /[Ll]ibrary/ 6 | /[Tt]emp/ 7 | /[Oo]bj/ 8 | /[Bb]uild/ 9 | /[Bb]uilds/ 10 | /[Ll]ogs/ 11 | /[Dd]ist/ 12 | /[Mm]emory[Cc]aptures/ 13 | /[Uu]ser[Ss]ettings/ 14 | 15 | # Never ignore Asset meta data 16 | !/[Aa]ssets/**/*.meta 17 | 18 | # Uncomment this line if you wish to ignore the asset store tools plugin 19 | # /[Aa]ssets/AssetStoreTools* 20 | 21 | # TextMesh Pro files 22 | [Aa]ssets/TextMesh*Pro/ 23 | 24 | # Autogenerated Jetbrains Rider plugin 25 | [Aa]ssets/Plugins/Editor/JetBrains* 26 | 27 | # Visual Studio cache directory 28 | .vs/ 29 | 30 | # Rider 31 | .idea/ 32 | 33 | # Gradle cache directory 34 | .gradle/ 35 | 36 | # Autogenerated VS/MD/Consulo solution and project files 37 | ExportedObj/ 38 | .consulo/ 39 | *.csproj 40 | *.unityproj 41 | *.sln 42 | *.suo 43 | *.tmp 44 | *.user 45 | *.userprefs 46 | *.pidb 47 | *.booproj 48 | *.svd 49 | *.pdb 50 | *.mdb 51 | *.opendb 52 | *.VC.db 53 | 54 | # Unity3D generated meta files 55 | *.pidb.meta 56 | *.pdb.meta 57 | *.mdb.meta 58 | 59 | # Unity3D generated file on crash reports 60 | sysinfo.txt 61 | 62 | # Builds 63 | *.apk 64 | *.unitypackage 65 | 66 | # Crashlytics generated file 67 | crashlytics-build.properties 68 | 69 | # Unity License 70 | alf/ 71 | *.alf 72 | *.ulf 73 | 74 | # Unnecessary parts in the xunit-unity-runner case 75 | Assets/Resources.meta 76 | Assets/Resources/ 77 | -------------------------------------------------------------------------------- /Assets/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cf5082641c8484e2e9b1f6961438f8e5 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Editor/Builder.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using UnityEditor; 5 | using UnityEditor.Build.Reporting; 6 | 7 | // Based on https://github.com/game-ci/documentation/blob/main/example/BuildScript.cs 8 | public class Builder 9 | { 10 | private static readonly string Eol = Environment.NewLine; 11 | 12 | private static readonly string[] Secrets = 13 | { "androidKeystorePass", "androidKeyaliasName", "androidKeyaliasPass" }; 14 | 15 | public static void Build() 16 | { 17 | // Gather values from args 18 | Dictionary options = GetValidatedOptions(); 19 | 20 | // Set version for this build 21 | PlayerSettings.bundleVersion = options["buildVersion"]; 22 | PlayerSettings.macOS.buildNumber = options["buildVersion"]; 23 | PlayerSettings.Android.bundleVersionCode = int.Parse(options["androidVersionCode"]); 24 | 25 | // Apply build target 26 | var buildTarget = (BuildTarget)Enum.Parse(typeof(BuildTarget), options["buildTarget"]); 27 | switch (buildTarget) 28 | { 29 | case BuildTarget.Android: 30 | { 31 | EditorUserBuildSettings.buildAppBundle = 32 | options["customBuildPath"].EndsWith(".aab"); 33 | if (options.TryGetValue("androidKeystoreName", out string keystoreName) && 34 | !string.IsNullOrEmpty(keystoreName)) 35 | PlayerSettings.Android.keystoreName = keystoreName; 36 | if (options.TryGetValue("androidKeystorePass", out string keystorePass) && 37 | !string.IsNullOrEmpty(keystorePass)) 38 | PlayerSettings.Android.keystorePass = keystorePass; 39 | if (options.TryGetValue("androidKeyaliasName", out string keyaliasName) && 40 | !string.IsNullOrEmpty(keyaliasName)) 41 | PlayerSettings.Android.keyaliasName = keyaliasName; 42 | if (options.TryGetValue("androidKeyaliasPass", out string keyaliasPass) && 43 | !string.IsNullOrEmpty(keyaliasPass)) 44 | PlayerSettings.Android.keyaliasPass = keyaliasPass; 45 | break; 46 | } 47 | case BuildTarget.StandaloneOSX: 48 | PlayerSettings.SetScriptingBackend(BuildTargetGroup.Standalone, 49 | ScriptingImplementation.Mono2x); 50 | break; 51 | } 52 | 53 | // Custom build 54 | Build(buildTarget, options["customBuildPath"]); 55 | } 56 | 57 | private static Dictionary GetValidatedOptions() 58 | { 59 | ParseCommandLineArguments(out Dictionary validatedOptions); 60 | 61 | if (!validatedOptions.TryGetValue("projectPath", out string _)) 62 | { 63 | Console.WriteLine("Missing argument -projectPath"); 64 | EditorApplication.Exit(110); 65 | } 66 | 67 | if (!validatedOptions.TryGetValue("buildTarget", out string buildTarget)) 68 | { 69 | Console.WriteLine("Missing argument -buildTarget"); 70 | EditorApplication.Exit(120); 71 | } 72 | 73 | if (!Enum.IsDefined(typeof(BuildTarget), buildTarget ?? string.Empty)) 74 | { 75 | EditorApplication.Exit(121); 76 | } 77 | 78 | if (!validatedOptions.TryGetValue("customBuildPath", out string _)) 79 | { 80 | Console.WriteLine("Missing argument -customBuildPath"); 81 | EditorApplication.Exit(130); 82 | } 83 | 84 | const string defaultCustomBuildName = "TestBuild"; 85 | if (!validatedOptions.TryGetValue("customBuildName", out string customBuildName)) 86 | { 87 | Console.WriteLine( 88 | $"Missing argument -customBuildName, defaulting to {defaultCustomBuildName}."); 89 | validatedOptions.Add("customBuildName", defaultCustomBuildName); 90 | } 91 | else if (customBuildName == "") 92 | { 93 | Console.WriteLine( 94 | $"Invalid argument -customBuildName, defaulting to {defaultCustomBuildName}."); 95 | validatedOptions.Add("customBuildName", defaultCustomBuildName); 96 | } 97 | 98 | return validatedOptions; 99 | } 100 | 101 | private static void ParseCommandLineArguments(out Dictionary providedArguments) 102 | { 103 | providedArguments = new Dictionary(); 104 | string[] args = Environment.GetCommandLineArgs(); 105 | 106 | Console.WriteLine( 107 | $"{Eol}" + 108 | $"###########################{Eol}" + 109 | $"# Parsing settings #{Eol}" + 110 | $"###########################{Eol}" + 111 | $"{Eol}" 112 | ); 113 | 114 | // Extract flags with optional values 115 | for (int current = 0, next = 1; current < args.Length; current++, next++) 116 | { 117 | // Parse flag 118 | bool isFlag = args[current].StartsWith("-"); 119 | if (!isFlag) continue; 120 | string flag = args[current].TrimStart('-'); 121 | 122 | // Parse optional value 123 | bool flagHasValue = next < args.Length && !args[next].StartsWith("-"); 124 | string value = flagHasValue ? args[next].TrimStart('-') : ""; 125 | bool secret = Secrets.Contains(flag); 126 | string displayValue = secret ? "*HIDDEN*" : "\"" + value + "\""; 127 | 128 | // Assign 129 | Console.WriteLine($"Found flag \"{flag}\" with value {displayValue}."); 130 | providedArguments.Add(flag, value); 131 | } 132 | } 133 | 134 | private static void Build(BuildTarget buildTarget, string filePath) 135 | { 136 | var buildPlayerOptions = new BuildPlayerOptions 137 | { 138 | scenes = new[] { "Assets/Scenes/MainScene.unity" }, 139 | target = buildTarget, 140 | locationPathName = filePath, 141 | options = BuildOptions.EnableHeadlessMode, 142 | }; 143 | 144 | BuildSummary buildSummary = BuildPipeline.BuildPlayer(buildPlayerOptions).summary; 145 | ReportSummary(buildSummary); 146 | ExitWithResult(buildSummary.result); 147 | } 148 | 149 | private static void ReportSummary(BuildSummary summary) 150 | { 151 | Console.WriteLine( 152 | $"{Eol}" + 153 | $"###########################{Eol}" + 154 | $"# Build results #{Eol}" + 155 | $"###########################{Eol}" + 156 | $"{Eol}" + 157 | $"Duration: {summary.totalTime.ToString()}{Eol}" + 158 | $"Warnings: {summary.totalWarnings.ToString()}{Eol}" + 159 | $"Errors: {summary.totalErrors.ToString()}{Eol}" + 160 | $"Size: {summary.totalSize.ToString()} bytes{Eol}" + 161 | $"{Eol}" 162 | ); 163 | } 164 | 165 | private static void ExitWithResult(BuildResult result) 166 | { 167 | switch (result) 168 | { 169 | case BuildResult.Succeeded: 170 | Console.WriteLine("Build succeeded!"); 171 | EditorApplication.Exit(0); 172 | break; 173 | case BuildResult.Failed: 174 | Console.WriteLine("Build failed!"); 175 | EditorApplication.Exit(101); 176 | break; 177 | case BuildResult.Cancelled: 178 | Console.WriteLine("Build cancelled!"); 179 | EditorApplication.Exit(102); 180 | break; 181 | case BuildResult.Unknown: 182 | default: 183 | Console.WriteLine("Build result is unknown!"); 184 | EditorApplication.Exit(103); 185 | break; 186 | } 187 | } 188 | } 189 | -------------------------------------------------------------------------------- /Assets/Editor/Builder.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bf9d42f34e9a6459297e48ea80432b70 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scenes.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: dd988480d6b5c4ff09d3990021146759 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scenes/MainScene.unity: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!29 &1 4 | OcclusionCullingSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_OcclusionBakeSettings: 8 | smallestOccluder: 5 9 | smallestHole: 0.25 10 | backfaceThreshold: 100 11 | m_SceneGUID: 00000000000000000000000000000000 12 | m_OcclusionCullingData: {fileID: 0} 13 | --- !u!104 &2 14 | RenderSettings: 15 | m_ObjectHideFlags: 0 16 | serializedVersion: 9 17 | m_Fog: 0 18 | m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} 19 | m_FogMode: 3 20 | m_FogDensity: 0.01 21 | m_LinearFogStart: 0 22 | m_LinearFogEnd: 300 23 | m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} 24 | m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} 25 | m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} 26 | m_AmbientIntensity: 1 27 | m_AmbientMode: 0 28 | m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} 29 | m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} 30 | m_HaloStrength: 0.5 31 | m_FlareStrength: 1 32 | m_FlareFadeSpeed: 3 33 | m_HaloTexture: {fileID: 0} 34 | m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} 35 | m_DefaultReflectionMode: 0 36 | m_DefaultReflectionResolution: 128 37 | m_ReflectionBounces: 1 38 | m_ReflectionIntensity: 1 39 | m_CustomReflection: {fileID: 0} 40 | m_Sun: {fileID: 705507994} 41 | m_IndirectSpecularColor: {r: 0.44657898, g: 0.49641287, b: 0.5748173, a: 1} 42 | m_UseRadianceAmbientProbe: 0 43 | --- !u!157 &3 44 | LightmapSettings: 45 | m_ObjectHideFlags: 0 46 | serializedVersion: 11 47 | m_GIWorkflowMode: 0 48 | m_GISettings: 49 | serializedVersion: 2 50 | m_BounceScale: 1 51 | m_IndirectOutputScale: 1 52 | m_AlbedoBoost: 1 53 | m_EnvironmentLightingMode: 0 54 | m_EnableBakedLightmaps: 1 55 | m_EnableRealtimeLightmaps: 1 56 | m_LightmapEditorSettings: 57 | serializedVersion: 12 58 | m_Resolution: 2 59 | m_BakeResolution: 40 60 | m_AtlasSize: 1024 61 | m_AO: 0 62 | m_AOMaxDistance: 1 63 | m_CompAOExponent: 1 64 | m_CompAOExponentDirect: 0 65 | m_ExtractAmbientOcclusion: 0 66 | m_Padding: 2 67 | m_LightmapParameters: {fileID: 0} 68 | m_LightmapsBakeMode: 1 69 | m_TextureCompression: 1 70 | m_FinalGather: 0 71 | m_FinalGatherFiltering: 1 72 | m_FinalGatherRayCount: 256 73 | m_ReflectionCompression: 2 74 | m_MixedBakeMode: 2 75 | m_BakeBackend: 1 76 | m_PVRSampling: 1 77 | m_PVRDirectSampleCount: 32 78 | m_PVRSampleCount: 500 79 | m_PVRBounces: 2 80 | m_PVREnvironmentSampleCount: 500 81 | m_PVREnvironmentReferencePointCount: 2048 82 | m_PVRFilteringMode: 2 83 | m_PVRDenoiserTypeDirect: 0 84 | m_PVRDenoiserTypeIndirect: 0 85 | m_PVRDenoiserTypeAO: 0 86 | m_PVRFilterTypeDirect: 0 87 | m_PVRFilterTypeIndirect: 0 88 | m_PVRFilterTypeAO: 0 89 | m_PVREnvironmentMIS: 0 90 | m_PVRCulling: 1 91 | m_PVRFilteringGaussRadiusDirect: 1 92 | m_PVRFilteringGaussRadiusIndirect: 5 93 | m_PVRFilteringGaussRadiusAO: 2 94 | m_PVRFilteringAtrousPositionSigmaDirect: 0.5 95 | m_PVRFilteringAtrousPositionSigmaIndirect: 2 96 | m_PVRFilteringAtrousPositionSigmaAO: 1 97 | m_ShowResolutionOverlay: 1 98 | m_ExportTrainingData: 0 99 | m_LightingDataAsset: {fileID: 0} 100 | m_UseShadowmask: 1 101 | --- !u!196 &4 102 | NavMeshSettings: 103 | serializedVersion: 2 104 | m_ObjectHideFlags: 0 105 | m_BuildSettings: 106 | serializedVersion: 2 107 | agentTypeID: 0 108 | agentRadius: 0.5 109 | agentHeight: 2 110 | agentSlope: 45 111 | agentClimb: 0.4 112 | ledgeDropHeight: 0 113 | maxJumpAcrossDistance: 0 114 | minRegionArea: 2 115 | manualCellSize: 0 116 | cellSize: 0.16666667 117 | manualTileSize: 0 118 | tileSize: 256 119 | accuratePlacement: 0 120 | debug: 121 | m_Flags: 0 122 | m_NavMeshData: {fileID: 0} 123 | --- !u!1 &705507993 124 | GameObject: 125 | m_ObjectHideFlags: 0 126 | m_CorrespondingSourceObject: {fileID: 0} 127 | m_PrefabInstance: {fileID: 0} 128 | m_PrefabAsset: {fileID: 0} 129 | serializedVersion: 6 130 | m_Component: 131 | - component: {fileID: 705507995} 132 | - component: {fileID: 705507994} 133 | - component: {fileID: 705507996} 134 | m_Layer: 0 135 | m_Name: Directional Light 136 | m_TagString: Untagged 137 | m_Icon: {fileID: 0} 138 | m_NavMeshLayer: 0 139 | m_StaticEditorFlags: 0 140 | m_IsActive: 1 141 | --- !u!108 &705507994 142 | Light: 143 | m_ObjectHideFlags: 0 144 | m_CorrespondingSourceObject: {fileID: 0} 145 | m_PrefabInstance: {fileID: 0} 146 | m_PrefabAsset: {fileID: 0} 147 | m_GameObject: {fileID: 705507993} 148 | m_Enabled: 1 149 | serializedVersion: 9 150 | m_Type: 1 151 | m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} 152 | m_Intensity: 1 153 | m_Range: 10 154 | m_SpotAngle: 30 155 | m_InnerSpotAngle: 21.802082 156 | m_CookieSize: 10 157 | m_Shadows: 158 | m_Type: 2 159 | m_Resolution: -1 160 | m_CustomResolution: -1 161 | m_Strength: 1 162 | m_Bias: 0.05 163 | m_NormalBias: 0.4 164 | m_NearPlane: 0.2 165 | m_CullingMatrixOverride: 166 | e00: 1 167 | e01: 0 168 | e02: 0 169 | e03: 0 170 | e10: 0 171 | e11: 1 172 | e12: 0 173 | e13: 0 174 | e20: 0 175 | e21: 0 176 | e22: 1 177 | e23: 0 178 | e30: 0 179 | e31: 0 180 | e32: 0 181 | e33: 1 182 | m_UseCullingMatrixOverride: 0 183 | m_Cookie: {fileID: 0} 184 | m_DrawHalo: 0 185 | m_Flare: {fileID: 0} 186 | m_RenderMode: 0 187 | m_CullingMask: 188 | serializedVersion: 2 189 | m_Bits: 4294967295 190 | m_RenderingLayerMask: 1 191 | m_Lightmapping: 1 192 | m_LightShadowCasterMode: 0 193 | m_AreaSize: {x: 1, y: 1} 194 | m_BounceIntensity: 1 195 | m_ColorTemperature: 6570 196 | m_UseColorTemperature: 0 197 | m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} 198 | m_UseBoundingSphereOverride: 0 199 | m_ShadowRadius: 0 200 | m_ShadowAngle: 0 201 | --- !u!4 &705507995 202 | Transform: 203 | m_ObjectHideFlags: 0 204 | m_CorrespondingSourceObject: {fileID: 0} 205 | m_PrefabInstance: {fileID: 0} 206 | m_PrefabAsset: {fileID: 0} 207 | m_GameObject: {fileID: 705507993} 208 | m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} 209 | m_LocalPosition: {x: 0, y: 3, z: 0} 210 | m_LocalScale: {x: 1, y: 1, z: 1} 211 | m_Children: [] 212 | m_Father: {fileID: 0} 213 | m_RootOrder: 1 214 | m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} 215 | --- !u!114 &705507996 216 | MonoBehaviour: 217 | m_ObjectHideFlags: 0 218 | m_CorrespondingSourceObject: {fileID: 0} 219 | m_PrefabInstance: {fileID: 0} 220 | m_PrefabAsset: {fileID: 0} 221 | m_GameObject: {fileID: 705507993} 222 | m_Enabled: 1 223 | m_EditorHideFlags: 0 224 | m_Script: {fileID: 11500000, guid: 95a23c02a55834c809e7bb2738bc23ed, type: 3} 225 | m_Name: 226 | m_EditorClassIdentifier: 227 | --- !u!1 &963194225 228 | GameObject: 229 | m_ObjectHideFlags: 0 230 | m_CorrespondingSourceObject: {fileID: 0} 231 | m_PrefabInstance: {fileID: 0} 232 | m_PrefabAsset: {fileID: 0} 233 | serializedVersion: 6 234 | m_Component: 235 | - component: {fileID: 963194228} 236 | - component: {fileID: 963194227} 237 | - component: {fileID: 963194226} 238 | m_Layer: 0 239 | m_Name: Main Camera 240 | m_TagString: MainCamera 241 | m_Icon: {fileID: 0} 242 | m_NavMeshLayer: 0 243 | m_StaticEditorFlags: 0 244 | m_IsActive: 1 245 | --- !u!81 &963194226 246 | AudioListener: 247 | m_ObjectHideFlags: 0 248 | m_CorrespondingSourceObject: {fileID: 0} 249 | m_PrefabInstance: {fileID: 0} 250 | m_PrefabAsset: {fileID: 0} 251 | m_GameObject: {fileID: 963194225} 252 | m_Enabled: 1 253 | --- !u!20 &963194227 254 | Camera: 255 | m_ObjectHideFlags: 0 256 | m_CorrespondingSourceObject: {fileID: 0} 257 | m_PrefabInstance: {fileID: 0} 258 | m_PrefabAsset: {fileID: 0} 259 | m_GameObject: {fileID: 963194225} 260 | m_Enabled: 1 261 | serializedVersion: 2 262 | m_ClearFlags: 1 263 | m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} 264 | m_projectionMatrixMode: 1 265 | m_GateFitMode: 2 266 | m_FOVAxisMode: 0 267 | m_SensorSize: {x: 36, y: 24} 268 | m_LensShift: {x: 0, y: 0} 269 | m_FocalLength: 50 270 | m_NormalizedViewPortRect: 271 | serializedVersion: 2 272 | x: 0 273 | y: 0 274 | width: 1 275 | height: 1 276 | near clip plane: 0.3 277 | far clip plane: 1000 278 | field of view: 60 279 | orthographic: 0 280 | orthographic size: 5 281 | m_Depth: -1 282 | m_CullingMask: 283 | serializedVersion: 2 284 | m_Bits: 4294967295 285 | m_RenderingPath: -1 286 | m_TargetTexture: {fileID: 0} 287 | m_TargetDisplay: 0 288 | m_TargetEye: 3 289 | m_HDR: 1 290 | m_AllowMSAA: 1 291 | m_AllowDynamicResolution: 0 292 | m_ForceIntoRT: 0 293 | m_OcclusionCulling: 1 294 | m_StereoConvergence: 10 295 | m_StereoSeparation: 0.022 296 | --- !u!4 &963194228 297 | Transform: 298 | m_ObjectHideFlags: 0 299 | m_CorrespondingSourceObject: {fileID: 0} 300 | m_PrefabInstance: {fileID: 0} 301 | m_PrefabAsset: {fileID: 0} 302 | m_GameObject: {fileID: 963194225} 303 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 304 | m_LocalPosition: {x: 0, y: 1, z: -10} 305 | m_LocalScale: {x: 1, y: 1, z: 1} 306 | m_Children: [] 307 | m_Father: {fileID: 0} 308 | m_RootOrder: 0 309 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 310 | -------------------------------------------------------------------------------- /Assets/Scenes/MainScene.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9fc0d4010bbf28b4594072e72b8655ab 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/Scripts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4bcde81a000774a938845a2f9ff4b47c 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/EntryPoint.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using System.IO; 5 | using System.Linq; 6 | using System.Text.RegularExpressions; 7 | using System.Threading.Tasks; 8 | using System.Xml.Linq; 9 | using Mono.Options; 10 | using UnityEngine; 11 | using Xunit; 12 | using Xunit.Abstractions; 13 | using Xunit.Runners; 14 | using Random = System.Random; 15 | 16 | public class EntryPoint : MonoBehaviour 17 | { 18 | private static readonly OptionSet Options = new OptionSet 19 | { 20 | { 21 | "c|select-class=", 22 | "Select a test class by its fully qualified name, and exclude " + 23 | "other classes. This option can be used multiple times, and " + 24 | "all specified classes (and others selected by -m/--select-method " + 25 | "and -t/--select-trait-condition options) are included together.", 26 | className => SelectedClasses.Add(className) 27 | }, 28 | { 29 | "m|select-method=", 30 | "Select a test method by its fully qualified name, and exclude " + 31 | "other methods. This option can be used multiple times, and " + 32 | "all specified methods (and others selected by -c/--select-class " + 33 | "and -t/--select-trait-condition options) are included together.", 34 | method => SelectedMethods.Add(method) 35 | }, 36 | { 37 | "t|select-trait-condition=", 38 | "Select a trait condition (e.g., `-T TraitName=value') and exclude " + 39 | "others. This option can be used multiple times, and " + 40 | "all specified methods (and others selected by -c/--select-class " + 41 | "and -m/--select-method options) are included together.", 42 | traitCondition => 43 | SelectedTraitConditions.Add(ParseTraitCondition(traitCondition)) 44 | }, 45 | { 46 | "C|exclude-class=", 47 | "Exclude a test class by its fully qualified name. " + 48 | "This option can be used multiple times. " + 49 | "Prior to -c/--select-class, -m/--select-method, and " + 50 | "-t/--select-trait-condition options.", 51 | className => ExcludedClasses.Add(className) 52 | }, 53 | { 54 | "M|exclude-method=", 55 | "Exclude a test method by its fully qualified name. " + 56 | "This option can be used multiple times. " + 57 | "Prior to -c/--select-class, -m/--select-method, and " + 58 | "-t/--select-trait-condition options.", 59 | method => ExcludedMethods.Add(method) 60 | }, 61 | { 62 | "T|exclude-trait-condition=", 63 | "Exclude a trait condition (e.g., `-T TraitName=value'). " + 64 | "This option can be used multiple times. " + 65 | "Prior to -c/--select-class, -m/--select-method, and " + 66 | "-t/--select-trait-condition options.", 67 | traitCondition => 68 | ExcludedTraitConditions.Add(ParseTraitCondition(traitCondition)) 69 | }, 70 | { 71 | "p|parallel=", 72 | "The maximum number of parallel threads to run tests. Zero " + 73 | "means not to limit the number of threads. 1 by default.", 74 | parallel => Parallel = int.TryParse(parallel, out int p) && p >= 0 75 | ? p 76 | : throw new OptionException( 77 | "The maximum number of parallel threads must be " + 78 | "an integer greater than or equal to zero.", 79 | "-p/--parallel" 80 | ) 81 | }, 82 | { 83 | "D|distributed=", 84 | "Run only randomly selected tests out of the all discovered " + 85 | "tests. This is intended to be used as a single node out of " + 86 | "multiple distributed nodes in parallel. The format is N/M, " + 87 | "where N is the zero-indexed node number, and M is the total " + 88 | "number of distributed nodes to run tests in parallel. " + 89 | "For example, the option --distributed=2/5 implies there are " + 90 | "5 nodes to run the same set of tests, and this is third one " + 91 | "of these nodes. You can optionally provide " + 92 | "-s/--distributed-seed option to manually configure the shared " + 93 | "seed among distributed nodes.", 94 | d => 95 | { 96 | Match m = Regex.Match(d, @"^\s*(-?\d+)\s*/\s*(-?\d+)\s*$"); 97 | if (!m.Success) 98 | { 99 | throw new OptionException( 100 | "Expected a fraction, i.e., N/M where N is the zero-" + 101 | "indexed node number, and M is the total number of " + 102 | "distributed nodes. See -h/--help for details.", 103 | "-D/--distributed"); 104 | } 105 | 106 | var current = int.Parse(m.Groups[1].Value); 107 | int total = int.Parse(m.Groups[2].Value); 108 | if (current < 0) 109 | { 110 | throw new OptionException( 111 | "The current node number cannot be less than zero.", 112 | "-D/--distributed" 113 | ); 114 | } 115 | else if (total < 1) 116 | { 117 | throw new OptionException( 118 | "The total number must be greater than zero.", 119 | "-D/--distributed" 120 | ); 121 | } 122 | else if (current >= total) 123 | { 124 | throw new OptionException( 125 | "The current node number must less be than the total " + 126 | "number." + (current == total 127 | ? "\nHint: The current node number is zero-indexed." 128 | : string.Empty), 129 | "-D/--distributed" 130 | ); 131 | } 132 | 133 | CurrentNode = current; 134 | DistributedNodes = total; 135 | } 136 | }, 137 | { 138 | "s|distributed-seed=", 139 | "(Only sensible together with -d/--distributed option.) " + 140 | "The seed value in integer to be used to randomly and uniquely " + 141 | "distribute the equal set of tests to the nodes. " + 142 | $"{DistributedSeed} by default.", 143 | seed => DistributedSeed = Int32.TryParse(seed, out int s) 144 | ? s 145 | : throw new OptionException( 146 | "Expected an integer.", 147 | "-s/--distributed-seed") 148 | }, 149 | { 150 | "x|report-xml-path=", 151 | "The file path to write a result report in xUnit.net v2 XML format.", 152 | reportXmlPath => ReportXmlPath = reportXmlPath 153 | }, 154 | { 155 | "H|hang-seconds=", 156 | "Detect hanging tests if a test runs for the specified seconds " + 157 | "or longer. 0 disables such detection. 0 by default.", 158 | hangSeconds => HangSeconds = int.TryParse(hangSeconds, out int h) 159 | ? h 160 | : throw new OptionException( 161 | "Expected an integer.", 162 | "-H/--hang-seconds") 163 | }, 164 | { 165 | "f|stop-on-fail", 166 | "Stop the whole running tests when any test fails.", 167 | stopOnFail => StopOnFail = !(stopOnFail is null) 168 | }, 169 | { 170 | "dry-run", 171 | "Do not run tests, but only discover tests. More useful with" + 172 | "-d/--debug option.", 173 | dryRun => DryRun = !(dryRun is null) 174 | }, 175 | { 176 | "d|debug", 177 | "Print debug logs.", 178 | debug => DebugLog = !(debug is null) 179 | }, 180 | { 181 | "h|help", 182 | "Show this message and exit.", 183 | help => Help = !(help is null) 184 | } 185 | }; 186 | 187 | static readonly ISet ExcludedClasses = new HashSet(); 188 | static readonly ISet ExcludedMethods = new HashSet(); 189 | static readonly ISet<(string, string)> ExcludedTraitConditions = 190 | new HashSet<(string, string)>(); 191 | 192 | static readonly ISet SelectedClasses = new HashSet(); 193 | static readonly ISet SelectedMethods = new HashSet(); 194 | static readonly ISet<(string, string)> SelectedTraitConditions = 195 | new HashSet<(string, string)>(); 196 | 197 | private static int Parallel { get; set; } = 1; 198 | private static int CurrentNode { get; set; } = 0; 199 | private static int DistributedNodes { get; set; } = 0; 200 | private static int DistributedSeed { get; set; } = 0; 201 | 202 | private static string ReportXmlPath { get; set; } = null; 203 | private static int HangSeconds { get; set; } = 0; 204 | private static bool StopOnFail { get; set; } = false; 205 | private static bool DryRun { get; set; } = false; 206 | private static bool DebugLog { get; set; } = false; 207 | private static bool Help { get; set; } = false; 208 | 209 | private static (string, string) ParseTraitCondition( string traitCondition) 210 | { 211 | int equal = traitCondition.IndexOf('='); 212 | if (equal < 0) 213 | { 214 | return (traitCondition, string.Empty); 215 | } 216 | 217 | return ( 218 | traitCondition.Substring(0, equal), 219 | traitCondition.Substring(equal + 1) 220 | ); 221 | } 222 | 223 | int ExitCode { get; set; } = 0; 224 | 225 | void Start() 226 | { 227 | if (Application.isEditor) 228 | { 229 | Debug.LogWarning("Xunit tests do not run on the Unity editor mode."); 230 | return; 231 | } 232 | 233 | int? exitCode = RunTests(); 234 | if (exitCode is int code) 235 | { 236 | Application.Quit(code); 237 | } 238 | } 239 | 240 | int? RunTests() 241 | { 242 | string[] commandLineArgs = Environment.GetCommandLineArgs(); 243 | string programName = Path.GetFileName(commandLineArgs[0]); 244 | IEnumerable args = commandLineArgs.Skip(1); 245 | IList assemblyPaths; 246 | try 247 | { 248 | assemblyPaths = Options.Parse(args); 249 | } 250 | catch (OptionException e) 251 | { 252 | Console.Error.WriteLine("Error: {0}: {1}", e.OptionName, e.Message); 253 | Console.Error.WriteLine( 254 | "Try `{0} --help' for more information", 255 | programName 256 | ); 257 | return 1; 258 | } 259 | 260 | foreach (string path in assemblyPaths) 261 | { 262 | if (!Path.IsPathRooted(path)) 263 | { 264 | Console.Error.WriteLine( 265 | "Error: An assembly path should be absolute: `{0}'.", 266 | path 267 | ); 268 | return 1; 269 | } 270 | } 271 | 272 | if (Help) 273 | { 274 | Console.WriteLine( 275 | "Usage: {0} [options] ASSEMBLY [ASSEMBLY...]", 276 | programName 277 | ); 278 | Console.WriteLine(); 279 | Console.WriteLine("Options:"); 280 | Options.WriteOptionDescriptions(Console.Out); 281 | return 0; 282 | } 283 | 284 | if (SelectedClasses.Any() || SelectedMethods.Any() || 285 | SelectedTraitConditions.Any() || ExcludedClasses.Any() || 286 | ExcludedMethods.Any() || ExcludedTraitConditions.Any() || 287 | DistributedNodes > 0) 288 | { 289 | Console.Error.WriteLine("Applied filters:"); 290 | PrintFilters("Selected classes", SelectedClasses); 291 | PrintFilters("Selected methods", SelectedMethods); 292 | PrintFilters("Selected traits", SelectedTraitConditions); 293 | PrintFilters("Excluded classes", ExcludedClasses); 294 | PrintFilters("Excluded methods", ExcludedMethods); 295 | PrintFilters("Excluded traits", ExcludedTraitConditions); 296 | Console.Error.WriteLine( 297 | " Current node: {0}/{1}", 298 | CurrentNode, 299 | DistributedNodes 300 | ); 301 | } 302 | else 303 | { 304 | Console.Error.WriteLine("Applied no filters."); 305 | } 306 | 307 | XElement run(string path) 308 | { 309 | Console.Error.WriteLine("Discovering tests in {0}...", path); 310 | XElement assemblyElement = new XElement("assembly"); 311 | try 312 | { 313 | var messageSink = new MessageSink 314 | { 315 | OnTest = OnTest, 316 | OnExecutionComplete = OnExecutionComplete, 317 | LogWriter = DebugLog ? Console.Error : null, 318 | }; 319 | var summarySink = new DelegatingExecutionSummarySink(messageSink); 320 | IExecutionSink sink = new DelegatingXmlCreationSink(summarySink, assemblyElement); 321 | if (HangSeconds > 0) 322 | { 323 | sink = new DelegatingLongRunningTestDetectionSink( 324 | sink, 325 | TimeSpan.FromSeconds(HangSeconds), 326 | messageSink 327 | ); 328 | } 329 | using (sink) 330 | using ( 331 | var controller = new XunitFrontController( 332 | AppDomainSupport.Denied, 333 | path, 334 | sourceInformationProvider: new NullSourceInformationProvider(), 335 | diagnosticMessageSink: MessageSinkAdapter.Wrap(messageSink) 336 | ) 337 | ) 338 | { 339 | var configuration = ConfigReader.Load(path); 340 | configuration.AppDomain = AppDomainSupport.Required; 341 | configuration.DiagnosticMessages = true; 342 | configuration.StopOnFail = StopOnFail; 343 | configuration.MaxParallelThreads = Parallel; 344 | configuration.LongRunningTestSeconds = HangSeconds; 345 | ITestFrameworkDiscoveryOptions discoveryOptions = 346 | TestFrameworkOptions.ForDiscovery(configuration); 347 | discoveryOptions.SetSynchronousMessageReporting(true); 348 | discoveryOptions.SetPreEnumerateTheories(false); 349 | controller.Find(false, messageSink, discoveryOptions); 350 | messageSink.DiscoveryCompletionWaitHandle.WaitOne(); 351 | ITestCase[] testCases = 352 | FilterTestCases(messageSink.TestCases).ToArray(); 353 | if (DebugLog || DryRun) 354 | { 355 | lock (this) 356 | { 357 | Console.Error.WriteLine( 358 | "{0} test cases were found in {1}:", 359 | testCases.Length, 360 | path 361 | ); 362 | foreach (ITestCase testCase in testCases) 363 | { 364 | Console.Error.WriteLine( 365 | "- {0}", 366 | testCase.DisplayName 367 | ); 368 | } 369 | 370 | Console.Error.Flush(); 371 | } 372 | } 373 | else 374 | { 375 | Console.Error.WriteLine( 376 | "{0} test cases were found in {1}.", 377 | testCases.Length, 378 | path 379 | ); 380 | } 381 | 382 | if (!DryRun) 383 | { 384 | ITestFrameworkExecutionOptions executionOptions = 385 | TestFrameworkOptions.ForExecution(configuration); 386 | executionOptions.SetDiagnosticMessages(true); 387 | executionOptions.SetSynchronousMessageReporting(true); 388 | executionOptions.SetStopOnTestFail(StopOnFail); 389 | if (Parallel != 1) 390 | { 391 | executionOptions.SetDisableParallelization(true); 392 | } 393 | else 394 | { 395 | executionOptions.SetDisableParallelization(false); 396 | executionOptions.SetMaxParallelThreads(Parallel); 397 | } 398 | 399 | controller.RunTests( 400 | testCases, 401 | sink, 402 | executionOptions 403 | ); 404 | messageSink.ExecutionCompletionWaitHandle.WaitOne(); 405 | } 406 | } 407 | } 408 | catch (Exception e) 409 | { 410 | Console.Error.WriteLine("{0}: {1}", e.GetType().Name, e.Message); 411 | Console.Error.WriteLine(e.StackTrace); 412 | ExitCode = 1; 413 | } 414 | Console.Error.WriteLine("All tests in {0} ran.", path); 415 | return assemblyElement; 416 | } 417 | 418 | IEnumerator wait(string[] paths) 419 | { 420 | Console.Error.WriteLine("Run {0} test assemblies.", paths.Length); 421 | var assembliesElement = new XElement("assemblies"); 422 | foreach (string path in paths) 423 | { 424 | var task = Task.Run(() => run(path)); 425 | while (!task.IsCompleted) 426 | { 427 | yield return new WaitUntil(() => task.IsCompleted); 428 | } 429 | assembliesElement.Add(task.Result); 430 | } 431 | 432 | if (!DryRun && ReportXmlPath is string reportXmlPath) 433 | { 434 | Directory.CreateDirectory(Path.GetDirectoryName(reportXmlPath)); 435 | assembliesElement.Save(reportXmlPath); 436 | Console.Error.Write("The result report is written: {0}", reportXmlPath); 437 | } 438 | 439 | Application.Quit(ExitCode); 440 | } 441 | 442 | StartCoroutine(wait(assemblyPaths.ToArray())); 443 | return null; 444 | } 445 | 446 | static IEnumerable FilterTestCases(IList testCases) 447 | { 448 | IEnumerable filtered = testCases.Where(t => 449 | { 450 | ITestMethod method = t.TestMethod; 451 | string className = method.TestClass.Class.Name; 452 | string methodName = $"{className}.{method.Method.Name}"; 453 | bool selected = true; 454 | 455 | bool IsSatisfied((string, string) pair) => 456 | t.Traits.ContainsKey(pair.Item1) && 457 | t.Traits[pair.Item1].Contains(pair.Item2); 458 | 459 | if (SelectedClasses.Any() || 460 | SelectedMethods.Any() || 461 | SelectedTraitConditions.Any()) 462 | { 463 | selected = 464 | SelectedClasses.Contains(className) || 465 | SelectedMethods.Contains(methodName) || 466 | SelectedTraitConditions.Any(IsSatisfied); 467 | } 468 | 469 | return selected && !ExcludedClasses.Contains(className) && 470 | !ExcludedMethods.Contains(methodName) && 471 | !ExcludedTraitConditions.Any(IsSatisfied); 472 | }); 473 | 474 | if (DistributedNodes > 0) 475 | { 476 | ITestCase[] tests = filtered.ToArray(); 477 | var window = (int)Math.Ceiling(tests.Length / (double)DistributedNodes); 478 | var random = new Random(DistributedSeed); 479 | filtered = tests 480 | .OrderBy(t => t.UniqueID, StringComparer.InvariantCulture) 481 | .Select(t => (t, random.Next())) 482 | .OrderBy(pair => pair.Item2) 483 | .Select(pair => pair.Item1) 484 | .Skip(CurrentNode * window) 485 | .Take(window) 486 | .OrderBy(t => 487 | (t.TestMethod.TestClass.Class.Assembly.Name, t.DisplayName) 488 | ); 489 | } 490 | 491 | return filtered; 492 | } 493 | 494 | private void OnTest(TestInfo info) 495 | { 496 | switch (info) 497 | { 498 | case TestPassedInfo i: 499 | Console.WriteLine("PASS {0}: {1:}s", i.TestDisplayName, i.ExecutionTime); 500 | return; 501 | 502 | case TestFailedInfo i: 503 | Console.WriteLine( 504 | "FAIL {0}: {1:}s\n {2}: {3}\n {4}\n\nOutput:\n{5}", 505 | i.TestDisplayName, 506 | i.ExecutionTime, 507 | i.ExceptionType, 508 | string.Join("\n ", i.ExceptionMessage.Split('\n')), 509 | string.Join("\n ", i.ExceptionStackTrace.Split('\n')), 510 | i.Output.Replace("\n", "\n ") 511 | ); 512 | return; 513 | 514 | case TestSkippedInfo i: 515 | Console.WriteLine("SKIP {0}: {1}", i.TestDisplayName, i.SkipReason); 516 | return; 517 | } 518 | } 519 | 520 | private void OnExecutionComplete(ExecutionCompleteInfo info) 521 | { 522 | Console.WriteLine("Total: {0}", info.TotalTests); 523 | Console.WriteLine("Passed: {0}", info.TotalTests - info.TestsFailed - info.TestsSkipped); 524 | Console.WriteLine("Failed: {0}", info.TestsFailed); 525 | Console.WriteLine("Skipped: {0}", info.TestsSkipped); 526 | if (info.TestsFailed > 0) 527 | { 528 | ExitCode = 1; 529 | } 530 | } 531 | 532 | private void PrintFilters(string label, ISet filters) 533 | { 534 | if (!filters.Any()) 535 | { 536 | return; 537 | } 538 | 539 | Console.Error.WriteLine(" {0}:", label); 540 | foreach (string f in filters.OrderBy(s => s)) 541 | { 542 | Console.Error.WriteLine(" - {0}", f); 543 | } 544 | 545 | Console.Error.Flush(); 546 | } 547 | 548 | private void PrintFilters(string label, ISet<(string, string)> filters) 549 | { 550 | if (!filters.Any()) 551 | { 552 | return; 553 | } 554 | 555 | Console.Error.WriteLine(" {0}:", label); 556 | foreach ((string f, string v) in filters.OrderBy(pair => pair.Item1)) 557 | { 558 | Console.Error.WriteLine(" - {0}: {1}", f, v); 559 | } 560 | 561 | Console.Error.Flush(); 562 | } 563 | 564 | void Update() 565 | { 566 | } 567 | } 568 | -------------------------------------------------------------------------------- /Assets/Scripts/EntryPoint.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 95a23c02a55834c809e7bb2738bc23ed 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/MessageSink.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Threading; 6 | using Xunit; 7 | using Xunit.Abstractions; 8 | using Xunit.Runners; 9 | 10 | public class MessageSink : IMessageSinkWithTypes 11 | { 12 | public IList TestCases { get; } = new List(); 13 | public EventWaitHandle DiscoveryCompletionWaitHandle { get; } = 14 | new EventWaitHandle(false, EventResetMode.ManualReset); 15 | public Action OnTest { get; set; } = null; 16 | public Action OnExecutionComplete { get; set; } = null; 17 | public EventWaitHandle ExecutionCompletionWaitHandle { get; } = 18 | new EventWaitHandle(false, EventResetMode.ManualReset); 19 | public TextWriter LogWriter { get; set; } 20 | 21 | public bool OnMessageWithTypes(IMessageSinkMessage message, HashSet messageTypes) 22 | { 23 | switch (message) 24 | { 25 | case ITestCaseDiscoveryMessage m: 26 | foreach (ITestCase testCase in m.TestCases) 27 | { 28 | LogWriter?.WriteLine("Discovered: {0}", testCase.DisplayName); 29 | TestCases.Add(testCase); 30 | } 31 | break; 32 | 33 | case IDiscoveryCompleteMessage _: 34 | DiscoveryCompletionWaitHandle.Set(); 35 | break; 36 | 37 | case ITestPassed m: 38 | OnTest?.Invoke( 39 | new TestPassedInfo( 40 | m.TestClass.Class.Name, 41 | m.TestMethod.Method.Name, 42 | m.TestCase.Traits, 43 | m.Test.DisplayName, 44 | m.TestCollection.DisplayName, 45 | m.ExecutionTime, 46 | m.Output 47 | ) 48 | ); 49 | break; 50 | 51 | case ITestFailed m: 52 | OnTest?.Invoke( 53 | new TestFailedInfo( 54 | m.TestClass.Class.Name, 55 | m.TestMethod.Method.Name, 56 | m.TestCase.Traits, 57 | m.Test.DisplayName, 58 | m.TestCollection.DisplayName, 59 | m.ExecutionTime, 60 | m.Output, 61 | m.ExceptionTypes.FirstOrDefault(), 62 | m.Messages.FirstOrDefault(), 63 | m.StackTraces.FirstOrDefault() 64 | ) 65 | ); 66 | break; 67 | 68 | case ITestSkipped m: 69 | OnTest?.Invoke( 70 | new TestSkippedInfo( 71 | m.TestClass.Class.Name, 72 | m.TestMethod.Method.Name, 73 | m.TestCase.Traits, 74 | m.Test.DisplayName, 75 | m.TestCollection.DisplayName, 76 | m.Reason 77 | ) 78 | ); 79 | break; 80 | 81 | case ITestAssemblyFinished m: 82 | OnExecutionComplete( 83 | new ExecutionCompleteInfo( 84 | m.TestsRun, 85 | m.TestsFailed, 86 | m.TestsSkipped, 87 | m.ExecutionTime 88 | ) 89 | ); 90 | ExecutionCompletionWaitHandle.Set(); 91 | break; 92 | 93 | default: 94 | LogWriter?.WriteLine("Received message: {0}", message); 95 | break; 96 | } 97 | 98 | return true; 99 | } 100 | 101 | public void Dispose() 102 | { 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /Assets/Scripts/MessageSink.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7505e3e2986894f1ab417e9ec8a11217 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Vendor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8da568ce4c1d54c679068d9735ad3434 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Vendor/Mono.Options.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/planetarium/xunit-unity-runner/30c8aa9605a6b0a818b582d93ef4ed500f382d70/Assets/Vendor/Mono.Options.dll -------------------------------------------------------------------------------- /Assets/Vendor/Mono.Options.dll.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 97cc70972c57440f68e5237bad348be6 3 | PluginImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | iconMap: {} 7 | executionOrder: {} 8 | defineConstraints: [] 9 | isPreloaded: 0 10 | isOverridable: 0 11 | isExplicitlyReferenced: 0 12 | validateReferences: 1 13 | platformData: 14 | - first: 15 | Any: 16 | second: 17 | enabled: 1 18 | settings: {} 19 | - first: 20 | Editor: Editor 21 | second: 22 | enabled: 0 23 | settings: 24 | DefaultValueInitialized: true 25 | - first: 26 | Windows Store Apps: WindowsStoreApps 27 | second: 28 | enabled: 0 29 | settings: 30 | CPU: AnyCPU 31 | userData: 32 | assetBundleName: 33 | assetBundleVariant: 34 | -------------------------------------------------------------------------------- /Assets/Vendor/xunit.abstractions.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/planetarium/xunit-unity-runner/30c8aa9605a6b0a818b582d93ef4ed500f382d70/Assets/Vendor/xunit.abstractions.dll -------------------------------------------------------------------------------- /Assets/Vendor/xunit.abstractions.dll.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ce400835b84e54d6aa009d5021035a18 3 | PluginImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | iconMap: {} 7 | executionOrder: {} 8 | defineConstraints: [] 9 | isPreloaded: 0 10 | isOverridable: 0 11 | isExplicitlyReferenced: 0 12 | validateReferences: 1 13 | platformData: 14 | - first: 15 | Any: 16 | second: 17 | enabled: 1 18 | settings: {} 19 | - first: 20 | Editor: Editor 21 | second: 22 | enabled: 0 23 | settings: 24 | DefaultValueInitialized: true 25 | - first: 26 | Windows Store Apps: WindowsStoreApps 27 | second: 28 | enabled: 0 29 | settings: 30 | CPU: AnyCPU 31 | userData: 32 | assetBundleName: 33 | assetBundleVariant: 34 | -------------------------------------------------------------------------------- /Assets/Vendor/xunit.abstractions.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | xunit.abstractions 5 | 6 | 7 | 8 | 9 | Represents source information about a test case. 10 | 11 | 12 | 13 | 14 | Interface implement by objects that want to support serialization in xUnit.net. 15 | 16 | 17 | 18 | 19 | Called when the object should populate itself with data from the serialization info. 20 | 21 | The info to get the data from 22 | 23 | 24 | 25 | Called when the object should store its data into the serialization info. 26 | 27 | The info to store the data in 28 | 29 | 30 | 31 | Gets or sets the source file name. A null value indicates that the 32 | source file name is not known. 33 | 34 | 35 | 36 | 37 | Gets or sets the source file line. A null value indicates that the 38 | source file line is not known. 39 | 40 | 41 | 42 | 43 | Represents a provider which gives source line information for a test case. Generally 44 | consumed by an implementation of during Find operations. 45 | 46 | 47 | 48 | 49 | Returns the source information for a test case. 50 | 51 | The test case to retrieve information for. 52 | The source information, with null string and int values when the information is not available. 53 | Note: return value should never be null, only the interior data values inside. 54 | 55 | 56 | 57 | Represents a test framework. There are two pieces to test frameworks: discovery and 58 | execution. The two factory methods represent these two pieces. Test frameworks can 59 | implement an empty constructor, or they can implement one that takes 60 | if they want to be able to send diagnostic messages. 61 | 62 | 63 | 64 | 65 | Get a test discoverer. 66 | 67 | The assembly from which to discover the tests. 68 | The test discoverer. 69 | 70 | 71 | 72 | Get a test executor. 73 | 74 | The name of the assembly to run tests from. 75 | The test executor. 76 | 77 | 78 | 79 | Sets the source information provider to be used during discovery. 80 | 81 | 82 | 83 | 84 | Represents an implementation of the discovery part of a test framework. 85 | 86 | 87 | 88 | 89 | Starts the process of finding all tests in an assembly. 90 | 91 | Whether to include source file information, if possible. 92 | The message sink to report results back to. 93 | The options used by the test framework during discovery. 94 | 95 | 96 | 97 | Starts the process of finding all tests in a class. 98 | 99 | The fully qualified type name to find tests in. 100 | Whether to include source file information, if possible. 101 | The message sink to report results back to. 102 | The options used by the test framework during discovery. 103 | 104 | 105 | 106 | Serializes a test case into string form. 107 | 108 | The test case to be serialized. 109 | The serialized representation of the test case. 110 | 111 | 112 | 113 | Gets the target framework that the test assembly is linked against. 114 | 115 | 116 | 117 | 118 | Returns the display name of the test framework that this discoverer is running tests for. 119 | 120 | 121 | 122 | 123 | Represents an instance of that is to be used for 124 | test discovery purposes. 125 | 126 | 127 | 128 | 129 | This interface should not be consumed directly; instead, you should 130 | consume 131 | or . 132 | 133 | 134 | 135 | 136 | Gets an option value. 137 | 138 | The type of the value. 139 | The name of the value. 140 | The value. 141 | 142 | 143 | 144 | Sets an option value. 145 | 146 | The type of the value. 147 | The name of the value. 148 | The value to be set. 149 | 150 | 151 | 152 | Represents an instance of that is to be used for 153 | test execution purposes. 154 | 155 | 156 | 157 | 158 | Represents an implementation of the execution part of a test framework. 159 | 160 | 161 | 162 | 163 | De-serializes a test case. 164 | 165 | The string representation of the test case. 166 | The de-serialized test case. 167 | 168 | 169 | 170 | Starts the process of running all the tests in the assembly. 171 | 172 | The message sink to report results back to. 173 | The options to be used during test discovery. 174 | The options to be used during test execution. 175 | 176 | 177 | 178 | Starts the process of running selected tests in the assembly. 179 | 180 | The test cases to run. 181 | The message sink to report results back to. 182 | The options to be used during test execution. 183 | 184 | 185 | 186 | Base message interface for all messages related to test execution. It includes the list 187 | of test cases that are associated with this execution step. 188 | 189 | 190 | 191 | 192 | This is the base interface for all test messages. A test message is a message that is 193 | used to communicate the status of discovery and execution of tests. 194 | 195 | 196 | 197 | 198 | The test cases that are associated with this message. 199 | 200 | 201 | 202 | 203 | This represents failure information for the test runner. It encapsulates multiple sets 204 | of exceptions so that it can provide inner exception information, including support for 205 | . The parent indices indicate the hierarchy of the exceptions 206 | as extracted during the failure; the 0th exception is always the single parent of the tree, 207 | and will have an index of -1. 208 | 209 | 210 | 211 | 212 | The fully-qualified type name of the exceptions. 213 | 214 | 215 | 216 | 217 | The messages of the exceptions. 218 | 219 | 220 | 221 | 222 | The stack traces of the exceptions. 223 | 224 | 225 | 226 | 227 | The parent exception index for the exceptions; a -1 indicates that 228 | the exception in question has no parent. 229 | 230 | 231 | 232 | 233 | This is the base message for various types of completion that can occur during the 234 | various phases of execution process (e.g., test case, test class, test collection, 235 | and assembly). 236 | 237 | 238 | 239 | 240 | The execution time (in seconds) for this execution. 241 | 242 | 243 | 244 | 245 | The number of failing tests. 246 | 247 | 248 | 249 | 250 | The total number of tests run. 251 | 252 | 253 | 254 | 255 | The number of skipped tests. 256 | 257 | 258 | 259 | 260 | Represents an endpoint for the reception of test messages. 261 | 262 | 263 | 264 | 265 | Reports the presence of a message on the message bus. This method should 266 | never throw exceptions. 267 | 268 | The message from the message bus 269 | Return true to continue running tests, or false to stop. 270 | 271 | 272 | 273 | Base message interface for all messages related to test assemblies. 274 | 275 | 276 | 277 | 278 | The test assembly that is associated with this message. 279 | 280 | 281 | 282 | 283 | Base message interface for all messages related to test cases. 284 | 285 | 286 | 287 | 288 | Base message interface for all messages related to test methods. 289 | 290 | 291 | 292 | 293 | Base message interface for all messages related to test classes. 294 | 295 | 296 | 297 | 298 | Base message interface for all messages related to test collections. 299 | 300 | 301 | 302 | 303 | The test collection that is associated with this message. 304 | 305 | 306 | 307 | 308 | The test class that is associated with this message. 309 | 310 | 311 | 312 | 313 | The test method that is associated with this message. 314 | 315 | 316 | 317 | 318 | The test case that is associated with this message. 319 | 320 | 321 | 322 | 323 | Base message interface for all messages related to tests. 324 | 325 | 326 | 327 | 328 | The test that is associated with this message. 329 | 330 | 331 | 332 | 333 | This is the base interface for all individual test results (e.g., tests which 334 | pass, fail, or are skipped). 335 | 336 | 337 | 338 | 339 | The execution time of the test, in seconds. 340 | 341 | 342 | 343 | 344 | The captured output of the test. 345 | 346 | 347 | 348 | 349 | This message is sent during execution to indicate that the After method of 350 | a has completed executing. 351 | 352 | 353 | 354 | 355 | The fully qualified type name of the . 356 | 357 | 358 | 359 | 360 | This message is sent during execution to indicate that the After method of 361 | a is about to execute. 362 | 363 | 364 | 365 | 366 | The fully qualified type name of the . 367 | 368 | 369 | 370 | 371 | This message is sent during execution to indicate that the Before method of 372 | a has completed executing. 373 | 374 | 375 | 376 | 377 | The fully qualified type name of the . 378 | 379 | 380 | 381 | 382 | This message is sent during execution to indicate that the Before method of 383 | a is about to execute. 384 | 385 | 386 | 387 | 388 | The fully qualified type name of the . 389 | 390 | 391 | 392 | 393 | This message is sent when the test framework wants to report a diagnostic message 394 | to the end user. 395 | 396 | 397 | 398 | 399 | Gets the diagnostic message. 400 | 401 | 402 | 403 | 404 | This message indicates that the discovery process has been completed for 405 | the requested assembly. 406 | 407 | 408 | 409 | 410 | This message indicates that an error has occurred in the execution process. 411 | 412 | 413 | 414 | 415 | This message indicates that an error has occurred in test assembly cleanup. 416 | 417 | 418 | 419 | 420 | This message indicates that the execution process has been completed for 421 | the requested assembly. 422 | 423 | 424 | 425 | 426 | This message indicates that the execution process is about to start for 427 | the requested assembly. 428 | 429 | 430 | 431 | 432 | Gets the local date and time when the test assembly execution began. 433 | 434 | 435 | 436 | 437 | Gets a display string that describes the test execution environment. 438 | 439 | 440 | 441 | 442 | Gets a display string which describes the test framework and version number. 443 | 444 | 445 | 446 | 447 | This message indicates that an error has occurred during test case cleanup. 448 | 449 | 450 | 451 | 452 | This message indicates that a test case had been found during the discovery process. 453 | 454 | 455 | 456 | 457 | This message indicates that a test case has finished executing. 458 | 459 | 460 | 461 | 462 | This message indicates that a test case is about to start executing. 463 | 464 | 465 | 466 | 467 | This message indicates that an error has occurred during test class cleanup. 468 | 469 | 470 | 471 | 472 | This message indicates that an instance of a test class has just been constructed. 473 | Instance (non-static) methods of tests get a new instance of the test class for each 474 | individual test execution; static methods do not get an instance of the test class. 475 | 476 | 477 | 478 | 479 | This message indicates that an instance of a test class is about to be constructed. 480 | Instance (non-static) methods of tests get a new instance of the test class for each 481 | individual test execution; static methods do not get an instance of the test class. 482 | 483 | 484 | 485 | 486 | This message indicates that the method was 487 | just called on the test class for the test case that just finished executing. 488 | 489 | 490 | 491 | 492 | This message indicates that the method is 493 | about to be called on the test class for the test case that just finished executing. 494 | 495 | 496 | 497 | 498 | This message indicates that a test class has finished executing (meaning, all of the 499 | test cases in this test class have finished running). 500 | 501 | 502 | 503 | 504 | This message indicates that a test class is about to begin running. 505 | 506 | 507 | 508 | 509 | This message indicates that an error has occurred during test cleanup. 510 | 511 | 512 | 513 | 514 | This message indicates that an error has occurred during test collection cleanup. 515 | 516 | 517 | 518 | 519 | This message indicates that a test collection has just finished executing (meaning, 520 | all the test classes in the collection has finished). 521 | 522 | 523 | 524 | 525 | This message indicates that a test collection has is about to start executing. 526 | 527 | 528 | 529 | 530 | This message indicates that a test has failed. 531 | 532 | 533 | 534 | 535 | This message indicates that a test has finished executing. 536 | 537 | 538 | 539 | 540 | Gets the time spent executing the test, in seconds. 541 | 542 | 543 | 544 | 545 | The captured output of the test. 546 | 547 | 548 | 549 | 550 | This message indicates that an error has occurred during test method cleanup. 551 | 552 | 553 | 554 | 555 | This message indicates that a test method has finished executing (meaning, all 556 | the test cases that derived from the test method have finished). 557 | 558 | 559 | 560 | 561 | This message indicates that a test method is about to begin executing. 562 | 563 | 564 | 565 | 566 | This message indicates that a line of output was provided for a test. 567 | 568 | 569 | 570 | 571 | Gets the line of output. 572 | 573 | 574 | 575 | 576 | Indicates that a test has passed. 577 | 578 | 579 | 580 | 581 | This message indicates that a test was skipped. 582 | 583 | 584 | 585 | 586 | The reason given for skipping the test. 587 | 588 | 589 | 590 | 591 | This message indicates that a test is about to start executing. 592 | 593 | 594 | 595 | 596 | Represents information about an assembly. The primary implementation is based on runtime 597 | reflection, but may also be implemented by runner authors to provide non-reflection-based 598 | test discovery (for example, AST-based runners like CodeRush or Resharper). 599 | 600 | 601 | 602 | 603 | Gets all the custom attributes for the given assembly. 604 | 605 | The type of the attribute, in assembly-qualified form 606 | The matching attributes that decorate the assembly 607 | 608 | 609 | 610 | Gets a for the given type. 611 | 612 | The fully qualified type name. 613 | The if the type exists, or null if not. 614 | 615 | 616 | 617 | Gets all the types for the assembly. 618 | 619 | Set to true to return all types in the assembly, 620 | or false to return only public types. 621 | The types in the assembly. 622 | 623 | 624 | 625 | Gets the on-disk location of the assembly under test. If the assembly path is not 626 | known (for example, in AST-based runners), you must return null. 627 | 628 | 629 | This is used by the test framework wrappers to find the co-located unit test framework 630 | assembly (f.e., xunit.dll or xunit.execution.dll). AST-based runners will need to directly create 631 | instances of and (using the constructors that 632 | support an explicit path to the test framework DLL) rather than relying on the 633 | use of . 634 | 635 | 636 | 637 | 638 | Gets the assembly name. May return a fully qualified name for assemblies found via 639 | reflection (i.e., "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"), 640 | or may return just assembly name only for assemblies found via source code introspection 641 | (i.e., "mscorlib"). 642 | 643 | 644 | 645 | 646 | Represents information about an attribute. The primary implementation is based on runtime 647 | reflection, but may also be implemented by runner authors to provide non-reflection-based 648 | test discovery (for example, AST-based runners like CodeRush or Resharper). 649 | 650 | 651 | 652 | 653 | Gets the arguments passed to the constructor. 654 | 655 | The constructor arguments, in order 656 | 657 | 658 | 659 | Gets all the custom attributes for the given attribute. 660 | 661 | The type of the attribute to find, in assembly-qualified form 662 | The matching attributes that decorate the attribute 663 | 664 | 665 | 666 | Gets a named-argument initialized value of the attribute. If there is no named argument for the given name 667 | on this attribute, then returns default(TValue). 668 | 669 | The type of the argument 670 | The name of the argument 671 | The argument value 672 | 673 | 674 | 675 | Represents information about a method. The primary implementation is based on runtime 676 | reflection, but may also be implemented by runner authors to provide non-reflection-based 677 | test discovery (for example, AST-based runners like CodeRush or Resharper). 678 | 679 | 680 | 681 | 682 | Gets all the custom attributes for the method that are of the given type. 683 | 684 | The type of the attribute, in assembly qualified form 685 | The matching attributes that decorate the method 686 | 687 | 688 | 689 | Gets the types of the generic arguments for generic methods. 690 | 691 | The argument types. 692 | 693 | 694 | 695 | Gets information about the parameters to the method. 696 | 697 | The method's parameters. 698 | 699 | 700 | 701 | Converts an open generic method into a closed generic method, using the provided type arguments. 702 | 703 | The type arguments to be used in the generic definition. 704 | A new that represents the closed generic method. 705 | 706 | 707 | 708 | Gets a value indicating whether the method is abstract. 709 | 710 | 711 | 712 | 713 | Gets a value indicating whether the method is a generic definition (i.e., an open generic). 714 | 715 | 716 | 717 | 718 | Gets a value indicating whether the method is public. 719 | 720 | 721 | 722 | 723 | Gets a value indicating whether the method is static. 724 | 725 | 726 | 727 | 728 | Gets the name of the method. 729 | 730 | 731 | 732 | 733 | Gets the fully qualified type name of the return type. 734 | 735 | 736 | 737 | 738 | Gets a value which represents the class that this method was 739 | reflected from (i.e., equivalent to MethodInfo.ReflectedType) 740 | 741 | 742 | 743 | 744 | Represents information about a method parameter. The primary implementation is based on runtime 745 | reflection, but may also be implemented by runner authors to provide non-reflection-based 746 | test discovery (for example, AST-based runners like CodeRush or Resharper). 747 | 748 | 749 | 750 | 751 | The name of the parameter. 752 | 753 | 754 | 755 | 756 | Gets the type of the parameter. 757 | 758 | 759 | 760 | 761 | Represents a reflection-backed implementation of . 762 | 763 | 764 | 765 | 766 | Gets the underlying for the assembly. 767 | 768 | 769 | 770 | 771 | Represents a reflection-backed implementation of . 772 | 773 | 774 | 775 | 776 | Gets the instance of the attribute, if available. 777 | 778 | 779 | 780 | 781 | Represents a reflection-backed implementation of . 782 | 783 | 784 | 785 | 786 | Gets the underlying for the method. 787 | 788 | 789 | 790 | 791 | Represents a reflection-backed implementation of . 792 | 793 | 794 | 795 | 796 | Gets the underlying for the parameter. 797 | 798 | 799 | 800 | 801 | Represents a reflection-backed implementation of . 802 | 803 | 804 | 805 | 806 | Represents information about a type. The primary implementation is based on runtime 807 | reflection, but may also be implemented by runner authors to provide non-reflection-based 808 | test discovery (for example, AST-based runners like CodeRush or Resharper). 809 | 810 | 811 | 812 | 813 | Gets all the custom attributes for the given type. 814 | 815 | The type of the attribute, in assembly qualified form 816 | The matching attributes that decorate the type 817 | 818 | 819 | 820 | Gets the generic type arguments for a generic type. 821 | 822 | The list of generic types. 823 | 824 | 825 | 826 | Gets a specific method. 827 | 828 | The name of the method. 829 | Set to true to look for the method in both public and private. 830 | The method. 831 | 832 | 833 | 834 | Gets all the methods in this type. 835 | 836 | Set to true to return all methods in the type, 837 | or false to return only public methods. 838 | 839 | 840 | 841 | Gets the assembly this type is located in. 842 | 843 | 844 | 845 | 846 | Gets the base type of the given type. 847 | 848 | 849 | 850 | 851 | Gets the interfaces implemented by the given type. 852 | 853 | 854 | 855 | 856 | Gets a value indicating whether the type is abstract. 857 | 858 | 859 | 860 | 861 | Gets a value indicating whether the type represents a generic parameter. 862 | 863 | 864 | 865 | 866 | Gets a value indicating whether the type is a generic type. 867 | 868 | 869 | 870 | 871 | Gets a value indicating whether the type is sealed. 872 | 873 | 874 | 875 | 876 | Gets a value indicating whether the type is a value type. 877 | 878 | 879 | 880 | 881 | Gets the fully qualified type name (for non-generic parameters), or the 882 | simple type name (for generic parameters). 883 | 884 | 885 | 886 | 887 | Gets the underlying object. 888 | 889 | 890 | 891 | 892 | Represents serialization support in xUnit.net. 893 | 894 | 895 | 896 | 897 | Adds a value to the serialization. Supported value types include the built-in 898 | intrinsics (string, int, long, float, double, and decimal, including nullable 899 | versions of those), any class which implements ), 900 | or arrays of any supported types. 901 | 902 | The key 903 | The value 904 | The optional type of the value 905 | 906 | 907 | 908 | Gets a value from the serialization. 909 | 910 | The key 911 | The type of the value 912 | The value, if present; null, otherwise 913 | 914 | 915 | 916 | Gets a value from the serialization. 917 | 918 | The key 919 | The value, if present; default(T), otherwise 920 | 921 | 922 | 923 | Represents a single test in the system. A test case typically contains only a single test, 924 | but may contain many if circumstances warrant it (for example, test data for a theory cannot 925 | be pre-enumerated, so the theory yields a single test case with multiple tests). 926 | 927 | 928 | 929 | 930 | Gets the display name of the test. 931 | 932 | 933 | 934 | 935 | Gets the test case this test belongs to. 936 | 937 | 938 | 939 | 940 | Represents a test assembly. 941 | 942 | 943 | 944 | 945 | Gets the assembly that this test assembly belongs to. 946 | 947 | 948 | 949 | 950 | Gets the full path of the configuration file name, if one is present. 951 | May be null if there is no configuration file. 952 | 953 | 954 | 955 | 956 | Represents a single test case in the system. This test case usually represents a single test, but in 957 | the case of dynamically generated data for data driven tests, the test case may actually return 958 | multiple results when run. 959 | 960 | 961 | 962 | 963 | Gets the display name of the test case. 964 | 965 | 966 | 967 | 968 | Gets the display text for the reason a test is being skipped; if the test 969 | is not skipped, returns null. 970 | 971 | 972 | 973 | 974 | Get or sets the source file name and line where the test is defined, if requested (and known). 975 | 976 | 977 | 978 | 979 | Gets the test method this test case belongs to. 980 | 981 | 982 | 983 | 984 | Gets the arguments that will be passed to the test method. 985 | 986 | 987 | 988 | 989 | Gets the trait values associated with this test case. If 990 | there are none, or the framework does not support traits, 991 | this should return an empty dictionary (not null). This 992 | dictionary must be treated as read-only. 993 | 994 | 995 | 996 | 997 | Gets a unique identifier for the test case. 998 | 999 | 1000 | The unique identifier for a test case should be able to discriminate 1001 | among test cases, even those which are varied invocations against the 1002 | same test method (i.e., theories). Ideally, this identifier would remain 1003 | stable until such time as the developer changes some fundamental part 1004 | of the identity (assembly, class name, test name, or test data); however, 1005 | the minimum stability of the identifier must at least extend across 1006 | multiple discoveries of the same test in the same (non-recompiled) 1007 | assembly. 1008 | 1009 | 1010 | 1011 | 1012 | Represents a test class. 1013 | 1014 | 1015 | 1016 | 1017 | Gets the class that this test case is attached to. 1018 | 1019 | 1020 | 1021 | 1022 | Gets the test collection this test case belongs to. 1023 | 1024 | 1025 | 1026 | 1027 | Represents a group of test cases. Test collections form the basis of the parallelization in 1028 | xUnit.net. Test cases which are in the same test collection will not be run in parallel 1029 | against sibling tests, but will run in parallel against tests in other collections. 1030 | 1031 | 1032 | 1033 | 1034 | Gets the type that the test collection was defined with, if available; may be null 1035 | if the test collection didn't have a definition type. 1036 | 1037 | 1038 | 1039 | 1040 | Gets the display name of the test collection. 1041 | 1042 | 1043 | 1044 | 1045 | Gets the test assembly this test collection belongs to. 1046 | 1047 | 1048 | 1049 | 1050 | Gets the test collection ID. Test collection equality is determined by comparing IDs. 1051 | 1052 | 1053 | 1054 | 1055 | Represents a test method. 1056 | 1057 | 1058 | 1059 | 1060 | Gets the method associated with this test method. 1061 | 1062 | 1063 | 1064 | 1065 | Gets the test class that this test method belongs to. 1066 | 1067 | 1068 | 1069 | 1070 | Represents a class which can be used to provide test output. 1071 | 1072 | 1073 | 1074 | 1075 | Adds a line of text to the output. 1076 | 1077 | The message 1078 | 1079 | 1080 | 1081 | Formats a line of text and adds it to the output. 1082 | 1083 | The message format 1084 | The format arguments 1085 | 1086 | 1087 | 1088 | -------------------------------------------------------------------------------- /Assets/Vendor/xunit.abstractions.xml.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f7bca00a3b6cd4a3fac4de8e81b2c80f 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/Vendor/xunit.runner.utility.net452.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/planetarium/xunit-unity-runner/30c8aa9605a6b0a818b582d93ef4ed500f382d70/Assets/Vendor/xunit.runner.utility.net452.dll -------------------------------------------------------------------------------- /Assets/Vendor/xunit.runner.utility.net452.dll.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c78229e1068644679ac8fcb262301184 3 | PluginImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | iconMap: {} 7 | executionOrder: {} 8 | defineConstraints: [] 9 | isPreloaded: 0 10 | isOverridable: 0 11 | isExplicitlyReferenced: 0 12 | validateReferences: 1 13 | platformData: 14 | - first: 15 | Any: 16 | second: 17 | enabled: 1 18 | settings: {} 19 | - first: 20 | Editor: Editor 21 | second: 22 | enabled: 0 23 | settings: 24 | DefaultValueInitialized: true 25 | - first: 26 | Windows Store Apps: WindowsStoreApps 27 | second: 28 | enabled: 0 29 | settings: 30 | CPU: AnyCPU 31 | userData: 32 | assetBundleName: 33 | assetBundleVariant: 34 | -------------------------------------------------------------------------------- /Assets/Vendor/xunit.runner.utility.net452.xml.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 72c45fe667c56442ab5c57566dda9f99 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /CHANGES.md: -------------------------------------------------------------------------------- 1 | xUnit.net Unity Runner Changelog 2 | ================================ 3 | 4 | 5 | Version 0.6.0 6 | ------------- 7 | 8 | Released on December 4, 2022. 9 | 10 | - Upgraded Unity from 2020.3.4f1 to 2021.3.5f1. 11 | 12 | 13 | Version 0.5.0 14 | ------------- 15 | 16 | Released on November 2, 2021. 17 | 18 | - Added `-f`/`--stop-on-fail` option. 19 | - Added `-p`/`--parallel` option. 20 | - Added `-H`/`--hang-seconds` option. 21 | - Applied AppDomains. 22 | 23 | 24 | Version 0.4.0 25 | ------------- 26 | 27 | Released on November 1, 2021. 28 | 29 | - Added `-D`/`--distributed` option for distributed exccution. 30 | - Added `-s`/`--distributed-seed` option for distributed exccution. 31 | - Added `--dry-run` option. 32 | 33 | 34 | Version 0.3.1 35 | ------------- 36 | 37 | Released on November 1, 2021. 38 | 39 | - Fixed a build bug that the runner had hanged and started running tests. 40 | - Applied filters became printed to the standard error for easier 41 | troubleshooting. 42 | 43 | 44 | Version 0.3.0 45 | ------------- 46 | 47 | Released on October 31, 2021. 48 | 49 | - Upgraded Unity Editor from 2019.1.0f2 to 2020.3.4f1. 50 | - Added `-x`/`--report-xml-path` option. 51 | - Fixed a bug that executables in distributions for Windows had lacked 52 | the suffix *.exe*. 53 | 54 | 55 | Version 0.2.5 56 | ------------- 57 | 58 | Released on June 3, 2021. 59 | 60 | - Added detailed log output for failed tests. [[#6]] 61 | 62 | [#6]: https://github.com/planetarium/xunit-unity-runner/pull/6 63 | 64 | 65 | Version 0.2.4 66 | ------------- 67 | 68 | Released on June 27, 2019. 69 | 70 | - Added more filtering options: [[#3]] 71 | - `-c`/`--select-class` 72 | - `-m`/`--select-method` 73 | - `-t`/`--select-trait-condition` 74 | 75 | [#3]: https://github.com/planetarium/xunit-unity-runner/pull/3 76 | 77 | 78 | Version 0.2.3 79 | ------------- 80 | 81 | Released on June 17, 2019. 82 | 83 | - Fixed the bug that every test case had run twice. [[#2] by Swen Mun] 84 | 85 | [#2]: https://github.com/planetarium/xunit-unity-runner/pull/2 86 | 87 | 88 | Version 0.2.2 89 | ------------- 90 | 91 | Released on June 13, 2019. 92 | 93 | - Fixed the bug that test runner had crashed if there are any test cases 94 | nnotated with `Xunit.TheoryAttribute`. [[#1] by Lee Dogeon] 95 | 96 | [#1]: https://github.com/planetarium/xunit-unity-runner/pull/1 97 | 98 | 99 | Version 0.2.1 100 | ------------- 101 | 102 | Released on June 5, 2019. 103 | 104 | - Improved the way to terminate the test runner process in order to finish 105 | tests gracefully. 106 | 107 | 108 | Version 0.2.0 109 | ------------- 110 | 111 | Released on May 25, 2019. 112 | 113 | - A graphical window became no more shown. It now has only a command-line 114 | interface. 115 | - Added CLI options to filter tests: 116 | - `-C`/`--exclude-class` 117 | - `-M`/`--exclude-method` 118 | - `-T`/`--exclude-trait-condition` 119 | - Added a CLI option to print the usage manual: `-h`/`--help`. 120 | 121 | 122 | Version 0.1.0 123 | ------------- 124 | 125 | Initial release. Released on May 24, 2019. 126 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /Packages/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "com.unity.2d.sprite": "1.0.0", 4 | "com.unity.2d.tilemap": "1.0.0", 5 | "com.unity.ads": "3.7.5", 6 | "com.unity.analytics": "3.6.12", 7 | "com.unity.collab-proxy": "1.15.18", 8 | "com.unity.ide.rider": "3.0.14", 9 | "com.unity.ide.visualstudio": "2.0.15", 10 | "com.unity.ide.vscode": "1.2.5", 11 | "com.unity.purchasing": "4.1.5", 12 | "com.unity.test-framework": "1.1.31", 13 | "com.unity.textmeshpro": "3.0.6", 14 | "com.unity.timeline": "1.6.4", 15 | "com.unity.ugui": "1.0.0", 16 | "com.unity.modules.ai": "1.0.0", 17 | "com.unity.modules.androidjni": "1.0.0", 18 | "com.unity.modules.animation": "1.0.0", 19 | "com.unity.modules.assetbundle": "1.0.0", 20 | "com.unity.modules.audio": "1.0.0", 21 | "com.unity.modules.cloth": "1.0.0", 22 | "com.unity.modules.director": "1.0.0", 23 | "com.unity.modules.imageconversion": "1.0.0", 24 | "com.unity.modules.imgui": "1.0.0", 25 | "com.unity.modules.jsonserialize": "1.0.0", 26 | "com.unity.modules.particlesystem": "1.0.0", 27 | "com.unity.modules.physics": "1.0.0", 28 | "com.unity.modules.physics2d": "1.0.0", 29 | "com.unity.modules.screencapture": "1.0.0", 30 | "com.unity.modules.terrain": "1.0.0", 31 | "com.unity.modules.terrainphysics": "1.0.0", 32 | "com.unity.modules.tilemap": "1.0.0", 33 | "com.unity.modules.ui": "1.0.0", 34 | "com.unity.modules.uielements": "1.0.0", 35 | "com.unity.modules.umbra": "1.0.0", 36 | "com.unity.modules.unityanalytics": "1.0.0", 37 | "com.unity.modules.unitywebrequest": "1.0.0", 38 | "com.unity.modules.unitywebrequestassetbundle": "1.0.0", 39 | "com.unity.modules.unitywebrequestaudio": "1.0.0", 40 | "com.unity.modules.unitywebrequesttexture": "1.0.0", 41 | "com.unity.modules.unitywebrequestwww": "1.0.0", 42 | "com.unity.modules.vehicles": "1.0.0", 43 | "com.unity.modules.video": "1.0.0", 44 | "com.unity.modules.vr": "1.0.0", 45 | "com.unity.modules.wind": "1.0.0", 46 | "com.unity.modules.xr": "1.0.0" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /Packages/packages-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "com.unity.2d.sprite": { 4 | "version": "1.0.0", 5 | "depth": 0, 6 | "source": "builtin", 7 | "dependencies": {} 8 | }, 9 | "com.unity.2d.tilemap": { 10 | "version": "1.0.0", 11 | "depth": 0, 12 | "source": "builtin", 13 | "dependencies": {} 14 | }, 15 | "com.unity.ads": { 16 | "version": "3.7.5", 17 | "depth": 0, 18 | "source": "registry", 19 | "dependencies": { 20 | "com.unity.ugui": "1.0.0" 21 | }, 22 | "url": "https://packages.unity.com" 23 | }, 24 | "com.unity.analytics": { 25 | "version": "3.6.12", 26 | "depth": 0, 27 | "source": "registry", 28 | "dependencies": { 29 | "com.unity.ugui": "1.0.0" 30 | }, 31 | "url": "https://packages.unity.com" 32 | }, 33 | "com.unity.collab-proxy": { 34 | "version": "1.15.18", 35 | "depth": 0, 36 | "source": "registry", 37 | "dependencies": { 38 | "com.unity.services.core": "1.0.1" 39 | }, 40 | "url": "https://packages.unity.com" 41 | }, 42 | "com.unity.ext.nunit": { 43 | "version": "1.0.6", 44 | "depth": 1, 45 | "source": "registry", 46 | "dependencies": {}, 47 | "url": "https://packages.unity.com" 48 | }, 49 | "com.unity.ide.rider": { 50 | "version": "3.0.14", 51 | "depth": 0, 52 | "source": "registry", 53 | "dependencies": { 54 | "com.unity.ext.nunit": "1.0.6" 55 | }, 56 | "url": "https://packages.unity.com" 57 | }, 58 | "com.unity.ide.visualstudio": { 59 | "version": "2.0.15", 60 | "depth": 0, 61 | "source": "registry", 62 | "dependencies": { 63 | "com.unity.test-framework": "1.1.9" 64 | }, 65 | "url": "https://packages.unity.com" 66 | }, 67 | "com.unity.ide.vscode": { 68 | "version": "1.2.5", 69 | "depth": 0, 70 | "source": "registry", 71 | "dependencies": {}, 72 | "url": "https://packages.unity.com" 73 | }, 74 | "com.unity.nuget.newtonsoft-json": { 75 | "version": "3.0.2", 76 | "depth": 2, 77 | "source": "registry", 78 | "dependencies": {}, 79 | "url": "https://packages.unity.com" 80 | }, 81 | "com.unity.purchasing": { 82 | "version": "4.1.5", 83 | "depth": 0, 84 | "source": "registry", 85 | "dependencies": { 86 | "com.unity.ugui": "1.0.0", 87 | "com.unity.modules.unityanalytics": "1.0.0", 88 | "com.unity.modules.unitywebrequest": "1.0.0", 89 | "com.unity.modules.jsonserialize": "1.0.0", 90 | "com.unity.modules.androidjni": "1.0.0", 91 | "com.unity.services.core": "1.0.1" 92 | }, 93 | "url": "https://packages.unity.com" 94 | }, 95 | "com.unity.services.core": { 96 | "version": "1.4.0", 97 | "depth": 1, 98 | "source": "registry", 99 | "dependencies": { 100 | "com.unity.modules.unitywebrequest": "1.0.0", 101 | "com.unity.nuget.newtonsoft-json": "3.0.2", 102 | "com.unity.modules.androidjni": "1.0.0" 103 | }, 104 | "url": "https://packages.unity.com" 105 | }, 106 | "com.unity.test-framework": { 107 | "version": "1.1.31", 108 | "depth": 0, 109 | "source": "registry", 110 | "dependencies": { 111 | "com.unity.ext.nunit": "1.0.6", 112 | "com.unity.modules.imgui": "1.0.0", 113 | "com.unity.modules.jsonserialize": "1.0.0" 114 | }, 115 | "url": "https://packages.unity.com" 116 | }, 117 | "com.unity.textmeshpro": { 118 | "version": "3.0.6", 119 | "depth": 0, 120 | "source": "registry", 121 | "dependencies": { 122 | "com.unity.ugui": "1.0.0" 123 | }, 124 | "url": "https://packages.unity.com" 125 | }, 126 | "com.unity.timeline": { 127 | "version": "1.6.4", 128 | "depth": 0, 129 | "source": "registry", 130 | "dependencies": { 131 | "com.unity.modules.director": "1.0.0", 132 | "com.unity.modules.animation": "1.0.0", 133 | "com.unity.modules.audio": "1.0.0", 134 | "com.unity.modules.particlesystem": "1.0.0" 135 | }, 136 | "url": "https://packages.unity.com" 137 | }, 138 | "com.unity.ugui": { 139 | "version": "1.0.0", 140 | "depth": 0, 141 | "source": "builtin", 142 | "dependencies": { 143 | "com.unity.modules.ui": "1.0.0", 144 | "com.unity.modules.imgui": "1.0.0" 145 | } 146 | }, 147 | "com.unity.modules.ai": { 148 | "version": "1.0.0", 149 | "depth": 0, 150 | "source": "builtin", 151 | "dependencies": {} 152 | }, 153 | "com.unity.modules.androidjni": { 154 | "version": "1.0.0", 155 | "depth": 0, 156 | "source": "builtin", 157 | "dependencies": {} 158 | }, 159 | "com.unity.modules.animation": { 160 | "version": "1.0.0", 161 | "depth": 0, 162 | "source": "builtin", 163 | "dependencies": {} 164 | }, 165 | "com.unity.modules.assetbundle": { 166 | "version": "1.0.0", 167 | "depth": 0, 168 | "source": "builtin", 169 | "dependencies": {} 170 | }, 171 | "com.unity.modules.audio": { 172 | "version": "1.0.0", 173 | "depth": 0, 174 | "source": "builtin", 175 | "dependencies": {} 176 | }, 177 | "com.unity.modules.cloth": { 178 | "version": "1.0.0", 179 | "depth": 0, 180 | "source": "builtin", 181 | "dependencies": { 182 | "com.unity.modules.physics": "1.0.0" 183 | } 184 | }, 185 | "com.unity.modules.director": { 186 | "version": "1.0.0", 187 | "depth": 0, 188 | "source": "builtin", 189 | "dependencies": { 190 | "com.unity.modules.audio": "1.0.0", 191 | "com.unity.modules.animation": "1.0.0" 192 | } 193 | }, 194 | "com.unity.modules.imageconversion": { 195 | "version": "1.0.0", 196 | "depth": 0, 197 | "source": "builtin", 198 | "dependencies": {} 199 | }, 200 | "com.unity.modules.imgui": { 201 | "version": "1.0.0", 202 | "depth": 0, 203 | "source": "builtin", 204 | "dependencies": {} 205 | }, 206 | "com.unity.modules.jsonserialize": { 207 | "version": "1.0.0", 208 | "depth": 0, 209 | "source": "builtin", 210 | "dependencies": {} 211 | }, 212 | "com.unity.modules.particlesystem": { 213 | "version": "1.0.0", 214 | "depth": 0, 215 | "source": "builtin", 216 | "dependencies": {} 217 | }, 218 | "com.unity.modules.physics": { 219 | "version": "1.0.0", 220 | "depth": 0, 221 | "source": "builtin", 222 | "dependencies": {} 223 | }, 224 | "com.unity.modules.physics2d": { 225 | "version": "1.0.0", 226 | "depth": 0, 227 | "source": "builtin", 228 | "dependencies": {} 229 | }, 230 | "com.unity.modules.screencapture": { 231 | "version": "1.0.0", 232 | "depth": 0, 233 | "source": "builtin", 234 | "dependencies": { 235 | "com.unity.modules.imageconversion": "1.0.0" 236 | } 237 | }, 238 | "com.unity.modules.subsystems": { 239 | "version": "1.0.0", 240 | "depth": 1, 241 | "source": "builtin", 242 | "dependencies": { 243 | "com.unity.modules.jsonserialize": "1.0.0" 244 | } 245 | }, 246 | "com.unity.modules.terrain": { 247 | "version": "1.0.0", 248 | "depth": 0, 249 | "source": "builtin", 250 | "dependencies": {} 251 | }, 252 | "com.unity.modules.terrainphysics": { 253 | "version": "1.0.0", 254 | "depth": 0, 255 | "source": "builtin", 256 | "dependencies": { 257 | "com.unity.modules.physics": "1.0.0", 258 | "com.unity.modules.terrain": "1.0.0" 259 | } 260 | }, 261 | "com.unity.modules.tilemap": { 262 | "version": "1.0.0", 263 | "depth": 0, 264 | "source": "builtin", 265 | "dependencies": { 266 | "com.unity.modules.physics2d": "1.0.0" 267 | } 268 | }, 269 | "com.unity.modules.ui": { 270 | "version": "1.0.0", 271 | "depth": 0, 272 | "source": "builtin", 273 | "dependencies": {} 274 | }, 275 | "com.unity.modules.uielements": { 276 | "version": "1.0.0", 277 | "depth": 0, 278 | "source": "builtin", 279 | "dependencies": { 280 | "com.unity.modules.ui": "1.0.0", 281 | "com.unity.modules.imgui": "1.0.0", 282 | "com.unity.modules.jsonserialize": "1.0.0", 283 | "com.unity.modules.uielementsnative": "1.0.0" 284 | } 285 | }, 286 | "com.unity.modules.uielementsnative": { 287 | "version": "1.0.0", 288 | "depth": 1, 289 | "source": "builtin", 290 | "dependencies": { 291 | "com.unity.modules.ui": "1.0.0", 292 | "com.unity.modules.imgui": "1.0.0", 293 | "com.unity.modules.jsonserialize": "1.0.0" 294 | } 295 | }, 296 | "com.unity.modules.umbra": { 297 | "version": "1.0.0", 298 | "depth": 0, 299 | "source": "builtin", 300 | "dependencies": {} 301 | }, 302 | "com.unity.modules.unityanalytics": { 303 | "version": "1.0.0", 304 | "depth": 0, 305 | "source": "builtin", 306 | "dependencies": { 307 | "com.unity.modules.unitywebrequest": "1.0.0", 308 | "com.unity.modules.jsonserialize": "1.0.0" 309 | } 310 | }, 311 | "com.unity.modules.unitywebrequest": { 312 | "version": "1.0.0", 313 | "depth": 0, 314 | "source": "builtin", 315 | "dependencies": {} 316 | }, 317 | "com.unity.modules.unitywebrequestassetbundle": { 318 | "version": "1.0.0", 319 | "depth": 0, 320 | "source": "builtin", 321 | "dependencies": { 322 | "com.unity.modules.assetbundle": "1.0.0", 323 | "com.unity.modules.unitywebrequest": "1.0.0" 324 | } 325 | }, 326 | "com.unity.modules.unitywebrequestaudio": { 327 | "version": "1.0.0", 328 | "depth": 0, 329 | "source": "builtin", 330 | "dependencies": { 331 | "com.unity.modules.unitywebrequest": "1.0.0", 332 | "com.unity.modules.audio": "1.0.0" 333 | } 334 | }, 335 | "com.unity.modules.unitywebrequesttexture": { 336 | "version": "1.0.0", 337 | "depth": 0, 338 | "source": "builtin", 339 | "dependencies": { 340 | "com.unity.modules.unitywebrequest": "1.0.0", 341 | "com.unity.modules.imageconversion": "1.0.0" 342 | } 343 | }, 344 | "com.unity.modules.unitywebrequestwww": { 345 | "version": "1.0.0", 346 | "depth": 0, 347 | "source": "builtin", 348 | "dependencies": { 349 | "com.unity.modules.unitywebrequest": "1.0.0", 350 | "com.unity.modules.unitywebrequestassetbundle": "1.0.0", 351 | "com.unity.modules.unitywebrequestaudio": "1.0.0", 352 | "com.unity.modules.audio": "1.0.0", 353 | "com.unity.modules.assetbundle": "1.0.0", 354 | "com.unity.modules.imageconversion": "1.0.0" 355 | } 356 | }, 357 | "com.unity.modules.vehicles": { 358 | "version": "1.0.0", 359 | "depth": 0, 360 | "source": "builtin", 361 | "dependencies": { 362 | "com.unity.modules.physics": "1.0.0" 363 | } 364 | }, 365 | "com.unity.modules.video": { 366 | "version": "1.0.0", 367 | "depth": 0, 368 | "source": "builtin", 369 | "dependencies": { 370 | "com.unity.modules.audio": "1.0.0", 371 | "com.unity.modules.ui": "1.0.0", 372 | "com.unity.modules.unitywebrequest": "1.0.0" 373 | } 374 | }, 375 | "com.unity.modules.vr": { 376 | "version": "1.0.0", 377 | "depth": 0, 378 | "source": "builtin", 379 | "dependencies": { 380 | "com.unity.modules.jsonserialize": "1.0.0", 381 | "com.unity.modules.physics": "1.0.0", 382 | "com.unity.modules.xr": "1.0.0" 383 | } 384 | }, 385 | "com.unity.modules.wind": { 386 | "version": "1.0.0", 387 | "depth": 0, 388 | "source": "builtin", 389 | "dependencies": {} 390 | }, 391 | "com.unity.modules.xr": { 392 | "version": "1.0.0", 393 | "depth": 0, 394 | "source": "builtin", 395 | "dependencies": { 396 | "com.unity.modules.physics": "1.0.0", 397 | "com.unity.modules.jsonserialize": "1.0.0", 398 | "com.unity.modules.subsystems": "1.0.0" 399 | } 400 | } 401 | } 402 | } 403 | -------------------------------------------------------------------------------- /ProjectSettings/AudioManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!11 &1 4 | AudioManager: 5 | m_ObjectHideFlags: 0 6 | m_Volume: 1 7 | Rolloff Scale: 1 8 | Doppler Factor: 1 9 | Default Speaker Mode: 2 10 | m_SampleRate: 0 11 | m_DSPBufferSize: 1024 12 | m_VirtualVoiceCount: 512 13 | m_RealVoiceCount: 32 14 | m_SpatializerPlugin: 15 | m_AmbisonicDecoderPlugin: 16 | m_DisableAudio: 0 17 | m_VirtualizeEffects: 1 18 | -------------------------------------------------------------------------------- /ProjectSettings/ClusterInputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!236 &1 4 | ClusterInputManager: 5 | m_ObjectHideFlags: 0 6 | m_Inputs: [] 7 | -------------------------------------------------------------------------------- /ProjectSettings/DynamicsManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!55 &1 4 | PhysicsManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 11 7 | m_Gravity: {x: 0, y: -9.81, z: 0} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_BounceThreshold: 2 10 | m_SleepThreshold: 0.005 11 | m_DefaultContactOffset: 0.01 12 | m_DefaultSolverIterations: 6 13 | m_DefaultSolverVelocityIterations: 1 14 | m_QueriesHitBackfaces: 0 15 | m_QueriesHitTriggers: 1 16 | m_EnableAdaptiveForce: 0 17 | m_ClothInterCollisionDistance: 0 18 | m_ClothInterCollisionStiffness: 0 19 | m_ContactsGeneration: 1 20 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 21 | m_AutoSimulation: 1 22 | m_AutoSyncTransforms: 0 23 | m_ReuseCollisionCallbacks: 1 24 | m_ClothInterCollisionSettingsToggle: 0 25 | m_ContactPairsMode: 0 26 | m_BroadphaseType: 0 27 | m_WorldBounds: 28 | m_Center: {x: 0, y: 0, z: 0} 29 | m_Extent: {x: 250, y: 250, z: 250} 30 | m_WorldSubdivisions: 8 31 | m_FrictionType: 0 32 | m_EnableEnhancedDeterminism: 0 33 | m_EnableUnifiedHeightmaps: 1 34 | m_DefaultMaxAngluarSpeed: 7 35 | -------------------------------------------------------------------------------- /ProjectSettings/EditorBuildSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1045 &1 4 | EditorBuildSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Scenes: [] 8 | m_configObjects: {} 9 | -------------------------------------------------------------------------------- /ProjectSettings/EditorSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!159 &1 4 | EditorSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 7 7 | m_ExternalVersionControlSupport: Hidden Meta Files 8 | m_SerializationMode: 2 9 | m_LineEndingsForNewScripts: 2 10 | m_DefaultBehaviorMode: 0 11 | m_PrefabRegularEnvironment: {fileID: 0} 12 | m_PrefabUIEnvironment: {fileID: 0} 13 | m_SpritePackerMode: 0 14 | m_SpritePackerPaddingPower: 1 15 | m_EtcTextureCompressorBehavior: 1 16 | m_EtcTextureFastCompressor: 1 17 | m_EtcTextureNormalCompressor: 2 18 | m_EtcTextureBestCompressor: 4 19 | m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp 20 | m_ProjectGenerationRootNamespace: 21 | m_CollabEditorSettings: 22 | inProgressEnabled: 1 23 | m_EnableTextureStreamingInEditMode: 1 24 | m_EnableTextureStreamingInPlayMode: 1 25 | m_AsyncShaderCompilation: 1 26 | -------------------------------------------------------------------------------- /ProjectSettings/GraphicsSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!30 &1 4 | GraphicsSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 12 7 | m_Deferred: 8 | m_Mode: 1 9 | m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} 10 | m_DeferredReflections: 11 | m_Mode: 1 12 | m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} 13 | m_ScreenSpaceShadows: 14 | m_Mode: 1 15 | m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} 16 | m_LegacyDeferred: 17 | m_Mode: 1 18 | m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} 19 | m_DepthNormals: 20 | m_Mode: 1 21 | m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} 22 | m_MotionVectors: 23 | m_Mode: 1 24 | m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} 25 | m_LightHalo: 26 | m_Mode: 1 27 | m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} 28 | m_LensFlare: 29 | m_Mode: 1 30 | m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} 31 | m_AlwaysIncludedShaders: 32 | - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} 33 | - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} 34 | - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} 35 | - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} 36 | - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} 37 | - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} 38 | - {fileID: 16000, guid: 0000000000000000f000000000000000, type: 0} 39 | - {fileID: 16001, guid: 0000000000000000f000000000000000, type: 0} 40 | - {fileID: 17000, guid: 0000000000000000f000000000000000, type: 0} 41 | - {fileID: 16002, guid: 0000000000000000f000000000000000, type: 0} 42 | m_PreloadedShaders: [] 43 | m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, 44 | type: 0} 45 | m_CustomRenderPipeline: {fileID: 0} 46 | m_TransparencySortMode: 0 47 | m_TransparencySortAxis: {x: 0, y: 0, z: 1} 48 | m_DefaultRenderingPath: 1 49 | m_DefaultMobileRenderingPath: 1 50 | m_TierSettings: [] 51 | m_LightmapStripping: 0 52 | m_FogStripping: 0 53 | m_InstancingStripping: 0 54 | m_LightmapKeepPlain: 1 55 | m_LightmapKeepDirCombined: 1 56 | m_LightmapKeepDynamicPlain: 1 57 | m_LightmapKeepDynamicDirCombined: 1 58 | m_LightmapKeepShadowMask: 1 59 | m_LightmapKeepSubtractive: 1 60 | m_FogKeepLinear: 1 61 | m_FogKeepExp: 1 62 | m_FogKeepExp2: 1 63 | m_AlbedoSwatchInfos: [] 64 | m_LightsUseLinearIntensity: 0 65 | m_LightsUseColorTemperature: 0 66 | -------------------------------------------------------------------------------- /ProjectSettings/InputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!13 &1 4 | InputManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Axes: 8 | - serializedVersion: 3 9 | m_Name: Horizontal 10 | descriptiveName: 11 | descriptiveNegativeName: 12 | negativeButton: left 13 | positiveButton: right 14 | altNegativeButton: a 15 | altPositiveButton: d 16 | gravity: 3 17 | dead: 0.001 18 | sensitivity: 3 19 | snap: 1 20 | invert: 0 21 | type: 0 22 | axis: 0 23 | joyNum: 0 24 | - serializedVersion: 3 25 | m_Name: Vertical 26 | descriptiveName: 27 | descriptiveNegativeName: 28 | negativeButton: down 29 | positiveButton: up 30 | altNegativeButton: s 31 | altPositiveButton: w 32 | gravity: 3 33 | dead: 0.001 34 | sensitivity: 3 35 | snap: 1 36 | invert: 0 37 | type: 0 38 | axis: 0 39 | joyNum: 0 40 | - serializedVersion: 3 41 | m_Name: Fire1 42 | descriptiveName: 43 | descriptiveNegativeName: 44 | negativeButton: 45 | positiveButton: left ctrl 46 | altNegativeButton: 47 | altPositiveButton: mouse 0 48 | gravity: 1000 49 | dead: 0.001 50 | sensitivity: 1000 51 | snap: 0 52 | invert: 0 53 | type: 0 54 | axis: 0 55 | joyNum: 0 56 | - serializedVersion: 3 57 | m_Name: Fire2 58 | descriptiveName: 59 | descriptiveNegativeName: 60 | negativeButton: 61 | positiveButton: left alt 62 | altNegativeButton: 63 | altPositiveButton: mouse 1 64 | gravity: 1000 65 | dead: 0.001 66 | sensitivity: 1000 67 | snap: 0 68 | invert: 0 69 | type: 0 70 | axis: 0 71 | joyNum: 0 72 | - serializedVersion: 3 73 | m_Name: Fire3 74 | descriptiveName: 75 | descriptiveNegativeName: 76 | negativeButton: 77 | positiveButton: left shift 78 | altNegativeButton: 79 | altPositiveButton: mouse 2 80 | gravity: 1000 81 | dead: 0.001 82 | sensitivity: 1000 83 | snap: 0 84 | invert: 0 85 | type: 0 86 | axis: 0 87 | joyNum: 0 88 | - serializedVersion: 3 89 | m_Name: Jump 90 | descriptiveName: 91 | descriptiveNegativeName: 92 | negativeButton: 93 | positiveButton: space 94 | altNegativeButton: 95 | altPositiveButton: 96 | gravity: 1000 97 | dead: 0.001 98 | sensitivity: 1000 99 | snap: 0 100 | invert: 0 101 | type: 0 102 | axis: 0 103 | joyNum: 0 104 | - serializedVersion: 3 105 | m_Name: Mouse X 106 | descriptiveName: 107 | descriptiveNegativeName: 108 | negativeButton: 109 | positiveButton: 110 | altNegativeButton: 111 | altPositiveButton: 112 | gravity: 0 113 | dead: 0 114 | sensitivity: 0.1 115 | snap: 0 116 | invert: 0 117 | type: 1 118 | axis: 0 119 | joyNum: 0 120 | - serializedVersion: 3 121 | m_Name: Mouse Y 122 | descriptiveName: 123 | descriptiveNegativeName: 124 | negativeButton: 125 | positiveButton: 126 | altNegativeButton: 127 | altPositiveButton: 128 | gravity: 0 129 | dead: 0 130 | sensitivity: 0.1 131 | snap: 0 132 | invert: 0 133 | type: 1 134 | axis: 1 135 | joyNum: 0 136 | - serializedVersion: 3 137 | m_Name: Mouse ScrollWheel 138 | descriptiveName: 139 | descriptiveNegativeName: 140 | negativeButton: 141 | positiveButton: 142 | altNegativeButton: 143 | altPositiveButton: 144 | gravity: 0 145 | dead: 0 146 | sensitivity: 0.1 147 | snap: 0 148 | invert: 0 149 | type: 1 150 | axis: 2 151 | joyNum: 0 152 | - serializedVersion: 3 153 | m_Name: Horizontal 154 | descriptiveName: 155 | descriptiveNegativeName: 156 | negativeButton: 157 | positiveButton: 158 | altNegativeButton: 159 | altPositiveButton: 160 | gravity: 0 161 | dead: 0.19 162 | sensitivity: 1 163 | snap: 0 164 | invert: 0 165 | type: 2 166 | axis: 0 167 | joyNum: 0 168 | - serializedVersion: 3 169 | m_Name: Vertical 170 | descriptiveName: 171 | descriptiveNegativeName: 172 | negativeButton: 173 | positiveButton: 174 | altNegativeButton: 175 | altPositiveButton: 176 | gravity: 0 177 | dead: 0.19 178 | sensitivity: 1 179 | snap: 0 180 | invert: 1 181 | type: 2 182 | axis: 1 183 | joyNum: 0 184 | - serializedVersion: 3 185 | m_Name: Fire1 186 | descriptiveName: 187 | descriptiveNegativeName: 188 | negativeButton: 189 | positiveButton: joystick button 0 190 | altNegativeButton: 191 | altPositiveButton: 192 | gravity: 1000 193 | dead: 0.001 194 | sensitivity: 1000 195 | snap: 0 196 | invert: 0 197 | type: 0 198 | axis: 0 199 | joyNum: 0 200 | - serializedVersion: 3 201 | m_Name: Fire2 202 | descriptiveName: 203 | descriptiveNegativeName: 204 | negativeButton: 205 | positiveButton: joystick button 1 206 | altNegativeButton: 207 | altPositiveButton: 208 | gravity: 1000 209 | dead: 0.001 210 | sensitivity: 1000 211 | snap: 0 212 | invert: 0 213 | type: 0 214 | axis: 0 215 | joyNum: 0 216 | - serializedVersion: 3 217 | m_Name: Fire3 218 | descriptiveName: 219 | descriptiveNegativeName: 220 | negativeButton: 221 | positiveButton: joystick button 2 222 | altNegativeButton: 223 | altPositiveButton: 224 | gravity: 1000 225 | dead: 0.001 226 | sensitivity: 1000 227 | snap: 0 228 | invert: 0 229 | type: 0 230 | axis: 0 231 | joyNum: 0 232 | - serializedVersion: 3 233 | m_Name: Jump 234 | descriptiveName: 235 | descriptiveNegativeName: 236 | negativeButton: 237 | positiveButton: joystick button 3 238 | altNegativeButton: 239 | altPositiveButton: 240 | gravity: 1000 241 | dead: 0.001 242 | sensitivity: 1000 243 | snap: 0 244 | invert: 0 245 | type: 0 246 | axis: 0 247 | joyNum: 0 248 | - serializedVersion: 3 249 | m_Name: Submit 250 | descriptiveName: 251 | descriptiveNegativeName: 252 | negativeButton: 253 | positiveButton: return 254 | altNegativeButton: 255 | altPositiveButton: joystick button 0 256 | gravity: 1000 257 | dead: 0.001 258 | sensitivity: 1000 259 | snap: 0 260 | invert: 0 261 | type: 0 262 | axis: 0 263 | joyNum: 0 264 | - serializedVersion: 3 265 | m_Name: Submit 266 | descriptiveName: 267 | descriptiveNegativeName: 268 | negativeButton: 269 | positiveButton: enter 270 | altNegativeButton: 271 | altPositiveButton: space 272 | gravity: 1000 273 | dead: 0.001 274 | sensitivity: 1000 275 | snap: 0 276 | invert: 0 277 | type: 0 278 | axis: 0 279 | joyNum: 0 280 | - serializedVersion: 3 281 | m_Name: Cancel 282 | descriptiveName: 283 | descriptiveNegativeName: 284 | negativeButton: 285 | positiveButton: escape 286 | altNegativeButton: 287 | altPositiveButton: joystick button 1 288 | gravity: 1000 289 | dead: 0.001 290 | sensitivity: 1000 291 | snap: 0 292 | invert: 0 293 | type: 0 294 | axis: 0 295 | joyNum: 0 296 | -------------------------------------------------------------------------------- /ProjectSettings/MemorySettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!387306366 &1 4 | MemorySettings: 5 | m_ObjectHideFlags: 0 6 | m_EditorMemorySettings: 7 | m_MainAllocatorBlockSize: -1 8 | m_ThreadAllocatorBlockSize: -1 9 | m_MainGfxBlockSize: -1 10 | m_ThreadGfxBlockSize: -1 11 | m_CacheBlockSize: -1 12 | m_TypetreeBlockSize: -1 13 | m_ProfilerBlockSize: -1 14 | m_ProfilerEditorBlockSize: -1 15 | m_BucketAllocatorGranularity: -1 16 | m_BucketAllocatorBucketsCount: -1 17 | m_BucketAllocatorBlockSize: -1 18 | m_BucketAllocatorBlockCount: -1 19 | m_ProfilerBucketAllocatorGranularity: -1 20 | m_ProfilerBucketAllocatorBucketsCount: -1 21 | m_ProfilerBucketAllocatorBlockSize: -1 22 | m_ProfilerBucketAllocatorBlockCount: -1 23 | m_TempAllocatorSizeMain: -1 24 | m_JobTempAllocatorBlockSize: -1 25 | m_BackgroundJobTempAllocatorBlockSize: -1 26 | m_JobTempAllocatorReducedBlockSize: -1 27 | m_TempAllocatorSizeGIBakingWorker: -1 28 | m_TempAllocatorSizeNavMeshWorker: -1 29 | m_TempAllocatorSizeAudioWorker: -1 30 | m_TempAllocatorSizeCloudWorker: -1 31 | m_TempAllocatorSizeGfx: -1 32 | m_TempAllocatorSizeJobWorker: -1 33 | m_TempAllocatorSizeBackgroundWorker: -1 34 | m_TempAllocatorSizePreloadManager: -1 35 | m_PlatformMemorySettings: {} 36 | -------------------------------------------------------------------------------- /ProjectSettings/NavMeshAreas.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!126 &1 4 | NavMeshProjectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | areas: 8 | - name: Walkable 9 | cost: 1 10 | - name: Not Walkable 11 | cost: 1 12 | - name: Jump 13 | cost: 2 14 | - name: 15 | cost: 1 16 | - name: 17 | cost: 1 18 | - name: 19 | cost: 1 20 | - name: 21 | cost: 1 22 | - name: 23 | cost: 1 24 | - name: 25 | cost: 1 26 | - name: 27 | cost: 1 28 | - name: 29 | cost: 1 30 | - name: 31 | cost: 1 32 | - name: 33 | cost: 1 34 | - name: 35 | cost: 1 36 | - name: 37 | cost: 1 38 | - name: 39 | cost: 1 40 | - name: 41 | cost: 1 42 | - name: 43 | cost: 1 44 | - name: 45 | cost: 1 46 | - name: 47 | cost: 1 48 | - name: 49 | cost: 1 50 | - name: 51 | cost: 1 52 | - name: 53 | cost: 1 54 | - name: 55 | cost: 1 56 | - name: 57 | cost: 1 58 | - name: 59 | cost: 1 60 | - name: 61 | cost: 1 62 | - name: 63 | cost: 1 64 | - name: 65 | cost: 1 66 | - name: 67 | cost: 1 68 | - name: 69 | cost: 1 70 | - name: 71 | cost: 1 72 | m_LastAgentTypeID: -887442657 73 | m_Settings: 74 | - serializedVersion: 2 75 | agentTypeID: 0 76 | agentRadius: 0.5 77 | agentHeight: 2 78 | agentSlope: 45 79 | agentClimb: 0.75 80 | ledgeDropHeight: 0 81 | maxJumpAcrossDistance: 0 82 | minRegionArea: 2 83 | manualCellSize: 0 84 | cellSize: 0.16666667 85 | manualTileSize: 0 86 | tileSize: 256 87 | accuratePlacement: 0 88 | debug: 89 | m_Flags: 0 90 | m_SettingNames: 91 | - Humanoid 92 | -------------------------------------------------------------------------------- /ProjectSettings/PackageManagerSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &1 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 61 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} 13 | m_Name: 14 | m_EditorClassIdentifier: 15 | m_EnablePreviewPackages: 0 16 | m_EnablePackageDependencies: 0 17 | m_AdvancedSettingsExpanded: 1 18 | m_ScopedRegistriesSettingsExpanded: 1 19 | oneTimeWarningShown: 0 20 | m_Registries: 21 | - m_Id: main 22 | m_Name: 23 | m_Url: https://packages.unity.com 24 | m_Scopes: [] 25 | m_IsDefault: 1 26 | m_Capabilities: 7 27 | m_UserSelectedRegistryName: 28 | m_UserAddingNewScopedRegistry: 0 29 | m_RegistryInfoDraft: 30 | m_ErrorMessage: 31 | m_Original: 32 | m_Id: 33 | m_Name: 34 | m_Url: 35 | m_Scopes: [] 36 | m_IsDefault: 0 37 | m_Capabilities: 0 38 | m_Modified: 0 39 | m_Name: 40 | m_Url: 41 | m_Scopes: 42 | - 43 | m_SelectedScopeIndex: 0 44 | -------------------------------------------------------------------------------- /ProjectSettings/Physics2DSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!19 &1 4 | Physics2DSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 4 7 | m_Gravity: {x: 0, y: -9.81} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_VelocityIterations: 8 10 | m_PositionIterations: 3 11 | m_VelocityThreshold: 1 12 | m_MaxLinearCorrection: 0.2 13 | m_MaxAngularCorrection: 8 14 | m_MaxTranslationSpeed: 100 15 | m_MaxRotationSpeed: 360 16 | m_BaumgarteScale: 0.2 17 | m_BaumgarteTimeOfImpactScale: 0.75 18 | m_TimeToSleep: 0.5 19 | m_LinearSleepTolerance: 0.01 20 | m_AngularSleepTolerance: 2 21 | m_DefaultContactOffset: 0.01 22 | m_JobOptions: 23 | serializedVersion: 2 24 | useMultithreading: 0 25 | useConsistencySorting: 0 26 | m_InterpolationPosesPerJob: 100 27 | m_NewContactsPerJob: 30 28 | m_CollideContactsPerJob: 100 29 | m_ClearFlagsPerJob: 200 30 | m_ClearBodyForcesPerJob: 200 31 | m_SyncDiscreteFixturesPerJob: 50 32 | m_SyncContinuousFixturesPerJob: 50 33 | m_FindNearestContactsPerJob: 100 34 | m_UpdateTriggerContactsPerJob: 100 35 | m_IslandSolverCostThreshold: 100 36 | m_IslandSolverBodyCostScale: 1 37 | m_IslandSolverContactCostScale: 10 38 | m_IslandSolverJointCostScale: 10 39 | m_IslandSolverBodiesPerJob: 50 40 | m_IslandSolverContactsPerJob: 50 41 | m_AutoSimulation: 1 42 | m_QueriesHitTriggers: 1 43 | m_QueriesStartInColliders: 1 44 | m_CallbacksOnDisable: 1 45 | m_ReuseCollisionCallbacks: 1 46 | m_AutoSyncTransforms: 0 47 | m_AlwaysShowColliders: 0 48 | m_ShowColliderSleep: 1 49 | m_ShowColliderContacts: 0 50 | m_ShowColliderAABB: 0 51 | m_ContactArrowScale: 0.2 52 | m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} 53 | m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} 54 | m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} 55 | m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} 56 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 57 | -------------------------------------------------------------------------------- /ProjectSettings/PresetManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1386491679 &1 4 | PresetManager: 5 | m_ObjectHideFlags: 0 6 | m_DefaultList: [] 7 | -------------------------------------------------------------------------------- /ProjectSettings/ProjectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!129 &1 4 | PlayerSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 16 7 | productGUID: 8b3d74b671ce74a1090224ff952bd17b 8 | AndroidProfiler: 0 9 | AndroidFilterTouchesWhenObscured: 0 10 | AndroidEnableSustainedPerformanceMode: 0 11 | defaultScreenOrientation: 4 12 | targetDevice: 2 13 | useOnDemandResources: 0 14 | accelerometerFrequency: 60 15 | companyName: DefaultCompany 16 | productName: unity-xunit 17 | defaultCursor: {fileID: 0} 18 | cursorHotspot: {x: 0, y: 0} 19 | m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} 20 | m_ShowUnitySplashScreen: 1 21 | m_ShowUnitySplashLogo: 1 22 | m_SplashScreenOverlayOpacity: 1 23 | m_SplashScreenAnimation: 1 24 | m_SplashScreenLogoStyle: 1 25 | m_SplashScreenDrawMode: 0 26 | m_SplashScreenBackgroundAnimationZoom: 1 27 | m_SplashScreenLogoAnimationZoom: 1 28 | m_SplashScreenBackgroundLandscapeAspect: 1 29 | m_SplashScreenBackgroundPortraitAspect: 1 30 | m_SplashScreenBackgroundLandscapeUvs: 31 | serializedVersion: 2 32 | x: 0 33 | y: 0 34 | width: 1 35 | height: 1 36 | m_SplashScreenBackgroundPortraitUvs: 37 | serializedVersion: 2 38 | x: 0 39 | y: 0 40 | width: 1 41 | height: 1 42 | m_SplashScreenLogos: [] 43 | m_VirtualRealitySplashScreen: {fileID: 0} 44 | m_HolographicTrackingLossScreen: {fileID: 0} 45 | defaultScreenWidth: 1024 46 | defaultScreenHeight: 768 47 | defaultScreenWidthWeb: 960 48 | defaultScreenHeightWeb: 600 49 | m_StereoRenderingPath: 0 50 | m_ActiveColorSpace: 0 51 | m_MTRendering: 1 52 | m_StackTraceTypes: 010000000100000001000000010000000100000001000000 53 | iosShowActivityIndicatorOnLoading: -1 54 | androidShowActivityIndicatorOnLoading: -1 55 | iosAppInBackgroundBehavior: 0 56 | displayResolutionDialog: 0 57 | iosAllowHTTPDownload: 1 58 | allowedAutorotateToPortrait: 1 59 | allowedAutorotateToPortraitUpsideDown: 1 60 | allowedAutorotateToLandscapeRight: 1 61 | allowedAutorotateToLandscapeLeft: 1 62 | useOSAutorotation: 1 63 | use32BitDisplayBuffer: 1 64 | preserveFramebufferAlpha: 0 65 | disableDepthAndStencilBuffers: 0 66 | androidStartInFullscreen: 1 67 | androidRenderOutsideSafeArea: 1 68 | androidBlitType: 0 69 | defaultIsNativeResolution: 1 70 | macRetinaSupport: 1 71 | runInBackground: 1 72 | captureSingleScreen: 0 73 | muteOtherAudioSources: 0 74 | Prepare IOS For Recording: 0 75 | Force IOS Speakers When Recording: 0 76 | deferSystemGesturesMode: 0 77 | hideHomeButton: 0 78 | submitAnalytics: 1 79 | usePlayerLog: 1 80 | bakeCollisionMeshes: 0 81 | forceSingleInstance: 0 82 | resizableWindow: 0 83 | useMacAppStoreValidation: 0 84 | macAppStoreCategory: public.app-category.games 85 | gpuSkinning: 1 86 | graphicsJobs: 0 87 | xboxPIXTextureCapture: 0 88 | xboxEnableAvatar: 0 89 | xboxEnableKinect: 0 90 | xboxEnableKinectAutoTracking: 0 91 | xboxEnableFitness: 0 92 | visibleInBackground: 1 93 | allowFullscreenSwitch: 1 94 | graphicsJobMode: 0 95 | fullscreenMode: 1 96 | xboxSpeechDB: 0 97 | xboxEnableHeadOrientation: 0 98 | xboxEnableGuest: 0 99 | xboxEnablePIXSampling: 0 100 | metalFramebufferOnly: 0 101 | xboxOneResolution: 0 102 | xboxOneSResolution: 0 103 | xboxOneXResolution: 3 104 | xboxOneMonoLoggingLevel: 0 105 | xboxOneLoggingLevel: 1 106 | xboxOneDisableEsram: 0 107 | xboxOnePresentImmediateThreshold: 0 108 | switchQueueCommandMemory: 0 109 | switchQueueControlMemory: 16384 110 | switchQueueComputeMemory: 262144 111 | switchNVNShaderPoolsGranularity: 33554432 112 | switchNVNDefaultPoolsGranularity: 16777216 113 | switchNVNOtherPoolsGranularity: 16777216 114 | vulkanEnableSetSRGBWrite: 0 115 | m_SupportedAspectRatios: 116 | 4:3: 1 117 | 5:4: 1 118 | 16:10: 1 119 | 16:9: 1 120 | Others: 1 121 | bundleVersion: 0.1 122 | preloadedAssets: [] 123 | metroInputSource: 0 124 | wsaTransparentSwapchain: 0 125 | m_HolographicPauseOnTrackingLoss: 1 126 | xboxOneDisableKinectGpuReservation: 1 127 | xboxOneEnable7thCore: 1 128 | vrSettings: 129 | cardboard: 130 | depthFormat: 0 131 | enableTransitionView: 0 132 | daydream: 133 | depthFormat: 0 134 | useSustainedPerformanceMode: 0 135 | enableVideoLayer: 0 136 | useProtectedVideoMemory: 0 137 | minimumSupportedHeadTracking: 0 138 | maximumSupportedHeadTracking: 1 139 | hololens: 140 | depthFormat: 1 141 | depthBufferSharingEnabled: 1 142 | lumin: 143 | depthFormat: 0 144 | frameTiming: 2 145 | enableGLCache: 0 146 | glCacheMaxBlobSize: 524288 147 | glCacheMaxFileSize: 8388608 148 | oculus: 149 | sharedDepthBuffer: 1 150 | dashSupport: 1 151 | enable360StereoCapture: 0 152 | isWsaHolographicRemotingEnabled: 0 153 | protectGraphicsMemory: 0 154 | enableFrameTimingStats: 0 155 | useHDRDisplay: 0 156 | m_ColorGamuts: 00000000 157 | targetPixelDensity: 30 158 | resolutionScalingMode: 0 159 | androidSupportedAspectRatio: 1 160 | androidMaxAspectRatio: 2.1 161 | applicationIdentifier: {} 162 | buildNumber: {} 163 | AndroidBundleVersionCode: 1 164 | AndroidMinSdkVersion: 16 165 | AndroidTargetSdkVersion: 0 166 | AndroidPreferredInstallLocation: 1 167 | aotOptions: 168 | stripEngineCode: 1 169 | iPhoneStrippingLevel: 0 170 | iPhoneScriptCallOptimization: 0 171 | ForceInternetPermission: 0 172 | ForceSDCardPermission: 0 173 | CreateWallpaper: 0 174 | APKExpansionFiles: 0 175 | keepLoadedShadersAlive: 0 176 | StripUnusedMeshComponents: 1 177 | VertexChannelCompressionMask: 4054 178 | iPhoneSdkVersion: 988 179 | iOSTargetOSVersionString: 9.0 180 | tvOSSdkVersion: 0 181 | tvOSRequireExtendedGameController: 0 182 | tvOSTargetOSVersionString: 9.0 183 | uIPrerenderedIcon: 0 184 | uIRequiresPersistentWiFi: 0 185 | uIRequiresFullScreen: 1 186 | uIStatusBarHidden: 1 187 | uIExitOnSuspend: 0 188 | uIStatusBarStyle: 0 189 | iPhoneSplashScreen: {fileID: 0} 190 | iPhoneHighResSplashScreen: {fileID: 0} 191 | iPhoneTallHighResSplashScreen: {fileID: 0} 192 | iPhone47inSplashScreen: {fileID: 0} 193 | iPhone55inPortraitSplashScreen: {fileID: 0} 194 | iPhone55inLandscapeSplashScreen: {fileID: 0} 195 | iPhone58inPortraitSplashScreen: {fileID: 0} 196 | iPhone58inLandscapeSplashScreen: {fileID: 0} 197 | iPadPortraitSplashScreen: {fileID: 0} 198 | iPadHighResPortraitSplashScreen: {fileID: 0} 199 | iPadLandscapeSplashScreen: {fileID: 0} 200 | iPadHighResLandscapeSplashScreen: {fileID: 0} 201 | iPhone65inPortraitSplashScreen: {fileID: 0} 202 | iPhone65inLandscapeSplashScreen: {fileID: 0} 203 | iPhone61inPortraitSplashScreen: {fileID: 0} 204 | iPhone61inLandscapeSplashScreen: {fileID: 0} 205 | appleTVSplashScreen: {fileID: 0} 206 | appleTVSplashScreen2x: {fileID: 0} 207 | tvOSSmallIconLayers: [] 208 | tvOSSmallIconLayers2x: [] 209 | tvOSLargeIconLayers: [] 210 | tvOSLargeIconLayers2x: [] 211 | tvOSTopShelfImageLayers: [] 212 | tvOSTopShelfImageLayers2x: [] 213 | tvOSTopShelfImageWideLayers: [] 214 | tvOSTopShelfImageWideLayers2x: [] 215 | iOSLaunchScreenType: 0 216 | iOSLaunchScreenPortrait: {fileID: 0} 217 | iOSLaunchScreenLandscape: {fileID: 0} 218 | iOSLaunchScreenBackgroundColor: 219 | serializedVersion: 2 220 | rgba: 0 221 | iOSLaunchScreenFillPct: 100 222 | iOSLaunchScreenSize: 100 223 | iOSLaunchScreenCustomXibPath: 224 | iOSLaunchScreeniPadType: 0 225 | iOSLaunchScreeniPadImage: {fileID: 0} 226 | iOSLaunchScreeniPadBackgroundColor: 227 | serializedVersion: 2 228 | rgba: 0 229 | iOSLaunchScreeniPadFillPct: 100 230 | iOSLaunchScreeniPadSize: 100 231 | iOSLaunchScreeniPadCustomXibPath: 232 | iOSUseLaunchScreenStoryboard: 0 233 | iOSLaunchScreenCustomStoryboardPath: 234 | iOSDeviceRequirements: [] 235 | iOSURLSchemes: [] 236 | iOSBackgroundModes: 0 237 | iOSMetalForceHardShadows: 0 238 | metalEditorSupport: 1 239 | metalAPIValidation: 1 240 | iOSRenderExtraFrameOnPause: 0 241 | appleDeveloperTeamID: 242 | iOSManualSigningProvisioningProfileID: 243 | tvOSManualSigningProvisioningProfileID: 244 | iOSManualSigningProvisioningProfileType: 0 245 | tvOSManualSigningProvisioningProfileType: 0 246 | appleEnableAutomaticSigning: 0 247 | iOSRequireARKit: 0 248 | iOSAutomaticallyDetectAndAddCapabilities: 1 249 | appleEnableProMotion: 0 250 | clonedFromGUID: c0afd0d1d80e3634a9dac47e8a0426ea 251 | templatePackageId: com.unity.template.3d@2.3.1 252 | templateDefaultScene: Assets/Scenes/SampleScene.unity 253 | AndroidTargetArchitectures: 1 254 | AndroidSplashScreenScale: 0 255 | androidSplashScreen: {fileID: 0} 256 | AndroidKeystoreName: '{inproject}: ' 257 | AndroidKeyaliasName: 258 | AndroidBuildApkPerCpuArchitecture: 0 259 | AndroidTVCompatibility: 0 260 | AndroidIsGame: 1 261 | AndroidEnableTango: 0 262 | androidEnableBanner: 1 263 | androidUseLowAccuracyLocation: 0 264 | androidUseCustomKeystore: 0 265 | m_AndroidBanners: 266 | - width: 320 267 | height: 180 268 | banner: {fileID: 0} 269 | androidGamepadSupportLevel: 0 270 | resolutionDialogBanner: {fileID: 0} 271 | m_BuildTargetIcons: [] 272 | m_BuildTargetPlatformIcons: [] 273 | m_BuildTargetBatching: 274 | - m_BuildTarget: Standalone 275 | m_StaticBatching: 1 276 | m_DynamicBatching: 0 277 | - m_BuildTarget: tvOS 278 | m_StaticBatching: 1 279 | m_DynamicBatching: 0 280 | - m_BuildTarget: Android 281 | m_StaticBatching: 1 282 | m_DynamicBatching: 0 283 | - m_BuildTarget: iPhone 284 | m_StaticBatching: 1 285 | m_DynamicBatching: 0 286 | - m_BuildTarget: WebGL 287 | m_StaticBatching: 0 288 | m_DynamicBatching: 0 289 | m_BuildTargetGraphicsAPIs: 290 | - m_BuildTarget: AndroidPlayer 291 | m_APIs: 150000000b000000 292 | m_Automatic: 0 293 | - m_BuildTarget: iOSSupport 294 | m_APIs: 10000000 295 | m_Automatic: 1 296 | - m_BuildTarget: AppleTVSupport 297 | m_APIs: 10000000 298 | m_Automatic: 0 299 | - m_BuildTarget: WebGLSupport 300 | m_APIs: 0b000000 301 | m_Automatic: 1 302 | m_BuildTargetVRSettings: 303 | - m_BuildTarget: Standalone 304 | m_Enabled: 0 305 | m_Devices: 306 | - Oculus 307 | - OpenVR 308 | m_BuildTargetEnableVuforiaSettings: [] 309 | openGLRequireES31: 0 310 | openGLRequireES31AEP: 0 311 | openGLRequireES32: 0 312 | m_TemplateCustomTags: {} 313 | mobileMTRendering: 314 | Android: 1 315 | iPhone: 1 316 | tvOS: 1 317 | m_BuildTargetGroupLightmapEncodingQuality: [] 318 | m_BuildTargetGroupLightmapSettings: [] 319 | playModeTestRunnerEnabled: 0 320 | runPlayModeTestAsEditModeTest: 0 321 | actionOnDotNetUnhandledException: 1 322 | enableInternalProfiler: 0 323 | logObjCUncaughtExceptions: 1 324 | enableCrashReportAPI: 0 325 | cameraUsageDescription: 326 | locationUsageDescription: 327 | microphoneUsageDescription: 328 | switchNetLibKey: 329 | switchSocketMemoryPoolSize: 6144 330 | switchSocketAllocatorPoolSize: 128 331 | switchSocketConcurrencyLimit: 14 332 | switchScreenResolutionBehavior: 2 333 | switchUseCPUProfiler: 0 334 | switchApplicationID: 0x01004b9000490000 335 | switchNSODependencies: 336 | switchTitleNames_0: 337 | switchTitleNames_1: 338 | switchTitleNames_2: 339 | switchTitleNames_3: 340 | switchTitleNames_4: 341 | switchTitleNames_5: 342 | switchTitleNames_6: 343 | switchTitleNames_7: 344 | switchTitleNames_8: 345 | switchTitleNames_9: 346 | switchTitleNames_10: 347 | switchTitleNames_11: 348 | switchTitleNames_12: 349 | switchTitleNames_13: 350 | switchTitleNames_14: 351 | switchPublisherNames_0: 352 | switchPublisherNames_1: 353 | switchPublisherNames_2: 354 | switchPublisherNames_3: 355 | switchPublisherNames_4: 356 | switchPublisherNames_5: 357 | switchPublisherNames_6: 358 | switchPublisherNames_7: 359 | switchPublisherNames_8: 360 | switchPublisherNames_9: 361 | switchPublisherNames_10: 362 | switchPublisherNames_11: 363 | switchPublisherNames_12: 364 | switchPublisherNames_13: 365 | switchPublisherNames_14: 366 | switchIcons_0: {fileID: 0} 367 | switchIcons_1: {fileID: 0} 368 | switchIcons_2: {fileID: 0} 369 | switchIcons_3: {fileID: 0} 370 | switchIcons_4: {fileID: 0} 371 | switchIcons_5: {fileID: 0} 372 | switchIcons_6: {fileID: 0} 373 | switchIcons_7: {fileID: 0} 374 | switchIcons_8: {fileID: 0} 375 | switchIcons_9: {fileID: 0} 376 | switchIcons_10: {fileID: 0} 377 | switchIcons_11: {fileID: 0} 378 | switchIcons_12: {fileID: 0} 379 | switchIcons_13: {fileID: 0} 380 | switchIcons_14: {fileID: 0} 381 | switchSmallIcons_0: {fileID: 0} 382 | switchSmallIcons_1: {fileID: 0} 383 | switchSmallIcons_2: {fileID: 0} 384 | switchSmallIcons_3: {fileID: 0} 385 | switchSmallIcons_4: {fileID: 0} 386 | switchSmallIcons_5: {fileID: 0} 387 | switchSmallIcons_6: {fileID: 0} 388 | switchSmallIcons_7: {fileID: 0} 389 | switchSmallIcons_8: {fileID: 0} 390 | switchSmallIcons_9: {fileID: 0} 391 | switchSmallIcons_10: {fileID: 0} 392 | switchSmallIcons_11: {fileID: 0} 393 | switchSmallIcons_12: {fileID: 0} 394 | switchSmallIcons_13: {fileID: 0} 395 | switchSmallIcons_14: {fileID: 0} 396 | switchManualHTML: 397 | switchAccessibleURLs: 398 | switchLegalInformation: 399 | switchMainThreadStackSize: 1048576 400 | switchPresenceGroupId: 401 | switchLogoHandling: 0 402 | switchReleaseVersion: 0 403 | switchDisplayVersion: 1.0.0 404 | switchStartupUserAccount: 0 405 | switchTouchScreenUsage: 0 406 | switchSupportedLanguagesMask: 0 407 | switchLogoType: 0 408 | switchApplicationErrorCodeCategory: 409 | switchUserAccountSaveDataSize: 0 410 | switchUserAccountSaveDataJournalSize: 0 411 | switchApplicationAttribute: 0 412 | switchCardSpecSize: -1 413 | switchCardSpecClock: -1 414 | switchRatingsMask: 0 415 | switchRatingsInt_0: 0 416 | switchRatingsInt_1: 0 417 | switchRatingsInt_2: 0 418 | switchRatingsInt_3: 0 419 | switchRatingsInt_4: 0 420 | switchRatingsInt_5: 0 421 | switchRatingsInt_6: 0 422 | switchRatingsInt_7: 0 423 | switchRatingsInt_8: 0 424 | switchRatingsInt_9: 0 425 | switchRatingsInt_10: 0 426 | switchRatingsInt_11: 0 427 | switchLocalCommunicationIds_0: 428 | switchLocalCommunicationIds_1: 429 | switchLocalCommunicationIds_2: 430 | switchLocalCommunicationIds_3: 431 | switchLocalCommunicationIds_4: 432 | switchLocalCommunicationIds_5: 433 | switchLocalCommunicationIds_6: 434 | switchLocalCommunicationIds_7: 435 | switchParentalControl: 0 436 | switchAllowsScreenshot: 1 437 | switchAllowsVideoCapturing: 1 438 | switchAllowsRuntimeAddOnContentInstall: 0 439 | switchDataLossConfirmation: 0 440 | switchUserAccountLockEnabled: 0 441 | switchSystemResourceMemory: 16777216 442 | switchSupportedNpadStyles: 3 443 | switchNativeFsCacheSize: 32 444 | switchIsHoldTypeHorizontal: 0 445 | switchSupportedNpadCount: 8 446 | switchSocketConfigEnabled: 0 447 | switchTcpInitialSendBufferSize: 32 448 | switchTcpInitialReceiveBufferSize: 64 449 | switchTcpAutoSendBufferSizeMax: 256 450 | switchTcpAutoReceiveBufferSizeMax: 256 451 | switchUdpSendBufferSize: 9 452 | switchUdpReceiveBufferSize: 42 453 | switchSocketBufferEfficiency: 4 454 | switchSocketInitializeEnabled: 1 455 | switchNetworkInterfaceManagerInitializeEnabled: 1 456 | switchPlayerConnectionEnabled: 1 457 | ps4NPAgeRating: 12 458 | ps4NPTitleSecret: 459 | ps4NPTrophyPackPath: 460 | ps4ParentalLevel: 11 461 | ps4ContentID: ED1633-NPXX51362_00-0000000000000000 462 | ps4Category: 0 463 | ps4MasterVersion: 01.00 464 | ps4AppVersion: 01.00 465 | ps4AppType: 0 466 | ps4ParamSfxPath: 467 | ps4VideoOutPixelFormat: 0 468 | ps4VideoOutInitialWidth: 1920 469 | ps4VideoOutBaseModeInitialWidth: 1920 470 | ps4VideoOutReprojectionRate: 60 471 | ps4PronunciationXMLPath: 472 | ps4PronunciationSIGPath: 473 | ps4BackgroundImagePath: 474 | ps4StartupImagePath: 475 | ps4StartupImagesFolder: 476 | ps4IconImagesFolder: 477 | ps4SaveDataImagePath: 478 | ps4SdkOverride: 479 | ps4BGMPath: 480 | ps4ShareFilePath: 481 | ps4ShareOverlayImagePath: 482 | ps4PrivacyGuardImagePath: 483 | ps4NPtitleDatPath: 484 | ps4RemotePlayKeyAssignment: -1 485 | ps4RemotePlayKeyMappingDir: 486 | ps4PlayTogetherPlayerCount: 0 487 | ps4EnterButtonAssignment: 1 488 | ps4ApplicationParam1: 0 489 | ps4ApplicationParam2: 0 490 | ps4ApplicationParam3: 0 491 | ps4ApplicationParam4: 0 492 | ps4DownloadDataSize: 0 493 | ps4GarlicHeapSize: 2048 494 | ps4ProGarlicHeapSize: 2560 495 | playerPrefsMaxSize: 32768 496 | ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ 497 | ps4pnSessions: 1 498 | ps4pnPresence: 1 499 | ps4pnFriends: 1 500 | ps4pnGameCustomData: 1 501 | playerPrefsSupport: 0 502 | enableApplicationExit: 0 503 | resetTempFolder: 1 504 | restrictedAudioUsageRights: 0 505 | ps4UseResolutionFallback: 0 506 | ps4ReprojectionSupport: 0 507 | ps4UseAudio3dBackend: 0 508 | ps4SocialScreenEnabled: 0 509 | ps4ScriptOptimizationLevel: 0 510 | ps4Audio3dVirtualSpeakerCount: 14 511 | ps4attribCpuUsage: 0 512 | ps4PatchPkgPath: 513 | ps4PatchLatestPkgPath: 514 | ps4PatchChangeinfoPath: 515 | ps4PatchDayOne: 0 516 | ps4attribUserManagement: 0 517 | ps4attribMoveSupport: 0 518 | ps4attrib3DSupport: 0 519 | ps4attribShareSupport: 0 520 | ps4attribExclusiveVR: 0 521 | ps4disableAutoHideSplash: 0 522 | ps4videoRecordingFeaturesUsed: 0 523 | ps4contentSearchFeaturesUsed: 0 524 | ps4attribEyeToEyeDistanceSettingVR: 0 525 | ps4IncludedModules: [] 526 | monoEnv: 527 | splashScreenBackgroundSourceLandscape: {fileID: 0} 528 | splashScreenBackgroundSourcePortrait: {fileID: 0} 529 | spritePackerPolicy: 530 | webGLMemorySize: 16 531 | webGLExceptionSupport: 1 532 | webGLNameFilesAsHashes: 0 533 | webGLDataCaching: 1 534 | webGLDebugSymbols: 0 535 | webGLEmscriptenArgs: 536 | webGLModulesDirectory: 537 | webGLTemplate: APPLICATION:Default 538 | webGLAnalyzeBuildSize: 0 539 | webGLUseEmbeddedResources: 0 540 | webGLCompressionFormat: 1 541 | webGLLinkerTarget: 1 542 | webGLThreadsSupport: 0 543 | webGLWasmStreaming: 0 544 | scriptingDefineSymbols: {} 545 | platformArchitecture: {} 546 | scriptingBackend: {} 547 | il2cppCompilerConfiguration: {} 548 | managedStrippingLevel: {} 549 | incrementalIl2cppBuild: {} 550 | allowUnsafeCode: 0 551 | additionalIl2CppArgs: 552 | scriptingRuntimeVersion: 1 553 | gcIncremental: 0 554 | gcWBarrierValidation: 0 555 | apiCompatibilityLevelPerPlatform: {} 556 | m_RenderingPath: 1 557 | m_MobileRenderingPath: 1 558 | metroPackageName: Template_3D 559 | metroPackageVersion: 560 | metroCertificatePath: 561 | metroCertificatePassword: 562 | metroCertificateSubject: 563 | metroCertificateIssuer: 564 | metroCertificateNotAfter: 0000000000000000 565 | metroApplicationDescription: Template_3D 566 | wsaImages: {} 567 | metroTileShortName: 568 | metroTileShowName: 0 569 | metroMediumTileShowName: 0 570 | metroLargeTileShowName: 0 571 | metroWideTileShowName: 0 572 | metroSupportStreamingInstall: 0 573 | metroLastRequiredScene: 0 574 | metroDefaultTileSize: 1 575 | metroTileForegroundText: 2 576 | metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} 577 | metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, 578 | a: 1} 579 | metroSplashScreenUseBackgroundColor: 0 580 | platformCapabilities: {} 581 | metroTargetDeviceFamilies: {} 582 | metroFTAName: 583 | metroFTAFileTypes: [] 584 | metroProtocolName: 585 | XboxOneProductId: 586 | XboxOneUpdateKey: 587 | XboxOneSandboxId: 588 | XboxOneContentId: 589 | XboxOneTitleId: 590 | XboxOneSCId: 591 | XboxOneGameOsOverridePath: 592 | XboxOnePackagingOverridePath: 593 | XboxOneAppManifestOverridePath: 594 | XboxOneVersion: 1.0.0.0 595 | XboxOnePackageEncryption: 0 596 | XboxOnePackageUpdateGranularity: 2 597 | XboxOneDescription: 598 | XboxOneLanguage: 599 | - enus 600 | XboxOneCapability: [] 601 | XboxOneGameRating: {} 602 | XboxOneIsContentPackage: 0 603 | XboxOneEnableGPUVariability: 1 604 | XboxOneSockets: {} 605 | XboxOneSplashScreen: {fileID: 0} 606 | XboxOneAllowedProductIds: [] 607 | XboxOnePersistentLocalStorageSize: 0 608 | XboxOneXTitleMemory: 8 609 | xboxOneScriptCompiler: 1 610 | XboxOneOverrideIdentityName: 611 | vrEditorSettings: 612 | daydream: 613 | daydreamIconForeground: {fileID: 0} 614 | daydreamIconBackground: {fileID: 0} 615 | cloudServicesEnabled: 616 | UNet: 1 617 | luminIcon: 618 | m_Name: 619 | m_ModelFolderPath: 620 | m_PortalFolderPath: 621 | luminCert: 622 | m_CertPath: 623 | m_SignPackage: 1 624 | luminIsChannelApp: 0 625 | luminVersion: 626 | m_VersionCode: 1 627 | m_VersionName: 628 | facebookSdkVersion: 7.9.4 629 | facebookAppId: 630 | facebookCookies: 1 631 | facebookLogging: 1 632 | facebookStatus: 1 633 | facebookXfbml: 0 634 | facebookFrictionlessRequests: 1 635 | apiCompatibilityLevel: 6 636 | cloudProjectId: 637 | framebufferDepthMemorylessMode: 0 638 | projectName: 639 | organizationId: 640 | cloudEnabled: 0 641 | enableNativePlatformBackendsForNewInputSystem: 0 642 | disableOldInputManagerSupport: 0 643 | legacyClampBlendShapeWeights: 1 644 | -------------------------------------------------------------------------------- /ProjectSettings/ProjectVersion.txt: -------------------------------------------------------------------------------- 1 | m_EditorVersion: 2021.3.5f1 2 | m_EditorVersionWithRevision: 2021.3.5f1 (40eb3a945986) 3 | -------------------------------------------------------------------------------- /ProjectSettings/QualitySettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!47 &1 4 | QualitySettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 5 7 | m_CurrentQuality: 5 8 | m_QualitySettings: 9 | - serializedVersion: 2 10 | name: Very Low 11 | pixelLightCount: 0 12 | shadows: 0 13 | shadowResolution: 0 14 | shadowProjection: 1 15 | shadowCascades: 1 16 | shadowDistance: 15 17 | shadowNearPlaneOffset: 3 18 | shadowCascade2Split: 0.33333334 19 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 20 | shadowmaskMode: 0 21 | blendWeights: 1 22 | textureQuality: 1 23 | anisotropicTextures: 0 24 | antiAliasing: 0 25 | softParticles: 0 26 | softVegetation: 0 27 | realtimeReflectionProbes: 0 28 | billboardsFaceCameraPosition: 0 29 | vSyncCount: 0 30 | lodBias: 0.3 31 | maximumLODLevel: 0 32 | streamingMipmapsActive: 0 33 | streamingMipmapsAddAllCameras: 1 34 | streamingMipmapsMemoryBudget: 512 35 | streamingMipmapsRenderersPerFrame: 512 36 | streamingMipmapsMaxLevelReduction: 2 37 | streamingMipmapsMaxFileIORequests: 1024 38 | particleRaycastBudget: 4 39 | asyncUploadTimeSlice: 2 40 | asyncUploadBufferSize: 16 41 | asyncUploadPersistentBuffer: 1 42 | resolutionScalingFixedDPIFactor: 1 43 | excludedTargetPlatforms: [] 44 | - serializedVersion: 2 45 | name: Low 46 | pixelLightCount: 0 47 | shadows: 0 48 | shadowResolution: 0 49 | shadowProjection: 1 50 | shadowCascades: 1 51 | shadowDistance: 20 52 | shadowNearPlaneOffset: 3 53 | shadowCascade2Split: 0.33333334 54 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 55 | shadowmaskMode: 0 56 | blendWeights: 2 57 | textureQuality: 0 58 | anisotropicTextures: 0 59 | antiAliasing: 0 60 | softParticles: 0 61 | softVegetation: 0 62 | realtimeReflectionProbes: 0 63 | billboardsFaceCameraPosition: 0 64 | vSyncCount: 0 65 | lodBias: 0.4 66 | maximumLODLevel: 0 67 | streamingMipmapsActive: 0 68 | streamingMipmapsAddAllCameras: 1 69 | streamingMipmapsMemoryBudget: 512 70 | streamingMipmapsRenderersPerFrame: 512 71 | streamingMipmapsMaxLevelReduction: 2 72 | streamingMipmapsMaxFileIORequests: 1024 73 | particleRaycastBudget: 16 74 | asyncUploadTimeSlice: 2 75 | asyncUploadBufferSize: 16 76 | asyncUploadPersistentBuffer: 1 77 | resolutionScalingFixedDPIFactor: 1 78 | excludedTargetPlatforms: [] 79 | - serializedVersion: 2 80 | name: Medium 81 | pixelLightCount: 1 82 | shadows: 1 83 | shadowResolution: 0 84 | shadowProjection: 1 85 | shadowCascades: 1 86 | shadowDistance: 20 87 | shadowNearPlaneOffset: 3 88 | shadowCascade2Split: 0.33333334 89 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 90 | shadowmaskMode: 0 91 | blendWeights: 2 92 | textureQuality: 0 93 | anisotropicTextures: 1 94 | antiAliasing: 0 95 | softParticles: 0 96 | softVegetation: 0 97 | realtimeReflectionProbes: 0 98 | billboardsFaceCameraPosition: 0 99 | vSyncCount: 1 100 | lodBias: 0.7 101 | maximumLODLevel: 0 102 | streamingMipmapsActive: 0 103 | streamingMipmapsAddAllCameras: 1 104 | streamingMipmapsMemoryBudget: 512 105 | streamingMipmapsRenderersPerFrame: 512 106 | streamingMipmapsMaxLevelReduction: 2 107 | streamingMipmapsMaxFileIORequests: 1024 108 | particleRaycastBudget: 64 109 | asyncUploadTimeSlice: 2 110 | asyncUploadBufferSize: 16 111 | asyncUploadPersistentBuffer: 1 112 | resolutionScalingFixedDPIFactor: 1 113 | excludedTargetPlatforms: [] 114 | - serializedVersion: 2 115 | name: High 116 | pixelLightCount: 2 117 | shadows: 2 118 | shadowResolution: 1 119 | shadowProjection: 1 120 | shadowCascades: 2 121 | shadowDistance: 40 122 | shadowNearPlaneOffset: 3 123 | shadowCascade2Split: 0.33333334 124 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 125 | shadowmaskMode: 1 126 | blendWeights: 2 127 | textureQuality: 0 128 | anisotropicTextures: 1 129 | antiAliasing: 0 130 | softParticles: 0 131 | softVegetation: 1 132 | realtimeReflectionProbes: 1 133 | billboardsFaceCameraPosition: 1 134 | vSyncCount: 1 135 | lodBias: 1 136 | maximumLODLevel: 0 137 | streamingMipmapsActive: 0 138 | streamingMipmapsAddAllCameras: 1 139 | streamingMipmapsMemoryBudget: 512 140 | streamingMipmapsRenderersPerFrame: 512 141 | streamingMipmapsMaxLevelReduction: 2 142 | streamingMipmapsMaxFileIORequests: 1024 143 | particleRaycastBudget: 256 144 | asyncUploadTimeSlice: 2 145 | asyncUploadBufferSize: 16 146 | asyncUploadPersistentBuffer: 1 147 | resolutionScalingFixedDPIFactor: 1 148 | excludedTargetPlatforms: [] 149 | - serializedVersion: 2 150 | name: Very High 151 | pixelLightCount: 3 152 | shadows: 2 153 | shadowResolution: 2 154 | shadowProjection: 1 155 | shadowCascades: 2 156 | shadowDistance: 70 157 | shadowNearPlaneOffset: 3 158 | shadowCascade2Split: 0.33333334 159 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 160 | shadowmaskMode: 1 161 | blendWeights: 4 162 | textureQuality: 0 163 | anisotropicTextures: 2 164 | antiAliasing: 2 165 | softParticles: 1 166 | softVegetation: 1 167 | realtimeReflectionProbes: 1 168 | billboardsFaceCameraPosition: 1 169 | vSyncCount: 1 170 | lodBias: 1.5 171 | maximumLODLevel: 0 172 | streamingMipmapsActive: 0 173 | streamingMipmapsAddAllCameras: 1 174 | streamingMipmapsMemoryBudget: 512 175 | streamingMipmapsRenderersPerFrame: 512 176 | streamingMipmapsMaxLevelReduction: 2 177 | streamingMipmapsMaxFileIORequests: 1024 178 | particleRaycastBudget: 1024 179 | asyncUploadTimeSlice: 2 180 | asyncUploadBufferSize: 16 181 | asyncUploadPersistentBuffer: 1 182 | resolutionScalingFixedDPIFactor: 1 183 | excludedTargetPlatforms: [] 184 | - serializedVersion: 2 185 | name: Ultra 186 | pixelLightCount: 4 187 | shadows: 2 188 | shadowResolution: 2 189 | shadowProjection: 1 190 | shadowCascades: 4 191 | shadowDistance: 150 192 | shadowNearPlaneOffset: 3 193 | shadowCascade2Split: 0.33333334 194 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 195 | shadowmaskMode: 1 196 | blendWeights: 4 197 | textureQuality: 0 198 | anisotropicTextures: 2 199 | antiAliasing: 2 200 | softParticles: 1 201 | softVegetation: 1 202 | realtimeReflectionProbes: 1 203 | billboardsFaceCameraPosition: 1 204 | vSyncCount: 1 205 | lodBias: 2 206 | maximumLODLevel: 0 207 | streamingMipmapsActive: 0 208 | streamingMipmapsAddAllCameras: 1 209 | streamingMipmapsMemoryBudget: 512 210 | streamingMipmapsRenderersPerFrame: 512 211 | streamingMipmapsMaxLevelReduction: 2 212 | streamingMipmapsMaxFileIORequests: 1024 213 | particleRaycastBudget: 4096 214 | asyncUploadTimeSlice: 2 215 | asyncUploadBufferSize: 16 216 | asyncUploadPersistentBuffer: 1 217 | resolutionScalingFixedDPIFactor: 1 218 | excludedTargetPlatforms: [] 219 | m_PerPlatformDefaultQuality: 220 | Android: 2 221 | Lumin: 5 222 | Nintendo 3DS: 5 223 | Nintendo Switch: 5 224 | PS4: 5 225 | PSP2: 2 226 | Standalone: 5 227 | WebGL: 3 228 | Windows Store Apps: 5 229 | XboxOne: 5 230 | iPhone: 2 231 | tvOS: 2 232 | -------------------------------------------------------------------------------- /ProjectSettings/TagManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!78 &1 4 | TagManager: 5 | serializedVersion: 2 6 | tags: [] 7 | layers: 8 | - Default 9 | - TransparentFX 10 | - Ignore Raycast 11 | - 12 | - Water 13 | - UI 14 | - 15 | - 16 | - 17 | - 18 | - 19 | - 20 | - 21 | - 22 | - 23 | - 24 | - 25 | - 26 | - 27 | - 28 | - 29 | - 30 | - 31 | - 32 | - 33 | - 34 | - 35 | - 36 | - 37 | - 38 | - 39 | - 40 | m_SortingLayers: 41 | - name: Default 42 | uniqueID: 0 43 | locked: 0 44 | -------------------------------------------------------------------------------- /ProjectSettings/TimeManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!5 &1 4 | TimeManager: 5 | m_ObjectHideFlags: 0 6 | Fixed Timestep: 0.02 7 | Maximum Allowed Timestep: 0.33333334 8 | m_TimeScale: 1 9 | Maximum Particle Timestep: 0.03 10 | -------------------------------------------------------------------------------- /ProjectSettings/UnityConnectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!310 &1 4 | UnityConnectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 1 7 | m_Enabled: 0 8 | m_TestMode: 0 9 | m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events 10 | m_EventUrl: https://cdp.cloud.unity3d.com/v1/events 11 | m_ConfigUrl: https://config.uca.cloud.unity3d.com 12 | m_TestInitMode: 0 13 | CrashReportingSettings: 14 | m_EventUrl: https://perf-events.cloud.unity3d.com 15 | m_Enabled: 0 16 | m_LogBufferSize: 10 17 | m_CaptureEditorExceptions: 1 18 | UnityPurchasingSettings: 19 | m_Enabled: 0 20 | m_TestMode: 0 21 | UnityAnalyticsSettings: 22 | m_Enabled: 0 23 | m_TestMode: 0 24 | m_InitializeOnStartup: 1 25 | UnityAdsSettings: 26 | m_Enabled: 0 27 | m_InitializeOnStartup: 1 28 | m_TestMode: 0 29 | m_IosGameId: 30 | m_AndroidGameId: 31 | m_GameIds: {} 32 | m_GameId: 33 | PerformanceReportingSettings: 34 | m_Enabled: 0 35 | -------------------------------------------------------------------------------- /ProjectSettings/VFXManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!937362698 &1 4 | VFXManager: 5 | m_ObjectHideFlags: 0 6 | m_IndirectShader: {fileID: 0} 7 | m_CopyBufferShader: {fileID: 0} 8 | m_SortShader: {fileID: 0} 9 | m_RenderPipeSettingsPath: 10 | m_FixedTimeStep: 0.016666668 11 | m_MaxDeltaTime: 0.05 12 | -------------------------------------------------------------------------------- /ProjectSettings/VersionControlSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!890905787 &1 4 | VersionControlSettings: 5 | m_ObjectHideFlags: 0 6 | m_Mode: Visible Meta Files 7 | m_CollabEditorSettings: 8 | inProgressEnabled: 1 9 | -------------------------------------------------------------------------------- /ProjectSettings/XRSettings.asset: -------------------------------------------------------------------------------- 1 | { 2 | "m_SettingKeys": [ 3 | "VR Device Disabled", 4 | "VR Device User Alert" 5 | ], 6 | "m_SettingValues": [ 7 | "False", 8 | "False" 9 | ] 10 | } -------------------------------------------------------------------------------- /ProjectSettings/boot.config: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/planetarium/xunit-unity-runner/30c8aa9605a6b0a818b582d93ef4ed500f382d70/ProjectSettings/boot.config -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | xUnit.net Unity Runner 2 | ====================== 3 | 4 | This program runs [xUnit.net]-based unit tests on [Unity] player so that 5 | a software work well on Unity's peculiar runtime environment, which differs 6 | from stable [Mono]. 7 | 8 | You can download the executable binaries from the [releases] page. 9 | 10 | This program takes one or more *absolute* paths to .NET assembly files (*.dll*) 11 | and run tests in them, e.g.: 12 | 13 | ~~~~ bash 14 | ./StandaloneLinux64 "$(pwd)"/YourTests.dll 15 | ~~~~ 16 | 17 | ~~~~ pwsh 18 | StandaloneWindows64.exe C:\path\to\YourTests.dll 19 | ~~~~ 20 | 21 | It also takes several options like `-c`/`--select-class` and 22 | `-T`/`--exclude-trait-condition`. See `--help` for details. 23 | 24 | On macOS you need to invoke the actual executable binary in 25 | *StandardOSX.app/Contents/MacOS/* directory, e.g.: 26 | 27 | ~~~~ bash 28 | StandaloneOSX.app/Contents/MacOS/unity-xunit "$(pwd)"/YourTests.dll 29 | ~~~~ 30 | 31 | Note that *.dll* files to test should target on .NET Framework (e.g., `net461`), 32 | not .NET Core. 33 | 34 | [xUnit.net]: https://xunit.net/ 35 | [Unity]: https://xunit.net/ 36 | [Mono]: https://www.mono-project.com/ 37 | [releases]: https://github.com/planetarium/xunit-unity-runner/releases 38 | 39 | 40 | CircleCI-style parallelism[^1] 41 | ------------------------------ 42 | 43 | There are two options for running tests in distributed nodes: 44 | `-D`/`--distributed` and `-s`/`--distributed-seed`. The former option takes 45 | an argument in the `N/M` format, where `N` is the current node's zero-indexed 46 | number and `M` is the total number of distributed nodes. This option selects 47 | the subset of the test cases[^2] for the current node, and this guarantees 48 | two different nodes never run the same test case, which is redundant. 49 | 50 | For example, the following options make the test execution to take advantage 51 | of CircleCI's parallelism: 52 | 53 | ~~~~ bash 54 | --distributed=$CIRCLE_NODE_INDEX/$CIRCLE_NODE_TOTAL \ 55 | --distributed-seed=$CIRCLE_BUILD_NUM 56 | ~~~~ 57 | 58 | 59 | [^1]: See also CircleCI's related docs: [*Running Tests in Parallel*][1]. 60 | [^2]: Before a subset is selected, all test filters are applied first. 61 | Therefore, all distributed nodes have to apply the same set of filters. 62 | 63 | [1]: https://circleci.com/docs/2.0/parallelism-faster-jobs/ 64 | 65 | 66 | FAQ 67 | --- 68 | 69 | ### I got `Magic number is wrong: 542` error. I'm on Linux. 70 | 71 | If the `TERM` environment variable is not set or it's a value unsupported by 72 | Mono (e.g., `xterm-256color`) yet Unity player's built-in Mono runtime could 73 | throw such an exception. You could work around this by setting it `xterm`: 74 | 75 | ~~~~ bash 76 | TERM=xterm ./StandaloneLinux64 "$(pwd)"/YourTests.dll 77 | ~~~~ 78 | 79 | See also the related issue on the Mono project: 80 | 81 | 82 | -------------------------------------------------------------------------------- /release.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -evx 3 | 4 | if [ "${GITHUB_REF:0:10}" != "refs/tags/" ]; then 5 | echo "This script is run for only tag push; being skipped..." > /dev/stderr 6 | exit 1 7 | fi 8 | 9 | tag="${GITHUB_REF:10}" 10 | 11 | wget -O /tmp/github-release.bz2 \ 12 | https://github.com/github-release/github-release/releases/download/v0.10.0/linux-amd64-github-release.bz2 13 | bzip2 -d /tmp/github-release.bz2 14 | chmod +x /tmp/github-release 15 | 16 | wget -O /tmp/submark \ 17 | https://github.com/dahlia/submark/releases/download/0.2.0/submark-linux-x86_64 18 | chmod +x /tmp/submark 19 | 20 | github_user="${GITHUB_REPOSITORY%/*}" 21 | github_repo="${GITHUB_REPOSITORY#*/}" 22 | 23 | ls -al /tmp 24 | 25 | /tmp/submark \ 26 | -o /tmp/release-note.txt \ 27 | -iO \ 28 | --h2 "Version $tag" \ 29 | CHANGES.md 30 | 31 | cat /tmp/release-note.txt 32 | 33 | /tmp/github-release release \ 34 | --user "$github_user" \ 35 | --repo "$github_repo" \ 36 | --tag "$tag" \ 37 | --name "xunit-unity-runner $tag" \ 38 | --description - < /tmp/release-note.txt || true 39 | 40 | ls -alh Dist 41 | 42 | for dist in Dist/*.tar.bz2; do 43 | filename="$(basename "$dist")" 44 | /tmp/github-release upload \ 45 | --user "$github_user" \ 46 | --repo "$github_repo" \ 47 | --tag "$tag" \ 48 | --name "xunit-unity-runner-$tag-$filename" \ 49 | --file "$dist" 50 | done 51 | --------------------------------------------------------------------------------