From decaf1aee249399eaf27d7f8d7b8178f6b1bcc91 Mon Sep 17 00:00:00 2001 From: lackofbindings <115063831+lackofbindings@users.noreply.github.com> Date: Thu, 30 May 2024 00:12:57 -0700 Subject: [PATCH] Initial commit --- .github/workflows/build-listing.yml | 78 ++ .github/workflows/release.yml | 87 +++ .gitignore | 64 ++ Assets/.gitkeep | 0 Packages/.gitignore | 5 + .../com.vrchat.core.bootstrap/Editor.meta | 8 + .../Editor/Bootstrap.cs | 92 +++ .../Editor/Bootstrap.cs.meta | 11 + .../Editor/VRChat.Bootstrapper.Editor.asmdef | 15 + .../VRChat.Bootstrapper.Editor.asmdef.meta | 7 + Packages/com.vrchat.core.bootstrap/License.md | 11 + .../com.vrchat.core.bootstrap/License.md.meta | 7 + .../com.vrchat.core.bootstrap/package.json | 17 + .../package.json.meta | 7 + Packages/com.vrchat.demo-template/Editor.meta | 8 + .../Editor/ExampleEditorScript.cs | 10 + .../Editor/ExampleEditorScript.cs.meta | 11 + .../VRChatPackageTemplate.Editor.asmdef | 15 + .../VRChatPackageTemplate.Editor.asmdef.meta | 7 + .../com.vrchat.demo-template/package.json | 13 + .../package.json.meta | 7 + Packages/manifest.json | 42 ++ Packages/packages-lock.json | 348 +++++++++ Packages/vpm-manifest.json | 1 + ProjectSettings/AudioManager.asset | 19 + ProjectSettings/ClusterInputManager.asset | 6 + ProjectSettings/DynamicsManager.asset | 34 + ProjectSettings/EditorBuildSettings.asset | 8 + ProjectSettings/EditorSettings.asset | 35 + ProjectSettings/GraphicsSettings.asset | 63 ++ ProjectSettings/InputManager.asset | 295 ++++++++ ProjectSettings/NavMeshAreas.asset | 91 +++ ProjectSettings/PackageManagerSettings.asset | 38 + ProjectSettings/Physics2DSettings.asset | 56 ++ ProjectSettings/PresetManager.asset | 7 + ProjectSettings/ProjectSettings.asset | 713 ++++++++++++++++++ ProjectSettings/ProjectVersion.txt | 2 + ProjectSettings/QualitySettings.asset | 232 ++++++ ProjectSettings/TagManager.asset | 43 ++ ProjectSettings/TimeManager.asset | 9 + ProjectSettings/UnityConnectSettings.asset | 34 + ProjectSettings/VFXManager.asset | 12 + ProjectSettings/XRSettings.asset | 10 + README.md | 76 ++ Website/app.js | 231 ++++++ Website/banner.png | Bin 0 -> 60292 bytes Website/favicon.ico | Bin 0 -> 77918 bytes Website/index.html | 221 ++++++ Website/styles.css | 356 +++++++++ 49 files changed, 3462 insertions(+) create mode 100644 .github/workflows/build-listing.yml create mode 100644 .github/workflows/release.yml create mode 100644 .gitignore create mode 100644 Assets/.gitkeep create mode 100644 Packages/.gitignore create mode 100644 Packages/com.vrchat.core.bootstrap/Editor.meta create mode 100644 Packages/com.vrchat.core.bootstrap/Editor/Bootstrap.cs create mode 100644 Packages/com.vrchat.core.bootstrap/Editor/Bootstrap.cs.meta create mode 100644 Packages/com.vrchat.core.bootstrap/Editor/VRChat.Bootstrapper.Editor.asmdef create mode 100644 Packages/com.vrchat.core.bootstrap/Editor/VRChat.Bootstrapper.Editor.asmdef.meta create mode 100644 Packages/com.vrchat.core.bootstrap/License.md create mode 100644 Packages/com.vrchat.core.bootstrap/License.md.meta create mode 100644 Packages/com.vrchat.core.bootstrap/package.json create mode 100644 Packages/com.vrchat.core.bootstrap/package.json.meta create mode 100644 Packages/com.vrchat.demo-template/Editor.meta create mode 100644 Packages/com.vrchat.demo-template/Editor/ExampleEditorScript.cs create mode 100644 Packages/com.vrchat.demo-template/Editor/ExampleEditorScript.cs.meta create mode 100644 Packages/com.vrchat.demo-template/Editor/VRChatPackageTemplate.Editor.asmdef create mode 100644 Packages/com.vrchat.demo-template/Editor/VRChatPackageTemplate.Editor.asmdef.meta create mode 100644 Packages/com.vrchat.demo-template/package.json create mode 100644 Packages/com.vrchat.demo-template/package.json.meta create mode 100644 Packages/manifest.json create mode 100644 Packages/packages-lock.json create mode 100644 Packages/vpm-manifest.json create mode 100644 ProjectSettings/AudioManager.asset create mode 100644 ProjectSettings/ClusterInputManager.asset create mode 100644 ProjectSettings/DynamicsManager.asset create mode 100644 ProjectSettings/EditorBuildSettings.asset create mode 100644 ProjectSettings/EditorSettings.asset create mode 100644 ProjectSettings/GraphicsSettings.asset create mode 100644 ProjectSettings/InputManager.asset create mode 100644 ProjectSettings/NavMeshAreas.asset create mode 100644 ProjectSettings/PackageManagerSettings.asset create mode 100644 ProjectSettings/Physics2DSettings.asset create mode 100644 ProjectSettings/PresetManager.asset create mode 100644 ProjectSettings/ProjectSettings.asset create mode 100644 ProjectSettings/ProjectVersion.txt create mode 100644 ProjectSettings/QualitySettings.asset create mode 100644 ProjectSettings/TagManager.asset create mode 100644 ProjectSettings/TimeManager.asset create mode 100644 ProjectSettings/UnityConnectSettings.asset create mode 100644 ProjectSettings/VFXManager.asset create mode 100644 ProjectSettings/XRSettings.asset create mode 100644 README.md create mode 100644 Website/app.js create mode 100644 Website/banner.png create mode 100644 Website/favicon.ico create mode 100644 Website/index.html create mode 100644 Website/styles.css diff --git a/.github/workflows/build-listing.yml b/.github/workflows/build-listing.yml new file mode 100644 index 0000000..1944c53 --- /dev/null +++ b/.github/workflows/build-listing.yml @@ -0,0 +1,78 @@ +name: Build Repo Listing + +env: + listPublishDirectory: Website + pathToCi: ci + +on: + workflow_dispatch: + workflow_run: + workflows: [Build Release] + types: + - completed + release: + types: [published, created, edited, unpublished, deleted, released] + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow one concurrent deployment +concurrency: + group: "pages" + cancel-in-progress: true + +jobs: + + # Build the VPM Listing Website and deploy to GitHub Pages + build-listing: + name: build-listing + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + + # Checkout Local Repository + - name: Checkout Local Repository + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac + + # Checkout Automation Repository without removing prior checkouts + - name: Checkout Automation Repository + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac + with: + repository: vrchat-community/package-list-action + path: ${{ env.pathToCi }} + clean: false + + # Load cached data from previous runs + - name: Restore Cache + uses: actions/cache@704facf57e6136b1bc63b828d79edcd491f0ee84 + with: + path: | + ${{ env.pathToCi }}/.nuke/temp + ~/.nuget/packages + key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj') }} + + # Build Package Version Listing with Nuke + - name: Build Package Version Listing + run: ${{ env.pathToCi }}/build.cmd BuildRepoListing --root ${{ env.pathToCi }} --list-publish-directory $GITHUB_WORKSPACE/${{ env.listPublishDirectory }} --current-package-name ${{ vars.PACKAGE_NAME }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + # Prepare for GitHub Pages deployment + - name: Setup Pages + uses: actions/configure-pages@f156874f8191504dae5b037505266ed5dda6c382 + + # Upload the VPM Listing Website to GitHub Pages artifacts + - name: Upload Pages Artifact + uses: actions/upload-pages-artifact@a753861a5debcf57bf8b404356158c8e1e33150c + with: + path: ${{ env.listPublishDirectory }} + + # Deploy the uploaded VPM Listing Website to GitHub Pages + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@9dbe3824824f8a1377b8e298bafde1a50ede43e5 \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..da57779 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,87 @@ +name: Build Release + +on: + workflow_dispatch: + +jobs: + + # Validate Repository Configuration + config: + runs-on: ubuntu-latest + outputs: + config_package: ${{ steps.config_package.outputs.configPackage }} + steps: + + # Ensure that required repository variable has been created for the Package + - name: Validate Package Config + id: config_package + run: | + if [ "${{ vars.PACKAGE_NAME }}" != "" ]; then + echo "configPackage=true" >> $GITHUB_OUTPUT; + else + echo "configPackage=false" >> $GITHUB_OUTPUT; + fi + + # Build and release the Package + # If the repository is not configured properly, this job will be skipped + build: + needs: config + runs-on: ubuntu-latest + permissions: + contents: write + env: + packagePath: Packages/${{ vars.PACKAGE_NAME }} + if: needs.config.outputs.config_package == 'true' + steps: + + # Checkout Local Repository + - name: Checkout + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac + + # Get the Package version based on the package.json file + - name: Get Version + id: version + uses: zoexx/github-action-json-file-properties@b9f36ce6ee6fe2680cd3c32b2c62e22eade7e590 + with: + file_path: "${{ env.packagePath }}/package.json" + prop_path: "version" + + # Configure the Environment Variables needed for releasing the Package + - name: Set Environment Variables + run: | + echo "zipFile=${{ vars.PACKAGE_NAME }}-${{ steps.version.outputs.value }}".zip >> $GITHUB_ENV + echo "unityPackage=${{ vars.PACKAGE_NAME }}-${{ steps.version.outputs.value }}.unitypackage" >> $GITHUB_ENV + echo "version=${{ steps.version.outputs.value }}" >> $GITHUB_ENV + + # Zip the Package for release + - name: Create Package Zip + working-directory: "${{ env.packagePath }}" + run: zip -r "${{ github.workspace }}/${{ env.zipFile }}" . + + # Build a list of .meta files for future use + - name: Track Package Meta Files + run: find "${{ env.packagePath }}/" -name \*.meta >> metaList + + # Make a UnityPackage version of the Package for release + - name: Create UnityPackage + uses: pCYSl5EDgo/create-unitypackage@cfcd3cf0391a5ef1306342794866a9897c32af0b + with: + package-path: ${{ env.unityPackage }} + include-files: metaList + + # Make a release tag of the version from the package.json file + - name: Create Tag + id: tag_version + uses: rickstaa/action-create-tag@88dbf7ff6fe2405f8e8f6c6fdfd78829bc631f83 + with: + tag: "${{ env.version }}" + + # Publish the Release to GitHub + - name: Make Release + uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844 + with: + files: | + ${{ env.zipFile }} + ${{ env.unityPackage }} + ${{ env.packagePath }}/package.json + tag_name: ${{ env.version }} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..284136d --- /dev/null +++ b/.gitignore @@ -0,0 +1,64 @@ +# This .gitignore file should be placed at the root of your Unity project directory +# +# Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore +# +/[Ll]ibrary/ +/[Tt]emp/ +/[Oo]bj/ +/[Bb]uild/ +/[Bb]uilds/ +/[Ll]ogs/ +/[Mm]emoryCaptures/ + +# Asset meta data should only be ignored when the corresponding asset is also ignored +!/[Aa]ssets/**/*.meta + +# Uncomment this line if you wish to ignore the asset store tools plugin +# /[Aa]ssets/AssetStoreTools* + +# Autogenerated Jetbrains Rider plugin +[Aa]ssets/Plugins/Editor/JetBrains* + +# Visual Studio cache directory +.vs/ + +# Gradle cache directory +.gradle/ + +# Autogenerated VS/MD/Consulo solution and project files +ExportedObj/ +.consulo/ +*.csproj +*.unityproj +*.sln +*.suo +*.tmp +*.user +*.userprefs +*.pidb +*.booproj +*.svd +*.pdb +*.mdb +*.opendb +*.VC.db + +# Unity3D generated meta files +*.pidb.meta +*.pdb.meta +*.mdb.meta + +# Unity3D generated file on crash reports +sysinfo.txt + +# Builds +*.apk +*.unitypackage + +# Crashlytics generated file +crashlytics-build.properties + +.idea/.idea.vpm-package-maker/.idea +Assets/PackageMakerWindowData.asset* +.idea +.vscode diff --git a/Assets/.gitkeep b/Assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Packages/.gitignore b/Packages/.gitignore new file mode 100644 index 0000000..3ed669d --- /dev/null +++ b/Packages/.gitignore @@ -0,0 +1,5 @@ +/*/ +!com.vrchat.core.* + +# Change this to match your new package name +!com.vrchat.demo-template \ No newline at end of file diff --git a/Packages/com.vrchat.core.bootstrap/Editor.meta b/Packages/com.vrchat.core.bootstrap/Editor.meta new file mode 100644 index 0000000..d8de383 --- /dev/null +++ b/Packages/com.vrchat.core.bootstrap/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5ee5eebf1b35bbd49ae7983db316180a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.core.bootstrap/Editor/Bootstrap.cs b/Packages/com.vrchat.core.bootstrap/Editor/Bootstrap.cs new file mode 100644 index 0000000..e1a0917 --- /dev/null +++ b/Packages/com.vrchat.core.bootstrap/Editor/Bootstrap.cs @@ -0,0 +1,92 @@ +using System; +using System.IO; +using System.Net; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using UnityEditor; +using UnityEngine; + +namespace VRC.PackageManagement.Core +{ + public class Bootstrap + { + // JSON property names in Project Manifest + public const string UNITY_PACKAGES_FOLDER = "Packages"; + public const string UNITY_MANIFEST_FILENAME = "manifest.json"; + + // VRC Values + public const string VRC_CONFIG = "https://api.vrchat.cloud/api/1/config"; + public const string VRC_AGENT = "VCCBootstrap 1.0"; + public const string VRC_RESOLVER_PACKAGE = "com.vrchat.core.vpm-resolver"; + + // Finds url for bootstrap package without using JSON + private static Regex _bootstrapRegex = new Regex("\"bootstrap\"\\s*:\\s*\"(.+?(?=\"))\""); + public static string ManifestPath => Path.Combine(Directory.GetCurrentDirectory(), UNITY_PACKAGES_FOLDER, UNITY_MANIFEST_FILENAME); + + // Path where we expect the target package to exist + public static string ResolverPath => + Path.Combine(Directory.GetCurrentDirectory(), UNITY_PACKAGES_FOLDER, VRC_RESOLVER_PACKAGE); + + [InitializeOnLoadMethod] + public static async void CheckForRestore() + { + if (!new DirectoryInfo(ResolverPath).Exists) + { + try + { + await AddResolver(); + } + catch (Exception e) + { + Debug.LogError($"Could not download and install the VPM Package Resolver - you may be missing packages. Exception: {e.Message}"); + } + } + } + + public static async Task AddResolver() + { + var configData = await GetRemoteString(VRC_CONFIG); + if (string.IsNullOrWhiteSpace(configData)) + { + Debug.LogWarning($"Could not get VPM libraries, try again later"); + return; + } + var bootstrapMatch = _bootstrapRegex.Match(configData); + if (!bootstrapMatch.Success || bootstrapMatch.Groups.Count < 2) + { + Debug.LogError($"Could not find bootstrap in config, try again later"); + return; + } + + var url = bootstrapMatch.Groups[1].Value; + + var targetFile = Path.Combine(Path.GetTempPath(), $"resolver-{DateTime.Now.ToString("yyyyMMddTHHmmss")}.unitypackage"); + + // Download to dir + using (var client = new WebClient()) + { + // Add User Agent or else CloudFlare will return 1020 + client.Headers.Add(HttpRequestHeader.UserAgent, VRC_AGENT); + + await client.DownloadFileTaskAsync(url, targetFile); + + if (File.Exists(targetFile)) + { + Debug.Log($"Downloaded Resolver to {targetFile}"); + AssetDatabase.ImportPackage(targetFile, false); + } + } + return; + } + + public static async Task GetRemoteString(string url) + { + using (var client = new WebClient()) + { + // Add User Agent or else CloudFlare will return 1020 + client.Headers.Add(HttpRequestHeader.UserAgent, VRC_AGENT); + return await client.DownloadStringTaskAsync(url); + } + } + } +} diff --git a/Packages/com.vrchat.core.bootstrap/Editor/Bootstrap.cs.meta b/Packages/com.vrchat.core.bootstrap/Editor/Bootstrap.cs.meta new file mode 100644 index 0000000..d7ac1ae --- /dev/null +++ b/Packages/com.vrchat.core.bootstrap/Editor/Bootstrap.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eea11c44cabdaaa43ac0a21dbbbd9824 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.core.bootstrap/Editor/VRChat.Bootstrapper.Editor.asmdef b/Packages/com.vrchat.core.bootstrap/Editor/VRChat.Bootstrapper.Editor.asmdef new file mode 100644 index 0000000..115b3e2 --- /dev/null +++ b/Packages/com.vrchat.core.bootstrap/Editor/VRChat.Bootstrapper.Editor.asmdef @@ -0,0 +1,15 @@ +{ + "name": "VRChat.Bootstrapper.Editor", + "references": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/com.vrchat.core.bootstrap/Editor/VRChat.Bootstrapper.Editor.asmdef.meta b/Packages/com.vrchat.core.bootstrap/Editor/VRChat.Bootstrapper.Editor.asmdef.meta new file mode 100644 index 0000000..1d60f49 --- /dev/null +++ b/Packages/com.vrchat.core.bootstrap/Editor/VRChat.Bootstrapper.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e0d8a3ed977bd0948b99f4bce8e56a07 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.core.bootstrap/License.md b/Packages/com.vrchat.core.bootstrap/License.md new file mode 100644 index 0000000..275530c --- /dev/null +++ b/Packages/com.vrchat.core.bootstrap/License.md @@ -0,0 +1,11 @@ +# VRCHAT INC. +### VRCHAT DISTRO LICENSE FILE +Version: February 24, 2022 + +**SUMMARY OF TERMS:** Any materials subject to this Distro Asset License may be distributed by you, with or without modifications, on a non-commercial basis (i.e., at no charge), in accordance with the full terms of the Materials License Agreement. + +This Distro License File is a "License File" as defined in the VRChat Materials License Agreement, found at https://hello.vrchat.com/legal/sdk (or any successor link designated by VRChat) (as may be revised from time to time, the "Materials License Agreement"). + +This Distro License File applies to all the files in the Folder containing this Distro License File and those in all Child Folders within that Folder (except with respect to files in any Child Folder that contains a different License File) (such files, other than this Distro License File, the "Covered Files"). All capitalized terms used but not otherwise defined in this Distro License File have the meanings provided in the Materials License Agreement. + +This Distro License File only provides a summary of the terms applicable to the Covered Files. To understand your rights and obligations and the full set of terms that apply to use of the Covered Files, please see the relevant sections of the Materials License Agreement, including terms applicable to Distro Materials. \ No newline at end of file diff --git a/Packages/com.vrchat.core.bootstrap/License.md.meta b/Packages/com.vrchat.core.bootstrap/License.md.meta new file mode 100644 index 0000000..3a508bc --- /dev/null +++ b/Packages/com.vrchat.core.bootstrap/License.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a84f4a071b4a7fa49985f447a0ce2fe2 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.core.bootstrap/package.json b/Packages/com.vrchat.core.bootstrap/package.json new file mode 100644 index 0000000..d0b5080 --- /dev/null +++ b/Packages/com.vrchat.core.bootstrap/package.json @@ -0,0 +1,17 @@ +{ + "name" : "com.vrchat.core.bootstrap", + "displayName" : "VRChat Package Bootstrapper", + "version" : "0.1.15", + "unity" : "2019.4", + "description" : "Tool to Download VPM Packages", + "vrchatVersion" : "2022.1.1", + "author" : { + "name" : "VRChat", + "email" : "developer@vrchat.com", + "url" : "https://github.com/vrchat/packages" + }, + "url" : "", + "dependencies" : { + "com.unity.nuget.newtonsoft-json" : "2.0.2" + } +} diff --git a/Packages/com.vrchat.core.bootstrap/package.json.meta b/Packages/com.vrchat.core.bootstrap/package.json.meta new file mode 100644 index 0000000..9aea588 --- /dev/null +++ b/Packages/com.vrchat.core.bootstrap/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6c5fffb4815ba9046ad0a2e878396439 +PackageManifestImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.demo-template/Editor.meta b/Packages/com.vrchat.demo-template/Editor.meta new file mode 100644 index 0000000..9eb8c90 --- /dev/null +++ b/Packages/com.vrchat.demo-template/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9f181a8663a6cfb4ca7a47de1f257036 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.demo-template/Editor/ExampleEditorScript.cs b/Packages/com.vrchat.demo-template/Editor/ExampleEditorScript.cs new file mode 100644 index 0000000..b5250de --- /dev/null +++ b/Packages/com.vrchat.demo-template/Editor/ExampleEditorScript.cs @@ -0,0 +1,10 @@ +using UnityEditor; + +public class ExampleEditorScript +{ + [MenuItem("Example Editor Script/Test")] + static void Test() + { + EditorUtility.DisplayDialog("Example Script", "Opened This Dialog", "OK"); + } +} diff --git a/Packages/com.vrchat.demo-template/Editor/ExampleEditorScript.cs.meta b/Packages/com.vrchat.demo-template/Editor/ExampleEditorScript.cs.meta new file mode 100644 index 0000000..423e68a --- /dev/null +++ b/Packages/com.vrchat.demo-template/Editor/ExampleEditorScript.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f0aa91dc693e43749aeb7d41d4e061ff +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.demo-template/Editor/VRChatPackageTemplate.Editor.asmdef b/Packages/com.vrchat.demo-template/Editor/VRChatPackageTemplate.Editor.asmdef new file mode 100644 index 0000000..968b1f3 --- /dev/null +++ b/Packages/com.vrchat.demo-template/Editor/VRChatPackageTemplate.Editor.asmdef @@ -0,0 +1,15 @@ +{ + "name": "VRChatPackageTemplate.Editor", + "references": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/com.vrchat.demo-template/Editor/VRChatPackageTemplate.Editor.asmdef.meta b/Packages/com.vrchat.demo-template/Editor/VRChatPackageTemplate.Editor.asmdef.meta new file mode 100644 index 0000000..995eb44 --- /dev/null +++ b/Packages/com.vrchat.demo-template/Editor/VRChatPackageTemplate.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: df45ab4f3bbb8394987fc80e55e039ef +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.vrchat.demo-template/package.json b/Packages/com.vrchat.demo-template/package.json new file mode 100644 index 0000000..6621f65 --- /dev/null +++ b/Packages/com.vrchat.demo-template/package.json @@ -0,0 +1,13 @@ +{ + "name": "com.vrchat.demo-template", + "displayName": "VRChat Example Package", + "version": "0.0.6", + "unity": "2019.4", + "description": "Simple Package for testing Automation", + "vrchatVersion": "2022.1.1", + "author": { + "name": "Momo the Monster", + "email": "momodmonster@gmail.com", + "url": "https://mmmlabs.com" + } +} diff --git a/Packages/com.vrchat.demo-template/package.json.meta b/Packages/com.vrchat.demo-template/package.json.meta new file mode 100644 index 0000000..def42f8 --- /dev/null +++ b/Packages/com.vrchat.demo-template/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0b6f5121587f2a94b979e618ae0751d5 +PackageManifestImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/manifest.json b/Packages/manifest.json new file mode 100644 index 0000000..6d46a20 --- /dev/null +++ b/Packages/manifest.json @@ -0,0 +1,42 @@ +{ + "dependencies": { + "com.unity.ide.rider": "1.2.1", + "com.unity.ide.visualstudio": "2.0.11", + "com.unity.ide.vscode": "1.2.4", + "com.unity.test-framework": "1.1.29", + "com.unity.textmeshpro": "2.1.6", + "com.unity.timeline": "1.2.18", + "com.unity.ugui": "1.0.0", + "com.unity.modules.ai": "1.0.0", + "com.unity.modules.androidjni": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.cloth": "1.0.0", + "com.unity.modules.director": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.screencapture": "1.0.0", + "com.unity.modules.terrain": "1.0.0", + "com.unity.modules.terrainphysics": "1.0.0", + "com.unity.modules.tilemap": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.umbra": "1.0.0", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.unitywebrequesttexture": "1.0.0", + "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vehicles": "1.0.0", + "com.unity.modules.video": "1.0.0", + "com.unity.modules.vr": "1.0.0", + "com.unity.modules.wind": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } +} diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json new file mode 100644 index 0000000..cfd4e20 --- /dev/null +++ b/Packages/packages-lock.json @@ -0,0 +1,348 @@ +{ + "dependencies": { + "com.unity.ext.nunit": { + "version": "1.0.6", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.ide.rider": { + "version": "1.2.1", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.test-framework": "1.1.1" + }, + "url": "https://packages.unity.com" + }, + "com.unity.ide.visualstudio": { + "version": "2.0.11", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.test-framework": "1.1.9" + }, + "url": "https://packages.unity.com" + }, + "com.unity.ide.vscode": { + "version": "1.2.4", + "depth": 0, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.nuget.newtonsoft-json": { + "version": "2.0.2", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.test-framework": { + "version": "1.1.29", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ext.nunit": "1.0.6", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.textmeshpro": { + "version": "2.1.6", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ugui": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.timeline": { + "version": "1.2.18", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.modules.director": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.ugui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0" + } + }, + "com.vrchat.core.bootstrap": { + "version": "file:com.vrchat.core.bootstrap", + "depth": 0, + "source": "embedded", + "dependencies": { + "com.unity.nuget.newtonsoft-json": "2.0.2" + } + }, + "com.vrchat.core.vpm-resolver": { + "version": "file:com.vrchat.core.vpm-resolver", + "depth": 0, + "source": "embedded", + "dependencies": { + "com.unity.nuget.newtonsoft-json": "2.0.2" + } + }, + "com.vrchat.demo-template": { + "version": "file:com.vrchat.demo-template", + "depth": 0, + "source": "embedded", + "dependencies": {} + }, + "com.unity.modules.ai": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.androidjni": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.animation": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.assetbundle": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.audio": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.cloth": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0" + } + }, + "com.unity.modules.director": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.animation": "1.0.0" + } + }, + "com.unity.modules.imageconversion": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.imgui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.jsonserialize": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.particlesystem": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.physics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.physics2d": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.screencapture": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.subsystems": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.terrain": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.terrainphysics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.terrain": "1.0.0" + } + }, + "com.unity.modules.tilemap": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics2d": "1.0.0" + } + }, + "com.unity.modules.ui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.uielements": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.umbra": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.unityanalytics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.unitywebrequest": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.unitywebrequestassetbundle": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" + } + }, + "com.unity.modules.unitywebrequestaudio": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.audio": "1.0.0" + } + }, + "com.unity.modules.unitywebrequesttexture": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.unitywebrequestwww": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.vehicles": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0" + } + }, + "com.unity.modules.video": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" + } + }, + "com.unity.modules.vr": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } + }, + "com.unity.modules.wind": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.xr": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.subsystems": "1.0.0" + } + } + } +} diff --git a/Packages/vpm-manifest.json b/Packages/vpm-manifest.json new file mode 100644 index 0000000..9e8f163 --- /dev/null +++ b/Packages/vpm-manifest.json @@ -0,0 +1 @@ +{"dependencies": {}, "locked": {}} \ No newline at end of file diff --git a/ProjectSettings/AudioManager.asset b/ProjectSettings/AudioManager.asset new file mode 100644 index 0000000..07ebfb0 --- /dev/null +++ b/ProjectSettings/AudioManager.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!11 &1 +AudioManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Volume: 1 + Rolloff Scale: 1 + Doppler Factor: 1 + Default Speaker Mode: 2 + m_SampleRate: 0 + m_DSPBufferSize: 1024 + m_VirtualVoiceCount: 512 + m_RealVoiceCount: 32 + m_SpatializerPlugin: + m_AmbisonicDecoderPlugin: + m_DisableAudio: 0 + m_VirtualizeEffects: 1 + m_RequestedDSPBufferSize: 1024 diff --git a/ProjectSettings/ClusterInputManager.asset b/ProjectSettings/ClusterInputManager.asset new file mode 100644 index 0000000..e7886b2 --- /dev/null +++ b/ProjectSettings/ClusterInputManager.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!236 &1 +ClusterInputManager: + m_ObjectHideFlags: 0 + m_Inputs: [] diff --git a/ProjectSettings/DynamicsManager.asset b/ProjectSettings/DynamicsManager.asset new file mode 100644 index 0000000..cdc1f3e --- /dev/null +++ b/ProjectSettings/DynamicsManager.asset @@ -0,0 +1,34 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!55 &1 +PhysicsManager: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_Gravity: {x: 0, y: -9.81, z: 0} + m_DefaultMaterial: {fileID: 0} + m_BounceThreshold: 2 + m_SleepThreshold: 0.005 + m_DefaultContactOffset: 0.01 + m_DefaultSolverIterations: 6 + m_DefaultSolverVelocityIterations: 1 + m_QueriesHitBackfaces: 0 + m_QueriesHitTriggers: 1 + m_EnableAdaptiveForce: 0 + m_ClothInterCollisionDistance: 0 + m_ClothInterCollisionStiffness: 0 + m_ContactsGeneration: 1 + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + m_AutoSimulation: 1 + m_AutoSyncTransforms: 0 + m_ReuseCollisionCallbacks: 1 + m_ClothInterCollisionSettingsToggle: 0 + m_ContactPairsMode: 0 + m_BroadphaseType: 0 + m_WorldBounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 250, y: 250, z: 250} + m_WorldSubdivisions: 8 + m_FrictionType: 0 + m_EnableEnhancedDeterminism: 0 + m_EnableUnifiedHeightmaps: 1 + m_DefaultMaxAngluarSpeed: 7 diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset new file mode 100644 index 0000000..0147887 --- /dev/null +++ b/ProjectSettings/EditorBuildSettings.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1045 &1 +EditorBuildSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Scenes: [] + m_configObjects: {} diff --git a/ProjectSettings/EditorSettings.asset b/ProjectSettings/EditorSettings.asset new file mode 100644 index 0000000..f920544 --- /dev/null +++ b/ProjectSettings/EditorSettings.asset @@ -0,0 +1,35 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!159 &1 +EditorSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_ExternalVersionControlSupport: Visible Meta Files + m_SerializationMode: 2 + m_LineEndingsForNewScripts: 0 + m_DefaultBehaviorMode: 0 + m_PrefabRegularEnvironment: {fileID: 0} + m_PrefabUIEnvironment: {fileID: 0} + m_SpritePackerMode: 0 + m_SpritePackerPaddingPower: 1 + m_EtcTextureCompressorBehavior: 1 + m_EtcTextureFastCompressor: 1 + m_EtcTextureNormalCompressor: 2 + m_EtcTextureBestCompressor: 4 + m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp;asmref + m_ProjectGenerationRootNamespace: + m_CollabEditorSettings: + inProgressEnabled: 1 + m_EnableTextureStreamingInEditMode: 1 + m_EnableTextureStreamingInPlayMode: 1 + m_AsyncShaderCompilation: 1 + m_EnterPlayModeOptionsEnabled: 0 + m_EnterPlayModeOptions: 3 + m_ShowLightmapResolutionOverlay: 1 + m_UseLegacyProbeSampleCount: 0 + m_AssetPipelineMode: 1 + m_CacheServerMode: 0 + m_CacheServerEndpoint: + m_CacheServerNamespacePrefix: default + m_CacheServerEnableDownload: 1 + m_CacheServerEnableUpload: 1 diff --git a/ProjectSettings/GraphicsSettings.asset b/ProjectSettings/GraphicsSettings.asset new file mode 100644 index 0000000..43369e3 --- /dev/null +++ b/ProjectSettings/GraphicsSettings.asset @@ -0,0 +1,63 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!30 &1 +GraphicsSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_Deferred: + m_Mode: 1 + m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} + m_DeferredReflections: + m_Mode: 1 + m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} + m_ScreenSpaceShadows: + m_Mode: 1 + m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} + m_LegacyDeferred: + m_Mode: 1 + m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} + m_DepthNormals: + m_Mode: 1 + m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} + m_MotionVectors: + m_Mode: 1 + m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} + m_LightHalo: + m_Mode: 1 + m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} + m_LensFlare: + m_Mode: 1 + m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} + m_AlwaysIncludedShaders: + - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} + m_PreloadedShaders: [] + m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, + type: 0} + m_CustomRenderPipeline: {fileID: 0} + m_TransparencySortMode: 0 + m_TransparencySortAxis: {x: 0, y: 0, z: 1} + m_DefaultRenderingPath: 1 + m_DefaultMobileRenderingPath: 1 + m_TierSettings: [] + m_LightmapStripping: 0 + m_FogStripping: 0 + m_InstancingStripping: 0 + m_LightmapKeepPlain: 1 + m_LightmapKeepDirCombined: 1 + m_LightmapKeepDynamicPlain: 1 + m_LightmapKeepDynamicDirCombined: 1 + m_LightmapKeepShadowMask: 1 + m_LightmapKeepSubtractive: 1 + m_FogKeepLinear: 1 + m_FogKeepExp: 1 + m_FogKeepExp2: 1 + m_AlbedoSwatchInfos: [] + m_LightsUseLinearIntensity: 0 + m_LightsUseColorTemperature: 0 + m_LogWhenShaderIsCompiled: 0 + m_AllowEnlightenSupportForUpgradedProject: 0 diff --git a/ProjectSettings/InputManager.asset b/ProjectSettings/InputManager.asset new file mode 100644 index 0000000..17c8f53 --- /dev/null +++ b/ProjectSettings/InputManager.asset @@ -0,0 +1,295 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!13 &1 +InputManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Axes: + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: a + altPositiveButton: d + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: s + altPositiveButton: w + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: mouse 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: mouse 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: mouse 2 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: space + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse X + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse Y + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse ScrollWheel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 2 + joyNum: 0 + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 0 + type: 2 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 1 + type: 2 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 0 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 1 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 2 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 3 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: enter + altNegativeButton: + altPositiveButton: space + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Cancel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: escape + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 diff --git a/ProjectSettings/NavMeshAreas.asset b/ProjectSettings/NavMeshAreas.asset new file mode 100644 index 0000000..3b0b7c3 --- /dev/null +++ b/ProjectSettings/NavMeshAreas.asset @@ -0,0 +1,91 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!126 &1 +NavMeshProjectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + areas: + - name: Walkable + cost: 1 + - name: Not Walkable + cost: 1 + - name: Jump + cost: 2 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + m_LastAgentTypeID: -887442657 + m_Settings: + - serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.75 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_SettingNames: + - Humanoid diff --git a/ProjectSettings/PackageManagerSettings.asset b/ProjectSettings/PackageManagerSettings.asset new file mode 100644 index 0000000..6920e3a --- /dev/null +++ b/ProjectSettings/PackageManagerSettings.asset @@ -0,0 +1,38 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_ScopedRegistriesSettingsExpanded: 1 + oneTimeWarningShown: 0 + m_Registries: + - m_Id: main + m_Name: + m_Url: https://packages.unity.com + m_Scopes: [] + m_IsDefault: 1 + m_UserSelectedRegistryName: + m_UserAddingNewScopedRegistry: 0 + m_RegistryInfoDraft: + m_ErrorMessage: + m_Original: + m_Id: + m_Name: + m_Url: + m_Scopes: [] + m_IsDefault: 0 + m_Modified: 0 + m_Name: + m_Url: + m_Scopes: + - + m_SelectedScopeIndex: 0 diff --git a/ProjectSettings/Physics2DSettings.asset b/ProjectSettings/Physics2DSettings.asset new file mode 100644 index 0000000..47880b1 --- /dev/null +++ b/ProjectSettings/Physics2DSettings.asset @@ -0,0 +1,56 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!19 &1 +Physics2DSettings: + m_ObjectHideFlags: 0 + serializedVersion: 4 + m_Gravity: {x: 0, y: -9.81} + m_DefaultMaterial: {fileID: 0} + m_VelocityIterations: 8 + m_PositionIterations: 3 + m_VelocityThreshold: 1 + m_MaxLinearCorrection: 0.2 + m_MaxAngularCorrection: 8 + m_MaxTranslationSpeed: 100 + m_MaxRotationSpeed: 360 + m_BaumgarteScale: 0.2 + m_BaumgarteTimeOfImpactScale: 0.75 + m_TimeToSleep: 0.5 + m_LinearSleepTolerance: 0.01 + m_AngularSleepTolerance: 2 + m_DefaultContactOffset: 0.01 + m_JobOptions: + serializedVersion: 2 + useMultithreading: 0 + useConsistencySorting: 0 + m_InterpolationPosesPerJob: 100 + m_NewContactsPerJob: 30 + m_CollideContactsPerJob: 100 + m_ClearFlagsPerJob: 200 + m_ClearBodyForcesPerJob: 200 + m_SyncDiscreteFixturesPerJob: 50 + m_SyncContinuousFixturesPerJob: 50 + m_FindNearestContactsPerJob: 100 + m_UpdateTriggerContactsPerJob: 100 + m_IslandSolverCostThreshold: 100 + m_IslandSolverBodyCostScale: 1 + m_IslandSolverContactCostScale: 10 + m_IslandSolverJointCostScale: 10 + m_IslandSolverBodiesPerJob: 50 + m_IslandSolverContactsPerJob: 50 + m_AutoSimulation: 1 + m_QueriesHitTriggers: 1 + m_QueriesStartInColliders: 1 + m_CallbacksOnDisable: 1 + m_ReuseCollisionCallbacks: 1 + m_AutoSyncTransforms: 0 + m_AlwaysShowColliders: 0 + m_ShowColliderSleep: 1 + m_ShowColliderContacts: 0 + m_ShowColliderAABB: 0 + m_ContactArrowScale: 0.2 + m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} + m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} + m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} + m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff diff --git a/ProjectSettings/PresetManager.asset b/ProjectSettings/PresetManager.asset new file mode 100644 index 0000000..67a94da --- /dev/null +++ b/ProjectSettings/PresetManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1386491679 &1 +PresetManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_DefaultPresets: {} diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset new file mode 100644 index 0000000..1412f55 --- /dev/null +++ b/ProjectSettings/ProjectSettings.asset @@ -0,0 +1,713 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!129 &1 +PlayerSettings: + m_ObjectHideFlags: 0 + serializedVersion: 20 + productGUID: b3c5e0f91eedeff44a33fc4ff58cec69 + AndroidProfiler: 0 + AndroidFilterTouchesWhenObscured: 0 + AndroidEnableSustainedPerformanceMode: 0 + defaultScreenOrientation: 4 + targetDevice: 2 + useOnDemandResources: 0 + accelerometerFrequency: 60 + companyName: VRChat + productName: vpm-package-maker + defaultCursor: {fileID: 0} + cursorHotspot: {x: 0, y: 0} + m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} + m_ShowUnitySplashScreen: 1 + m_ShowUnitySplashLogo: 1 + m_SplashScreenOverlayOpacity: 1 + m_SplashScreenAnimation: 1 + m_SplashScreenLogoStyle: 1 + m_SplashScreenDrawMode: 0 + m_SplashScreenBackgroundAnimationZoom: 1 + m_SplashScreenLogoAnimationZoom: 1 + m_SplashScreenBackgroundLandscapeAspect: 1 + m_SplashScreenBackgroundPortraitAspect: 1 + m_SplashScreenBackgroundLandscapeUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenBackgroundPortraitUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenLogos: [] + m_VirtualRealitySplashScreen: {fileID: 0} + m_HolographicTrackingLossScreen: {fileID: 0} + defaultScreenWidth: 1024 + defaultScreenHeight: 768 + defaultScreenWidthWeb: 960 + defaultScreenHeightWeb: 600 + m_StereoRenderingPath: 0 + m_ActiveColorSpace: 0 + m_MTRendering: 1 + m_StackTraceTypes: 010000000100000001000000010000000100000001000000 + iosShowActivityIndicatorOnLoading: -1 + androidShowActivityIndicatorOnLoading: -1 + iosUseCustomAppBackgroundBehavior: 0 + iosAllowHTTPDownload: 1 + allowedAutorotateToPortrait: 1 + allowedAutorotateToPortraitUpsideDown: 1 + allowedAutorotateToLandscapeRight: 1 + allowedAutorotateToLandscapeLeft: 1 + useOSAutorotation: 1 + use32BitDisplayBuffer: 1 + preserveFramebufferAlpha: 0 + disableDepthAndStencilBuffers: 0 + androidStartInFullscreen: 1 + androidRenderOutsideSafeArea: 1 + androidUseSwappy: 0 + androidBlitType: 0 + androidResizableWindow: 0 + androidDefaultWindowWidth: 1920 + androidDefaultWindowHeight: 1080 + androidMinimumWindowWidth: 400 + androidMinimumWindowHeight: 300 + androidFullscreenMode: 1 + defaultIsNativeResolution: 1 + macRetinaSupport: 1 + runInBackground: 1 + captureSingleScreen: 0 + muteOtherAudioSources: 0 + Prepare IOS For Recording: 0 + Force IOS Speakers When Recording: 0 + deferSystemGesturesMode: 0 + hideHomeButton: 0 + submitAnalytics: 1 + usePlayerLog: 1 + bakeCollisionMeshes: 0 + forceSingleInstance: 0 + useFlipModelSwapchain: 1 + resizableWindow: 0 + useMacAppStoreValidation: 0 + macAppStoreCategory: public.app-category.games + gpuSkinning: 1 + xboxPIXTextureCapture: 0 + xboxEnableAvatar: 0 + xboxEnableKinect: 0 + xboxEnableKinectAutoTracking: 0 + xboxEnableFitness: 0 + visibleInBackground: 1 + allowFullscreenSwitch: 1 + fullscreenMode: 1 + xboxSpeechDB: 0 + xboxEnableHeadOrientation: 0 + xboxEnableGuest: 0 + xboxEnablePIXSampling: 0 + metalFramebufferOnly: 0 + xboxOneResolution: 0 + xboxOneSResolution: 0 + xboxOneXResolution: 3 + xboxOneMonoLoggingLevel: 0 + xboxOneLoggingLevel: 1 + xboxOneDisableEsram: 0 + xboxOneEnableTypeOptimization: 0 + xboxOnePresentImmediateThreshold: 0 + switchQueueCommandMemory: 0 + switchQueueControlMemory: 16384 + switchQueueComputeMemory: 262144 + switchNVNShaderPoolsGranularity: 33554432 + switchNVNDefaultPoolsGranularity: 16777216 + switchNVNOtherPoolsGranularity: 16777216 + switchNVNMaxPublicTextureIDCount: 0 + switchNVNMaxPublicSamplerIDCount: 0 + stadiaPresentMode: 0 + stadiaTargetFramerate: 0 + vulkanNumSwapchainBuffers: 3 + vulkanEnableSetSRGBWrite: 0 + vulkanEnableLateAcquireNextImage: 0 + m_SupportedAspectRatios: + 4:3: 1 + 5:4: 1 + 16:10: 1 + 16:9: 1 + Others: 1 + bundleVersion: 0.1 + preloadedAssets: [] + metroInputSource: 0 + wsaTransparentSwapchain: 0 + m_HolographicPauseOnTrackingLoss: 1 + xboxOneDisableKinectGpuReservation: 1 + xboxOneEnable7thCore: 1 + vrSettings: + cardboard: + depthFormat: 0 + enableTransitionView: 0 + daydream: + depthFormat: 0 + useSustainedPerformanceMode: 0 + enableVideoLayer: 0 + useProtectedVideoMemory: 0 + minimumSupportedHeadTracking: 0 + maximumSupportedHeadTracking: 1 + hololens: + depthFormat: 1 + depthBufferSharingEnabled: 1 + lumin: + depthFormat: 0 + frameTiming: 2 + enableGLCache: 0 + glCacheMaxBlobSize: 524288 + glCacheMaxFileSize: 8388608 + oculus: + sharedDepthBuffer: 1 + dashSupport: 1 + lowOverheadMode: 0 + protectedContext: 0 + v2Signing: 1 + enable360StereoCapture: 0 + isWsaHolographicRemotingEnabled: 0 + enableFrameTimingStats: 0 + useHDRDisplay: 0 + D3DHDRBitDepth: 0 + m_ColorGamuts: 00000000 + targetPixelDensity: 30 + resolutionScalingMode: 0 + androidSupportedAspectRatio: 1 + androidMaxAspectRatio: 2.1 + applicationIdentifier: {} + buildNumber: {} + AndroidBundleVersionCode: 1 + AndroidMinSdkVersion: 19 + AndroidTargetSdkVersion: 0 + AndroidPreferredInstallLocation: 1 + aotOptions: + stripEngineCode: 1 + iPhoneStrippingLevel: 0 + iPhoneScriptCallOptimization: 0 + ForceInternetPermission: 0 + ForceSDCardPermission: 0 + CreateWallpaper: 0 + APKExpansionFiles: 0 + keepLoadedShadersAlive: 0 + StripUnusedMeshComponents: 1 + VertexChannelCompressionMask: 4054 + iPhoneSdkVersion: 988 + iOSTargetOSVersionString: 10.0 + tvOSSdkVersion: 0 + tvOSRequireExtendedGameController: 0 + tvOSTargetOSVersionString: 10.0 + uIPrerenderedIcon: 0 + uIRequiresPersistentWiFi: 0 + uIRequiresFullScreen: 1 + uIStatusBarHidden: 1 + uIExitOnSuspend: 0 + uIStatusBarStyle: 0 + appleTVSplashScreen: {fileID: 0} + appleTVSplashScreen2x: {fileID: 0} + tvOSSmallIconLayers: [] + tvOSSmallIconLayers2x: [] + tvOSLargeIconLayers: [] + tvOSLargeIconLayers2x: [] + tvOSTopShelfImageLayers: [] + tvOSTopShelfImageLayers2x: [] + tvOSTopShelfImageWideLayers: [] + tvOSTopShelfImageWideLayers2x: [] + iOSLaunchScreenType: 0 + iOSLaunchScreenPortrait: {fileID: 0} + iOSLaunchScreenLandscape: {fileID: 0} + iOSLaunchScreenBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreenFillPct: 100 + iOSLaunchScreenSize: 100 + iOSLaunchScreenCustomXibPath: + iOSLaunchScreeniPadType: 0 + iOSLaunchScreeniPadImage: {fileID: 0} + iOSLaunchScreeniPadBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreeniPadFillPct: 100 + iOSLaunchScreeniPadSize: 100 + iOSLaunchScreeniPadCustomXibPath: + iOSUseLaunchScreenStoryboard: 0 + iOSLaunchScreenCustomStoryboardPath: + iOSDeviceRequirements: [] + iOSURLSchemes: [] + iOSBackgroundModes: 0 + iOSMetalForceHardShadows: 0 + metalEditorSupport: 1 + metalAPIValidation: 1 + iOSRenderExtraFrameOnPause: 0 + iosCopyPluginsCodeInsteadOfSymlink: 0 + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + iOSManualSigningProvisioningProfileType: 0 + tvOSManualSigningProvisioningProfileType: 0 + appleEnableAutomaticSigning: 0 + iOSRequireARKit: 0 + iOSAutomaticallyDetectAndAddCapabilities: 1 + appleEnableProMotion: 0 + clonedFromGUID: c0afd0d1d80e3634a9dac47e8a0426ea + templatePackageId: com.unity.template.3d@4.2.8 + templateDefaultScene: Assets/Scenes/SampleScene.unity + AndroidTargetArchitectures: 1 + AndroidTargetDevices: 0 + AndroidSplashScreenScale: 0 + androidSplashScreen: {fileID: 0} + AndroidKeystoreName: + AndroidKeyaliasName: + AndroidBuildApkPerCpuArchitecture: 0 + AndroidTVCompatibility: 0 + AndroidIsGame: 1 + AndroidEnableTango: 0 + androidEnableBanner: 1 + androidUseLowAccuracyLocation: 0 + androidUseCustomKeystore: 0 + m_AndroidBanners: + - width: 320 + height: 180 + banner: {fileID: 0} + androidGamepadSupportLevel: 0 + chromeosInputEmulation: 1 + AndroidValidateAppBundleSize: 1 + AndroidAppBundleSizeToValidate: 150 + m_BuildTargetIcons: [] + m_BuildTargetPlatformIcons: [] + m_BuildTargetBatching: + - m_BuildTarget: Standalone + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: tvOS + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: Android + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: iPhone + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: WebGL + m_StaticBatching: 0 + m_DynamicBatching: 0 + m_BuildTargetGraphicsJobs: + - m_BuildTarget: MacStandaloneSupport + m_GraphicsJobs: 0 + - m_BuildTarget: Switch + m_GraphicsJobs: 1 + - m_BuildTarget: MetroSupport + m_GraphicsJobs: 1 + - m_BuildTarget: AppleTVSupport + m_GraphicsJobs: 0 + - m_BuildTarget: BJMSupport + m_GraphicsJobs: 1 + - m_BuildTarget: LinuxStandaloneSupport + m_GraphicsJobs: 1 + - m_BuildTarget: PS4Player + m_GraphicsJobs: 1 + - m_BuildTarget: iOSSupport + m_GraphicsJobs: 0 + - m_BuildTarget: WindowsStandaloneSupport + m_GraphicsJobs: 1 + - m_BuildTarget: XboxOnePlayer + m_GraphicsJobs: 1 + - m_BuildTarget: LuminSupport + m_GraphicsJobs: 0 + - m_BuildTarget: AndroidPlayer + m_GraphicsJobs: 0 + - m_BuildTarget: WebGLSupport + m_GraphicsJobs: 0 + m_BuildTargetGraphicsJobMode: + - m_BuildTarget: PS4Player + m_GraphicsJobMode: 0 + - m_BuildTarget: XboxOnePlayer + m_GraphicsJobMode: 0 + m_BuildTargetGraphicsAPIs: + - m_BuildTarget: AndroidPlayer + m_APIs: 150000000b000000 + m_Automatic: 0 + - m_BuildTarget: iOSSupport + m_APIs: 10000000 + m_Automatic: 1 + - m_BuildTarget: AppleTVSupport + m_APIs: 10000000 + m_Automatic: 0 + - m_BuildTarget: WebGLSupport + m_APIs: 0b000000 + m_Automatic: 1 + m_BuildTargetVRSettings: + - m_BuildTarget: Standalone + m_Enabled: 0 + m_Devices: + - Oculus + - OpenVR + openGLRequireES31: 0 + openGLRequireES31AEP: 0 + openGLRequireES32: 0 + m_TemplateCustomTags: {} + mobileMTRendering: + Android: 1 + iPhone: 1 + tvOS: 1 + m_BuildTargetGroupLightmapEncodingQuality: [] + m_BuildTargetGroupLightmapSettings: [] + playModeTestRunnerEnabled: 0 + runPlayModeTestAsEditModeTest: 0 + actionOnDotNetUnhandledException: 1 + enableInternalProfiler: 0 + logObjCUncaughtExceptions: 1 + enableCrashReportAPI: 0 + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + switchNetLibKey: + switchSocketMemoryPoolSize: 6144 + switchSocketAllocatorPoolSize: 128 + switchSocketConcurrencyLimit: 14 + switchScreenResolutionBehavior: 2 + switchUseCPUProfiler: 0 + switchApplicationID: 0x01004b9000490000 + switchNSODependencies: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchTitleNames_15: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchPublisherNames_15: + switchIcons_0: {fileID: 0} + switchIcons_1: {fileID: 0} + switchIcons_2: {fileID: 0} + switchIcons_3: {fileID: 0} + switchIcons_4: {fileID: 0} + switchIcons_5: {fileID: 0} + switchIcons_6: {fileID: 0} + switchIcons_7: {fileID: 0} + switchIcons_8: {fileID: 0} + switchIcons_9: {fileID: 0} + switchIcons_10: {fileID: 0} + switchIcons_11: {fileID: 0} + switchIcons_12: {fileID: 0} + switchIcons_13: {fileID: 0} + switchIcons_14: {fileID: 0} + switchIcons_15: {fileID: 0} + switchSmallIcons_0: {fileID: 0} + switchSmallIcons_1: {fileID: 0} + switchSmallIcons_2: {fileID: 0} + switchSmallIcons_3: {fileID: 0} + switchSmallIcons_4: {fileID: 0} + switchSmallIcons_5: {fileID: 0} + switchSmallIcons_6: {fileID: 0} + switchSmallIcons_7: {fileID: 0} + switchSmallIcons_8: {fileID: 0} + switchSmallIcons_9: {fileID: 0} + switchSmallIcons_10: {fileID: 0} + switchSmallIcons_11: {fileID: 0} + switchSmallIcons_12: {fileID: 0} + switchSmallIcons_13: {fileID: 0} + switchSmallIcons_14: {fileID: 0} + switchSmallIcons_15: {fileID: 0} + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: + switchMainThreadStackSize: 1048576 + switchPresenceGroupId: + switchLogoHandling: 0 + switchReleaseVersion: 0 + switchDisplayVersion: 1.0.0 + switchStartupUserAccount: 0 + switchTouchScreenUsage: 0 + switchSupportedLanguagesMask: 0 + switchLogoType: 0 + switchApplicationErrorCodeCategory: + switchUserAccountSaveDataSize: 0 + switchUserAccountSaveDataJournalSize: 0 + switchApplicationAttribute: 0 + switchCardSpecSize: -1 + switchCardSpecClock: -1 + switchRatingsMask: 0 + switchRatingsInt_0: 0 + switchRatingsInt_1: 0 + switchRatingsInt_2: 0 + switchRatingsInt_3: 0 + switchRatingsInt_4: 0 + switchRatingsInt_5: 0 + switchRatingsInt_6: 0 + switchRatingsInt_7: 0 + switchRatingsInt_8: 0 + switchRatingsInt_9: 0 + switchRatingsInt_10: 0 + switchRatingsInt_11: 0 + switchRatingsInt_12: 0 + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: + switchParentalControl: 0 + switchAllowsScreenshot: 1 + switchAllowsVideoCapturing: 1 + switchAllowsRuntimeAddOnContentInstall: 0 + switchDataLossConfirmation: 0 + switchUserAccountLockEnabled: 0 + switchSystemResourceMemory: 16777216 + switchSupportedNpadStyles: 22 + switchNativeFsCacheSize: 32 + switchIsHoldTypeHorizontal: 0 + switchSupportedNpadCount: 8 + switchSocketConfigEnabled: 0 + switchTcpInitialSendBufferSize: 32 + switchTcpInitialReceiveBufferSize: 64 + switchTcpAutoSendBufferSizeMax: 256 + switchTcpAutoReceiveBufferSizeMax: 256 + switchUdpSendBufferSize: 9 + switchUdpReceiveBufferSize: 42 + switchSocketBufferEfficiency: 4 + switchSocketInitializeEnabled: 1 + switchNetworkInterfaceManagerInitializeEnabled: 1 + switchPlayerConnectionEnabled: 1 + switchUseMicroSleepForYield: 1 + switchMicroSleepForYieldTime: 25 + ps4NPAgeRating: 12 + ps4NPTitleSecret: + ps4NPTrophyPackPath: + ps4ParentalLevel: 11 + ps4ContentID: ED1633-NPXX51362_00-0000000000000000 + ps4Category: 0 + ps4MasterVersion: 01.00 + ps4AppVersion: 01.00 + ps4AppType: 0 + ps4ParamSfxPath: + ps4VideoOutPixelFormat: 0 + ps4VideoOutInitialWidth: 1920 + ps4VideoOutBaseModeInitialWidth: 1920 + ps4VideoOutReprojectionRate: 60 + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: + ps4RemotePlayKeyAssignment: -1 + ps4RemotePlayKeyMappingDir: + ps4PlayTogetherPlayerCount: 0 + ps4EnterButtonAssignment: 1 + ps4ApplicationParam1: 0 + ps4ApplicationParam2: 0 + ps4ApplicationParam3: 0 + ps4ApplicationParam4: 0 + ps4DownloadDataSize: 0 + ps4GarlicHeapSize: 2048 + ps4ProGarlicHeapSize: 2560 + playerPrefsMaxSize: 32768 + ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ + ps4pnSessions: 1 + ps4pnPresence: 1 + ps4pnFriends: 1 + ps4pnGameCustomData: 1 + playerPrefsSupport: 0 + enableApplicationExit: 0 + resetTempFolder: 1 + restrictedAudioUsageRights: 0 + ps4UseResolutionFallback: 0 + ps4ReprojectionSupport: 0 + ps4UseAudio3dBackend: 0 + ps4UseLowGarlicFragmentationMode: 1 + ps4SocialScreenEnabled: 0 + ps4ScriptOptimizationLevel: 0 + ps4Audio3dVirtualSpeakerCount: 14 + ps4attribCpuUsage: 0 + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: + ps4PatchDayOne: 0 + ps4attribUserManagement: 0 + ps4attribMoveSupport: 0 + ps4attrib3DSupport: 0 + ps4attribShareSupport: 0 + ps4attribExclusiveVR: 0 + ps4disableAutoHideSplash: 0 + ps4videoRecordingFeaturesUsed: 0 + ps4contentSearchFeaturesUsed: 0 + ps4CompatibilityPS5: 0 + ps4AllowPS5Detection: 0 + ps4GPU800MHz: 1 + ps4attribEyeToEyeDistanceSettingVR: 0 + ps4IncludedModules: [] + ps4attribVROutputEnabled: 0 + ps5ParamFilePath: + ps5VideoOutPixelFormat: 0 + ps5VideoOutInitialWidth: 1920 + ps5VideoOutOutputMode: 1 + ps5BackgroundImagePath: + ps5StartupImagePath: + ps5Pic2Path: + ps5StartupImagesFolder: + ps5IconImagesFolder: + ps5SaveDataImagePath: + ps5SdkOverride: + ps5BGMPath: + ps5ShareOverlayImagePath: + ps5NPConfigZipPath: + ps5Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ + ps5UseResolutionFallback: 0 + ps5UseAudio3dBackend: 0 + ps5ScriptOptimizationLevel: 2 + ps5Audio3dVirtualSpeakerCount: 14 + ps5UpdateReferencePackage: + ps5disableAutoHideSplash: 0 + ps5OperatingSystemCanDisableSplashScreen: 0 + ps5IncludedModules: [] + ps5SharedBinaryContentLabels: [] + ps5SharedBinarySystemFolders: [] + monoEnv: + splashScreenBackgroundSourceLandscape: {fileID: 0} + splashScreenBackgroundSourcePortrait: {fileID: 0} + blurSplashScreenBackground: 1 + spritePackerPolicy: + webGLMemorySize: 16 + webGLExceptionSupport: 1 + webGLNameFilesAsHashes: 0 + webGLDataCaching: 1 + webGLDebugSymbols: 0 + webGLEmscriptenArgs: + webGLModulesDirectory: + webGLTemplate: APPLICATION:Default + webGLAnalyzeBuildSize: 0 + webGLUseEmbeddedResources: 0 + webGLCompressionFormat: 1 + webGLLinkerTarget: 1 + webGLThreadsSupport: 0 + webGLWasmStreaming: 0 + scriptingDefineSymbols: {} + platformArchitecture: {} + scriptingBackend: {} + il2cppCompilerConfiguration: {} + managedStrippingLevel: {} + incrementalIl2cppBuild: {} + suppressCommonWarnings: 1 + allowUnsafeCode: 0 + additionalIl2CppArgs: + scriptingRuntimeVersion: 1 + gcIncremental: 0 + assemblyVersionValidation: 1 + gcWBarrierValidation: 0 + apiCompatibilityLevelPerPlatform: + Standalone: 3 + m_RenderingPath: 1 + m_MobileRenderingPath: 1 + metroPackageName: Template_3D + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: + metroCertificateNotAfter: 0000000000000000 + metroApplicationDescription: Template_3D + wsaImages: {} + metroTileShortName: + metroTileShowName: 0 + metroMediumTileShowName: 0 + metroLargeTileShowName: 0 + metroWideTileShowName: 0 + metroSupportStreamingInstall: 0 + metroLastRequiredScene: 0 + metroDefaultTileSize: 1 + metroTileForegroundText: 2 + metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} + metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, + a: 1} + metroSplashScreenUseBackgroundColor: 0 + platformCapabilities: {} + metroTargetDeviceFamilies: {} + metroFTAName: + metroFTAFileTypes: [] + metroProtocolName: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: + XboxOneVersion: 1.0.0.0 + XboxOnePackageEncryption: 0 + XboxOnePackageUpdateGranularity: 2 + XboxOneDescription: + XboxOneLanguage: + - enus + XboxOneCapability: [] + XboxOneGameRating: {} + XboxOneIsContentPackage: 0 + XboxOneEnhancedXboxCompatibilityMode: 0 + XboxOneEnableGPUVariability: 1 + XboxOneSockets: {} + XboxOneSplashScreen: {fileID: 0} + XboxOneAllowedProductIds: [] + XboxOnePersistentLocalStorageSize: 0 + XboxOneXTitleMemory: 8 + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: + vrEditorSettings: + daydream: + daydreamIconForeground: {fileID: 0} + daydreamIconBackground: {fileID: 0} + cloudServicesEnabled: + UNet: 1 + luminIcon: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: + luminCert: + m_CertPath: + m_SignPackage: 1 + luminIsChannelApp: 0 + luminVersion: + m_VersionCode: 1 + m_VersionName: + apiCompatibilityLevel: 6 + cloudProjectId: + framebufferDepthMemorylessMode: 0 + projectName: + organizationId: + cloudEnabled: 0 + enableNativePlatformBackendsForNewInputSystem: 0 + disableOldInputManagerSupport: 0 + legacyClampBlendShapeWeights: 0 diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt new file mode 100644 index 0000000..5549a7f --- /dev/null +++ b/ProjectSettings/ProjectVersion.txt @@ -0,0 +1,2 @@ +m_EditorVersion: 2019.4.31f1 +m_EditorVersionWithRevision: 2019.4.31f1 (bd5abf232a62) diff --git a/ProjectSettings/QualitySettings.asset b/ProjectSettings/QualitySettings.asset new file mode 100644 index 0000000..7b7658d --- /dev/null +++ b/ProjectSettings/QualitySettings.asset @@ -0,0 +1,232 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!47 &1 +QualitySettings: + m_ObjectHideFlags: 0 + serializedVersion: 5 + m_CurrentQuality: 5 + m_QualitySettings: + - serializedVersion: 2 + name: Very Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 15 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + blendWeights: 1 + textureQuality: 1 + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 0 + lodBias: 0.3 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 4 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + blendWeights: 2 + textureQuality: 0 + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 0 + lodBias: 0.4 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 16 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Medium + pixelLightCount: 1 + shadows: 1 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + blendWeights: 2 + textureQuality: 0 + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 1 + lodBias: 0.7 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 64 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: High + pixelLightCount: 2 + shadows: 2 + shadowResolution: 1 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 40 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + blendWeights: 2 + textureQuality: 0 + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 1 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 256 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Very High + pixelLightCount: 3 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 70 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + blendWeights: 4 + textureQuality: 0 + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 1.5 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 1024 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Ultra + pixelLightCount: 4 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 4 + shadowDistance: 150 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + blendWeights: 4 + textureQuality: 0 + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 2 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 4096 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + m_PerPlatformDefaultQuality: + Android: 2 + Lumin: 5 + Nintendo 3DS: 5 + Nintendo Switch: 5 + PS4: 5 + PSP2: 2 + Stadia: 5 + Standalone: 5 + WebGL: 3 + Windows Store Apps: 5 + XboxOne: 5 + iPhone: 2 + tvOS: 2 diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset new file mode 100644 index 0000000..1c92a78 --- /dev/null +++ b/ProjectSettings/TagManager.asset @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!78 &1 +TagManager: + serializedVersion: 2 + tags: [] + layers: + - Default + - TransparentFX + - Ignore Raycast + - + - Water + - UI + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + m_SortingLayers: + - name: Default + uniqueID: 0 + locked: 0 diff --git a/ProjectSettings/TimeManager.asset b/ProjectSettings/TimeManager.asset new file mode 100644 index 0000000..558a017 --- /dev/null +++ b/ProjectSettings/TimeManager.asset @@ -0,0 +1,9 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!5 &1 +TimeManager: + m_ObjectHideFlags: 0 + Fixed Timestep: 0.02 + Maximum Allowed Timestep: 0.33333334 + m_TimeScale: 1 + Maximum Particle Timestep: 0.03 diff --git a/ProjectSettings/UnityConnectSettings.asset b/ProjectSettings/UnityConnectSettings.asset new file mode 100644 index 0000000..fa0b146 --- /dev/null +++ b/ProjectSettings/UnityConnectSettings.asset @@ -0,0 +1,34 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!310 &1 +UnityConnectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 1 + m_Enabled: 0 + m_TestMode: 0 + m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events + m_EventUrl: https://cdp.cloud.unity3d.com/v1/events + m_ConfigUrl: https://config.uca.cloud.unity3d.com + m_TestInitMode: 0 + CrashReportingSettings: + m_EventUrl: https://perf-events.cloud.unity3d.com + m_Enabled: 0 + m_LogBufferSize: 10 + m_CaptureEditorExceptions: 1 + UnityPurchasingSettings: + m_Enabled: 0 + m_TestMode: 0 + UnityAnalyticsSettings: + m_Enabled: 0 + m_TestMode: 0 + m_InitializeOnStartup: 1 + UnityAdsSettings: + m_Enabled: 0 + m_InitializeOnStartup: 1 + m_TestMode: 0 + m_IosGameId: + m_AndroidGameId: + m_GameIds: {} + m_GameId: + PerformanceReportingSettings: + m_Enabled: 0 diff --git a/ProjectSettings/VFXManager.asset b/ProjectSettings/VFXManager.asset new file mode 100644 index 0000000..3a95c98 --- /dev/null +++ b/ProjectSettings/VFXManager.asset @@ -0,0 +1,12 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!937362698 &1 +VFXManager: + m_ObjectHideFlags: 0 + m_IndirectShader: {fileID: 0} + m_CopyBufferShader: {fileID: 0} + m_SortShader: {fileID: 0} + m_StripUpdateShader: {fileID: 0} + m_RenderPipeSettingsPath: + m_FixedTimeStep: 0.016666668 + m_MaxDeltaTime: 0.05 diff --git a/ProjectSettings/XRSettings.asset b/ProjectSettings/XRSettings.asset new file mode 100644 index 0000000..482590c --- /dev/null +++ b/ProjectSettings/XRSettings.asset @@ -0,0 +1,10 @@ +{ + "m_SettingKeys": [ + "VR Device Disabled", + "VR Device User Alert" + ], + "m_SettingValues": [ + "False", + "False" + ] +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..39f577a --- /dev/null +++ b/README.md @@ -0,0 +1,76 @@ +# VPM Package Template + +Starter for making Packages, including automation for building and publishing them. + +Once you're all set up, you'll be able to push changes to this repository and have .zip and .unitypackage versions automatically generated, and a listing made which works in the VPM for delivering updates for this package. If you want to make a listing with a variety of packages, check out our [template-package-listing](https://github.com/vrchat-community/template-package-listing) repo. + +## ▶ Getting Started + +* Press [![Use This Template](https://user-images.githubusercontent.com/737888/185467681-e5fdb099-d99f-454b-8d9e-0760e5a6e588.png)](https://github.com/vrchat-community/template-package/generate) +to start a new GitHub project based on this template. + * Choose a fitting repository name and description. + * Set the visibility to 'Public'. You can also choose 'Private' and change it later. + * You don't need to select 'Include all branches.' +* Clone this repository locally using Git. + * If you're unfamiliar with Git and GitHub, [visit GitHub's documentation](https://docs.github.com/en/get-started/quickstart/git-and-github-learning-resources) to learn more. +* Add the folder to Unity Hub and open it as a Unity Project. +* After opening the project, wait while the VPM resolver is downloaded and added to your project. + * This gives you access to the VPM Package Maker and Package Resolver tools. + +## 🚇 Migrating Assets Package +Full details at [Converting Assets to a VPM Package](https://vcc.docs.vrchat.com/guides/convert-unitypackage) + +## ✏️ Working on Your Package + +* Delete the "Packages/com.vrchat.demo-template" directory or reuse it for your own package. + * If you reuse the package, don't forget to rename it! +* Update the `.gitignore` file in the "Packages" directory to include your package. + * For example, change `!com.vrchat.demo-template` to `!com.username.package-name`. + * `.gitignore` files normally *exclude* the contents of your "Packages" directory. This `.gitignore` in this template show how to *include* the demo package. You can easily change this out for your own package name. +* Open the Unity project and work on your package's files in your favorite code editor. +* When you're ready, commit and push your changes. +* Once you've set up the automation as described below, you can easily publish new versions. + +## 🤖 Setting up the Automation + +Create a repository variable with the name and value described below. +For details on how to create repository variables, see [Creating Configuration Variables for a Repository](https://docs.github.com/en/actions/learn-github-actions/variables#creating-configuration-variables-for-a-repository). +Make sure you are creating a **repository variable**, and not a **repository secret**. + +* `PACKAGE_NAME`: the name of your package, like `com.vrchat.demo-template`. + +Finally, go to the "Settings" page for your repo, then choose "Pages", and look for the heading "Build and deployment". Change the "Source" dropdown from "Deploy from a branch" to "GitHub Actions". + +That's it! +Some other notes: +* We highly recommend you keep the existing folder structure of this template. + * The root of the project should be a Unity project. + * Your packages should be in the "Packages" directory. + * If you deviate from this folder structure, you'll need to update the paths that assume your package is in the "Packages" directory on lines 24, 38, 41 and 57. +* If you want to store and generate your web files in a folder other than "Website" in the root, you can change the `listPublicDirectory` item [here in build-listing.yml](.github/workflows/build-listing.yml#L17). + +## 🎉 Publishing a Release + +You can make a release by running the [Build Release](.github/workflows/release.yml) action. The version specified in your `package.json` file will be used to define the version of the release. + +## 📃 Rebuilding the Listing + +Whenever you make a change to a release - manually publishing it, or manually creating, editing or deleting a release, the [Build Repo Listing](.github/workflows/build-listing.yml) action will make a new index of all the releases available, and publish them as a website hosted fore free on [GitHub Pages](https://pages.github.com/). This listing can be used by the VPM to keep your package up to date, and the generated index page can serve as a simple landing page with info for your package. The URL for your package will be in the format `https://username.github.io/repo-name`. + +## 🏠 Customizing the Landing Page (Optional) + +The action which rebuilds the listing also publishes a landing page. The source for this page is in `Website/index.html`. The automation system uses [Scriban](https://github.com/scriban/scriban) to fill in the objects like `{{ this }}` with information from the latest release's manifest, so it will stay up-to-date with the name, id and description that you provide there. You are welcome to modify this page however you want - just use the existing `{{ template.objects }}` to fill in that info wherever you like. The entire contents of your "Website" folder are published to your GitHub Page each time. + +## 💻 Technical Stuff + +You are welcome to make your own changes to the automation process to make it fit your needs, and you can create Pull Requests if you have some changes you think we should adopt. Here's some more info on the included automation: + +### Build Release Action +[release.yml](/.github/workflows/release.yml) + +This is a composite action combining a variety of existing GitHub Actions and some shell commands to create both a .zip of your Package and a .unitypackage. It creates a release which is named for the `version` in the `package.json` file found in your target Package, and publishes the zip, the unitypackage and the package.json file to this release. + +### Build Repo Listing +[build-listing.yml](.github/workflows/build-listing.yml) + +This is a composite action which builds a vpm-compatible [Repo Listing](https://vcc.docs.vrchat.com/vpm/repos) based on the releases you've created. In order to find all your releases and combine them into a listing, it checks out [another repository](https://github.com/vrchat-community/package-list-action) which has a [Nuke](https://nuke.build/) project which includes the VPM core lib to have access to its types and methods. This project will be expanded to include more functionality in the future - for now, the action just calls its `BuildRepoListing` target. diff --git a/Website/app.js b/Website/app.js new file mode 100644 index 0000000..b15c8fe --- /dev/null +++ b/Website/app.js @@ -0,0 +1,231 @@ +import { baseLayerLuminance, StandardLuminance } from 'https://unpkg.com/@fluentui/web-components'; + +const LISTING_URL = "{{ listingInfo.Url }}"; + +const PACKAGES = { +{{~ for package in packages ~}} + "{{ package.Name }}": { + name: "{{ package.Name }}", + displayName: "{{ if package.DisplayName; package.DisplayName; end; }}", + description: "{{ if package.Description; package.Description; end; }}", + version: "{{ package.Version }}", + author: { + name: "{{ if package.Author.Name; package.Author.Name; end; }}", + url: "{{ if package.Author.Url; package.Author.Url; end; }}", + }, + dependencies: { + {{~ for dependency in package.Dependencies ~}} + "{{ dependency.Name }}": "{{ dependency.Version }}", + {{~ end ~}} + }, + keywords: [ + {{~ for keyword in package.Keywords ~}} + "{{ keyword }}", + {{~ end ~}} + ], + license: "{{ package.License }}", + licensesUrl: "{{ package.LicensesUrl }}", + }, +{{~ end ~}} +}; + +const setTheme = () => { + const isDarkTheme = () => window.matchMedia("(prefers-color-scheme: dark)").matches; + if (isDarkTheme()) { + baseLayerLuminance.setValueFor(document.documentElement, StandardLuminance.DarkMode); + } else { + baseLayerLuminance.setValueFor(document.documentElement, StandardLuminance.LightMode); + } +} + +(() => { + setTheme(); + + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => { + setTheme(); + }); + + const packageGrid = document.getElementById('packageGrid'); + + const searchInput = document.getElementById('searchInput'); + searchInput.addEventListener('input', ({ target: { value = '' }}) => { + const items = packageGrid.querySelectorAll('fluent-data-grid-row[row-type="default"]'); + items.forEach(item => { + if (value === '') { + item.style.display = 'grid'; + return; + } + if ( + item.dataset?.packageName?.toLowerCase()?.includes(value.toLowerCase()) || + item.dataset?.packageId?.toLowerCase()?.includes(value.toLowerCase()) + ) { + item.style.display = 'grid'; + } else { + item.style.display = 'none'; + } + }); + }); + + const urlBarHelpButton = document.getElementById('urlBarHelp'); + const addListingToVccHelp = document.getElementById('addListingToVccHelp'); + urlBarHelpButton.addEventListener('click', () => { + addListingToVccHelp.hidden = false; + }); + const addListingToVccHelpClose = document.getElementById('addListingToVccHelpClose'); + addListingToVccHelpClose.addEventListener('click', () => { + addListingToVccHelp.hidden = true; + }); + + const vccListingInfoUrlFieldCopy = document.getElementById('vccListingInfoUrlFieldCopy'); + vccListingInfoUrlFieldCopy.addEventListener('click', () => { + const vccUrlField = document.getElementById('vccListingInfoUrlField'); + vccUrlField.select(); + navigator.clipboard.writeText(vccUrlField.value); + vccUrlFieldCopy.appearance = 'accent'; + setTimeout(() => { + vccUrlFieldCopy.appearance = 'neutral'; + }, 1000); + }); + + const vccAddRepoButton = document.getElementById('vccAddRepoButton'); + vccAddRepoButton.addEventListener('click', () => window.location.assign(`vcc://vpm/addRepo?url=${encodeURIComponent(LISTING_URL)}`)); + + const vccUrlFieldCopy = document.getElementById('vccUrlFieldCopy'); + vccUrlFieldCopy.addEventListener('click', () => { + const vccUrlField = document.getElementById('vccUrlField'); + vccUrlField.select(); + navigator.clipboard.writeText(vccUrlField.value); + vccUrlFieldCopy.appearance = 'accent'; + setTimeout(() => { + vccUrlFieldCopy.appearance = 'neutral'; + }, 1000); + }); + + const rowMoreMenu = document.getElementById('rowMoreMenu'); + const hideRowMoreMenu = e => { + if (rowMoreMenu.contains(e.target)) return; + document.removeEventListener('click', hideRowMoreMenu); + rowMoreMenu.hidden = true; + } + + const rowMenuButtons = document.querySelectorAll('.rowMenuButton'); + rowMenuButtons.forEach(button => { + button.addEventListener('click', e => { + if (rowMoreMenu?.hidden) { + rowMoreMenu.style.top = `${e.clientY + e.target.clientHeight}px`; + rowMoreMenu.style.left = `${e.clientX - 120}px`; + rowMoreMenu.hidden = false; + + const downloadLink = rowMoreMenu.querySelector('#rowMoreMenuDownload'); + const downloadListener = () => { + window.open(e?.target?.dataset?.packageUrl, '_blank'); + } + downloadLink.addEventListener('change', () => { + downloadListener(); + downloadLink.removeEventListener('change', downloadListener); + }); + + setTimeout(() => { + document.addEventListener('click', hideRowMoreMenu); + }, 1); + } + }); + }); + + const packageInfoModal = document.getElementById('packageInfoModal'); + const packageInfoModalClose = document.getElementById('packageInfoModalClose'); + packageInfoModalClose.addEventListener('click', () => { + packageInfoModal.hidden = true; + }); + + // Fluent dialogs use nested shadow-rooted elements, so we need to use JS to style them + const modalControl = packageInfoModal.shadowRoot.querySelector('.control'); + modalControl.style.maxHeight = "90%"; + modalControl.style.transition = 'height 0.2s ease-in-out'; + modalControl.style.overflowY = 'hidden'; + + const packageInfoName = document.getElementById('packageInfoName'); + const packageInfoId = document.getElementById('packageInfoId'); + const packageInfoVersion = document.getElementById('packageInfoVersion'); + const packageInfoDescription = document.getElementById('packageInfoDescription'); + const packageInfoAuthor = document.getElementById('packageInfoAuthor'); + const packageInfoDependencies = document.getElementById('packageInfoDependencies'); + const packageInfoKeywords = document.getElementById('packageInfoKeywords'); + const packageInfoLicense = document.getElementById('packageInfoLicense'); + + const rowAddToVccButtons = document.querySelectorAll('.rowAddToVccButton'); + rowAddToVccButtons.forEach((button) => { + button.addEventListener('click', () => window.location.assign(`vcc://vpm/addRepo?url=${encodeURIComponent(LISTING_URL)}`)); + }); + + const rowPackageInfoButton = document.querySelectorAll('.rowPackageInfoButton'); + rowPackageInfoButton.forEach((button) => { + button.addEventListener('click', e => { + const packageId = e.target.dataset?.packageId; + const packageInfo = PACKAGES?.[packageId]; + if (!packageInfo) { + console.error(`Did not find package ${packageId}. Packages available:`, PACKAGES); + return; + } + + packageInfoName.textContent = packageInfo.displayName; + packageInfoId.textContent = packageId; + packageInfoVersion.textContent = `v${packageInfo.version}`; + packageInfoDescription.textContent = packageInfo.description; + packageInfoAuthor.textContent = packageInfo.author.name; + packageInfoAuthor.href = packageInfo.author.url; + + if ((packageInfo.keywords?.length ?? 0) === 0) { + packageInfoKeywords.parentElement.classList.add('hidden'); + } else { + packageInfoKeywords.parentElement.classList.remove('hidden'); + packageInfoKeywords.innerHTML = null; + packageInfo.keywords.forEach(keyword => { + const keywordDiv = document.createElement('div'); + keywordDiv.classList.add('me-2', 'mb-2', 'badge'); + keywordDiv.textContent = keyword; + packageInfoKeywords.appendChild(keywordDiv); + }); + } + + if (!packageInfo.license?.length && !packageInfo.licensesUrl?.length) { + packageInfoLicense.parentElement.classList.add('hidden'); + } else { + packageInfoLicense.parentElement.classList.remove('hidden'); + packageInfoLicense.textContent = packageInfo.license ?? 'See License'; + packageInfoLicense.href = packageInfo.licensesUrl ?? '#'; + } + + packageInfoDependencies.innerHTML = null; + Object.entries(packageInfo.dependencies).forEach(([name, version]) => { + const depRow = document.createElement('li'); + depRow.classList.add('mb-2'); + depRow.textContent = `${name} @ v${version}`; + packageInfoDependencies.appendChild(depRow); + }); + + packageInfoModal.hidden = false; + + setTimeout(() => { + const height = packageInfoModal.querySelector('.col').clientHeight; + modalControl.style.setProperty('--dialog-height', `${height + 14}px`); + }, 1); + }); + }); + + const packageInfoVccUrlFieldCopy = document.getElementById('packageInfoVccUrlFieldCopy'); + packageInfoVccUrlFieldCopy.addEventListener('click', () => { + const vccUrlField = document.getElementById('packageInfoVccUrlField'); + vccUrlField.select(); + navigator.clipboard.writeText(vccUrlField.value); + vccUrlFieldCopy.appearance = 'accent'; + setTimeout(() => { + vccUrlFieldCopy.appearance = 'neutral'; + }, 1000); + }); + + const packageInfoListingHelp = document.getElementById('packageInfoListingHelp'); + packageInfoListingHelp.addEventListener('click', () => { + addListingToVccHelp.hidden = false; + }); +})(); \ No newline at end of file diff --git a/Website/banner.png b/Website/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..6609efc752ed6a5b1e37f22631a8bda3242080f5 GIT binary patch literal 60292 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 iX_sSnNRGu?E&l^<7ZA)BPJMd-0000^c-Ri=rqc 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 a5%X`!50>64ZUi&Q)bJr=28ZZdtoc7lZNXOn literal 0 HcmV?d00001 diff --git a/Website/index.html b/Website/index.html new file mode 100644 index 0000000..8bb119c --- /dev/null +++ b/Website/index.html @@ -0,0 +1,221 @@ + + + + + + VCC Listing + + + + + +
+
+ {{~ if listingInfo.BannerImage; ~}} +
+ {{~ end; ~}} +

+ {{~ listingInfo.Name ~}} +

+ {{~ if listingInfo.Description; ~}} +
{{ listingInfo.Description }}
+ {{~ end; ~}} +
+ {{~ if listingInfo.Author.Email; ~}} + + {{ listingInfo.Author.Email }} + + {{~ end; ~}} + + {{~ if listingInfo.InfoLink.Url ~}} + + {{~ end; ~}} +
+
+
+ + + Add to VCC + + + + + Copy + + + How to add a listing to your VCC + + + + + + +
+ +
+ +
+ + + + + + + Name + + + Type + + + + + {{~ for package in packages ~}} + + +
+
{{ package.DisplayName }}
+
{{ package.Description }}
+
{{ package.Name }}
+
+
+ + {{ package.Type }} + + + Add to VCC + + + + + + + + + + + +
+ {{~ end ~}} +
+
+ {{~ if listingInfo.InfoLink.Url ~}} + + {{~ end; ~}} +
+ + + diff --git a/Website/styles.css b/Website/styles.css new file mode 100644 index 0000000..ce999b0 --- /dev/null +++ b/Website/styles.css @@ -0,0 +1,356 @@ +:root { + color-scheme: light dark; +} + +* { + box-sizing: border-box; +} + +body { + padding: 0; + margin: 0; + min-width: 100vw; + min-height: 100vh; + display: flex; + align-items: center; + justify-content: center; + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + color: var(--neutral-foreground-rest); +} + +.hidden { + display: none !important; +} + +.row { + display: flex; + flex-direction: row; +} + +.col { + display: flex; + flex-direction: column; +} + +.content { + max-width: 1000px; + width: 100%; + margin: 0 auto; +} + +.align-items-center { + align-items: center; +} + +.justify-content-between { + justify-content: space-between; +} + +.justify-content-end { + justify-content: flex-end; +} + +h1 { + margin-bottom: 0.5rem; +} + +.caption1 { + font-size: 1rem; + color: var(--neutral-foreground-hover); +} + +.caption2 { + font-size: 0.8rem; + margin-top: 0.25rem; + color: var(--neutral-foreground-rest); +} + +.packages { + margin: 0.5rem 0 1rem 0; + max-width: 90%; + padding: 0.25rem; + display: flex; + flex: 1; +} + +#packageGrid { + overflow-y: auto; + width: 100%; + max-height: 40rem; +} + +.packages .packageName { + font-size: 1.1rem; + font-weight: 600; + margin: 0.25rem 0; +} + +.searchBlock { + margin-top: 1rem; + width: 100%; + max-width: 90%; +} + +.searchBlock .root { + width: 100%; +} + +#searchInput { + width: 100%; +} + +.vccUrlField { + min-width: 450px; + max-width: 90%; + flex-grow:1; +} + +#addListingToVccHelp { + z-index: 11; +} + +#packageInfoModal { + z-index: 10; +} + +#rowMoreMenu { + top: 0; + left: 0; + position: absolute; + z-index: 10; +} + +#rowMoreMenu a { + display: block; + text-decoration: none; + color: var(--neutral-foreground-rest); +} + +.bannerImage { + aspect-ratio: 5 / 1; + border-radius: 6px; + max-width: 90%; + width: 100%; + background-size: cover; + background-position: center; + background-repeat: no-repeat; + margin-bottom: 0.25rem; +} + +.badge { + border-radius: 4px; + padding: 0.25rem 0.5rem; + background-color: var(--neutral-fill-hover); +} + +.m-0 { + margin: 0; +} + +.m-1 { + margin: 0.25rem; +} + +.m-2 { + margin: 0.5rem; +} + +.m-3 { + margin: 0.75rem; +} + +.m-4 { + margin: 1rem; +} + +.m-5 { + margin: 2rem; +} + +.mt-1 { + margin-top: 0.25rem; +} + +.mt-2 { + margin-top: 0.5rem; +} + +.mt-3 { + margin-top: 0.75rem; +} + +.mt-4 { + margin-top: 1rem; +} + +.mt-5 { + margin-top: 2rem; +} + +.mb-1 { + margin-bottom: 0.25rem; +} + +.mb-2 { + margin-bottom: 0.5rem; +} + +.mb-3 { + margin-bottom: 0.75rem; +} + +.mb-4 { + margin-bottom: 1rem; +} + +.mb-5 { + margin-bottom: 2rem; +} + +.ms-1 { + margin-left: 0.25rem; +} + +.ms-2 { + margin-left: 0.5rem; +} + +.ms-3 { + margin-left: 0.75rem; +} + +.ms-4 { + margin-left: 1rem; +} + +.ms-5 { + margin-left: 2rem; +} + +.me-1 { + margin-right: 0.25rem; +} + +.me-2 { + margin-right: 0.5rem; +} + +.me-3 { + margin-right: 0.75rem; +} + +.me-4 { + margin-right: 1rem; +} + +.me-5 { + margin-right: 2rem; +} + +.p-1 { + padding: 0.25rem; +} + +.p-2 { + padding: 0.5rem; +} + +.p-3 { + padding: 0.75rem; +} + +.p-4 { + padding: 1rem; +} + +.p-5 { + padding: 2rem; +} + +.pt-1 { + padding-top: 0.25rem; +} + +.pt-2 { + padding-top: 0.5rem; +} + +.pt-3 { + padding-top: 0.75rem; +} + +.pt-4 { + padding-top: 1rem; +} + +.pt-5 { + padding-top: 2rem; +} + +.pb-1 { + padding-bottom: 0.25rem; +} + +.pb-2 { + padding-bottom: 0.5rem; +} + +.pb-3 { + padding-bottom: 0.75rem; +} + +.pb-4 { + padding-bottom: 1rem; +} + +.pb-5 { + padding-bottom: 2rem; +} + +.ps-1 { + padding-left: 0.25rem; +} + +.ps-2 { + padding-left: 0.5rem; +} + +.ps-3 { + padding-left: 0.75rem; +} + +.ps-4 { + padding-left: 1rem; +} + +.ps-5 { + padding-left: 2rem; +} + +.pe-1 { + padding-right: 0.25rem; +} + +.pe-2 { + padding-right: 0.5rem; +} + +.pe-3 { + padding-right: 0.75rem; +} + +.pe-4 { + padding-right: 1rem; +} + +.pe-5 { + padding-right: 2rem; +} + +.w-100 { + width: 100%; +} + +.flex-1 { + flex: 1; +} \ No newline at end of file