From fad6cc3e20f902f3d522bb578d5abd1445803e7b Mon Sep 17 00:00:00 2001 From: Andrew Skowronski Date: Tue, 30 Jun 2026 09:39:46 -0400 Subject: [PATCH 1/3] Introduce second UnityProject Rename UnityFileSystemTestData and introduce a LeadingEdge project for testing Content Directory builds and other newer features that require Unity >=6.6. Add AGENTS.md explaining the relationship between these projects and the referenced files checked in to TestCommon --- .gitignore | 13 +- AGENTS.md | 4 +- CLAUDE.md | 2 +- README.md | 2 +- TestCommon/Data/AssetBundles/AGENTS.md | 5 + TestCommon/Data/AssetBundles/CLAUDE.md | 1 + TestCommon/Data/LeadingEdgeBuilds/AGENTS.md | 12 + .../Data/LeadingEdgeBuilds/AssetBundles/6 | Bin 0 -> 30280 bytes .../LeadingEdgeBuilds/AssetBundles/6.manifest | 21 + .../AssetBundles/AssetBundles | Bin 0 -> 1220 bytes .../AssetBundles/AssetBundles.manifest | 30 + .../Data/LeadingEdgeBuilds/AssetBundles/a | Bin 0 -> 46783 bytes .../LeadingEdgeBuilds/AssetBundles/a.manifest | 21 + .../AssetBundles/assetbundleroot | Bin 0 -> 1530 bytes .../AssetBundles/assetbundleroot.manifest | 34 + .../AssetBundles/directaudioclipreference | Bin 0 -> 1429 bytes .../directaudioclipreference.manifest | 29 + .../AssetBundles/serializationdemo | Bin 0 -> 2102 bytes .../AssetBundles/serializationdemo.manifest | 25 + .../singleaudioclipdirectreference | Bin 0 -> 1395 bytes .../singleaudioclipdirectreference.manifest | 28 + .../LastBuild.buildreport | Bin 0 -> 17068 bytes ...3fcc980d14c6a498d140ac0a24af65.buildreport | Bin 0 -> 9928 bytes .../BuildContentTEP.json | 155 +++ .../BuildLog.jsonl | 45 + .../BuildReportSummary.json | 27 + .../ContentLayout.json | 1 + .../ContentSizeSummary.txt | 19 + .../ScriptsOnlyCache.yaml | 21 + TestCommon/Data/LeadingEdgeBuilds/CLAUDE.md | 1 + .../15d5df98d98434e67e06716cfabfad1b.json | 1 + .../4226b5c16a50dab6eff0f08dd1253d4b.resource | Bin 0 -> 47424 bytes .../51690f09f541d7442ce8faf26fd84696.cf | Bin 0 -> 4812 bytes .../5c43454a3823f172a2a326410a36ba6b.cf | Bin 0 -> 2136 bytes .../68c9d0b12420e1951eec7790bd0754fe.resource | Bin 0 -> 30688 bytes .../730d2d641a53eeb1e633f2ff60d730e9.cf | Bin 0 -> 1288 bytes .../93bb3159569284a5c7bcceb4acb91bae.cf | Bin 0 -> 1288 bytes .../ContentDirectory/BuildManifestHash.txt | 1 + .../a77f98db89b6aa1aeaaad01d857e5115.cf | Bin 0 -> 1448 bytes .../bfcf18a244e45f867750e0223a9b3a43.cf | Bin 0 -> 2184 bytes .../dfa73a08ed0fba634f160c6d26a5e830.cf | Bin 0 -> 1900 bytes TestCommon/Data/PlayerData/AGENTS.md | 5 + TestCommon/Data/PlayerData/CLAUDE.md | 1 + UnityFileSystem/TypeIdRegistry.cs | 2 +- UnityProjects/Baseline/AGENTS.md | 16 + .../Baseline}/Assets/AssetBundle2Data.meta | 0 .../Assets/AssetBundle2Data/Shader.shader | 0 .../AssetBundle2Data/Shader.shader.meta | 0 .../Baseline}/Assets/AssetBundleData.meta | 0 .../Assets/AssetBundleData/Animation.anim | 0 .../AssetBundleData/Animation.anim.meta | 0 .../AnimatorControlle.controller | 0 .../AnimatorControlle.controller.meta | 0 .../AssetBundleData/LegacyAnimation.anim | 0 .../AssetBundleData/LegacyAnimation.anim.meta | 0 .../Assets/AssetBundleData/Material.mat | 0 .../Assets/AssetBundleData/Material.mat.meta | 0 .../Assets/AssetBundleData/Prefab.prefab | 0 .../Assets/AssetBundleData/Prefab.prefab.meta | 0 .../Assets/AssetBundleData/Robot_Basic.fbx | Bin .../AssetBundleData/Robot_Basic.fbx.meta | 0 .../AssetBundleData/Square_Soft_A_Cookie.tif | Bin .../Square_Soft_A_Cookie.tif.meta | 0 .../AssetBundleData/Sting-Sword lowpoly.fbx | Bin .../Sting-Sword lowpoly.fbx.meta | 0 .../Baseline}/Assets/AssetBundleData/blip.wav | Bin .../Assets/AssetBundleData/blip.wav.meta | 0 .../Baseline}/Assets/AssetBundleData/wood.jpg | Bin .../Assets/AssetBundleData/wood.jpg.meta | 0 .../Baseline}/Assets/Editor.meta | 0 .../Assets/Editor/BuildAssetBundles.cs | 0 .../Assets/Editor/BuildAssetBundles.cs.meta | 0 .../Assets/Editor/TypeIdRegistryGenerator.cs | 0 .../Editor/TypeIdRegistryGenerator.cs.meta | 0 .../Baseline}/Assets/Scenes.meta | 0 .../Baseline}/Assets/Scenes/OtherScene.unity | 0 .../Assets/Scenes/OtherScene.unity.meta | 0 .../Baseline}/Assets/Scenes/SampleScene.unity | 0 .../Assets/Scenes/SampleScene.unity.meta | 0 .../Scenes/SampleSceneSettings.lighting | 0 .../Scenes/SampleSceneSettings.lighting.meta | 0 .../SerializeReferencePolymorphismExample.cs | 0 ...ializeReferencePolymorphismExample.cs.meta | 0 UnityProjects/Baseline/CLAUDE.md | 1 + UnityProjects/LeadingEdge/AGENTS.md | 28 + UnityProjects/LeadingEdge/Assets/Audio.meta | 8 + UnityProjects/LeadingEdge/Assets/Audio/6.mp3 | Bin 0 -> 39694 bytes .../LeadingEdge/Assets/Audio/6.mp3.meta | 2 + UnityProjects/LeadingEdge/Assets/Audio/a.mp3 | Bin 0 -> 53948 bytes .../LeadingEdge/Assets/Audio/a.mp3.meta | 2 + UnityProjects/LeadingEdge/Assets/Editor.meta | 8 + .../Assets/Editor/BuildAssetBundles.cs | 73 ++ .../Assets/Editor/BuildAssetBundles.cs.meta | 2 + .../Assets/Editor/BuildContentDirectory.cs | 67 ++ .../Editor/BuildContentDirectory.cs.meta | 2 + .../Assets/Editor/GenerateAssets.cs | 78 ++ .../Assets/Editor/GenerateAssets.cs.meta | 2 + .../Assets/InputSystem_Actions.inputactions | 1057 +++++++++++++++++ .../InputSystem_Actions.inputactions.meta | 14 + UnityProjects/LeadingEdge/Assets/Scenes.meta | 8 + .../Assets/Scenes/SampleScene.unity | 208 ++++ .../Assets/Scenes/SampleScene.unity.meta | 7 + .../LeadingEdge/Assets/ScriptableObjects.meta | 8 + .../ScriptableObjects/AssetBundleRoot.asset | 21 + .../AssetBundleRoot.asset.meta | 8 + .../ContentDirectoryRoot.asset | 21 + .../ContentDirectoryRoot.asset.meta | 8 + .../DirectAudioClipReference.asset | 19 + .../DirectAudioClipReference.asset.meta | 8 + .../LoadableAudioClipReference.asset | 21 + .../LoadableAudioClipReference.asset.meta | 8 + .../ScriptableObjects/SerializationDemo.asset | 36 + .../SerializationDemo.asset.meta | 8 + .../SingleAudioClipDirectReference.asset | 17 + .../SingleAudioClipDirectReference.asset.meta | 8 + .../SingleAudioClipLoadableReference.asset | 18 + ...ingleAudioClipLoadableReference.asset.meta | 8 + UnityProjects/LeadingEdge/Assets/Scripts.meta | 8 + .../Scripts/DirectAudioClipReference.cs | 10 + .../Scripts/DirectAudioClipReference.cs.meta | 2 + .../DirectScriptableObjectReference.cs | 10 + .../DirectScriptableObjectReference.cs.meta | 2 + .../Scripts/LoadableAudioClipReference.cs | 11 + .../LoadableAudioClipReference.cs.meta | 2 + .../Assets/Scripts/SerializationDemo.cs | 37 + .../Assets/Scripts/SerializationDemo.cs.meta | 2 + UnityProjects/LeadingEdge/CLAUDE.md | 1 + 127 files changed, 2381 insertions(+), 10 deletions(-) create mode 100644 TestCommon/Data/AssetBundles/AGENTS.md create mode 100644 TestCommon/Data/AssetBundles/CLAUDE.md create mode 100644 TestCommon/Data/LeadingEdgeBuilds/AGENTS.md create mode 100644 TestCommon/Data/LeadingEdgeBuilds/AssetBundles/6 create mode 100644 TestCommon/Data/LeadingEdgeBuilds/AssetBundles/6.manifest create mode 100644 TestCommon/Data/LeadingEdgeBuilds/AssetBundles/AssetBundles create mode 100644 TestCommon/Data/LeadingEdgeBuilds/AssetBundles/AssetBundles.manifest create mode 100644 TestCommon/Data/LeadingEdgeBuilds/AssetBundles/a create mode 100644 TestCommon/Data/LeadingEdgeBuilds/AssetBundles/a.manifest create mode 100644 TestCommon/Data/LeadingEdgeBuilds/AssetBundles/assetbundleroot create mode 100644 TestCommon/Data/LeadingEdgeBuilds/AssetBundles/assetbundleroot.manifest create mode 100644 TestCommon/Data/LeadingEdgeBuilds/AssetBundles/directaudioclipreference create mode 100644 TestCommon/Data/LeadingEdgeBuilds/AssetBundles/directaudioclipreference.manifest create mode 100644 TestCommon/Data/LeadingEdgeBuilds/AssetBundles/serializationdemo create mode 100644 TestCommon/Data/LeadingEdgeBuilds/AssetBundles/serializationdemo.manifest create mode 100644 TestCommon/Data/LeadingEdgeBuilds/AssetBundles/singleaudioclipdirectreference create mode 100644 TestCommon/Data/LeadingEdgeBuilds/AssetBundles/singleaudioclipdirectreference.manifest create mode 100644 TestCommon/Data/LeadingEdgeBuilds/BuildReport-AssetBundles/LastBuild.buildreport create mode 100644 TestCommon/Data/LeadingEdgeBuilds/BuildReport-ContentDirectory/2e3fcc980d14c6a498d140ac0a24af65.buildreport create mode 100644 TestCommon/Data/LeadingEdgeBuilds/BuildReport-ContentDirectory/BuildContentTEP.json create mode 100644 TestCommon/Data/LeadingEdgeBuilds/BuildReport-ContentDirectory/BuildLog.jsonl create mode 100644 TestCommon/Data/LeadingEdgeBuilds/BuildReport-ContentDirectory/BuildReportSummary.json create mode 100644 TestCommon/Data/LeadingEdgeBuilds/BuildReport-ContentDirectory/ContentLayout.json create mode 100644 TestCommon/Data/LeadingEdgeBuilds/BuildReport-ContentDirectory/ContentSizeSummary.txt create mode 100644 TestCommon/Data/LeadingEdgeBuilds/BuildReport-ContentDirectory/ScriptsOnlyCache.yaml create mode 100644 TestCommon/Data/LeadingEdgeBuilds/CLAUDE.md create mode 100644 TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/15d5df98d98434e67e06716cfabfad1b.json create mode 100644 TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/4226b5c16a50dab6eff0f08dd1253d4b.resource create mode 100644 TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/51690f09f541d7442ce8faf26fd84696.cf create mode 100644 TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/5c43454a3823f172a2a326410a36ba6b.cf create mode 100644 TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/68c9d0b12420e1951eec7790bd0754fe.resource create mode 100644 TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/730d2d641a53eeb1e633f2ff60d730e9.cf create mode 100644 TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/93bb3159569284a5c7bcceb4acb91bae.cf create mode 100644 TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/BuildManifestHash.txt create mode 100644 TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/a77f98db89b6aa1aeaaad01d857e5115.cf create mode 100644 TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/bfcf18a244e45f867750e0223a9b3a43.cf create mode 100644 TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/dfa73a08ed0fba634f160c6d26a5e830.cf create mode 100644 TestCommon/Data/PlayerData/AGENTS.md create mode 100644 TestCommon/Data/PlayerData/CLAUDE.md create mode 100644 UnityProjects/Baseline/AGENTS.md rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundle2Data.meta (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundle2Data/Shader.shader (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundle2Data/Shader.shader.meta (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundleData.meta (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundleData/Animation.anim (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundleData/Animation.anim.meta (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundleData/AnimatorControlle.controller (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundleData/AnimatorControlle.controller.meta (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundleData/LegacyAnimation.anim (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundleData/LegacyAnimation.anim.meta (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundleData/Material.mat (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundleData/Material.mat.meta (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundleData/Prefab.prefab (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundleData/Prefab.prefab.meta (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundleData/Robot_Basic.fbx (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundleData/Robot_Basic.fbx.meta (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundleData/Square_Soft_A_Cookie.tif (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundleData/Square_Soft_A_Cookie.tif.meta (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundleData/Sting-Sword lowpoly.fbx (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundleData/Sting-Sword lowpoly.fbx.meta (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundleData/blip.wav (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundleData/blip.wav.meta (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundleData/wood.jpg (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/AssetBundleData/wood.jpg.meta (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/Editor.meta (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/Editor/BuildAssetBundles.cs (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/Editor/BuildAssetBundles.cs.meta (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/Editor/TypeIdRegistryGenerator.cs (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/Editor/TypeIdRegistryGenerator.cs.meta (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/Scenes.meta (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/Scenes/OtherScene.unity (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/Scenes/OtherScene.unity.meta (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/Scenes/SampleScene.unity (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/Scenes/SampleScene.unity.meta (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/Scenes/SampleSceneSettings.lighting (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/Scenes/SampleSceneSettings.lighting.meta (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/SerializeReferencePolymorphismExample.cs (100%) rename {UnityFileSystemTestData => UnityProjects/Baseline}/Assets/SerializeReferencePolymorphismExample.cs.meta (100%) create mode 100644 UnityProjects/Baseline/CLAUDE.md create mode 100644 UnityProjects/LeadingEdge/AGENTS.md create mode 100644 UnityProjects/LeadingEdge/Assets/Audio.meta create mode 100644 UnityProjects/LeadingEdge/Assets/Audio/6.mp3 create mode 100644 UnityProjects/LeadingEdge/Assets/Audio/6.mp3.meta create mode 100644 UnityProjects/LeadingEdge/Assets/Audio/a.mp3 create mode 100644 UnityProjects/LeadingEdge/Assets/Audio/a.mp3.meta create mode 100644 UnityProjects/LeadingEdge/Assets/Editor.meta create mode 100644 UnityProjects/LeadingEdge/Assets/Editor/BuildAssetBundles.cs create mode 100644 UnityProjects/LeadingEdge/Assets/Editor/BuildAssetBundles.cs.meta create mode 100644 UnityProjects/LeadingEdge/Assets/Editor/BuildContentDirectory.cs create mode 100644 UnityProjects/LeadingEdge/Assets/Editor/BuildContentDirectory.cs.meta create mode 100644 UnityProjects/LeadingEdge/Assets/Editor/GenerateAssets.cs create mode 100644 UnityProjects/LeadingEdge/Assets/Editor/GenerateAssets.cs.meta create mode 100644 UnityProjects/LeadingEdge/Assets/InputSystem_Actions.inputactions create mode 100644 UnityProjects/LeadingEdge/Assets/InputSystem_Actions.inputactions.meta create mode 100644 UnityProjects/LeadingEdge/Assets/Scenes.meta create mode 100644 UnityProjects/LeadingEdge/Assets/Scenes/SampleScene.unity create mode 100644 UnityProjects/LeadingEdge/Assets/Scenes/SampleScene.unity.meta create mode 100644 UnityProjects/LeadingEdge/Assets/ScriptableObjects.meta create mode 100644 UnityProjects/LeadingEdge/Assets/ScriptableObjects/AssetBundleRoot.asset create mode 100644 UnityProjects/LeadingEdge/Assets/ScriptableObjects/AssetBundleRoot.asset.meta create mode 100644 UnityProjects/LeadingEdge/Assets/ScriptableObjects/ContentDirectoryRoot.asset create mode 100644 UnityProjects/LeadingEdge/Assets/ScriptableObjects/ContentDirectoryRoot.asset.meta create mode 100644 UnityProjects/LeadingEdge/Assets/ScriptableObjects/DirectAudioClipReference.asset create mode 100644 UnityProjects/LeadingEdge/Assets/ScriptableObjects/DirectAudioClipReference.asset.meta create mode 100644 UnityProjects/LeadingEdge/Assets/ScriptableObjects/LoadableAudioClipReference.asset create mode 100644 UnityProjects/LeadingEdge/Assets/ScriptableObjects/LoadableAudioClipReference.asset.meta create mode 100644 UnityProjects/LeadingEdge/Assets/ScriptableObjects/SerializationDemo.asset create mode 100644 UnityProjects/LeadingEdge/Assets/ScriptableObjects/SerializationDemo.asset.meta create mode 100644 UnityProjects/LeadingEdge/Assets/ScriptableObjects/SingleAudioClipDirectReference.asset create mode 100644 UnityProjects/LeadingEdge/Assets/ScriptableObjects/SingleAudioClipDirectReference.asset.meta create mode 100644 UnityProjects/LeadingEdge/Assets/ScriptableObjects/SingleAudioClipLoadableReference.asset create mode 100644 UnityProjects/LeadingEdge/Assets/ScriptableObjects/SingleAudioClipLoadableReference.asset.meta create mode 100644 UnityProjects/LeadingEdge/Assets/Scripts.meta create mode 100644 UnityProjects/LeadingEdge/Assets/Scripts/DirectAudioClipReference.cs create mode 100644 UnityProjects/LeadingEdge/Assets/Scripts/DirectAudioClipReference.cs.meta create mode 100644 UnityProjects/LeadingEdge/Assets/Scripts/DirectScriptableObjectReference.cs create mode 100644 UnityProjects/LeadingEdge/Assets/Scripts/DirectScriptableObjectReference.cs.meta create mode 100644 UnityProjects/LeadingEdge/Assets/Scripts/LoadableAudioClipReference.cs create mode 100644 UnityProjects/LeadingEdge/Assets/Scripts/LoadableAudioClipReference.cs.meta create mode 100644 UnityProjects/LeadingEdge/Assets/Scripts/SerializationDemo.cs create mode 100644 UnityProjects/LeadingEdge/Assets/Scripts/SerializationDemo.cs.meta create mode 100644 UnityProjects/LeadingEdge/CLAUDE.md diff --git a/.gitignore b/.gitignore index de49506..468dee6 100644 --- a/.gitignore +++ b/.gitignore @@ -32,12 +32,13 @@ .claude -UnityFileSystemTestData/AssetBundles/ -UnityFileSystemTestData/**/*.csproj -UnityFileSystemTestData/**/*.sln -UnityFileSystemTestData/ProjectSettings/ -UnityFileSystemTestData/UserSettings/ -UnityFileSystemTestData/Packages/ +UnityProjects/**/*.csproj +UnityProjects/**/*.sln +UnityProjects/**/AssetBundles/ +UnityProjects/**/ProjectSettings/ +UnityProjects/**/UserSettings/ +UnityProjects/**/Packages/ +UnityProjects/**/Builds/ *.db *.csv diff --git a/AGENTS.md b/AGENTS.md index 39cabdc..ac51699 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -174,4 +174,6 @@ To use a specific Unity version's library: * TestCommon/Data contains small reference files extracted from Unity builds (player and AssetBundles). These are used by the automated tests and also useful for manual testing. -* UnityFileSystemTestData is a Unity project that generates test data for the test suites. +* UnityProjects contains two Unity projects that generate test data for the test suites: + * `Baseline` - tracks stable, broadly-used Unity versions and is upgraded only when necessary. Most UnityDataTools users inspect output from these versions. Its `TypeIdRegistryGenerator` regenerates `UnityFileSystem/TypeIdRegistry.cs`. + * `LeadingEdge` - tracks the newest Unity version (currently the 6.6 beta) and is updated proactively so newer build features (Content Directory builds, serialized dictionaries, etc.) can be tested. diff --git a/CLAUDE.md b/CLAUDE.md index 47dc3e3..eef4bd2 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1 +1 @@ -AGENTS.md \ No newline at end of file +@AGENTS.md \ No newline at end of file diff --git a/README.md b/README.md index 1d6e0a1..04d0daf 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ The repository contains the following items: * UnityFileSystem: source code and binaries of a .NET class library exposing the functionalities or the UnityFileSystemApi native library. * UnityFileSystem.Tests: test suite for the UnityFileSystem library. -* UnityFileSystemTestData: the Unity project used to generate the test data. +* UnityProjects: Unity projects used to generate some of the test data. * TestCommon: a helper library used by the test projects. ## Downloads diff --git a/TestCommon/Data/AssetBundles/AGENTS.md b/TestCommon/Data/AssetBundles/AGENTS.md new file mode 100644 index 0000000..6a2997c --- /dev/null +++ b/TestCommon/Data/AssetBundles/AGENTS.md @@ -0,0 +1,5 @@ +# AssetBundle test data + +AssetBundle build output used by the UnityDataTools test suites, kept in a subfolder per Unity version (`2019.4.0f1` through `2023.1.0a16`). Each holds the `assetbundle` and `scenes` bundles built from the project's assets; some versions also include additional fixtures used by specific tests. + +Generated by the `UnityProjects/Baseline` project - run **Tools > Generate AssetBundles** there (built for StandaloneOSX and copied here under the Unity version). See that project's `AGENTS.md` for the assets that go into the bundles. diff --git a/TestCommon/Data/AssetBundles/CLAUDE.md b/TestCommon/Data/AssetBundles/CLAUDE.md new file mode 100644 index 0000000..43c994c --- /dev/null +++ b/TestCommon/Data/AssetBundles/CLAUDE.md @@ -0,0 +1 @@ +@AGENTS.md diff --git a/TestCommon/Data/LeadingEdgeBuilds/AGENTS.md b/TestCommon/Data/LeadingEdgeBuilds/AGENTS.md new file mode 100644 index 0000000..977dfac --- /dev/null +++ b/TestCommon/Data/LeadingEdgeBuilds/AGENTS.md @@ -0,0 +1,12 @@ +# LeadingEdge reference builds + +The checked-in build output of the `UnityProjects/LeadingEdge` project, for use in automated and ad hoc tests. See that project's `AGENTS.md` for the test scenarios and how the assets are set up. + +The LeadingEdge build scripts regenerate this folder directly, so to update it, rebuild in that project and check in the results. + +## Layout + +* `AssetBundles/` - the AssetBundle build: one bundle per asset (named after the asset) plus the `AssetBundles` manifest bundle. +* `ContentDirectory/` - the Content Directory build: content (`.cf`) files, `.resource` files and the build manifest. +* `BuildReport-AssetBundles/LastBuild.buildreport` - the AssetBundle build report. +* `BuildReport-ContentDirectory/` - the Content Directory build report folder, including `ContentLayout.json`. diff --git a/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/6 b/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/6 new file mode 100644 index 0000000000000000000000000000000000000000..ea1762c82697c2fe5a22e0481b2d8647640000f5 GIT binary patch literal 30280 zcmV)0K+eBaZfSIRMpFO)000OzE_g0@05&i%FfKMOFk&+R00000004GK000170001; z0006*0000000000000000000U0098{00961hAaR8b*KPA000029RT+m4om<500cup zLM=2hH8Eo}V>UE7V>e_nW;ix8GB;&rWMwilIXN zcM>YCze2BPJ41HJD^&C&5Q~_%*CBV!BP{rVO=|B)Js|nN-<-o0WO24yl%9kUN^3dj zG^>$dhm5JJhc;D5xcqJ9WZY7PqR7qjC7=;~7RIY}tY`Ikip;oYB0fgpabXkZyU~S?F z9X$am_$taY(xk%sVU#U22VkM6sa-A}b&zJ;RUh|^`lDU8O48;0y7ut;ED&Tx^iAhF zTrz&9JXS4XuZpynNp?_aE+WES_bleB4X{1I!YBm6$UxO@1;piMC&Vhxt|=kTkcVI) z?c{M`MwmhAvyRzd6HO-7T2*kDIwszk#h4&{nvbMV z_?$gO7|YRP(^;HgB5uy_LG4nWkZ7v>#g~-nI_o2=ftSnh`XHcktka6drg?X&Fpd}U zDLPTgjlM#YF)eh)3B^i8rte{v-*u?0la`E(y6&*RHN%Rs{i#pcRPvt2j#HeZJhdmf zU&X)a8`N8y(59#V+TBApY5&qH5k7HBFg<6%9E2|#oHe#iYfkx@R6whS16chg2NtV! zrb6P0lQk5;nBi4)(WLb_$U9xflnPYf<~@SbvHW>(zx4FtT@q8ku26D@c@DGTEOE!_ zGm34$W9T5(*o!?W=56`vh^EwO2cKZP#R!tMVa<`-aM64?cl8Ac82uHR^2~c|HEoC4 zsE^L&w{_X`wM+5ESt=RMvQd-A{(-{8YR_IQduaDy=oq8h)#tytI3F=7e@izGf|$LL z^2otM#oM#@L=naOSZMQ^7#f)mG8@QzqAaT2o>S*JsbNFQ^yy%52;7rb)oZ8b<+6BY zyN|_RVry*r$iNf13k5V6-qTxt%|Vg|GqI@AlOr^4KQyWtjd%J8fP$i07^gwvIyg0( z$psV7_)(m+ForP4p0a>0F^zae6*&Vqk6dK2^kj3mG z>og{c`Jv4aNKEn$&_Mxq^@#wBQb5UNR@2+nz(!!|I5)lBX@GyCTJeRl<%ivI#+)j0 z8sf>tG^|+`*N#CWsXSFZqhZ23-?S6e2%X9c`5*CtVo&vt54ldyzfW)bTA=G>k;X@F z9yB?I0NQ;TEgVr)X%s5HpN$SjNec4_IWzkXU^Mq;unW`i(d*0d$dHk|n;==^eDu2P z+*V}r+*0Mbuk2ny$SXyW()L1nnL@;<1KQ_RCb=LRn=qFnJTW+HZ#+93EWxWmJTxuf zc{!e~FX8wO3r-dr__OF*VLVJ>KyNTgm=9@sy*@W<67Dl;wLa(`&9dwvgniH0WiJ=N z(A1sqf*tH4v-u>+rsC!_IxgkTbH0>O(K=k zGE>qhA+}?taqyR9S!j#`O=J(-!Nn=3eBqR1z&bK-#w*@`bP!0=iONDrV~qZbQhv#z zd%bWh^uuf;e#(4uJ0eB5t_ySZipT-Z)37nzuM3uT9vC3$mN`52@3m;Ip^x!hWw+nO zC*jFBnI?#O@w;-=dTWbRaOlb1>@5-OF5AN}6~2vvTp83$M&(KyQV5`KhO>sv#c(25@3iHL|MM&9zvdFIGAE8vr zP-r!8-WD8vdno})O(~BX>^R#y2>50ie{cTE9qeJIi*a2++GK&aeabo{PVa@be>!|X zyhqdahb?7+HiF0tA^zKp2?1)VeTnr!6d9%7gzYGbK*(OV>NEM zvr&pb$9J!IK_$7zexrw{0od;T zMBSZYNDo|)zV?w7v>SNU@rN}h71n0qx5W34V&FdYcE+zY{udNyc%vVsgk8tt@5W)_ zDXAkpAA@efsYwGS%ive&RNncBI?C@(U67pJi6O5o8&;2779pz3y+WW4FW|4)V-sP& z7`JYj4ILyDcA2yEV#loB-c;kmX3M+^FG6pzL8`%)`7*H5+um2EF|Bd54&y`^y% z0fMzvbz}!mk*t@qvFb$nAM?n!!BO;WFwA&cwGrRvNFlwOhV9QjiQ{xZZ`~O?x`uaI z0IdF=SyEZeOMAl+oXnD8q4T@oTS8ZkAto>rez}XAt z1$N0^iqVSQr|s)EYE(oPk|Hd;>J#dZk8q8cDZK02J%ZX4e4)DA*WAp)U|JvRwUux{ zW()zyZ>I|RRI z0m`J+9OkxxftI4*+bvQ6aB}z^ic-yP*bwl8QwtM;_VgqCHC;T8ck>a@hXVAgSv&Y- z?Xe>eg4z3{-BK!P|78YI^7<3KI547^o{5lwX|D#Fd=?}O$c(Xr+Hi};CVxaBT(A7u?(eXDwkAT0kSIL{1w(jJb7#;I6OQvwRlUW z(lf{`JN89PU+@f7T_gTjRf7N^w&a#8mXNs99zt3;J67{YxL=TfSpH*Gx-xM+s03}} z%-IGI7Ax+lcl|PWP*|DzJ8r-<5kV2lcKeiR^n$pqK`SXQq~>1L?y8Vl!~EX5!&vML zWw_4jc3{QJz~mUqcI3I5*KZ{z-4Cbh>MU*7PpfD(wr1mYivKRP^DbpsIm-5a|IQ!v z;SxfhApB`*3n<(QqC4X|WHPbUa5hxGyy#2?@_CANjA-XiOaJW&e?jS$=i2k8Q`}R{ z!?@SLSe_tlPZPSCiPYwsdcmrvOiOy2M@x9IxWvRsLaB1HExr+7*Q4K|I+4saz0FYsnZZ&TYA*X=A^QTkf zx&6MEXq+9c``pO6wK+{7#xj=w{F)25vm{Om^GvE~u_qdK^z~>>1fSua8jTjHUFOX? zMiS+Qjw}(_1|)3m)=6j0s3m*Pc!)9GT0i7)^d7{!H#}BF2>e$=Hi=%@yS`Bn5x)Oq z`WfG@a(F(F##0($Miq*N!OM!9K3XBlM=6n;GzqoFiDYU0TiO)+SeXe1TB?-Wq>Oll zREcwT>|i@i^{dH{n`QLDmHSy`i9Q7@QC5=YGO8Qd6olyw6U$-8$5>N>98b;Sf}u>< z-*@$}8YuT4fhvJ58o2;Ja|waF^T+j^mw0nS;yvUC``1r~ADiqBYal(?4o4+)+%6`7 zkSPjcGbES=nj;L@jM(0%|82+Vxl=fS91i=F3;6)$ydH!H*`PES&Zg`4vgO_Ht2$D3 zsuANzgdPO87!Clc<0hpIhIjW`hAx-|4DZo^XcxN8mii~hB>w#n&bhfi2z^8EX|9{% zcvnuktUs!4%_J|4AV=d!2lfJ)C6dEZj8*5pj)KV(u?T@6+VUK2=|{8rNXx@*N}mH- z$yGl)wMX?`e=9}U=NLyBY;o&}+f31_l#E!1Q4v^KyqooyCU7C%wpivog`1YpbhzfU zoulq-43|gY+LgmNtU-FxF9zGA4rXhYM_or=f=9FAgp;?v0 ze$R;xo+5N|2fx;px?;rjul8GEsDC(lwu^yH+!poA*Y;Pzhp5aEnfI;XL1=1n=H zRkEIvh|A$IbnpWh)_K0-1H%(b=oD^D#lP8x2d^-y+J}3Tv%BxcX{(b%xviuWG=P{q zfoHCSar}r4hLlGiHyR?QF&7XXbD0^^?(nhyD4Ds(xM=#VpLnys8i^Vm}cp#O4h9T(~d>s2Sb7WN6MPD^-uzVdH zI<~cV(>UEKID(AWmTjgC*UKS*FU|=fr)2w$u4{FJ6GK4fM}w+I)8R%Lhd^w`&6e;z zA}6h6P4Eo|Ef)~wO6VjfHZM=I!@CO6KKS{IOT_LzZbONGNo!;aYwksK0LlLLL;^+# zX5cXJ*;h@O)=^1yIWp%y+QEpZoorNCT;)VJ-SmO22&gx3U@XdUNkc41Ig>p&fIE{A zk(7E2Ahd{~3S80jLIP1U53h)B7b+hX@bG0_Fg(G?h7A$4)4}obC>jb>vL9j-aVo1v_ME0}h!UYLk@%zXg6-c=D1Kw@jmf3`K$0#n*>O8ggmT z7Jd?3nu-c7KC|H1=@2fGGb&OC*`{#tstEamQ{lrd1V_d!Y7Ls^`6Wb8TfoR4$AdNG zAP|UpNQ1_0n%Eh_eu{zGMyv`-w_Gqypp4F=u z*z7l|`AE>eVpH70ncdbN0Y(cz&0L3BSK+0b$FXP0yMfzr!@!aw=dJr}HfmR_j7x-t zY*4ScWaHk5C}x@{|I<~Hq&Dl;N-m-G%iBuNQ@%9CN&4;ksR)>P;daaHSg-(@0(zNk zp-t1A@QKDEn%6(k?o+5WPPd@PEM;v+kLf@YB8oRJY+#t4q5ui#6=Qhi;b{_mR^oGZ z&P8%GEtk+1l{ynXA|sParS6v5Z?YZ~BN(o|)&*tgN;Iu$@^sG|Jvd3)ZW*1~v}F{jH83Eg=}!AgFW97Ix@l0kU@CxUJiD5eVyXlyEfLP}Ya4+w9i z!KT}&xcayA$ua9aZjQ}-_Kf9!RMonJ`zCG4s9$EU zsnD~xMI6B0jz6Rq?5aGHS(7VD`TXlo=VuFHY)+egCqF;D!Ko&dCHc6n%78RhTS-tBpC_{*WhbA?3nYM(VnOgc#8 z5dkqR@N08sA?TlB_ox29G$ej6Q~f>Ycu!(|Pl1v)bU0 z6fn8O^PUtwrL`q6Mmfyat>UUYMua6rvBpp%ztrtt!V3@o0e|4#bL4|^&-39|?wd3) zY5I~}*Yx+~{>)E(W27)XhWJ=JZZ=%o-xJMB5^lks4DgRqrZPi`N8VWfFD2bN?*v0J zqn$?fii>Jzhha51!rnGYjm&gTdRLs@{x6O)GIROCfEhA?#IqMaX0=>PQ0(*t+8iSQojG5w=BrtDXL z0Os$INK{SL%RpVWc9=5x-nC2he;(&7|Lq39pmeZoA^Z`N+$nRI=?Zbw_Z|*@!$Fk~ zv`epvV<$RLuB=}S6c04!7IH2Cz4`&dI1)Pg2=O05RI60ez_j!r1^>h_&YM=RROsVc zDzD;SDSR>Y`WZY@{)9rMTZC;C`{(t=Q8olrRP5l9S>AOeW?9hy=Hj%Jp7;yQ1C&i; zmL#?19J20F2^h0c^wxg(PkLJ=Sqb%_6hD5AH`cecMw0wpFm=A;G97$tV=Fn?y3<*J zT_k%RR{(D9>#{Yl3gEBPV&;_E=%D^$?Cxi49G80fO0)-dQ~M^Q-G*RYbq=I`i9Y{t zZ#tn*m$2-G@UK`lSZHq9Ew^+8+*Vf{ZdYGmmK`1qD?Xb!b(nUh@sbbrw7fv9@GY)h z!0wy=qtzN|}XC=W)bc@>Y-><&S z^!aIfUi)|Vr=_V2%)-Wn9#UMBeDKQadbHOry4453Fq~V)KN{U8&G(BG%aH+Nrl+n< zgm%H%OTEvsdr-op{ZP9HSN?-)>Y$ z0P|2=C*0S~$TOVaOQWUmmMkx8P}+O&!tq#0bOZ&`39ocR7g3A=SHfY;yuJ(KYo_s>&(xGhyPdLBi)wr% z<-l)jaZF>;J4(WDSk7Xg&8oKl>6?!p7NMc4Sk?ceZiBs|Wh@}r#Tp?N+7$)oB@78$ zK>V>^&Znv->vNiOTSB5jv*vVW@?_-pQI2kzR@*35UxCbTVxQY@ZN!`pTG8~%3VKd2 zMb;2hc=4==b*?_a8I;nZkiC4cFPw|iZLhm43$yv_@C#86HF;seOn|9wo}CN%iPz+H z0s>k#|D9x*8!r@4ziDX`$IyZSLTd6F?u>-ecLOR6#FH?sbCSMFZWAiSyIE`XT2VI* z$j`c(R;~`^my|Vg;UA^I0$Mp3U=aeFLLL^~_MeA8O{;A596%*Ym%=qnWB`U$=fJfD z5c1EAP$+4@DF9%(H6SKfL74A+e4Z>BS1Z8n>#PQrsAK{F<`-li##06K7<4-&93f2o z?hbIE8Swk>B-l#Wo5+o(t`Djyh%hpLgB+$=pJ-UrM!0`5;2GLL&gKP+4GuW_P=s3m zlLiB)?jT#NGGIM;qvc8LE{XpPTM0DRFY1*gfTD;CZNIsv9B2yIEhY@P#qHKC5%R(= zA|vts%y#X2PqhNVa5+tqLhX13ZwO`;=hkC?-^nJLI7=NCnR!QEi@bYh{>7-eb}~Ok zxF0wQvLA#|>*ghdB$bHaLHuiftC^Rg156P9xE)wEWU~BwJ&5!C%vgQCwUP*Z6ss(n zb~h3!7r1gJ*}lGAySt!aPf#zZ#5EOgE;34FSh)p-gG>(l_+)nWdMv87M;Y$6*@5?i zD0>A^rgfwi(z2A8Ubb|DQ?um3M+|*E6s%z0dmt{D-5rSQV&T$wY1vzH4+rz6&dyFR zcSgHaG}PTWfmBq6tu7?_@#Y=7OKax!p`q~viG~@U9`SJ%RU5vpRKhp8Rqlowl90W4@{OHk=)4Ws*DB*$13!G8)0xjv|mIX zEh4U`!V5<$yOi%%B+$DVMd|(rHHQqiBK;N$`vb1*b2frsr}dgc4{2H%*5uYL+LTWQ zIApm23w8JI$oVE-*tcze_oiRFHY}v^=3i29T0KXe56{lQdm<|56q{lf!L(rU^SgeN z{5vz7KH3G7Z`_XNNy>af*5|Smg*RGNCdaP&#$ne>?mX~XTo@ESx@iKhADP8@j1iO{9dc!K-0o-Ha zdJH9rgis!J%Vrf1Rc+`a(azwthdQqJtmz8CJcT$vd^odm4SK}6Erv9n{8PN-ecgT%A^T{;W!0&3pF&oSkwzi%18loRvDKS`J;;Ky1 zASr=8EbKPY^7S7_J6#L0t58E{x(+nz)+(vHB~fA3+plw0CIlUSp^Q+~2jFSgdM?-x zjT(EF{oa)y2Lgqvc|%ZGYx^kDW_Y$7uc_o@6F38yP<$`^EiN-mQ5#t1_rmI+Z|9Ny zC1mBd)fKV3CMpeKTDGG$(&=zqZ9+JJj8Fs73dKxk*T`!NUm?em9(ZLzW_A4vZH+Gv zNbsbld5+Q{o5b}m<))awn9_2@l@@X)c)u0vMTJOaD{Zaq^%3titUg2QodwIBAJCRJ zAq^lFyd45knzJY@di4iKgl&aK3B!O4KdWaiXaMC4Mycii=5ePsPPSDV+L!_E&&Fbo zp6Qak0~&WfF-jIcRl2?(J^owCTQJ|zQk>36re|;#`Hk^kw=pMbG58#h4$TlETysJ_ zrIpVaT#&Z+G89D%hq!sSB;$)6cdvA&?Vetfid)OtN+&})U`k?GuzZ%8!bTNlu2Ufw zB*ynhnS?WDN3vIIU4z9QPO>i3MS#_^qd0ew3M$bI|`nAx#n!7Ip zVV>#)T+!YH8-clKO!<4z7=zY@g8fB=W9v z{RiMJ82)?2|FDDgS|)UFCUBV_0|-wd#SDaFj+JmIb$RD3o@QW7Y3*oENJa01dX>4K zf_wu2>pmD6We!IGmC+pY-iySz5Ucdz4pv=iY^$yt5pR~o?*mC(%o-C(Tt}ocE+XJb z?-wLf@68v}nuuY7mLBW;Ioh@DE2SKacuz`Se(5bji`Vm(OyU!>3f-KKH=7}>KP&npGclQ0`;C?h54<^F1M7y_KqN_i!@SF84q#?TkYk*!=4?uwBoiSn@jd*~Or zjF@#~hmFYVW&9#sA`$uLhw+J+$r(}>Q~3ReYx^y}nebn9h4dUQ8u-+sUzQQpyvJ3BD$U|D=VF8~_s-^;c z!-9>@0_MXElCs|>qLP6y`)GN(9r45(UoB!q;X-N$*rp<7?Vb;&5(h>WyH3~kvS(y5 zrQlm9w7reA?jk)W9Y|F->ZskZT>Sjdwvx)>61BEhjlq#PPO1ZcM-S8U&{f{^)E(9Sda0DSv+Qw|13QBuW&(2-k=~SL9AKXT`DqLfeCh_&F5hE!Tf2LK5v`m|cUcH;=4#7#Bnnc#6#5JS zIdF`z9-c>(I!db(!A+5mOOJQ}n{HR=A#qoAuaoBx9u} zsQ7vm74hFXisPs0;0gUDHd*etu!i*L%lSJR!|li|1;na#Wk3SR;j_((4(oz%*?OeE zO=QupWM8X39F4E2@Qnl`+#WHn9j3deYu9Em^iC zDC(HS`wmH1AJ>=&H{r86%p8SX{wgfCl`b@W8ZPhGRi6(b5%M8q)-MDf0%%!NJSw;P zs}g&J>DOwWtl`Ojod~D7&8>~bd>DC0Z_>e0ELaK$t}Y)l1NfkxUQ=ol4bbN zuemA962F+KVO8hl((p_jDUvw!XP55}ZI+5G`=p^H=lK6ndMK+1pB>FU$mC;)Ov5OXKI!1`Xu&mK3_1PKxFzjDQ-L3P+Og|(+mTr zxghaS2_-qWzJc(GaDm)A?s{6yab^hq8NxyU8%8X^-vBaW-AjN|=pnmHEtDCMsE|uz zt{=GPL=#D00!S*N}CA9e%m;3-VJ%eq?tCQi6)NauPVlfZG9Nf z{GIaaO5uQG;Ic~M+2{DlN0U=?JA1}EBem&w&&QcJAn?CH9#?n?JP_D;zB!k-9Mw}D zKMlv?&w^<##ver3ZnKQ}D1KD;qt7m+pXMB!y6U|Vy1v{|+89lX`aiM9sWt^4oB_*j ziYJIkpl-;PCRp7Kyl;f;Q#{qax#Em)IXs^oA3TOxL_9eDzj z7Mm*uEnhh8Ipj;f#I}|636~7Il)Q|j`G~2Ri__ZRyH905bKOg_R$HU6hY%Pj#bi5V z`R#GHOu3GUv^(RcDqaBaA&H&p7yFL0t>uJ1WfpYSSF7wU@fw3BwbqMQyy)m#!+3^! z1#5$-3~c(kJ;H_;urSg3B*cmy#priWz4oewTecHP)rBdU3geJUWi=*e5BjTv!E6d1(DM6&HKe)kx9B_^mw@!<;d*fUUFS2GeOzdaH;V7cL8TWHrnw*>s-@N+U7~DzgG`f8+~;rl{s~NP zfJ?1yXANd-x7xyYW_U>TAWhG7C~`T)*NC=*s387n1)9PI_nOzy62sKtwAihjk>8jf zUGlm9m>146h4LTUEI>6XyqF8Oge)VP{lXK|GG_w3I-jis40cUw<-;Oq6+xrDiU~Jb zkr%j=BofsH0cWaBO`&^)Axu6(>& zTf<)c(wgU%6jm_wMcj(S5jT2UfcR2AgZyP*%myjdPC7-D{=k%F~`ulwaZKt z{Qjx|A$@&W?<<+~+O z*EpZnVsWl3G5<|pVt{k~qCP4o~CE`6GL@=7aTQ;A_Y7$oE%)_=JhlIveT zx*eH3zlukjj1N{$TbR(Aynp$LX%s}GJGl@m(xJ|zWc7$iHnmHk1qkhwf3q;u-Tts7 zH7`P*B5l!h&p!+FE67BJxH6A9(i|(eT`AddXJ!_&y-WZC$^CUhUDGgtgh&)+l-bEI zKfQQ2souM`4r*TmR2;o}-JS;fxy!=a$5e9KLE0@Ip%s%Gyi+Vti0H#XuLa^(EqD4$ z3I5;fZo#wgzCW5_erTRvm=0f6TkoRBH902DO_`P{x&cl@3VWJ47vP^?1$Zce(4wYN zL$lj0AY9Eod0xpAhwRc{)l0K&6iGNBA19Y|d8T-z>e=L2&{i7|Pn00>YF{FX)P*M{ zG?p$c%*;@S&|zgb#yh_a^T-4R5Q}=e9xP{CAd0eJBmvOwQ3Wh~`$u+|>>y0kZSJ`g zJ)8TBs*-qi^#Rl%`&&{H{31gh3`vK?tXx@Pu1LuAM} zXwnbm9%H*U(gIpUI-n4mCO$$+LsUzbNrc|rYBJSbx_NJUf(37}8u#ER$hP!c@?S&3 z8g}5!4U@zfqo}X7%xhohax&Gp76SfZjwl`I04)UDCj)pvraql#7R5ybVTU%D-ZWTmf4Vs*S{Fb#Zh zTR}M2O+#1Vp(?5kH8$jf%WkHA(7bSLthkEYZb8S*(Jpr*!u2y}f?}D&Og({Gy35<= zy=HQ<77gCeZLG~UOI$H^5d$}Y$F5kiS;Y!onivusN!|x_w~@@PA4i27RH!#PsuSd0A*$~7%mOS9=G?)swPSn)Hv(A{ zupDFX-2Mo|hZN?D$0!HTyPhGf7b}qeY#&EmV+Gn}_Wp*TooV#4TMhMf1PCLu$THmT z{0=7(TPeN9h;j9xfvo}@uq7n~ntU8PziY2QFfUv!v+LC%rqwt&hDZZ z1Il={$BW*=k;(HVpNEH_lWnU7wjDp(K_H9~I1IRX{^qj5>o@+5br11^B}pC`xjCtU z;gQOmG5?joBE-+U7uta&BAun$9V%QCT(O5<%3%j;{M|A`^hPD8(v|?C!675;@Vde+ z!&O)qwk;)xp=v>VP7b@ah7@?~H(h>fnYX_c(Q|zK<7HkUPPl2BL?G?-IYZ`Dn`@f6 zwQgN{e<@GA(MKSOGL@`Y_CV)uj?QDXtr4cBX(c+`cGjaK>nA};=wW_!P|f`IUefIg z(h)8gIS1@Gchu-6s|{=Vxs$`Y5i-`d4YgM&kZqnUs_S@X-7m@!l#{=Fs0S4S z$<%t*tVh}j!Ee(KWr7P~eYWpP^@E??GtFvNyuSr8%EYm7&m*3GgV|~pUO4WzL4Q%p zfgHxXbx!mNHc9$*t3*eW30Y(OKz5PhCPa1wPK;js$*>~XXePN2-uk57eXFy5c-}V6 zpSWL!mLd??bfxVxPB|z4!6b*k@OA9vC-2I z^>OtFqZn2TiVwczUR-9QiWTKL$!uBpI99uBqx*wypL!YOKxtAm0?*V2P4>K1pkMc# zU}b>DT55$P6qHv3-jfA9EnyKKifAYDzgDz2BG_3ht=WUYYA&bjH8mD&7ePsoH@nLS zr7UPAh^=PmFkJ0n>d~FCwVOIeQKo61B)R#P7$xG5UYG$b^yraG0?B&e!T_W?~4Gbr%id z4?|_&pthamZ8GOw?vKw; z<}mX?P(?x-B9jAE+rW`x9tc1goT^Gd%fOqJ3!418US>1&@P)R3CP#qdx`Y)|H8&r3 z#bjk|{B%TE!UsuLy3HCNh}%i4{1qvMX3M z)32Mfzn?`b5sgsfqx-BDteWJlPb#q}5|%mvV?Zb1)pp7H<0&fW9ssS!K1s+eEeD}Z z`!*E@A-N4IUWaJ*0kzPOn+>MEZZ>@c!_9@~&!5P(o7yys<#zcL8F_ikk@4Q=>j8`@ zrgDOAloM>C(guJ$oEATT^IrKXZ&$G+PP+3?3kON(@9jAG2Pv2pndst%T&qU`0)fV` zn>L3?$t`UvX4$@WU;E>7r>dtcUI>!hcq5ahG#+p6Cxk2+q`(Y%UCu z_P>|3Fxo4DW7ryR&<;VCdE~h{!>C(|`|3`SXbF{}zYlj~@K547F*CHXH{GtHk-g@Z zWh&+1=&mr`ivg@QFd^EkolgI`Pu50vm8_Jovi9$qKHli+R>hlBp`Xh5YCdoI^!IP^Ym|#_?MV zRK+#}zxbnTMfc^#P%uu0J!cYHyZaLuHE_Z_k8rg(+s6LxA9lsLU z>5UA{AO@1XB(UIcWIQ{Y^YaX44Tu1+$wV1lb2vA_1cu)r+>(EYM>tZ00SO7Czt-WB z#T02g(Nl7fTxw9gjkU0QihQAi5X8qTFHSJ#ORWfs1I0j1@B6)DLErh~*`aSKBrvG>7*$vsLq z>QhX9nf!_a#nBeolt8LVHERFRDXKa5YT;5W@j zTB1!Fn3+({!nJmyar%t48P;==`)x-T`y?SwuIBoUH!PL;i^pV8b~w!n0>gER}cbO+?tw)wG2i!68RVg0R17C;Jg*XugtMD zVQys(+FhzNH7lCwrui9m^?>AG*3e#)~BQySp{D!Lc*O`6Vqf zu7{L+aodrC#)|b6aM><0WmrS@7r;M!&~kxgP&q2KwtE9tQyk%Fy$^66{vN%l?zKDg(WY%NX_@5 zRw|s$E1{P8z8y|Uk7qZV0H?5=IoVQ?QEXp#Ij|l6*zmJ%zI1~S@y2Y{$yru{tL0CI zE5Rq#D1AqDCXr0|osnAK&XBKe!c|-&hVgV=t>SoNW=K*Alvl2i-M0avx zcN^ZBx5(4}3$1F-$LGe@<_tK|VMi3adISTyW1Q*zq}94(vD7&35+AtHPb zc4sj$f{Ymr^*gyo?Dms?SgyoW*b0Yz$yJyzj} zw&4&M{wAlRXs8kbKU%;KlG{LQY?MUcz+ch@T8sDxJN$-en(n9dEc~F|pV&$`_6f0B zzd7H|P5eIb3WnH|2V zCnpT%d@Xu(iWt1&ZOw?g4Z#upIH?Bro32o4hO5y3mb?}KNipfjiJI!OS;xTb<4Z&e z%e+9~P)Vcue5Ow)?Q`SSMHpBWYFM3UhahE-@Qld5+m~bp)Aftuom&2gk(1bdkP(x= zb@-4s$3q0&kM4@K+^c4y)Gu_azuY{h1OC;e_A3rliI9em#!pLvZ;eDtocQ*;A4`86 zMr=lpeM2-Y>;XTyRr9{DWDA8c706m;HNmCO?@%8VknT|zp%`3yJ3eY3>mwlFX~^5i zUWLNHHt0-Ru7MNH`X?D$_&cvq^g8`Fse}?Xm4Ls^zkIFfi>fX3y%CeiEewzEQiu;v zkY>NbMzpIJEg5K$`Z0pi!~L<@=yi0qw=1gf-iewDu=nGv(Q7d$g}jApYTfp%ekE2<13p#IX zQXBby`iBT%-`>nt{Tna+;=rwh6!f%mN%^XyQLchoX-)qIMjME-)pzR(lM?ibKBkguzDAUD^f=GkTq(?C!0R>DQZY8{ksZ`Rw+ zrqrUfTYjM50S>f6vF^V2b6F&!I7MO(VjQ1poUor6_RM6SN7pLa#NML||6Vu4o?jS+ z2mgS(SvY@Wo=E_FM9(1J?YLvZDWIM<7{~BRw?j-gDiYWZToc*i1%P&|4&KyBKE4b$ z@AgV42si-87G!gZ=BXXTGdTPzewbd0_PfM7!L6RDOiaocpJUsG`ado6TwpGQth|}C zxbrTd&Q(>DkU$fA1^8_Z#v8n_>o8Cnc`a|b4bRIA-@hUDf~ZZ;QBov~F6*?`jMBkL zxokfFcU1%FLK6iFHcNtf0X(y$gS>j(IU~R5;sE+}{z(@gIrTV~&NHcS&}xMuyBx9uxYT2DLyyGaA-xiSy9{K>^r${aX7c+K%);vlBSKyGphT zxyw6Tjq4$z=C)p2S?)pelumi2p|oamNv|R$OQLP@mKSgs!_A&xD0ON`uw_;vhcfl! zppS-<$Zy-%t_Cu$4aLc4bv1zR2h?Yr&@CqbfVjG+FuRRX$uy{_F|G&V+JYS^FJ!9Y zpP^92 zd*&Da#zRP>!@uUEl|XFELZpb(SzPv!9L!GzG1*5|yKKSU1X*mTylf<*(|ytE$MZwB zXoq6Ini>jJhTwg2x>sKD5a{+cvO>e`RF93G>W+Rx8*B}zx2*g*Y0IRB`^J(rd?M*& zZEl=U`F2D*?wPvGKe^!Zvro~S4%uz}D|FXtrmt^K40kVB=bZI4P8}n3sh?8n&VN7l zVDoch9`(CWv8;@*-HQ5gAr2sMfK(j5XU+6D#v63>2TaQN?A%HZ_JInByo&HX^szxZ zqKp+2rjJ2>rT8Jo(>}O7N-Izz>S6P|`wft62=ScJW~gq4arh`3qoAWVju%pOm>%;oTc*^(VxTs_$V+@xfH8xY z!3xfqC7d+W@O_Q|A*F)vJB@FY<~{#3*Gtu|)by(tlx!XO z%qlJ=?hI#tReOo!s4dEh072-ifmBkSIsgqqYhydA34oK-z#uHkwppmHSO5~cRwDjI zGlEuEJ(S;Cztg(lmQC8KMqusYhtavrcj?>xoJj1w-}|G;XYEeQp(~skDYFi=Uf7KZ zif05u%?YHP;tkM8YDeD@@|82$0Bk3l%R#vQ3)>3$xH96VpNzc%g_K6`)KeYd^-rJ2(x=*ZyQSA=qO1h#8 z>O8CpU-+C5pUze@>@(dqnIp)KGnP7Hs>Hb`1APk=0sgnaFi@f@xZ#+Xw~sV587;ri zR0ETybGRZC)e-+ooIZc|=yP;+u^%a@VR+o%PwZ!~O`Iysaw2c*cFoD-68_c+J9 zhPg~#3fnxoF)33N?jOGq4+&(}uN7T}5la|DIc@_de~gh--kOzJ8Vr=REb#Vv|Kkms z>G_@vYfg$mO>N8r){Z@_C7_RC3N)TXx|^<9T?es@J6F{VLPVM zH=;)s%>i%C%A?37CPxvk=gvNz#!a#pQ4jC=ySnciaK4fkwGCedyPhE7X_f(68;ibY z9&@9$wFn0W>Shx-MTlbYX^#%IM z@h0ODHe&Xl)u&vYDIIfOiypaZ!zWTL3U=VB6pOLM!~Pl=3p%Td6!9%oXiUG^RYC#X z`wVBFl$zKYL+ttNM;`umK*j~szVNV#z$1AgNFGUfs@vc0xO3|H`s>kjr_6}ezkwE+ zS;Dem;W#8C*11fuhJUs4TFU8MYU?Qd(>CrxhG0XRQ!tH3S&+@U)wkF%_RR+gS>Q z*ytD-PZi7qj@;Be7l7Kn#v;ZbAZ@ewu@5}b=AL2-ZeaJKD*&71Wfg~qaPKbdU(9D* zokHGTk-8>(uldS6^p^{21qpxdJ~xJi+Q_OIsm+N4D*9GkMygf#Y!oE?jE~M&_uC#w z5`3LFPkEx1(Fw-bYh9AgQVIBN(!+%1!~7A@#|#nvPPH16SE*gCfpK2-i*Ph(Sh;2; zD_}pZQ(dgSPytZ_RJFjB^c(dTOHOD4R(eOZDvnGA+XPbXhTe~hmZhE}?7~h8Wl+{{ z^<2G;cMJvn;P5-KGW4UrhhY9CEgeUoiGsHWQFI^Zt=;qH*esM7aZvgCrGpexB`lka z31mk8wo#2~LB6T(qwc$(e9ahnvf{f!7xH%x6go4#80$O8bx)$}PbmMZMWeab%>r)* zFk?2$zpjds>8q6#K4&h*nVH~=-8#u^qRiNUOp^I#jinn&r#=(peGar|$c>;9D>yTx zk(%nU7{~%J91E!~?efq1%c(Az*H=ZQv+$)e*e&;GUEz7?3Ew8@YXPt3J?tIc5s)64 z^3@no%oaY9(R%CwV>J!w&*v=8GV>~gdgW3?CR1Q-8G{m!ehDS`u&FmRp0Mg$wC;)) zIgI*S07cQI8bq@o!cPmEMvV*aG#}e;O=Ml4g`}TEe3kAdSdDJ|>S8Kv4^&!0gYFy< zsN&6s3A56`02e@y1G-?Zcw6hgEjt|V5xgZEiarGjTcl<=fQTr;X3PmqtRGfd@~u^7 zKq~99t6m?94@N&pGcKn55f7&GuNP6T5J_Tm?33VZ*$HMFW{MiTIi`=%+_8T*DWa&G zKOk4g)-cZLDm%TIU=fpjGrsTcjiKAzP`R4Nf{aJy*YeNawV0x#4g3G_P1xrrOz!6k z}E)Hk{@q zSWLsWmCT0qCqs%bPzxqIvMmnas2D97txz1YghWqxh*&7Gacg6J}W=9h&c9onX zkHHzk{N?SGpH|dG0JpJO6F|VFg9!8m2jGzw3_VJM>6YA=la5c`9G#KK3TS_Y4 zOv^(6XbcoF$D0D-Kn+creC`ZJveY}ln6cwbv)QhC7C?|mkEkn(riWjPRu|);rY`=) zxVq0!C>flD>jDE-MtsSR&V97ZUD88beEqJ8!l(WGbJhpt<*15qr1*n?WFo5MWl2Fp z0$T{vO#+bf!clX|rg+CI9pKxy6#}8!vAtwtPfG~Xu->p5V(p#n5+tPT*w_=T&S*VO zM*3f72I?p_?op^v?7}x&&^SQXTj{Or_`%1IWh~(}-PxMNMfZpvr3=L&gdYRNk1ru@ z0^-J*|LEai7ZsWnfo1Y(^A9aVPUZ}#A{d_SUo`Ng$%5_mGNNOp7VIpC!^ku|v8%!t zSMZ$RR2BvkMG$4zOFmJLHUv{XG2MnUQ9%lri6E;p+2m{^q=gFVBfzz`%yyyX*Np8; zDah|!EX?rOj{+Av)4<$4gU+%&mTT`$@>c$q_}TWoH&=sf^QNCm9#%@U%jzw&IoVTO z?0T{j9Yjh|3&f?5c=mD#4ot8ZSOtLIG_)P9!q66w8~-jbS=YjjG)QMebFc-A6!+=NdV$foGw5!;;zj7{MBQFXAdyCfG>4*6ii=o1}_?3K>|?}5vQAC~06D<3>1 z*s}eR?bIW?5`Xvm)Jp7x;y$o{&Gm(STU@MX+`_utD8_&aVb>Y&XhuXf+}qUeG+#Et z*hS23EW%{K)7jt!e!l0Vi8inoK^P?KMA*!4(^=@I5PgG2_kp3n41nVMpA#MzjLiII)u_ ze1z7KB5}>Y6}i!4#h63z5t(p$9v#~HRj5tU;?Hz@+N-(5MtyMMPl=&)pBl;XDAGay znkRXhm)O@=zmR1MExq44cxlqj@r=tziet9jUXOsoP1w$A)>Wdl?*>V_osou#W7zzI zj;9s80voR<6K*AM$iwx8=e~eD=2->BKRf#$nyZ2O7f%PQ|k*6I7)i{yl7Hx{*K;ukMIR+ zy%bh)X_yq!6*XjW4N4?Md#$I5={VGirQyvdqVxS(M_z>XrXfKL?9ukPhw{rWQs(#zl0!% z2(yUwq^+HqW^bfaTQ_X`Z{p>HA@4A*?Kdbj+Q(*LEn|o|ansxM4o!P?^wKx<7*`2Z zA(`6I2pgq{R);$uvdxs|;X?N&;Os*wWqCli_x%_XbD}x9vCoo?(}^mT3(yRqwCpc= z4Sh7I`%`nIx)6)NPwbR;=;uhk6b+&zK+iPCUQPEtFQPmz|057}9);6N_kt#*;Vm^e zZ@284ql+ZP%U~x`*B$wT`(B_QHgz_J3>q53X8IW)?ERrxz;B51laxjP)FO9reQpYfxIpOdKR*3lUZ z$SWd2?WjQib3koimBRaMUwT!zJGZ%i!r;-j?mSIytgDm8v0xRb<{yMS&->g7(Ha@Z z<*)Y-4=AqNGm7?7Ayf-`^3=vPjA-N`ruv;*!XoisLXM-=bM8toBTBfxeAm`kxVaAI zrQeD!+2B*FVV4Owx2fi|^M~!ZiRJR&+>sDQWqrRy_R$bh(AD`VnPhA!;qfA|Vn^t# z<)>uvb8l*-*yWDGE!)GOTirv(ae;Hh%o0ruvPqXF3Rgyg-eU|(D9%c|5NfMa6{uXP zZAJ3jgnmv;7)CiM{z{r0ua!VdcxuuYQ!gb66Pq>3eVdL(86LD<4xMPnQ{aOmdIOUY#OK^~1XN^yH zaX9MJ{f!&~Qg)kOk&Qshr|mN!0P)6bT?tu|FU)JvkMS>1UrPH$*hef}dR)#&M4?AaEjYmIDR(=C-gX9uJ9TG(? zwb1_={Ww88%XC=;IdOsPVY}?q~-nvdpuEO~X@5o%j_OZ3d;6IG%lx zW-E~2xdNzo_a*p}lPbRYn-gXY^01?*oo)LOdRjloaElg9uCsanQpW5_UBu|v zO^Xwg>W)38miDUStuuI1v;fdBm-1=cDKL%WQqB}^fQ^MywON}lNJ_vU^!`np&(8tu zUJLBDjRB(r%dTM|qf8L&o}frz#@y~5f}nyI`%f>^+;lXa5rPSbWixaFVoxUjn#LGl z;3O7omscUmn{Z^t78F?Pq5KFEDhtA1OIS zw|W^YFV_>=javcAWmO2AKA1Sy7j#^frrP`{v7H}bGPZE78SoY4cD+$+_@xr(A=Y=4 zPH*eAdSfo|J^tKrdH-tlIT!`zzTBRyif?6UIl)5M&?Ob*=D!peNK0)iROD5y zltL^`Bstj`jgQW2#QJwis)qv{8#oUJ!EB^_I{HdtoJYLUB!edMojd>=!IDz*jNqlt zp!(Y0WVOAyUk9E7q@>@Xb32YsG?3RzAyUE$RU#y%nPZ*2#$WapWB9t?_u9oe!o_TN*Wx!jJf=*>8r=+UhT9IMn$8wF8fD>kj6!Mko zn?^Fs6!|(1s$>&1XR0Ls4*D_pNH2~I6}VU-^t>(hWco9ciPW%Rg*wSSft3u1T+_R+ zkPipqb+o?hkOh7^m`;>xUFugQ(MH6aQX#A&n=}38{3A>h< zSZFP)sVse_D;de=nx$y^}r)!tVJHS9NKCIkuR2uCcLW(Z{@>WNUx4;NY)HQ*M zrLG!BP*Ki$wX03;+zHKAPtis`p-;YDyj1*!lHg{iloWN7o8Hr<(t0Ywb7zWg@6a!4Xv}4C+yF(;k zDfaRfGfHy0(PjiV;Qf|0%-(I$V~b1?N1N0&4bX;=agEZcXDwc6_+k~ADOA$TGZ4Wp zSu>xs*ua&JVx53^)%KG@y@ z9ZiSdQ4Npowd5P1P#r=Gb!82=j!u2sEKo=Kxu-HqvG>})7U~+l?=4P zER^ImS(>~Hu2m?I&z}iT9GDe-o=DL*uGVB{K;GmH@Y#YsqxIkScU?nrBw$NwuNjQm zYP2*z>FWQer)Q$EKkvD|4Kq%3BL`3=&y_r9SD^`8cyU6QJ`9ob`xm3JG~8zNOd$&E=+ zcaDh>*GKn?z@4IMuvG@+)*?reXY3utN2*SPar%?;v;W%l%5)q`_F{icbr0vcskDmZ zqC=ovQw2<~HAGWA)Uucx?)N9-d%R;W_$%K5*J$z54znOSN~MZ-BS?msDLa_(T5}A# zcuI1?`ohahcgX1Xy);~<&30f98-1x<6O*=dF`Zf&czIr?V*HcL3t#rKtF^?=a|4J_o$oi&Lzv8505!~M^sXv zZ;fFL)>J^f^eEe)gc-hh9$%W1)opoQHRU&XQ4^|dUB~Q>HlMp#LGfkgXHpw{f^`#6 z;RZ@k78K>q>c1^WNbC(ys@u;?Y?rQqg0GDG@d?&PVRu~MCPA+sf$?%FE|T#{c|0T9 zr|ul5$h1f(CsdUo_fpWFytOZC>pRXtlECUaW?9XIb$ zPBC7Xo9_SN?fnl*s03^3!`tA~@NR$6d~J-u`az}0?{q5atR;*sSq=B&ZBPK0nuLPL zZ*4r`WrK1A-;ma~65+S3y$ns2&%}7Exj{W)lHvgn(m{{^(t;F4Tb;b|i4yJni>XU` zLs!qVm9M8ua-b2>asVs}v~NaRgHf$!Tci2$&m)s?^W@tx0uhGL+n^wpm8@P1s^~YhQNSCxK zTq?kK!TCsk-GVZm+b6Y`JM%I@&A)emC8H|IEz*btO6tN0U7a_5W>WE!NgMuh6}-1Q zGHi|HX>Ckh#7x>%t!0_b+F>%j>Hxulw1*Nlc&n#t7PMk(vT~eeHUdpRwX)!08C3{3-C$FYA%pamcj}Eb4G{LHCP!iJ8=`)VI*WV7;A3b8Wti^07W;E35jjg z*m1h{#rH$s$?pdL`ANmE+ zy<`|PGa7A)RDzh}PDfC8SvIdH9GiyTzOVoP)F>;Y#$wjjiE}QqNL5bg;z~x_e2I|8 z;O1`3i7RM#W3@Gt5}NQv&4!7nwyUR5=>xL)qN)q8Yi`&dFtfceRxzq{%>=e2<$S7sX ztEU!YaMvU4psutv8aM;CzPgr!)D|VY5NP;RrEn196FdWba5Qe4?Kw-8o9D-^JZk5Y z^*i&fglUG(+Lfzf4edzdf)Y~c6_m4o>$&}eqgTOJMJ|Y>imI~U5u(=MxOj`hLS&CC z;i`Yc=FBRv?zw=<{!h1uZc#0|?&Zglbe5DahbcwpeAY;Q`6V1rL!smi`UNBzOPSI1 zvnI<^w|~hQa9Q(W^x5BbIZq-8RF-&nYbsW*lCJZRnal5!y)GGVL<1=8OI1g_{Lr^s zeRL?!vnSBlB%sKVEL`P?f5g)Y2$;D!uMg?KzXR|Sx;!Dh3)ZxSxuVBk5GzL;S`8ch zrq3cOANhTUg(mWxjxxIH%meZGJcQPz8d@yVkJ+#xAa)^4d zyu{?Jr4vva^Rn9-wk=4M5v?unVuAk zsQhaO!8WeVc{pU96lvc3prctihSuJ$W`Izu(GdE%1CV6&TWCdG7h9V;lj8N=Oaj*s z@>qqMz$#lzN&Q+&nCNk3wRK?z0%EE?MM_{-?OzGE*`+2=LsZM7_xzyi)wfj$UDhRR z%SQF^`BEJVy$sBCg_h~|#u7fiW;J3_T`f9fj*Iw+y`NM}&ekALt8m_$xUWmdzjDn zvH%3Qb`6~hfW{gbwhF^#YeZDJ0Xe6|o(~xHKL8K{BfFkV4Y~4gJ}l;RRoIUC+;3C*Rw#w&N$J&fqpNL~q*V6RMH3xXC#_GKK&AKZLi@q-=Na_)kmoqro>CYzZ}cZlIhUHPWpJm=XOv`LyjLW==p&k34sNFYQ~50e#~{o z(t84t9(##PtSufvb?tgXZ>yJ3s)BVtGG4D^weM~p_Or)ChR2g=C}Xm3BJjfP2-Su9#bgG5Tc&>^jPXU>3(CxdLwE!%W)rRJ_EF>PO(+CRtG$_Ma0WherZ8d z>F@RwODm`^?s)N-DgI;UR?u07w(JuG-`kctTk(4x(Frn=0QWSsE)1>+A{4ZM25*rT zKn#1TgUX$g#4(;NjpX_KK~C$UHP#K;q!`BDFQ7w7=5X$BjVoE+i&*fmtR}M9zcGFZ ziW z$txE#x1fxMO4YifxoLISzG$nFzFNGHCs1h(;9(h|vh6O^xbFeZ7YU2siz)8z8KkgR z^p@eSV}jzS3&NkZsJ;-1sQ*lDM=Gxlx@mf+jiAVD{voUD1GN7lw%HNOAJ1UI8E#REEP%g~MQ8$sN^?jPPL2_{8WbKL(Y11b1YT4-EQq3?X0D=c98`M=~T|ABPW z_AWtneu(SbbDu;jMNE3eLd3~3Lcp?wkMo>#E^W!O4Vkhe!mkgqeK00=MO=aSen-bh zDbh93YXoV5J>cxB6gY-{$0`5DaP!q;Cx{$cznuAEMChSbhP27}!LvJD&Y_av5}!J* zpeRg|J9G7G?19I}jN}x{7BO|(xNyneQeW7bdqSrS^xWN6e!vpsj`z5YkoOc+_-$h~ zH3l_1zl;3U$h1S{KKnOmB^1wmWvUV$8%mo=VCLP!=6ZM!$cRpbsoJ`DH)?%%rv0RF z3Ei}{OFe}&cP7T8_p#zjC*niHxE@ZSTN%#60XY@j3EI!6Y<*DeRaoIC<5O@A8`cab zlwgcH_WlN(A5Ojyh!jHAQDIGfEnFWB3i6|PM1ts*DL>JbdCb7Ombc~!VZ!!WEg}U9@@*65U z-LShN|2_-f7xzc;iDZrl-RY-Utm z(ia2st4k9Dr>IDaNIRGHawSl5v1E)-c?URvT6W9L@XQsJBfr6E)T7H_r@ShpL|_mc z!7#~N1DB|&UPzVx_b|~{CWRWxTT*yye~%?`hYZ2zuYQIndA8s%Tq4(EM(Exy-~ps- zMHCR@X+dVEr#$_E8pwtc|Jn>2kC4D__kgv4+}b|*FqI%8F@j|@udgouHaJ!O_;;ch z`By{!HNW|T@nIf~z{B^}0iS-xkya!D(5xnS9N$*h>j%|-A1PVgKS~Q}3a9nkuw{P; z7bm#2qNhG9b-!;3C)Od2CO|E?ou8IO^d51*NWafMhjt&}B!elYjCC9+G){nL-^@+* zC_k0ec|O5%l~z542lr8>bgj-`{a3(?o740LXEqJlhu zK9?MJgswniwVSNvzkBtt2`o7ZymzMSPQ7m6{%0PX z9<{|7D8LWwOS9TD_*tHF{Z^%Zu9`pHiqY{b!n4Vg=NH4c{GijnMpcrAP{QY5LxM?9 z5#9$BPlWvY$i?X{==Dr)U|tC)j@rw~!`%%a(rUEX-rF}#B4@hX#6zB68g`+pc+@>~ zX`LTsw#+sN%|X0C8trRLvn#>Jm>s&^XL=WOachA^mKd@uZw7z%Rqqotm`beL`tB;< zk;#If>%13m4U|TeK5yMe7@y9Ky080KD|7iq8`Y7#YeXL9nuQ~S`xUd>rNR_z+KXtP z@#6-pAr8sq5bmu>&Je}$n!O+VTgz{8q>-m1w_`APT*AGQSZuS?ZU2Fv{wqzoJv1$) zJP%=S*cUa*B%jN6JQAS{fh&;!ctSXv)MDfTY~9Z@NF!~+;L;u2K=@r?QE4qma&tG+ z-9zD3U`B{Gsqnz`lo5tDNMvQx);#biaXb}OvjG2KQKqi>0t!$5#o8TO^RIts3CB(O zQT7)+3Shc0uEfoc1}%G+2c-0N@xePg4FKt?#4Yl%Er|DE`9EGF(WY8Lsy{ix#dNrd zG|BptUxb9;juk;z5FaR!@7%U(GxyfJ{bY%v8q`j!Ht5<>T4Wsq|F?sn!_OsvH25@$ zb{}RsJr%BK=xbrh&ahaWq{E*!*B~fQ8ciWUy!1`9aJsYMgprM{O~45|JenV+^g@=d z3>&D&mLD?*1v?w8q>s4_c*A8V9qgAOmWB})Z!A8Pf>u+u323-yfDt~5ROcr53y8B6 znTRZ0xNi$Kk5gNJ8;S#ILblb8bq4ipw(hik-f20bG;qz#4tyA!reR;lrPgj=?Z#Bp z&$J{kbo&;CZ18>7Xvwp8k6vsM&)-+9yT(82Klto^xje>WgXGSBD5s&LPYZz!xkvqN z6rlsc#Bj)4DSh3(FF}ZK(}24G<1@1*_0?rdT_80oTmbR58voU8Pv3-#E}(cB%p;Y2 ze6B9%1>=HBNM8VI<>W=!aA4#z^52g9@T{RQQxF5>_15uRMcc8tzV4u8Jwu|nn=?W! z)>oE>!=+U~6yX^XmA%z;7q`p{oj!w#>Q9P)6Z=JSx^Jtq&O88Bm(QDlmqy38WZn&V z)K$HdfeC}1FGc_2Ip5r-u2(Y-rDY>TIgPSTAv4A?CGB;ghHh)NGzIcA$tM!(d&A?+ zr!BIKKxvFy9+BFk%Lp%PtUQTdw0~tcV9yA?(1SQ_^qDOvzNd=WTtj&_Pf=9Vjc_QYt7TG zk!C5~Q$N*?eG-P~Suxv7CurdfSrUs63ESaQuysEgWgXnlPrkeK^$}zBux5rhq=w&M za@*@m&D-%64J2MVJgJ>v%a^qi+E%Bg|u92G4mV>N z*QZoE^J$t`$nS-c#bL2(7F(5hfEKF>FhJ9uGm$sMI=n)PQ6eRHyx@#jx-zU%eVr=C z=sA{ng(ZM>i$M8^U0!UZe0cV3OEg=Y4*XFT`o_X8XX73^&h`s+bq`!WCI8GZPJ#KU zjd~|VivD*FR{=G=8`WG9kepp|`kkpHLLn_fN}rY+2O2`Cbk-RjERO080)Peoc35K( zTF=>neTctfFKc~m7oUGUl=C&i0ecXZjHu|a!&;J{qowGFG{aTp8=`WxDnbT7I@H`W zUM>3L{Kn?)yz|WKH1$&v&3!gBClWh1m8Ku!xZ_o-$u&YBBD#0&tTNQzDwuMN&_;1i)Jc)`YSRoy(e?Z9tU$@&F z-?KtHqJ{^&*QkomobJ*i2}YE?aGkmA%zUtW`Yc>fV#W z!mT}VKAOKP&bHc$8}2R1Ud?AcFF9M6a15>Cf zdTl6}2|x*lpKZI_Oe(`%3(99BA5cM3==KL(tXIp{rCjN&Kn4F5HQuP=5Wi&*uQ&Nfob3GN;KceGB;EGJmZ@|FT~EQ4gpi@8}VT{9VvN#QihF5 z(q<+lK}=k#YYUPWAI&{|SN-BMmwVw4@C7=!ouksnMH%utF?)sjEID6Ywn8R?T64FG zuJXE2H2twqImSQTS;6jLv+)sH;%}^;8d+6_{SK`p?$*YvLdYSY?^#Hliit5hj2^!Mk z{V4OQ=AO#oPM3go>?}t>)Y9f+k_f`oDYHJLn){>&P)AF`Lh%KgsY8(+E1o$%5vYm5 zZ}VkEP&M~6K9~SsEke>m9=Q6gy#$Ys0kq*+aIsr&NB$*m9!Jo%$fR=-6piQ{Ke>YQ zI||D^MshEGs1#f?`8m$m3%%i*CsueI7L^9WM(yFnW47o&(O^L=7(1hog&iy|;o+R4 z;{Q;Uj&cu#X)DAk9bRC%gba1PQSVN07(x~2=ru|%c&yB=_ryNbuuKLf+LTW!i`O9k z=(Q?x63_(Q%*d*UK(~L^Ru!x4_A$HUBKhe_kixkV8?(o>e4Gn#-2&EM0LlS;BvV!P zC3Vq9K#-!!%yv0BQ1MYZl9+NOAuC^)uId`8P+hx8N??l+&}^{C!tw++uJoGdv%u^e z@Rq1-arcKR&PICmCI%uT*<~doZR}E>KitOZY?5xFS*Ssw5DK>{KD*c4=lzL?b`Vza f&ci=HDGa{7F_;RN(ap-f#vF{Q_xz{-t*06vdLp*D literal 0 HcmV?d00001 diff --git a/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/6.manifest b/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/6.manifest new file mode 100644 index 0000000..8402467 --- /dev/null +++ b/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/6.manifest @@ -0,0 +1,21 @@ +ManifestFileVersion: 0 +UnityVersion: 6000.6.0b3 +CRC: 4272264984 +Hashes: + AssetFileHash: + serializedVersion: 2 + Hash: 256fc0686cc70288ca0c8f6d88bc4cfc + TypeTreeHash: + serializedVersion: 2 + Hash: 9a2ca7bdbd1871f7131daf57de908e0c + IncrementalBuildHash: + serializedVersion: 2 + Hash: e4d5b2148b8da35f0919e0024f8e9095 +HashAppended: 0 +ClassTypes: +- Class: 83 + Script: {instanceID: 0} +SerializeReferenceClassIdentifiers: [] +Assets: +- Assets/Audio/6.mp3 +Dependencies: [] diff --git a/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/AssetBundles b/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/AssetBundles new file mode 100644 index 0000000000000000000000000000000000000000..ebb2351600d342fd0c293cbef2461cac3f1c7862 GIT binary patch literal 1220 zcmV;#1UvgxZfSIRMpFO)000OzE_g0@05&i%FfKMOFk&+R00000000EU0000%00016 z0006*0000000000000000000U009890RR9I&;S4gGyp*k00;p902%=B7ytxAK|(EI zF=aC`W-~E3H8wagGh#P0I5cKCIXPxxVrDgEIbtvX00000000000000000018000O8 z003+OL;7+9cwh*^A5>hpqrMb&)*8@x`L++820^}-xE~Y9w!NQXs_`f*h z;(nM+wbxvJYuLh|&1mG~)mI#7rDFVm;g5P0^uZE`kC`B4&57~VPqCd%q`26w(PIVG zBClM$T8+B2Od8Bla&clfyZGoFCZlYN+hFkX{5l>lA~VS{=jIPsUFI@5%K4~Yh{~Rh zb1V(8bc}TRIGOj3WD^cmeB;PtFy=`$E8pzM^RZ;%7Ul~Bx93Y0m4cAG6SPj5FnJ>+ zcEb-7Xo8=ET?zaf5cTZfAcsw0$5+&dM1ZkQLdoSIJ|fwr^9ZRH-7nbKLIxG?z%*J9PNrD2;< zDZ<+?@1+6j&v-ZHE`09)WcC)MplBQI82S4ePeE?otvn#s%;zW9HVjyW-zM5H`#S-@ zb71w+&LrYeZ9dBrJgokCUwubw7P|KNIT$onbnDBu>$y-5uATERi)AB z=Hjd2oZgZ3RkC6BEIc8}ob!Zey*7=iuv4uPjT1G%D~Yk8`Z4LuezeIBN#gSwJ<6^$GI9D$35RRNT ze#7T*A7J$WX^1*rBV4Mvtdy(wj|1c`ypaDtUc@TP2`q@#wHCbeM+X-1dXJQ zCxrQUPOgO>NL8WA3g*}{T{FWT+4gRYl#{Z#zM8bya60$33Vu)Q6d{;iq#J8lvS2Ss z>4|F(VPK>D?4vI;xt9@CiWp-TE{*6}+U~6PnvlL9OyAZFA+}*W8%fZc1Acfb``OkBRSSoI*S>1+nE=&(3+li z0{=A4$-QCOm@oG>_}+r!unspxj?%b1T)L7rfERCgM`N@P{l4OD5kq6uIY->8$b8c( zk0$6YyC{3@y9BF@qh&ch^G~3-qDDG0xOe>fB8L57E5YKraYd^Fu3FNCX^iITU-VVD zFe&#LfpeA;-C9e&sxSZNHKc7O1+{*%M@jYB9tFt|O=((a@M??+yj_uXNgZOP^+fo* i(^s8r+@VTBjp6NCP;t|TV17YJC;wN%fl!nEqSOIJ=`jod literal 0 HcmV?d00001 diff --git a/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/AssetBundles.manifest b/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/AssetBundles.manifest new file mode 100644 index 0000000..1e77c6d --- /dev/null +++ b/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/AssetBundles.manifest @@ -0,0 +1,30 @@ +ManifestFileVersion: 0 +UnityVersion: 6000.6.0b3 +CRC: 3235539447 +HashAppended: 0 +AssetBundleManifest: + AssetBundleInfos: + Info_0: + Name: assetbundleroot + Dependencies: + Dependency_0: directaudioclipreference + Dependency_1: singleaudioclipdirectreference + Dependency_2: serializationdemo + Info_1: + Name: directaudioclipreference + Dependencies: + Dependency_0: 6 + Dependency_1: a + Info_2: + Name: singleaudioclipdirectreference + Dependencies: + Dependency_0: a + Info_3: + Name: serializationdemo + Dependencies: {} + Info_4: + Name: 6 + Dependencies: {} + Info_5: + Name: a + Dependencies: {} diff --git a/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/a b/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/a new file mode 100644 index 0000000000000000000000000000000000000000..c19e7c6b8be7c02fd85d25d4c168165b1392a93b GIT binary patch literal 46783 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 Du{sc0 literal 0 HcmV?d00001 diff --git a/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/a.manifest b/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/a.manifest new file mode 100644 index 0000000..296af19 --- /dev/null +++ b/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/a.manifest @@ -0,0 +1,21 @@ +ManifestFileVersion: 0 +UnityVersion: 6000.6.0b3 +CRC: 3543150657 +Hashes: + AssetFileHash: + serializedVersion: 2 + Hash: 27584a7667a63eb913bc1cc20ff4c416 + TypeTreeHash: + serializedVersion: 2 + Hash: 9a2ca7bdbd1871f7131daf57de908e0c + IncrementalBuildHash: + serializedVersion: 2 + Hash: 8e2f9ab0bd28d271a63e0ad1c392e317 +HashAppended: 0 +ClassTypes: +- Class: 83 + Script: {instanceID: 0} +SerializeReferenceClassIdentifiers: [] +Assets: +- Assets/Audio/a.mp3 +Dependencies: [] diff --git a/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/assetbundleroot b/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/assetbundleroot new file mode 100644 index 0000000000000000000000000000000000000000..56602819619b7d5157f2da00f5797d34c511dfb6 GIT binary patch literal 1530 zcmV5jh@O5!t!ZwU<8d_5&U5YtPn?VErRYq)VhOhs^k{;}E9&0$ z-bYfK>f8wuMH>=IOv)3&Zo}6(#E||G0;*GuEMNtn?B{-(8_X4K<-wd~L^nqeIM=m2 z^fwFJC^yn={$%8+jL;E;x^MgacL{mQFWWl|Io?%^Kzn?Bp15M6;fjKOG`U<^>&W#z zBmZH6F%gLuU5noZ;q@tJcsQQSaJG89tYeR`6>l{r>(Ml1f`Q87VgW@{P17$OFRNDB z$7zSFkqd(f1quqFohWtBgjSKUGjy1*0)2x~>LS1zbn2f;R1R7`VkQ0bn|cEa@QXtg zr@|cM?uuI~og}nwj+(u;Xt`cGrGs9))_4=!;}N#$!t*6A z1MfIVHUr>Wt`kLMbjWUoiXTbA$9bvZOCzH0jv@}szH~~WMb_GC#SjOXf9q9@F*sKI zDs%GOW78G-T&r-7AlJ06I7eonsc3$0_<|e#ZD)2d?1LTEE=}ZwXf?-aja<^0zc1Q?{{{@XmF6Za9r(lffa2@pqb;$r8z!#y4$moX&L>M{5=7&DCVeD-E#+W+#y zC1nQPQf9De`9!PvD}vqFV_({sLzN){N`k#fh*J+2^;ddE_Uc>Dpk+!syB2Ne>gW@c z{gg<~v!}B*Bf%o#5`wFMihC%n!(Ix0mYnUnQ2P-`HmVJbzO9$vsn4SHO7PX(ck#X8 zGYvn8oCoCjdX<4#x7iyKG&5ipHb!OK(=D8mr5ggS$_nUb9|~ zd}+(c=54qom=_uWw<#TBS8m@guzoy{VKatjbtuF4qg@|+f-lQSo1~=V!Oa#oERXb{ zH(Ppf!??#R4gT0o<4H8xfU40*7T1!D*PTrcQ{E~5;v-ok(K>mqOS-Ik3MgJH3dM2~ zwX8qZ6SMQz0|)#(o;|Y%I3*h88zJ7a)~Ci%^c7EwH*OspcBf20`hI_cXEe0@= za@Yqn4_!q73@J*46Mfs13)hqS*hPmZ)8yRb-aFMq={4%KTZctUyTgvEvwgGftDPbh g{Q8i$ZWTbAMfsT{$1-k=2#`J`%PM!R*!Bj_@CXRMQUCw| literal 0 HcmV?d00001 diff --git a/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/assetbundleroot.manifest b/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/assetbundleroot.manifest new file mode 100644 index 0000000..cfc3b11 --- /dev/null +++ b/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/assetbundleroot.manifest @@ -0,0 +1,34 @@ +ManifestFileVersion: 0 +UnityVersion: 6000.6.0b3 +CRC: 1569140202 +Hashes: + AssetFileHash: + serializedVersion: 2 + Hash: d7f919acab03f8314047c9954b2f35d3 + TypeTreeHash: + serializedVersion: 2 + Hash: e4c92e7ce30487f41e62ec475c399971 + IncrementalBuildHash: + serializedVersion: 2 + Hash: 1dbce57dbf052f5659ad2cc7eb1ce772 +HashAppended: 0 +ClassTypes: +- Class: 114 + Script: {fileID: 11500000, guid: d6330d3e9b8e5a0439e4dd147cec19dd, type: 3} +- Class: 114 + Script: {fileID: 11500000, guid: 8623c5efbb626994da80931050f0aba0, type: 3} +- Class: 114 + Script: {fileID: 11500000, guid: f44aeb02ae06dd84bb3ef76e1df8d525, type: 3} +- Class: 115 + Script: {instanceID: 0} +SerializeReferenceClassIdentifiers: +- AssemblyName: Assembly-CSharp + ClassName: SerializationDemo/SerializedData +- AssemblyName: UnityEngine.CoreModule + ClassName: UnityEngine.DictionarySerialization/SerializedKeyValue`2 +Assets: +- Assets/ScriptableObjects/AssetBundleRoot.asset +Dependencies: +- C:/UnitySrc/UnityDataTools/UnityProjects/LeadingEdge/../../TestCommon/Data/LeadingEdgeBuilds/AssetBundles/directaudioclipreference +- C:/UnitySrc/UnityDataTools/UnityProjects/LeadingEdge/../../TestCommon/Data/LeadingEdgeBuilds/AssetBundles/serializationdemo +- C:/UnitySrc/UnityDataTools/UnityProjects/LeadingEdge/../../TestCommon/Data/LeadingEdgeBuilds/AssetBundles/singleaudioclipdirectreference diff --git a/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/directaudioclipreference b/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/directaudioclipreference new file mode 100644 index 0000000000000000000000000000000000000000..7b824a14523a477a0908212930550a4b57bc494d GIT binary patch literal 1429 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 literal 0 HcmV?d00001 diff --git a/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/serializationdemo.manifest b/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/serializationdemo.manifest new file mode 100644 index 0000000..4a24e03 --- /dev/null +++ b/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/serializationdemo.manifest @@ -0,0 +1,25 @@ +ManifestFileVersion: 0 +UnityVersion: 6000.6.0b3 +CRC: 1465243436 +Hashes: + AssetFileHash: + serializedVersion: 2 + Hash: 126f385e23d41aca13d7233b6051d3a1 + TypeTreeHash: + serializedVersion: 2 + Hash: d0726b8e1199eb6125e2245ce15343f9 + IncrementalBuildHash: + serializedVersion: 2 + Hash: 6b339242357a8a3b47aa14706dd55d35 +HashAppended: 0 +ClassTypes: +- Class: 114 + Script: {fileID: 11500000, guid: f44aeb02ae06dd84bb3ef76e1df8d525, type: 3} +- Class: 115 + Script: {instanceID: 0} +SerializeReferenceClassIdentifiers: +- AssemblyName: Assembly-CSharp + ClassName: SerializationDemo/SerializedData +Assets: +- Assets/ScriptableObjects/SerializationDemo.asset +Dependencies: [] diff --git a/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/singleaudioclipdirectreference b/TestCommon/Data/LeadingEdgeBuilds/AssetBundles/singleaudioclipdirectreference new file mode 100644 index 0000000000000000000000000000000000000000..df3eb93560d9c90e32bd0c70e6941e017e402ad0 GIT binary patch literal 1395 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 PWf;N9BH{a~wwC_~Tt;Rq literal 0 HcmV?d00001 diff --git a/TestCommon/Data/LeadingEdgeBuilds/BuildReport-ContentDirectory/2e3fcc980d14c6a498d140ac0a24af65.buildreport b/TestCommon/Data/LeadingEdgeBuilds/BuildReport-ContentDirectory/2e3fcc980d14c6a498d140ac0a24af65.buildreport new file mode 100644 index 0000000000000000000000000000000000000000..5ee07d1dac91c6508634d42755f893c78e0046f8 GIT binary patch literal 9928 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 i=9T059VXTTv3Z4h8Tv%_e&M}#e1Q(_isExLm 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 X?VWeb-mMxfS^*&-M{p7T|F8c8t;vue literal 0 HcmV?d00001 diff --git a/TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/51690f09f541d7442ce8faf26fd84696.cf b/TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/51690f09f541d7442ce8faf26fd84696.cf new file mode 100644 index 0000000000000000000000000000000000000000..e82c8f417a74ff3df8d92a1696be7205169e0de0 GIT binary patch literal 4812 zcmaLa4SY>y9KiACj>)D{LS8DD2`OW1Yn$HgSXg=87L|&--Lvg-cdzcfqfxpkFNN|} zLJ4_W61~64ltQAF=uM9F@6*Fn6WO&{8JZkXtA*I8ueojFCI7`bHlOu#an0WJ(1re>G<9?d6g|rx9b@= z;#qmBS=Rh62NIG-1zE;gCIjt8Xlv zkrt-{BRS_>YUKRv+Azm)YIm?jUFze4=a{ERJh_evBv4Twbz!YM!zK{j|2Z*ni|R%HD`+J1moZubvNa0rEh)@TNL=P&u?2&& z&x~aLExCq_J+U^V?@4?B@nMkpHHe8@;u=vWap_g=adw83>E-VC)4POZy9?J|G*TF#d@7UnteZudfetevQK$vu{!H%Ej+ENc$!d4_IZZ7mKQ=Kfj3_NxZ4l24rIt z3#&W)`N`Uke17#K#^20r7;0ZX;`ud?i5vY-rC$1PA@P80j1t{{ORCS-|0QO_Q2WUK zFO7*C{ZFG_`oB!#0ofQOy8l*GpRIpuu$}p1Vbz7N-_~Xz_$$w67W?virK*i=!b;hY z9!{5*o1@Bx^tby@5)_49s~dD2v#XQY$UHCfYfrVOr8+WF91e$8oRX?#W@ct(rezh| zi_^0T9gd9TqGDz(&E=tmn*IOI+`jAA&a9r%ZO^8o?!L=U<_@h>o6F^$SPgSDXUpZ1 zizNrhgv|5V)r;iXImBg+OI&h!c#*ig>uss53x*I;B)*jPov4+#2rm-15@&q+we?(X zt35;FlZkf=#wC|4n{13C@pR&SIh3(WE{~2cAbxi+u0J%JoMaSfFYyr^N_)xW;U6=J zFJykBsg|)PN<6Gcyqx%W>g3x0k<0b*PbVh#PS52weU~HY)A-iRV_zP-p34IgF-r8e zM$hFoGb-&PzcsPBJn~zk=knU-djFE^mr*DE>$yBodqQ;odM>wx$0PgKb9rqzG(O1% za{r=pdA{a#+Fj1knnQo%TpoAHK)b74Q{}b0PPac;7uxfcdc0<3*uKwM;?^A9OYPoZ z19x;yp~vGgV#O|xJ$MO+r@YXm8P!Fh#-tjjIT||7_Im9V${erVPu9uN$~>LTn&1pn zw$G=P6}l=qbASu8>^K{*{+nV#OG$;+E9Z?C+e@}|g}CU29xG4fW(%9qtGD_B;k z+!I-CvZ7?wNJf({xqPkVi!2#QzO3@~lrN-w1!a8lHM62M+8_ySaXH$dJv!hDbi|do z3X-9c(HUKkf>d0MG^FDiNT$j}7P{hET!-s%18#&3+31Gu$iYqMfu87vT-=OX&>MXq zS*#!WV*v7yj{@9^ff$6_a69Cg491d3k!iixR4j0Pch6l20 z?|~OS_(7IaBQXm1q5`8a2KV89jKu>8;6aSTLwFeDF#!`X36J1WOvV&U#bbCJ(=Z(~ zFcY)z1fIlfJcT)!i+Ok&&tN{D#R4qEB0Pu1Sc0WkhUKWl^H_lwuo5p~6;|UVyo^`y zDqh3ucmr?ZExe6)um;|wHu$X}&#sDrwQM?LVDrK*nvB%%S%#d$a%4RHZ3L?c{;#%O}3 zxERgQ94*iim*7%dhE}kmHQFEvZE-o;p*=d_3UtJkxC-(gw`6oi7o;E+S0fGSxCR-> zL>9W@T3mThJSQ&=>vC9|Mqwd=%hT48$PZhTCxm z2IEff*Rr}BLogI}6rul=3*Y6#xt0Y zXR!bau?Wv$F_vH{mSH(6@jO=G1+2u2ScTPi2`}Rnyo%TGI^MvWcnfdi9jw8-Sc@vG z!+Uri>+u0T#0G4{CVYg=_!wKT6`!CQpW-uY!{^wJ9ryxY;wyZOZ?F^JVi$JfJM6*t z_yIrSC;W_Guou7LH`HJs_TvB!;t&qw2#(@+9K&&(z#sS%f8iwl#wq-R(>Q~F0qp<9 Ar~m)} literal 0 HcmV?d00001 diff --git a/TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/5c43454a3823f172a2a326410a36ba6b.cf b/TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/5c43454a3823f172a2a326410a36ba6b.cf new file mode 100644 index 0000000000000000000000000000000000000000..98b2c87707b46fdbaa2a5106d009a1eef23d536c GIT binary patch literal 2136 zcmZ{lU1$_n6vxjb>u$8BerwgXYW@CNGHY~q(FdbazY2bY1iyk#GI!n8jY_hL5h(*L z1r78`=u;sT;)8uy5g#H5Me0+Z3O)$p7l=Lx5=37DivIsIcQ$ui=Pc*mGv{~DIrrR| z%Zk)wPR)|kjlga?5X`A(!7S2}#!qJ8(Xue~1^&UC|J+sw`-kstyEpHh{c*ITNoFVZ zC;t64ojvq$O^o|&;}^ighHNf6mKFNP0&VYlv^?c-i7@1Glyjq zVErQMztZ(5fSdApeYA)OueRj#`l&i@$qv;28$s-!d$c@`fgs+p(I1tZeOQ|{q>YZ) z|9s@&-Y1PC-y+`!egew=zN+JvOowkdl=*qa#`cjvTEDrDN9%u0ZV2l$KkGC96f%!P zAeJQj{@3D>d@9`@hd?Zu5b1v!+|mA%k^WiB6ibqk{`n1?!umK{*#un!ooPbYs4uq@ z;%(7goBSI(4GDP}KJvK+qZ#rF zZ1Q<@8p8hheWdUWlh21n_m}kV2SfPPeftG|3H@J$pZ$GT$5a0O8T9=k-(xm~`x`?4 zSK#FLx4?wHFW`S_zA%Pg(|l13uWJ573?I>aaSXq!`H~p^pXN(r_>!T1?BEm1D#I!tU8vFo^t6-znoM9^3!R@b-K&ym@VfB5g5Ambe~W? zm7OkJ+dGiSbt=x`mabs7^_sD7>w3qBEh zXkZP!110#!yW1poj5 literal 0 HcmV?d00001 diff --git a/TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/68c9d0b12420e1951eec7790bd0754fe.resource b/TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/68c9d0b12420e1951eec7790bd0754fe.resource new file mode 100644 index 0000000000000000000000000000000000000000..5db4c6044eb728ae9de0daba9fad06bea881b65e GIT binary patch literal 30688 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%0DFXbgwMrw;H@y(9ug%0WXyxzUV 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 literal 0 HcmV?d00001 diff --git a/TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/730d2d641a53eeb1e633f2ff60d730e9.cf b/TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/730d2d641a53eeb1e633f2ff60d730e9.cf new file mode 100644 index 0000000000000000000000000000000000000000..37c0390098c4b449ed8e707ff12ec57b6013acde GIT binary patch literal 1288 zcmZ`&%W4!s6s=AsKH~e4D2Sp9ccPQYQ&H$7V{jl~k{QWPsp+oCv`%-A-95yJi(ZJh z5L{=a0dW&?r{K%q!95IESbcKPn>}j*ZM`gX{0*W8?inRvFI~KkjugRK5{0UHbeA_ zAJ9%fh1`Dw z^)G9E_kZ%|pPcu z&iDUlUIb?SxFF(B!0ZkC%y-C)`Z~U?FCeH7V|453_wx-r-#7VtnE=|RJGSG`ww$(b zZ_WGCuC28d;A~TRo@#}FbAh_sQJ%F1JmW;+f(okAZMV2=UU@4~6QB~-0%_e*!JHqs zG6FO0)}7Gz91FPGsfT{Yvn!sh?qR+Vs1|A^waYS+pjf-&&0vp}fJ;fK6=|)FmPIuR zlysH7q_9h1v2YGnGwyn$5h|9hI`@-1_-;E;Vd(gtJ{9krJkE#Jr=K5x|M)C>g=PkN zL?%fLM*hRguY};2a%y$hM9^l4vp|+?Ub-+=DoxbKt&s^iUbJO>LNyx2MsdovM@r+P P_EwKA>b=^XsE?kAE%B+ zr?E#C9F8yq>Wk3tU~q4)NrUy7p94v4JS`$l^a-W!8lj(6`tA|>1*QMHS-g<@Z=n8F zrSJVuegpb-@H{`ynFjNzuYjb!k79);Msj`wQ{HdC;uDwT`yiNqAQ6;L^e0L`I6_}n z`XTBSni$M~iSR83`*)ahND~A7jr#u{Q|d?HwGc)D{Tu54QSih4&kpsUZ#E4Lw@&x} zcv?iv`e9atpAfS*>@&YZ0_y8{TVFs>KY=l<$M5GGcz)mL?^QvdFgq|Ucdlpkg?+o> z>gMuVUm~3A>W(9OKEioV-Wy2ASVLU30)IhzP2KMIxU3A$ NGD(5|c|V?T@4sw@!UO;S literal 0 HcmV?d00001 diff --git a/TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/BuildManifestHash.txt b/TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/BuildManifestHash.txt new file mode 100644 index 0000000..5a2a338 --- /dev/null +++ b/TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/BuildManifestHash.txt @@ -0,0 +1 @@ +15d5df98d98434e67e06716cfabfad1b \ No newline at end of file diff --git a/TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/a77f98db89b6aa1aeaaad01d857e5115.cf b/TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/a77f98db89b6aa1aeaaad01d857e5115.cf new file mode 100644 index 0000000000000000000000000000000000000000..efd76e098ca3e20c62563a3f5270107a73e74e36 GIT binary patch literal 1448 zcmaJ>Jxml)5PlC1P{AMkO~itNgpS<)?} zTf0>AW-GaS#i4SclaR_>7$PO=G$^*~p(HX0iMByt30`btLm@-$AkiY^^g#sk$97;? zcaY7rA_wt~G^de*_(&&-4np7nC~P6_v4c~x0{Cs{kG-)6%@82}9Prmu{;o!0`flg% z#`??v?fgBva7r!%|0^iM`EidlLYoNGQwionMI7g#7g7*?mK4>i|3bNiTE)L zM`#kEq^o8Aeh9bD-`z4la%F{*?w0xS4rc}VbqHJs#o140LGXdU<$j%tV^K2;@$CIN z-G*0YF1ntWD3Hobk%e>MOo_l{p8G)XD`M#u^A^OcOakGEKvYZOKDjHFNU<0OqeD}r zz?~17?TH(9S(L)_WD(P2Zahmu)<4%bf4m<38!y0oNF78`|837c`5nIbg*RhQVKP%? zZb+PS;YhMDP17<}%VCaY*_<0ACCBA^RuVO@n2w_x3RkSWq^R7IRa-Nhk}Y^%Rpfn2 zWl1+ITbPo?bzw=W&UD4L^D;ApCONXRPpM&QiY%#;!wu-cRLxZLny@9^=C+|Ze4o;E zjP`GXCqC|1Ls1P2ZUCRz50)l8y}JgaxhPbVkp;oyJ&+3uzj~)@s$7R%2`ZsO^&3#OyBZLt>?Vf?q^X8+0~vmtEadNme0J zWT1*If%;PLsgM>TVjm)}`b2lP2Sy;0qbuqA;J`3j5{a_YpOXE-G;nA`%3~utiQGRAN%=4 zPm?T2>`eS{GM(M~`}nQ08vAD3*yEwio5#N%ncQu!d6E?AFIB57nT9SyE~ZOa;$=m= z=MX=$=a2qiVMRxSc*n427CcoryIqa2}cvO5gO%|jDYtd zKmE*M83kCsg!+$k{Tbkv**OY;r?bpZQsz z`R9;%90IW<;rIV89?4&#+v5<3B{L%Z&xJeMe=^cPYnft6GSWZ4VN+NiXDjbR-+|6I zA#Bu_%L(z;Y5qzbPs&~FxCegjeE~H3{!?-e@8%=;`F@P+h9|BKxC@(n5uJvFyaFHj zs|KSP@+xfd#dI3N{`q~R@C}opKRXO#(kUvNGXny-%GlbXLB!yA#D`PanoX3cpAObPe5P;=f>Q~LLR zSgxo|>!pAHcBfi`u}ckGw<)!En98_c$zGkR|C#j-GBqcd2N!cbKWa(!SRATSUS7zhcB zj?h>e8l9n$4UJrA~<}^jri<0t9Bjt7ZXeuC*yQv+^p@ot}5CYmCNPwxsH6%DXz^ITsNEUE0*2qLG}6h3lW}p z_ffZe_yfF~ovNq?)W>~l>OW{F)(zY)*zNz8x~~10JA1cPe&v79`=clPBCTDgPt83s z?@aFI&s#?x=5BM}4)oCIS!Z2Oe#;k=-#1@ay}jLxx!3mB*n7kGo;>ROt@O0}!n6MX D!<#!A literal 0 HcmV?d00001 diff --git a/TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/dfa73a08ed0fba634f160c6d26a5e830.cf b/TestCommon/Data/LeadingEdgeBuilds/ContentDirectory/dfa73a08ed0fba634f160c6d26a5e830.cf new file mode 100644 index 0000000000000000000000000000000000000000..e87bbb4fded80f415bb660c4f97702915c3e4bda GIT binary patch literal 1900 zcma)+O=uHA6o6-&^he`QtG3ouYi&V_+S0AHQK8V1YI_h<8$|JkxJgE`Ww%*&w_vM> z1x4sV@E{&M35p=n>amArwk;)}UuU4F~s)e(zPWX|XFck#o47BI-&CB7p!x#EjrnS~1OYI+)78XSMpl|ih zTK@ID+^d`!t0Y9tm?oxZgZ3F(HMDwxSP??3JP1rdvwOP}h(Lw|#Cid1kYhT*s&N+x zq(TtE0~_)RP6Uvz#O0hK$ydkU_$w*LHv zOSqGN5$u@13C42y_X01Me_u)b;``HF!kzr@!H)U&!&okV3-EIJ4*>Vd`ug#nc|}c} zx1nDHH8G-RHL9C3HHIZ4Lz0swH7<8uWs1m^Zmt~VN)K0#aiy0l5w0BP z$_cKBh0tzn(G4!T(M31B2=UcKRFMqhtfW%VaWFI~h5CSDP&KJc+6YT!Pugn!+QXmb z412Q)G1)dGPreHsy7{rgV)H9(ygmQx_fUI$>I<8*N1n}!2mES-vQATGJf+K;DJ2ye zOOC;OlwPMg9fyC0@=}U?>+Y?qexf}4@ijCuyHP)U6?k18(RfDEH9H>f@YctvE=!6$ zCE>Rmq-vJIww3SmqtC-@2ZyZX?9AWBa%=ta;H^26mC{((z(iWkMip5rE{&Y8Aq~ON T;F~+0kxRL`MR_AW|I7CeWY|2u literal 0 HcmV?d00001 diff --git a/TestCommon/Data/PlayerData/AGENTS.md b/TestCommon/Data/PlayerData/AGENTS.md new file mode 100644 index 0000000..9d9d60f --- /dev/null +++ b/TestCommon/Data/PlayerData/AGENTS.md @@ -0,0 +1,5 @@ +# PlayerData test data + +Player build output used by the UnityDataTools test suites, kept in a subfolder per Unity version (e.g. `2022.1.20f1`). Each holds the serialized `level0` scene file and its `.resS` streaming resource. + +Generated by the `UnityProjects/Baseline` project - run **Tools > Generate PlayerData** there (builds a player from `OtherScene.unity` and copies `level0` here under the Unity version). This requires the `ForceAlwaysWriteTypeTrees` diagnostic switch to be enabled. See that project's `AGENTS.md`. diff --git a/TestCommon/Data/PlayerData/CLAUDE.md b/TestCommon/Data/PlayerData/CLAUDE.md new file mode 100644 index 0000000..43c994c --- /dev/null +++ b/TestCommon/Data/PlayerData/CLAUDE.md @@ -0,0 +1 @@ +@AGENTS.md diff --git a/UnityFileSystem/TypeIdRegistry.cs b/UnityFileSystem/TypeIdRegistry.cs index 211392b..f09a862 100644 --- a/UnityFileSystem/TypeIdRegistry.cs +++ b/UnityFileSystem/TypeIdRegistry.cs @@ -6,7 +6,7 @@ namespace UnityDataTools.FileSystem; /// Registry of Unity TypeIds mapped to their type names. /// Used as a fallback when TypeTree information is not available. /// The entries below are generated from the live engine type list by the -/// TypeIdRegistryGenerator tool (UnityFileSystemTestData/Assets/Editor/TypeIdRegistryGenerator.cs); +/// TypeIdRegistryGenerator tool (UnityProjects/Baseline/Assets/Editor/TypeIdRegistryGenerator.cs); /// regenerate with a current Unity Editor rather than editing them by hand. /// Reference: https://docs.unity3d.com/Manual/ClassIDReference.html /// diff --git a/UnityProjects/Baseline/AGENTS.md b/UnityProjects/Baseline/AGENTS.md new file mode 100644 index 0000000..5a7e691 --- /dev/null +++ b/UnityProjects/Baseline/AGENTS.md @@ -0,0 +1,16 @@ +# Baseline test project + +A Unity project that generates test data for the UnityDataTools test suites. It intentionally tracks older broadly-used Unity features and is upgraded only when necessary, it should be updated with the oldest currently supported LTS version. + +## Assets + +A deliberately broad mix of asset types, so the tool is exercised against many serialized object types: a shader, animation clips (including a legacy animation), an animator controller, a material, a prefab, FBX models, TIFF/JPG textures, a WAV clip and several scenes. `SerializeReferencePolymorphismExample.cs` demonstrates polymorphic `[SerializeReference]` fields. + +## Editor scripts (`Assets/Editor`, `Tools` menu) + +* `BuildAssetBundles.cs` + * **Generate AssetBundles** - builds the `assetbundle` and `scenes` bundles (StandaloneOSX) and copies them to `TestCommon/Data/AssetBundles/`. + * **Generate PlayerData** - builds a player and copies its `level0` to `TestCommon/Data/PlayerData/`. Requires the `ForceAlwaysWriteTypeTrees` diagnostic switch (Editor Preferences > Diagnostic/Editor). +* `TypeIdRegistryGenerator.cs` - regenerates `UnityFileSystem/TypeIdRegistry.cs` from the live engine type list. Run via **Tools > Generate TypeIdRegistry** or headless with `-executeMethod TypeIdRegistryGenerator.Generate`. + +Output is written under a per-Unity-version subfolder so data from multiple versions can coexist. diff --git a/UnityFileSystemTestData/Assets/AssetBundle2Data.meta b/UnityProjects/Baseline/Assets/AssetBundle2Data.meta similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundle2Data.meta rename to UnityProjects/Baseline/Assets/AssetBundle2Data.meta diff --git a/UnityFileSystemTestData/Assets/AssetBundle2Data/Shader.shader b/UnityProjects/Baseline/Assets/AssetBundle2Data/Shader.shader similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundle2Data/Shader.shader rename to UnityProjects/Baseline/Assets/AssetBundle2Data/Shader.shader diff --git a/UnityFileSystemTestData/Assets/AssetBundle2Data/Shader.shader.meta b/UnityProjects/Baseline/Assets/AssetBundle2Data/Shader.shader.meta similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundle2Data/Shader.shader.meta rename to UnityProjects/Baseline/Assets/AssetBundle2Data/Shader.shader.meta diff --git a/UnityFileSystemTestData/Assets/AssetBundleData.meta b/UnityProjects/Baseline/Assets/AssetBundleData.meta similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundleData.meta rename to UnityProjects/Baseline/Assets/AssetBundleData.meta diff --git a/UnityFileSystemTestData/Assets/AssetBundleData/Animation.anim b/UnityProjects/Baseline/Assets/AssetBundleData/Animation.anim similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundleData/Animation.anim rename to UnityProjects/Baseline/Assets/AssetBundleData/Animation.anim diff --git a/UnityFileSystemTestData/Assets/AssetBundleData/Animation.anim.meta b/UnityProjects/Baseline/Assets/AssetBundleData/Animation.anim.meta similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundleData/Animation.anim.meta rename to UnityProjects/Baseline/Assets/AssetBundleData/Animation.anim.meta diff --git a/UnityFileSystemTestData/Assets/AssetBundleData/AnimatorControlle.controller b/UnityProjects/Baseline/Assets/AssetBundleData/AnimatorControlle.controller similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundleData/AnimatorControlle.controller rename to UnityProjects/Baseline/Assets/AssetBundleData/AnimatorControlle.controller diff --git a/UnityFileSystemTestData/Assets/AssetBundleData/AnimatorControlle.controller.meta b/UnityProjects/Baseline/Assets/AssetBundleData/AnimatorControlle.controller.meta similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundleData/AnimatorControlle.controller.meta rename to UnityProjects/Baseline/Assets/AssetBundleData/AnimatorControlle.controller.meta diff --git a/UnityFileSystemTestData/Assets/AssetBundleData/LegacyAnimation.anim b/UnityProjects/Baseline/Assets/AssetBundleData/LegacyAnimation.anim similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundleData/LegacyAnimation.anim rename to UnityProjects/Baseline/Assets/AssetBundleData/LegacyAnimation.anim diff --git a/UnityFileSystemTestData/Assets/AssetBundleData/LegacyAnimation.anim.meta b/UnityProjects/Baseline/Assets/AssetBundleData/LegacyAnimation.anim.meta similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundleData/LegacyAnimation.anim.meta rename to UnityProjects/Baseline/Assets/AssetBundleData/LegacyAnimation.anim.meta diff --git a/UnityFileSystemTestData/Assets/AssetBundleData/Material.mat b/UnityProjects/Baseline/Assets/AssetBundleData/Material.mat similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundleData/Material.mat rename to UnityProjects/Baseline/Assets/AssetBundleData/Material.mat diff --git a/UnityFileSystemTestData/Assets/AssetBundleData/Material.mat.meta b/UnityProjects/Baseline/Assets/AssetBundleData/Material.mat.meta similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundleData/Material.mat.meta rename to UnityProjects/Baseline/Assets/AssetBundleData/Material.mat.meta diff --git a/UnityFileSystemTestData/Assets/AssetBundleData/Prefab.prefab b/UnityProjects/Baseline/Assets/AssetBundleData/Prefab.prefab similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundleData/Prefab.prefab rename to UnityProjects/Baseline/Assets/AssetBundleData/Prefab.prefab diff --git a/UnityFileSystemTestData/Assets/AssetBundleData/Prefab.prefab.meta b/UnityProjects/Baseline/Assets/AssetBundleData/Prefab.prefab.meta similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundleData/Prefab.prefab.meta rename to UnityProjects/Baseline/Assets/AssetBundleData/Prefab.prefab.meta diff --git a/UnityFileSystemTestData/Assets/AssetBundleData/Robot_Basic.fbx b/UnityProjects/Baseline/Assets/AssetBundleData/Robot_Basic.fbx similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundleData/Robot_Basic.fbx rename to UnityProjects/Baseline/Assets/AssetBundleData/Robot_Basic.fbx diff --git a/UnityFileSystemTestData/Assets/AssetBundleData/Robot_Basic.fbx.meta b/UnityProjects/Baseline/Assets/AssetBundleData/Robot_Basic.fbx.meta similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundleData/Robot_Basic.fbx.meta rename to UnityProjects/Baseline/Assets/AssetBundleData/Robot_Basic.fbx.meta diff --git a/UnityFileSystemTestData/Assets/AssetBundleData/Square_Soft_A_Cookie.tif b/UnityProjects/Baseline/Assets/AssetBundleData/Square_Soft_A_Cookie.tif similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundleData/Square_Soft_A_Cookie.tif rename to UnityProjects/Baseline/Assets/AssetBundleData/Square_Soft_A_Cookie.tif diff --git a/UnityFileSystemTestData/Assets/AssetBundleData/Square_Soft_A_Cookie.tif.meta b/UnityProjects/Baseline/Assets/AssetBundleData/Square_Soft_A_Cookie.tif.meta similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundleData/Square_Soft_A_Cookie.tif.meta rename to UnityProjects/Baseline/Assets/AssetBundleData/Square_Soft_A_Cookie.tif.meta diff --git a/UnityFileSystemTestData/Assets/AssetBundleData/Sting-Sword lowpoly.fbx b/UnityProjects/Baseline/Assets/AssetBundleData/Sting-Sword lowpoly.fbx similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundleData/Sting-Sword lowpoly.fbx rename to UnityProjects/Baseline/Assets/AssetBundleData/Sting-Sword lowpoly.fbx diff --git a/UnityFileSystemTestData/Assets/AssetBundleData/Sting-Sword lowpoly.fbx.meta b/UnityProjects/Baseline/Assets/AssetBundleData/Sting-Sword lowpoly.fbx.meta similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundleData/Sting-Sword lowpoly.fbx.meta rename to UnityProjects/Baseline/Assets/AssetBundleData/Sting-Sword lowpoly.fbx.meta diff --git a/UnityFileSystemTestData/Assets/AssetBundleData/blip.wav b/UnityProjects/Baseline/Assets/AssetBundleData/blip.wav similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundleData/blip.wav rename to UnityProjects/Baseline/Assets/AssetBundleData/blip.wav diff --git a/UnityFileSystemTestData/Assets/AssetBundleData/blip.wav.meta b/UnityProjects/Baseline/Assets/AssetBundleData/blip.wav.meta similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundleData/blip.wav.meta rename to UnityProjects/Baseline/Assets/AssetBundleData/blip.wav.meta diff --git a/UnityFileSystemTestData/Assets/AssetBundleData/wood.jpg b/UnityProjects/Baseline/Assets/AssetBundleData/wood.jpg similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundleData/wood.jpg rename to UnityProjects/Baseline/Assets/AssetBundleData/wood.jpg diff --git a/UnityFileSystemTestData/Assets/AssetBundleData/wood.jpg.meta b/UnityProjects/Baseline/Assets/AssetBundleData/wood.jpg.meta similarity index 100% rename from UnityFileSystemTestData/Assets/AssetBundleData/wood.jpg.meta rename to UnityProjects/Baseline/Assets/AssetBundleData/wood.jpg.meta diff --git a/UnityFileSystemTestData/Assets/Editor.meta b/UnityProjects/Baseline/Assets/Editor.meta similarity index 100% rename from UnityFileSystemTestData/Assets/Editor.meta rename to UnityProjects/Baseline/Assets/Editor.meta diff --git a/UnityFileSystemTestData/Assets/Editor/BuildAssetBundles.cs b/UnityProjects/Baseline/Assets/Editor/BuildAssetBundles.cs similarity index 100% rename from UnityFileSystemTestData/Assets/Editor/BuildAssetBundles.cs rename to UnityProjects/Baseline/Assets/Editor/BuildAssetBundles.cs diff --git a/UnityFileSystemTestData/Assets/Editor/BuildAssetBundles.cs.meta b/UnityProjects/Baseline/Assets/Editor/BuildAssetBundles.cs.meta similarity index 100% rename from UnityFileSystemTestData/Assets/Editor/BuildAssetBundles.cs.meta rename to UnityProjects/Baseline/Assets/Editor/BuildAssetBundles.cs.meta diff --git a/UnityFileSystemTestData/Assets/Editor/TypeIdRegistryGenerator.cs b/UnityProjects/Baseline/Assets/Editor/TypeIdRegistryGenerator.cs similarity index 100% rename from UnityFileSystemTestData/Assets/Editor/TypeIdRegistryGenerator.cs rename to UnityProjects/Baseline/Assets/Editor/TypeIdRegistryGenerator.cs diff --git a/UnityFileSystemTestData/Assets/Editor/TypeIdRegistryGenerator.cs.meta b/UnityProjects/Baseline/Assets/Editor/TypeIdRegistryGenerator.cs.meta similarity index 100% rename from UnityFileSystemTestData/Assets/Editor/TypeIdRegistryGenerator.cs.meta rename to UnityProjects/Baseline/Assets/Editor/TypeIdRegistryGenerator.cs.meta diff --git a/UnityFileSystemTestData/Assets/Scenes.meta b/UnityProjects/Baseline/Assets/Scenes.meta similarity index 100% rename from UnityFileSystemTestData/Assets/Scenes.meta rename to UnityProjects/Baseline/Assets/Scenes.meta diff --git a/UnityFileSystemTestData/Assets/Scenes/OtherScene.unity b/UnityProjects/Baseline/Assets/Scenes/OtherScene.unity similarity index 100% rename from UnityFileSystemTestData/Assets/Scenes/OtherScene.unity rename to UnityProjects/Baseline/Assets/Scenes/OtherScene.unity diff --git a/UnityFileSystemTestData/Assets/Scenes/OtherScene.unity.meta b/UnityProjects/Baseline/Assets/Scenes/OtherScene.unity.meta similarity index 100% rename from UnityFileSystemTestData/Assets/Scenes/OtherScene.unity.meta rename to UnityProjects/Baseline/Assets/Scenes/OtherScene.unity.meta diff --git a/UnityFileSystemTestData/Assets/Scenes/SampleScene.unity b/UnityProjects/Baseline/Assets/Scenes/SampleScene.unity similarity index 100% rename from UnityFileSystemTestData/Assets/Scenes/SampleScene.unity rename to UnityProjects/Baseline/Assets/Scenes/SampleScene.unity diff --git a/UnityFileSystemTestData/Assets/Scenes/SampleScene.unity.meta b/UnityProjects/Baseline/Assets/Scenes/SampleScene.unity.meta similarity index 100% rename from UnityFileSystemTestData/Assets/Scenes/SampleScene.unity.meta rename to UnityProjects/Baseline/Assets/Scenes/SampleScene.unity.meta diff --git a/UnityFileSystemTestData/Assets/Scenes/SampleSceneSettings.lighting b/UnityProjects/Baseline/Assets/Scenes/SampleSceneSettings.lighting similarity index 100% rename from UnityFileSystemTestData/Assets/Scenes/SampleSceneSettings.lighting rename to UnityProjects/Baseline/Assets/Scenes/SampleSceneSettings.lighting diff --git a/UnityFileSystemTestData/Assets/Scenes/SampleSceneSettings.lighting.meta b/UnityProjects/Baseline/Assets/Scenes/SampleSceneSettings.lighting.meta similarity index 100% rename from UnityFileSystemTestData/Assets/Scenes/SampleSceneSettings.lighting.meta rename to UnityProjects/Baseline/Assets/Scenes/SampleSceneSettings.lighting.meta diff --git a/UnityFileSystemTestData/Assets/SerializeReferencePolymorphismExample.cs b/UnityProjects/Baseline/Assets/SerializeReferencePolymorphismExample.cs similarity index 100% rename from UnityFileSystemTestData/Assets/SerializeReferencePolymorphismExample.cs rename to UnityProjects/Baseline/Assets/SerializeReferencePolymorphismExample.cs diff --git a/UnityFileSystemTestData/Assets/SerializeReferencePolymorphismExample.cs.meta b/UnityProjects/Baseline/Assets/SerializeReferencePolymorphismExample.cs.meta similarity index 100% rename from UnityFileSystemTestData/Assets/SerializeReferencePolymorphismExample.cs.meta rename to UnityProjects/Baseline/Assets/SerializeReferencePolymorphismExample.cs.meta diff --git a/UnityProjects/Baseline/CLAUDE.md b/UnityProjects/Baseline/CLAUDE.md new file mode 100644 index 0000000..43c994c --- /dev/null +++ b/UnityProjects/Baseline/CLAUDE.md @@ -0,0 +1 @@ +@AGENTS.md diff --git a/UnityProjects/LeadingEdge/AGENTS.md b/UnityProjects/LeadingEdge/AGENTS.md new file mode 100644 index 0000000..4dca213 --- /dev/null +++ b/UnityProjects/LeadingEdge/AGENTS.md @@ -0,0 +1,28 @@ +# LeadingEdge test project + +A Unity project that tracks the newest Unity version (currently 6000.6.0b3) and is updated proactively so UnityDataTools can be tested against the latest build features - for example Content Directory builds and serialized `Dictionary<,>` fields. + +Its build scripts produce the reference output checked in at `TestCommon/Data/LeadingEdgeBuilds` (see that folder's `AGENTS.md`). To update it, rebuild with the scripts below and check in the results. + +## Assets + +Both builds start from a root ScriptableObject whose serialized dictionary maps names to other ScriptableObjects in the project. The referenced assets cover two scenarios: + +1. **AudioClip references.** ScriptableObjects reference the project's two mp3 files. `a.mp3` is referenced from two different ScriptableObjects and `6.mp3` from one, demonstrating that all referenced content is included in the build exactly once, with no duplication. +2. **`SerializationDemo` asset.** A ScriptableObject with fields of many types, including a `[SerializeReference]` field. Useful for testing the `dump` command and for inspecting serialized field values directly. + +## Editor scripts (`Assets/Editor`, `ContentDirectory` menu) + +* `GenerateAssets.cs` - creates the ScriptableObject assets in `Assets/ScriptableObjects`, populating the serialized dictionaries before saving so the entries are serialized into the assets. +* `BuildAssetBundles.cs` - runs the AssetBundle build and copies its build report. +* `BuildContentDirectory.cs` - runs the Content Directory build and copies its build report folder. + +Both build scripts write directly into `TestCommon/Data/LeadingEdgeBuilds` using paths relative to the project root. + +## Content Directory Build + +The root asset is `ContentDirectoryRoot.asset`. It directly references the `LoadableAudioClipReference` assets, so those are loaded automatically when the content directory is registered. The AudioClips themselves are referenced through `Loadable`, so they are included in the build but loaded only on demand. + +## AssetBundle Build + +The root asset is `AssetBundleRoot.asset`. AssetBundles do not support `Loadable`, so this build uses the direct-reference variants of the assets instead. Each asset is placed in its own bundle (named after the asset) - a highly granular layout that guarantees no content is duplicated across bundles. diff --git a/UnityProjects/LeadingEdge/Assets/Audio.meta b/UnityProjects/LeadingEdge/Assets/Audio.meta new file mode 100644 index 0000000..190a545 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/Audio.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a1cf86fc18d360f469df4c88f1d52aa2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProjects/LeadingEdge/Assets/Audio/6.mp3 b/UnityProjects/LeadingEdge/Assets/Audio/6.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9cd46ce1f937a8986870be1f72f8affae6ebab02 GIT binary patch literal 39694 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 Jkp4>q{R`6{z!Cre literal 0 HcmV?d00001 diff --git a/UnityProjects/LeadingEdge/Assets/Audio/a.mp3.meta b/UnityProjects/LeadingEdge/Assets/Audio/a.mp3.meta new file mode 100644 index 0000000..ef181d2 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/Audio/a.mp3.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b65a7916245593b4e89f4bd0aa920533 diff --git a/UnityProjects/LeadingEdge/Assets/Editor.meta b/UnityProjects/LeadingEdge/Assets/Editor.meta new file mode 100644 index 0000000..a4e60e5 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7cb3862195daf7749a91f2f549934213 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProjects/LeadingEdge/Assets/Editor/BuildAssetBundles.cs b/UnityProjects/LeadingEdge/Assets/Editor/BuildAssetBundles.cs new file mode 100644 index 0000000..b2b3f04 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/Editor/BuildAssetBundles.cs @@ -0,0 +1,73 @@ +using System.Collections.Generic; +using System.IO; +using UnityEditor; +using UnityEngine; + +// Builds AssetBundles directly into the checked-in reference data under TestCommon. Every asset gets its own bundle +// (named after its filename): the AssetBundleRoot, both DirectAudioClipReference assets, and each mp3 in +// Assets/Audio. This highly granular layout ensures no asset is duplicated across bundles - shared assets +// (e.g. a.mp3) live in a single bundle that the others depend on. The build report is copied alongside the output. +public static class BuildAssetBundles +{ + const string AudioFolder = "Assets/Audio"; + + // Relative to the project root, which is the working directory when the build runs. + const string TestDataFolder = "../../TestCommon/Data/LeadingEdgeBuilds"; + const string OutputFolder = TestDataFolder + "/AssetBundles"; + const string BuildReportFolder = TestDataFolder + "/BuildReport-AssetBundles"; + + static readonly string[] DirectAssets = + { + "Assets/ScriptableObjects/AssetBundleRoot.asset", + "Assets/ScriptableObjects/DirectAudioClipReference.asset", + "Assets/ScriptableObjects/SingleAudioClipDirectReference.asset", + "Assets/ScriptableObjects/SerializationDemo.asset" + }; + + [MenuItem("ContentDirectory/Build AssetBundles")] + public static void Build() + { + Directory.CreateDirectory(OutputFolder); + + var bundles = new List(); + + foreach (var assetPath in DirectAssets) + { + bundles.Add(new AssetBundleBuild + { + assetBundleName = Path.GetFileNameWithoutExtension(assetPath), + assetNames = new[] { assetPath } + }); + } + + foreach (var guid in AssetDatabase.FindAssets("t:AudioClip", new[] { AudioFolder })) + { + var path = AssetDatabase.GUIDToAssetPath(guid); + bundles.Add(new AssetBundleBuild + { + assetBundleName = Path.GetFileNameWithoutExtension(path), + assetNames = new[] { path } + }); + } + + var parameters = new BuildAssetBundlesParameters + { + outputPath = OutputFolder, + bundleDefinitions = bundles.ToArray(), + options = BuildAssetBundleOptions.None, + targetPlatform = EditorUserBuildSettings.activeBuildTarget + }; + + var manifest = BuildPipeline.BuildAssetBundles(parameters); + if (manifest == null) + { + Debug.LogError("BuildAssetBundles: build failed."); + return; + } + + Directory.CreateDirectory(BuildReportFolder); + File.Copy("Library/LastBuild.buildreport", $"{BuildReportFolder}/LastBuild.buildreport", true); + + Debug.Log($"BuildAssetBundles: built {manifest.GetAllAssetBundles().Length} bundles into {OutputFolder}."); + } +} diff --git a/UnityProjects/LeadingEdge/Assets/Editor/BuildAssetBundles.cs.meta b/UnityProjects/LeadingEdge/Assets/Editor/BuildAssetBundles.cs.meta new file mode 100644 index 0000000..634389c --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/Editor/BuildAssetBundles.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8a17ff4e0f494744088d941d5b087b5f \ No newline at end of file diff --git a/UnityProjects/LeadingEdge/Assets/Editor/BuildContentDirectory.cs b/UnityProjects/LeadingEdge/Assets/Editor/BuildContentDirectory.cs new file mode 100644 index 0000000..a57f4b7 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/Editor/BuildContentDirectory.cs @@ -0,0 +1,67 @@ +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEditor.Build.Reporting; +using UnityEngine; + +// Builds a Content Directory directly into the checked-in reference data under TestCommon, using +// ContentDirectoryRoot.asset as the root. ContentDirectoryRoot directly references the two +// LoadableAudioClipReference assets, so those are loaded automatically when the content directory is registered. +// The AudioClips themselves are referenced through Loadable, so they are included in the build but only +// loaded on demand, not at registration. The build report folder is copied alongside the output. +public static class BuildContentDirectory +{ + const string RootAsset = "Assets/ScriptableObjects/ContentDirectoryRoot.asset"; + + // Relative to the project root, which is the working directory when the build runs. + const string TestDataFolder = "../../TestCommon/Data/LeadingEdgeBuilds"; + const string OutputFolder = TestDataFolder + "/ContentDirectory"; + const string BuildReportFolder = TestDataFolder + "/BuildReport-ContentDirectory"; + + [MenuItem("ContentDirectory/Build Content Directory")] + public static void Build() + { + var parameters = new BuildContentDirectoryParameters + { + outputPath = OutputFolder, + rootAssetPaths = new[] { RootAsset }, + options = BuildContentOptions.CleanBuildCache, + compression = BuildCompression.Uncompressed + }; + + var report = BuildPipeline.BuildContentDirectory(parameters); + if (report.summary.result != BuildResult.Succeeded) + { + Debug.LogError($"BuildContentDirectory: failed with result {report.summary.result}."); + return; + } + + CopyLatestBuildReport(); + + Debug.Log($"BuildContentDirectory: succeeded, output in {OutputFolder}."); + } + + // The content directory build writes its report (including ContentLayout.json) to a timestamped folder under + // Library/BuildHistory. Mirror the most recent one into the checked-in reference data. + static void CopyLatestBuildReport() + { + var latest = new DirectoryInfo("Library/BuildHistory") + .GetDirectories() + .OrderByDescending(d => d.CreationTimeUtc) + .First(); + + if (Directory.Exists(BuildReportFolder)) + Directory.Delete(BuildReportFolder, true); + + CopyDirectory(latest.FullName, BuildReportFolder); + } + + static void CopyDirectory(string source, string dest) + { + Directory.CreateDirectory(dest); + foreach (var file in Directory.GetFiles(source)) + File.Copy(file, Path.Combine(dest, Path.GetFileName(file)), true); + foreach (var dir in Directory.GetDirectories(source)) + CopyDirectory(dir, Path.Combine(dest, Path.GetFileName(dir))); + } +} diff --git a/UnityProjects/LeadingEdge/Assets/Editor/BuildContentDirectory.cs.meta b/UnityProjects/LeadingEdge/Assets/Editor/BuildContentDirectory.cs.meta new file mode 100644 index 0000000..3a91b98 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/Editor/BuildContentDirectory.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 58ae5bbedc3c3294aaf7fccc63ede17a \ No newline at end of file diff --git a/UnityProjects/LeadingEdge/Assets/Editor/GenerateAssets.cs b/UnityProjects/LeadingEdge/Assets/Editor/GenerateAssets.cs new file mode 100644 index 0000000..9b7edf0 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/Editor/GenerateAssets.cs @@ -0,0 +1,78 @@ +using System.Collections.Generic; +using System.IO; +using Unity.Loading; +using UnityEditor; +using UnityEngine; + +// Generates the ScriptableObject assets used as build sources. The dictionaries are populated before the assets +// are saved, so the entries are serialized into the asset files. +// +// Leaf assets reference AudioClips (directly or via Loadable). The single-clip variants reference only a.mp3, +// which is also referenced by the all-clips variants, demonstrating an AudioClip shared between two assets. +// The root assets (DirectScriptableObjectReference) directly reference the leaf assets and act as build roots. +public static class GenerateAssets +{ + const string AudioFolder = "Assets/Audio"; + const string OutputFolder = "Assets/ScriptableObjects"; + + [MenuItem("ContentDirectory/Generate Assets")] + public static void Generate() + { + if (!AssetDatabase.IsValidFolder(OutputFolder)) + AssetDatabase.CreateFolder("Assets", "ScriptableObjects"); + + // All AudioClips keyed by filename without extension, e.g. "6.mp3" -> "6". + var allClips = new Dictionary(); + foreach (var guid in AssetDatabase.FindAssets("t:AudioClip", new[] { AudioFolder })) + { + var path = AssetDatabase.GUIDToAssetPath(guid); + allClips[Path.GetFileNameWithoutExtension(path)] = AssetDatabase.LoadAssetAtPath(path); + } + + // The single-clip assets reference only a.mp3, which is also part of the all-clips assets. + var singleClip = new Dictionary { { "a", allClips["a"] } }; + + var direct = CreateDirect("DirectAudioClipReference", allClips); + var loadable = CreateLoadable("LoadableAudioClipReference", allClips); + var singleDirect = CreateDirect("SingleAudioClipDirectReference", singleClip); + var singleLoadable = CreateLoadable("SingleAudioClipLoadableReference", singleClip); + + // Serialization demo asset, referenced from both build roots so it ends up in both build outputs. + var serializationDemo = ScriptableObject.CreateInstance(); + serializationDemo.data = new SerializationDemo.SerializedData(); + AssetDatabase.CreateAsset(serializationDemo, $"{OutputFolder}/SerializationDemo.asset"); + + CreateReference("AssetBundleRoot", direct, singleDirect, serializationDemo); + CreateReference("ContentDirectoryRoot", loadable, singleLoadable, serializationDemo); + + AssetDatabase.SaveAssets(); + + Debug.Log("GenerateAssets: created leaf reference assets and AssetBundleRoot / ContentDirectoryRoot."); + } + + static DirectAudioClipReference CreateDirect(string name, Dictionary clips) + { + var asset = ScriptableObject.CreateInstance(); + foreach (var kvp in clips) + asset.clips[kvp.Key] = kvp.Value; + AssetDatabase.CreateAsset(asset, $"{OutputFolder}/{name}.asset"); + return asset; + } + + static LoadableAudioClipReference CreateLoadable(string name, Dictionary clips) + { + var asset = ScriptableObject.CreateInstance(); + foreach (var kvp in clips) + asset.clips[kvp.Key] = new Loadable(LoadableObjectIdEditorUtility.CreateLoadableObjectId(kvp.Value)); + AssetDatabase.CreateAsset(asset, $"{OutputFolder}/{name}.asset"); + return asset; + } + + static void CreateReference(string name, params ScriptableObject[] targets) + { + var asset = ScriptableObject.CreateInstance(); + foreach (var target in targets) + asset.references[target.name] = target; + AssetDatabase.CreateAsset(asset, $"{OutputFolder}/{name}.asset"); + } +} diff --git a/UnityProjects/LeadingEdge/Assets/Editor/GenerateAssets.cs.meta b/UnityProjects/LeadingEdge/Assets/Editor/GenerateAssets.cs.meta new file mode 100644 index 0000000..efc1ecf --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/Editor/GenerateAssets.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: abda831dbbbf4c64c846c6a403f2f9f8 \ No newline at end of file diff --git a/UnityProjects/LeadingEdge/Assets/InputSystem_Actions.inputactions b/UnityProjects/LeadingEdge/Assets/InputSystem_Actions.inputactions new file mode 100644 index 0000000..1a12cb9 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/InputSystem_Actions.inputactions @@ -0,0 +1,1057 @@ +{ + "name": "InputSystem_Actions", + "maps": [ + { + "name": "Player", + "id": "df70fa95-8a34-4494-b137-73ab6b9c7d37", + "actions": [ + { + "name": "Move", + "type": "Value", + "id": "351f2ccd-1f9f-44bf-9bec-d62ac5c5f408", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Look", + "type": "Value", + "id": "6b444451-8a00-4d00-a97e-f47457f736a8", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Attack", + "type": "Button", + "id": "6c2ab1b8-8984-453a-af3d-a3c78ae1679a", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Interact", + "type": "Button", + "id": "852140f2-7766-474d-8707-702459ba45f3", + "expectedControlType": "Button", + "processors": "", + "interactions": "Hold", + "initialStateCheck": false + }, + { + "name": "Crouch", + "type": "Button", + "id": "27c5f898-bc57-4ee1-8800-db469aca5fe3", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Jump", + "type": "Button", + "id": "f1ba0d36-48eb-4cd5-b651-1c94a6531f70", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Previous", + "type": "Button", + "id": "2776c80d-3c14-4091-8c56-d04ced07a2b0", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Next", + "type": "Button", + "id": "b7230bb6-fc9b-4f52-8b25-f5e19cb2c2ba", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Sprint", + "type": "Button", + "id": "641cd816-40e6-41b4-8c3d-04687c349290", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + } + ], + "bindings": [ + { + "name": "", + "id": "978bfe49-cc26-4a3d-ab7b-7d7a29327403", + "path": "/leftStick", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "WASD", + "id": "00ca640b-d935-4593-8157-c05846ea39b3", + "path": "Dpad", + "interactions": "", + "processors": "", + "groups": "", + "action": "Move", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "e2062cb9-1b15-46a2-838c-2f8d72a0bdd9", + "path": "/w", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "up", + "id": "8180e8bd-4097-4f4e-ab88-4523101a6ce9", + "path": "/upArrow", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "320bffee-a40b-4347-ac70-c210eb8bc73a", + "path": "/s", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "1c5327b5-f71c-4f60-99c7-4e737386f1d1", + "path": "/downArrow", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "d2581a9b-1d11-4566-b27d-b92aff5fabbc", + "path": "/a", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "2e46982e-44cc-431b-9f0b-c11910bf467a", + "path": "/leftArrow", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "fcfe95b8-67b9-4526-84b5-5d0bc98d6400", + "path": "/d", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "77bff152-3580-4b21-b6de-dcd0c7e41164", + "path": "/rightArrow", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "1635d3fe-58b6-4ba9-a4e2-f4b964f6b5c8", + "path": "/{Primary2DAxis}", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "3ea4d645-4504-4529-b061-ab81934c3752", + "path": "/stick", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "c1f7a91b-d0fd-4a62-997e-7fb9b69bf235", + "path": "/rightStick", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Look", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8c8e490b-c610-4785-884f-f04217b23ca4", + "path": "/delta", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse;Touch", + "action": "Look", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "3e5f5442-8668-4b27-a940-df99bad7e831", + "path": "/{Hatswitch}", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Look", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "143bb1cd-cc10-4eca-a2f0-a3664166fe91", + "path": "/buttonWest", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "05f6913d-c316-48b2-a6bb-e225f14c7960", + "path": "/leftButton", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "886e731e-7071-4ae4-95c0-e61739dad6fd", + "path": "/primaryTouch/tap", + "interactions": "", + "processors": "", + "groups": ";Touch", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "ee3d0cd2-254e-47a7-a8cb-bc94d9658c54", + "path": "/trigger", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8255d333-5683-4943-a58a-ccb207ff1dce", + "path": "/{PrimaryAction}", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "b3c1c7f0-bd20-4ee7-a0f1-899b24bca6d7", + "path": "/enter", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "cbac6039-9c09-46a1-b5f2-4e5124ccb5ed", + "path": "/2", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Next", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "e15ca19d-e649-4852-97d5-7fe8ccc44e94", + "path": "/dpad/right", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Next", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "f2e9ba44-c423-42a7-ad56-f20975884794", + "path": "/leftShift", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Sprint", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8cbb2f4b-a784-49cc-8d5e-c010b8c7f4e6", + "path": "/leftStickPress", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Sprint", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "d8bf24bf-3f2f-4160-a97c-38ec1eb520ba", + "path": "/trigger", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "Sprint", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "eb40bb66-4559-4dfa-9a2f-820438abb426", + "path": "/space", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Jump", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "daba33a1-ad0c-4742-a909-43ad1cdfbeb6", + "path": "/buttonSouth", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Jump", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "603f3daf-40bd-4854-8724-93e8017f59e3", + "path": "/secondaryButton", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "Jump", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "1534dc16-a6aa-499d-9c3a-22b47347b52a", + "path": "/1", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Previous", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "25060bbd-a3a6-476e-8fba-45ae484aad05", + "path": "/dpad/left", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Previous", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "1c04ea5f-b012-41d1-a6f7-02e963b52893", + "path": "/e", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Interact", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "b3f66d0b-7751-423f-908b-a11c5bd95930", + "path": "/buttonNorth", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Interact", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "4f4649ac-64a8-4a73-af11-b3faef356a4d", + "path": "/buttonEast", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Crouch", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "36e52cba-0905-478e-a818-f4bfcb9f3b9a", + "path": "/c", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Crouch", + "isComposite": false, + "isPartOfComposite": false + } + ] + }, + { + "name": "UI", + "id": "272f6d14-89ba-496f-b7ff-215263d3219f", + "actions": [ + { + "name": "Navigate", + "type": "PassThrough", + "id": "c95b2375-e6d9-4b88-9c4c-c5e76515df4b", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Submit", + "type": "Button", + "id": "7607c7b6-cd76-4816-beef-bd0341cfe950", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Cancel", + "type": "Button", + "id": "15cef263-9014-4fd5-94d9-4e4a6234a6ef", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Point", + "type": "PassThrough", + "id": "32b35790-4ed0-4e9a-aa41-69ac6d629449", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Click", + "type": "PassThrough", + "id": "3c7022bf-7922-4f7c-a998-c437916075ad", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "RightClick", + "type": "PassThrough", + "id": "44b200b1-1557-4083-816c-b22cbdf77ddf", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "MiddleClick", + "type": "PassThrough", + "id": "dad70c86-b58c-4b17-88ad-f5e53adf419e", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "ScrollWheel", + "type": "PassThrough", + "id": "0489e84a-4833-4c40-bfae-cea84b696689", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "TrackedDevicePosition", + "type": "PassThrough", + "id": "24908448-c609-4bc3-a128-ea258674378a", + "expectedControlType": "Vector3", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "TrackedDeviceOrientation", + "type": "PassThrough", + "id": "9caa3d8a-6b2f-4e8e-8bad-6ede561bd9be", + "expectedControlType": "Quaternion", + "processors": "", + "interactions": "", + "initialStateCheck": false + } + ], + "bindings": [ + { + "name": "Gamepad", + "id": "809f371f-c5e2-4e7a-83a1-d867598f40dd", + "path": "2DVector", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "14a5d6e8-4aaf-4119-a9ef-34b8c2c548bf", + "path": "/leftStick/up", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "up", + "id": "9144cbe6-05e1-4687-a6d7-24f99d23dd81", + "path": "/rightStick/up", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "2db08d65-c5fb-421b-983f-c71163608d67", + "path": "/leftStick/down", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "58748904-2ea9-4a80-8579-b500e6a76df8", + "path": "/rightStick/down", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "8ba04515-75aa-45de-966d-393d9bbd1c14", + "path": "/leftStick/left", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "712e721c-bdfb-4b23-a86c-a0d9fcfea921", + "path": "/rightStick/left", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "fcd248ae-a788-4676-a12e-f4d81205600b", + "path": "/leftStick/right", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "1f04d9bc-c50b-41a1-bfcc-afb75475ec20", + "path": "/rightStick/right", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "fb8277d4-c5cd-4663-9dc7-ee3f0b506d90", + "path": "/dpad", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "Joystick", + "id": "e25d9774-381c-4a61-b47c-7b6b299ad9f9", + "path": "2DVector", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "3db53b26-6601-41be-9887-63ac74e79d19", + "path": "/stick/up", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "0cb3e13e-3d90-4178-8ae6-d9c5501d653f", + "path": "/stick/down", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "0392d399-f6dd-4c82-8062-c1e9c0d34835", + "path": "/stick/left", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "942a66d9-d42f-43d6-8d70-ecb4ba5363bc", + "path": "/stick/right", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "Keyboard", + "id": "ff527021-f211-4c02-933e-5976594c46ed", + "path": "2DVector", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "563fbfdd-0f09-408d-aa75-8642c4f08ef0", + "path": "/w", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "up", + "id": "eb480147-c587-4a33-85ed-eb0ab9942c43", + "path": "/upArrow", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "2bf42165-60bc-42ca-8072-8c13ab40239b", + "path": "/s", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "85d264ad-e0a0-4565-b7ff-1a37edde51ac", + "path": "/downArrow", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "74214943-c580-44e4-98eb-ad7eebe17902", + "path": "/a", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "cea9b045-a000-445b-95b8-0c171af70a3b", + "path": "/leftArrow", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "8607c725-d935-4808-84b1-8354e29bab63", + "path": "/d", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "4cda81dc-9edd-4e03-9d7c-a71a14345d0b", + "path": "/rightArrow", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "9e92bb26-7e3b-4ec4-b06b-3c8f8e498ddc", + "path": "*/{Submit}", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse;Gamepad;Touch;Joystick;XR", + "action": "Submit", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "82627dcc-3b13-4ba9-841d-e4b746d6553e", + "path": "*/{Cancel}", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse;Gamepad;Touch;Joystick;XR", + "action": "Cancel", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "c52c8e0b-8179-41d3-b8a1-d149033bbe86", + "path": "/position", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Point", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "e1394cbc-336e-44ce-9ea8-6007ed6193f7", + "path": "/position", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Point", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "5693e57a-238a-46ed-b5ae-e64e6e574302", + "path": "/touch*/position", + "interactions": "", + "processors": "", + "groups": "Touch", + "action": "Point", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "4faf7dc9-b979-4210-aa8c-e808e1ef89f5", + "path": "/leftButton", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8d66d5ba-88d7-48e6-b1cd-198bbfef7ace", + "path": "/tip", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "47c2a644-3ebc-4dae-a106-589b7ca75b59", + "path": "/touch*/press", + "interactions": "", + "processors": "", + "groups": "Touch", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "bb9e6b34-44bf-4381-ac63-5aa15d19f677", + "path": "/trigger", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "38c99815-14ea-4617-8627-164d27641299", + "path": "/scroll", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "ScrollWheel", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "4c191405-5738-4d4b-a523-c6a301dbf754", + "path": "/rightButton", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "RightClick", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "24066f69-da47-44f3-a07e-0015fb02eb2e", + "path": "/middleButton", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "MiddleClick", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "7236c0d9-6ca3-47cf-a6ee-a97f5b59ea77", + "path": "/devicePosition", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "TrackedDevicePosition", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "23e01e3a-f935-4948-8d8b-9bcac77714fb", + "path": "/deviceRotation", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "TrackedDeviceOrientation", + "isComposite": false, + "isPartOfComposite": false + } + ] + } + ], + "controlSchemes": [ + { + "name": "Keyboard&Mouse", + "bindingGroup": "Keyboard&Mouse", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + }, + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "Gamepad", + "bindingGroup": "Gamepad", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "Touch", + "bindingGroup": "Touch", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "Joystick", + "bindingGroup": "Joystick", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "XR", + "bindingGroup": "XR", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + } + ] +} \ No newline at end of file diff --git a/UnityProjects/LeadingEdge/Assets/InputSystem_Actions.inputactions.meta b/UnityProjects/LeadingEdge/Assets/InputSystem_Actions.inputactions.meta new file mode 100644 index 0000000..e25b7aa --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/InputSystem_Actions.inputactions.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 3590b91b4603b465dbb4216d601bff33 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 8404be70184654265930450def6a9037, type: 3} + generateWrapperCode: 0 + wrapperCodePath: + wrapperClassName: + wrapperCodeNamespace: diff --git a/UnityProjects/LeadingEdge/Assets/Scenes.meta b/UnityProjects/LeadingEdge/Assets/Scenes.meta new file mode 100644 index 0000000..0d01452 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ae1c144d04fa32e45a48bf7a7b13bd2d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProjects/LeadingEdge/Assets/Scenes/SampleScene.unity b/UnityProjects/LeadingEdge/Assets/Scenes/SampleScene.unity new file mode 100644 index 0000000..9421266 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/Scenes/SampleScene.unity @@ -0,0 +1,208 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &519420028 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 519420032} + - component: {fileID: 519420031} + - component: {fileID: 519420029} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &519420029 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519420028} + m_Enabled: 1 +--- !u!20 &519420031 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519420028} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 1 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 0 + m_HDR: 1 + m_AllowMSAA: 0 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 0 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &519420032 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519420028} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/UnityProjects/LeadingEdge/Assets/Scenes/SampleScene.unity.meta b/UnityProjects/LeadingEdge/Assets/Scenes/SampleScene.unity.meta new file mode 100644 index 0000000..c1e3c88 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/Scenes/SampleScene.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2cda990e2423bbf4892e6590ba056729 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProjects/LeadingEdge/Assets/ScriptableObjects.meta b/UnityProjects/LeadingEdge/Assets/ScriptableObjects.meta new file mode 100644 index 0000000..1fc39b6 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/ScriptableObjects.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c0a5d512ac5fd9048a54a51f4f8b9f4c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProjects/LeadingEdge/Assets/ScriptableObjects/AssetBundleRoot.asset b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/AssetBundleRoot.asset new file mode 100644 index 0000000..d71e5d0 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/AssetBundleRoot.asset @@ -0,0 +1,21 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + 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: 11500000, guid: 8623c5efbb626994da80931050f0aba0, type: 3} + m_Name: AssetBundleRoot + m_EditorClassIdentifier: Assembly-CSharp::DirectScriptableObjectReference + references: + - key: DirectAudioClipReference + value: {fileID: 11400000, guid: c58476a984dba8d4897a10b387e7bc3b, type: 2} + - key: SingleAudioClipDirectReference + value: {fileID: 11400000, guid: 0bfc83564a9c3024bb15ff70c58eef45, type: 2} + - key: SerializationDemo + value: {fileID: 11400000, guid: 78532141fd7679a458405eb16bdb75fd, type: 2} diff --git a/UnityProjects/LeadingEdge/Assets/ScriptableObjects/AssetBundleRoot.asset.meta b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/AssetBundleRoot.asset.meta new file mode 100644 index 0000000..f7582b3 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/AssetBundleRoot.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6f1eef25b4ab04141ae13066539a29cd +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProjects/LeadingEdge/Assets/ScriptableObjects/ContentDirectoryRoot.asset b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/ContentDirectoryRoot.asset new file mode 100644 index 0000000..b22f315 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/ContentDirectoryRoot.asset @@ -0,0 +1,21 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + 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: 11500000, guid: 8623c5efbb626994da80931050f0aba0, type: 3} + m_Name: ContentDirectoryRoot + m_EditorClassIdentifier: Assembly-CSharp::DirectScriptableObjectReference + references: + - key: LoadableAudioClipReference + value: {fileID: 11400000, guid: 4038ff673d390134d924b57fcbed0432, type: 2} + - key: SingleAudioClipLoadableReference + value: {fileID: 11400000, guid: 21679be819d6e9146a63bb02a7e51f2f, type: 2} + - key: SerializationDemo + value: {fileID: 11400000, guid: 78532141fd7679a458405eb16bdb75fd, type: 2} diff --git a/UnityProjects/LeadingEdge/Assets/ScriptableObjects/ContentDirectoryRoot.asset.meta b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/ContentDirectoryRoot.asset.meta new file mode 100644 index 0000000..7028107 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/ContentDirectoryRoot.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 52b43dad178849b42ac753005736e7bb +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProjects/LeadingEdge/Assets/ScriptableObjects/DirectAudioClipReference.asset b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/DirectAudioClipReference.asset new file mode 100644 index 0000000..de7ec52 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/DirectAudioClipReference.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + 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: 11500000, guid: d6330d3e9b8e5a0439e4dd147cec19dd, type: 3} + m_Name: DirectAudioClipReference + m_EditorClassIdentifier: Assembly-CSharp::DirectAudioClipReference + clips: + - key: 6 + value: {fileID: 8300000, guid: 278c261333bf8604eb5c83790d02004d, type: 3} + - key: a + value: {fileID: 8300000, guid: b65a7916245593b4e89f4bd0aa920533, type: 3} diff --git a/UnityProjects/LeadingEdge/Assets/ScriptableObjects/DirectAudioClipReference.asset.meta b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/DirectAudioClipReference.asset.meta new file mode 100644 index 0000000..89251ac --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/DirectAudioClipReference.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c58476a984dba8d4897a10b387e7bc3b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProjects/LeadingEdge/Assets/ScriptableObjects/LoadableAudioClipReference.asset b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/LoadableAudioClipReference.asset new file mode 100644 index 0000000..2cfb111 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/LoadableAudioClipReference.asset @@ -0,0 +1,21 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + 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: 11500000, guid: e747db5d2ee20ce4a9bf7f57c5b25df0, type: 3} + m_Name: LoadableAudioClipReference + m_EditorClassIdentifier: Assembly-CSharp::LoadableAudioClipReference + clips: + - key: 6 + value: + m_LoadableObjectId: {fileID: 8300000, loadable: 1, guid: 278c261333bf8604eb5c83790d02004d, type: 3} + - key: a + value: + m_LoadableObjectId: {fileID: 8300000, loadable: 1, guid: b65a7916245593b4e89f4bd0aa920533, type: 3} diff --git a/UnityProjects/LeadingEdge/Assets/ScriptableObjects/LoadableAudioClipReference.asset.meta b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/LoadableAudioClipReference.asset.meta new file mode 100644 index 0000000..b55f713 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/LoadableAudioClipReference.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4038ff673d390134d924b57fcbed0432 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProjects/LeadingEdge/Assets/ScriptableObjects/SerializationDemo.asset b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/SerializationDemo.asset new file mode 100644 index 0000000..1b1dac6 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/SerializationDemo.asset @@ -0,0 +1,36 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + 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: 11500000, guid: f44aeb02ae06dd84bb3ef76e1df8d525, type: 3} + m_Name: SerializationDemo + m_EditorClassIdentifier: Assembly-CSharp::SerializationDemo + data: + rid: 1502988012516802560 + references: + version: 2 + RefIds: + - rid: 1502988012516802560 + type: {class: SerializationDemo/SerializedData, ns: , asm: Assembly-CSharp} + data: + longValue: -1234567890123456789 + ulongValue: 12345678901234567890 + intValue: -2000000000 + uintValue: 4000000000 + shortValue: -12345 + ushortValue: 54321 + signedCharValue: -123 + unsignedCharValue: 234 + boolValue: 1 + floatValue: 3.1415927 + doubleValue: 2.718281828459045 + charValue: 90 + stringValue: SerializationDemo string value + intArray: 000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f000000100000001100000012000000130000001400000015000000160000001700000018000000190000001a0000001b0000001c0000001d0000001e0000001f000000200000002100000022000000230000002400000025000000260000002700000028000000290000002a0000002b0000002c0000002d0000002e0000002f000000300000003100000032000000330000003400000035000000360000003700000038000000390000003a0000003b0000003c0000003d0000003e0000003f000000400000004100000042000000430000004400000045000000460000004700000048000000490000004a0000004b0000004c0000004d0000004e0000004f000000500000005100000052000000530000005400000055000000560000005700000058000000590000005a0000005b0000005c0000005d0000005e0000005f000000600000006100000062000000630000006400000065000000660000006700000068000000690000006a0000006b0000006c0000006d0000006e0000006f000000700000007100000072000000730000007400000075000000760000007700000078000000790000007a0000007b0000007c0000007d0000007e0000007f000000800000008100000082000000830000008400000085000000860000008700000088000000890000008a0000008b0000008c0000008d0000008e0000008f000000900000009100000092000000930000009400000095000000960000009700000098000000990000009a0000009b0000009c0000009d0000009e0000009f000000a0000000a1000000a2000000a3000000a4000000a5000000a6000000a7000000a8000000a9000000aa000000ab000000ac000000ad000000ae000000af000000b0000000b1000000b2000000b3000000b4000000b5000000b6000000b7000000b8000000b9000000ba000000bb000000bc000000bd000000be000000bf000000c0000000c1000000c2000000c3000000c4000000c5000000c6000000c7000000c8000000c9000000ca000000cb000000cc000000cd000000ce000000cf000000d0000000d1000000d2000000d3000000d4000000d5000000d6000000d7000000d8000000d9000000da000000db000000dc000000dd000000de000000df000000e0000000e1000000e2000000e3000000e4000000e5000000e6000000e7000000e8000000e9000000ea000000eb000000ec000000ed000000ee000000ef000000f0000000f1000000f2000000f3000000f4000000f5000000f6000000f7000000f8000000f9000000fa000000fb000000fc000000fd000000fe000000ff000000000100000101000002010000030100000401000005010000060100000701000008010000090100000a0100000b0100000c0100000d0100000e0100000f010000100100001101000012010000130100001401000015010000160100001701000018010000190100001a0100001b0100001c0100001d0100001e0100001f010000200100002101000022010000230100002401000025010000260100002701000028010000290100002a0100002b0100002c0100002d0100002e0100002f010000300100003101000032010000330100003401000035010000360100003701000038010000390100003a0100003b0100003c0100003d0100003e0100003f010000400100004101000042010000430100004401000045010000460100004701000048010000490100004a0100004b0100004c0100004d0100004e0100004f010000500100005101000052010000530100005401000055010000560100005701000058010000590100005a0100005b0100005c0100005d0100005e0100005f010000600100006101000062010000630100006401000065010000660100006701000068010000690100006a0100006b0100006c0100006d0100006e0100006f010000700100007101000072010000730100007401000075010000760100007701000078010000790100007a0100007b0100007c0100007d0100007e0100007f010000800100008101000082010000830100008401000085010000860100008701000088010000890100008a0100008b0100008c0100008d0100008e0100008f010000900100009101000092010000930100009401000095010000960100009701000098010000990100009a0100009b0100009c0100009d0100009e0100009f010000a0010000a1010000a2010000a3010000a4010000a5010000a6010000a7010000a8010000a9010000aa010000ab010000ac010000ad010000ae010000af010000b0010000b1010000b2010000b3010000b4010000b5010000b6010000b7010000b8010000b9010000ba010000bb010000bc010000bd010000be010000bf010000c0010000c1010000c2010000c3010000c4010000c5010000c6010000c7010000c8010000c9010000ca010000cb010000cc010000cd010000ce010000cf010000d0010000d1010000d2010000d3010000d4010000d5010000d6010000d7010000d8010000d9010000da010000db010000dc010000dd010000de010000df010000e0010000e1010000e2010000e3010000e4010000e5010000e6010000e7010000e8010000e9010000ea010000eb010000ec010000ed010000ee010000ef010000f0010000f1010000f2010000f3010000f4010000f5010000f6010000f7010000f8010000f9010000fa010000fb010000fc010000fd010000fe010000ff010000i diff --git a/UnityProjects/LeadingEdge/Assets/ScriptableObjects/SerializationDemo.asset.meta b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/SerializationDemo.asset.meta new file mode 100644 index 0000000..783f266 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/SerializationDemo.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 78532141fd7679a458405eb16bdb75fd +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProjects/LeadingEdge/Assets/ScriptableObjects/SingleAudioClipDirectReference.asset b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/SingleAudioClipDirectReference.asset new file mode 100644 index 0000000..b75d4c7 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/SingleAudioClipDirectReference.asset @@ -0,0 +1,17 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + 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: 11500000, guid: d6330d3e9b8e5a0439e4dd147cec19dd, type: 3} + m_Name: SingleAudioClipDirectReference + m_EditorClassIdentifier: Assembly-CSharp::DirectAudioClipReference + clips: + - key: a + value: {fileID: 8300000, guid: b65a7916245593b4e89f4bd0aa920533, type: 3} diff --git a/UnityProjects/LeadingEdge/Assets/ScriptableObjects/SingleAudioClipDirectReference.asset.meta b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/SingleAudioClipDirectReference.asset.meta new file mode 100644 index 0000000..3a3739c --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/SingleAudioClipDirectReference.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0bfc83564a9c3024bb15ff70c58eef45 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProjects/LeadingEdge/Assets/ScriptableObjects/SingleAudioClipLoadableReference.asset b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/SingleAudioClipLoadableReference.asset new file mode 100644 index 0000000..ddfef90 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/SingleAudioClipLoadableReference.asset @@ -0,0 +1,18 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + 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: 11500000, guid: e747db5d2ee20ce4a9bf7f57c5b25df0, type: 3} + m_Name: SingleAudioClipLoadableReference + m_EditorClassIdentifier: Assembly-CSharp::LoadableAudioClipReference + clips: + - key: a + value: + m_LoadableObjectId: {fileID: 8300000, loadable: 1, guid: b65a7916245593b4e89f4bd0aa920533, type: 3} diff --git a/UnityProjects/LeadingEdge/Assets/ScriptableObjects/SingleAudioClipLoadableReference.asset.meta b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/SingleAudioClipLoadableReference.asset.meta new file mode 100644 index 0000000..d31efc1 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/ScriptableObjects/SingleAudioClipLoadableReference.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 21679be819d6e9146a63bb02a7e51f2f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProjects/LeadingEdge/Assets/Scripts.meta b/UnityProjects/LeadingEdge/Assets/Scripts.meta new file mode 100644 index 0000000..f0df28a --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 46f0b295c1a77cf42bf0e89b8fa690b1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProjects/LeadingEdge/Assets/Scripts/DirectAudioClipReference.cs b/UnityProjects/LeadingEdge/Assets/Scripts/DirectAudioClipReference.cs new file mode 100644 index 0000000..09cc247 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/Scripts/DirectAudioClipReference.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using UnityEngine; + +// References AudioClips through a serialized Dictionary, creating direct (strong) references. +// All referenced clips are loaded immediately when this asset is loaded. +public class DirectAudioClipReference : ScriptableObject +{ + [SerializeField] + public Dictionary clips = new Dictionary(); +} diff --git a/UnityProjects/LeadingEdge/Assets/Scripts/DirectAudioClipReference.cs.meta b/UnityProjects/LeadingEdge/Assets/Scripts/DirectAudioClipReference.cs.meta new file mode 100644 index 0000000..b0e8317 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/Scripts/DirectAudioClipReference.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d6330d3e9b8e5a0439e4dd147cec19dd \ No newline at end of file diff --git a/UnityProjects/LeadingEdge/Assets/Scripts/DirectScriptableObjectReference.cs b/UnityProjects/LeadingEdge/Assets/Scripts/DirectScriptableObjectReference.cs new file mode 100644 index 0000000..f9afb36 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/Scripts/DirectScriptableObjectReference.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using UnityEngine; + +// References other ScriptableObjects through a serialized Dictionary, creating direct (strong) references. +// Used as a root asset that aggregates several leaf reference assets. +public class DirectScriptableObjectReference : ScriptableObject +{ + [SerializeField] + public Dictionary references = new Dictionary(); +} diff --git a/UnityProjects/LeadingEdge/Assets/Scripts/DirectScriptableObjectReference.cs.meta b/UnityProjects/LeadingEdge/Assets/Scripts/DirectScriptableObjectReference.cs.meta new file mode 100644 index 0000000..d30e39d --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/Scripts/DirectScriptableObjectReference.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8623c5efbb626994da80931050f0aba0 \ No newline at end of file diff --git a/UnityProjects/LeadingEdge/Assets/Scripts/LoadableAudioClipReference.cs b/UnityProjects/LeadingEdge/Assets/Scripts/LoadableAudioClipReference.cs new file mode 100644 index 0000000..e93fcbc --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/Scripts/LoadableAudioClipReference.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using Unity.Loading; +using UnityEngine; + +// References AudioClips through a serialized Dictionary of Loadable, creating on-demand (weak) +// references. The clips are included in the build but loaded only when code requests them. +public class LoadableAudioClipReference : ScriptableObject +{ + [SerializeField] + public Dictionary> clips = new Dictionary>(); +} diff --git a/UnityProjects/LeadingEdge/Assets/Scripts/LoadableAudioClipReference.cs.meta b/UnityProjects/LeadingEdge/Assets/Scripts/LoadableAudioClipReference.cs.meta new file mode 100644 index 0000000..7890ab0 --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/Scripts/LoadableAudioClipReference.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e747db5d2ee20ce4a9bf7f57c5b25df0 \ No newline at end of file diff --git a/UnityProjects/LeadingEdge/Assets/Scripts/SerializationDemo.cs b/UnityProjects/LeadingEdge/Assets/Scripts/SerializationDemo.cs new file mode 100644 index 0000000..fe3d4af --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/Scripts/SerializationDemo.cs @@ -0,0 +1,37 @@ +using System; +using UnityEngine; + +// Reference asset exercising Unity serialization of a range of primitive types, an array and a string. +// Useful for systematically testing the UnityDataTool `dump` command against known field layout and values. +public class SerializationDemo : ScriptableObject +{ + // Held through a managed reference so the data is serialized as a referenced object rather than inline. + [SerializeReference] + public SerializedData data; + + [Serializable] + public class SerializedData + { + public long longValue = -1234567890123456789L; + public ulong ulongValue = 12345678901234567890UL; + public int intValue = -2000000000; + public uint uintValue = 4000000000U; + public short shortValue = -12345; + public ushort ushortValue = 54321; + public sbyte signedCharValue = -123; // C++ "signed char" + public byte unsignedCharValue = 234; // C++ "unsigned char" + public bool boolValue = true; + public float floatValue = 3.1415927f; + public double doubleValue = 2.718281828459045; + public char charValue = 'Z'; + public string stringValue = "SerializationDemo string value"; + public int[] intArray; + + public SerializedData() + { + intArray = new int[512]; + for (int i = 0; i < intArray.Length; i++) + intArray[i] = i; + } + } +} diff --git a/UnityProjects/LeadingEdge/Assets/Scripts/SerializationDemo.cs.meta b/UnityProjects/LeadingEdge/Assets/Scripts/SerializationDemo.cs.meta new file mode 100644 index 0000000..a890eae --- /dev/null +++ b/UnityProjects/LeadingEdge/Assets/Scripts/SerializationDemo.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f44aeb02ae06dd84bb3ef76e1df8d525 \ No newline at end of file diff --git a/UnityProjects/LeadingEdge/CLAUDE.md b/UnityProjects/LeadingEdge/CLAUDE.md new file mode 100644 index 0000000..43c994c --- /dev/null +++ b/UnityProjects/LeadingEdge/CLAUDE.md @@ -0,0 +1 @@ +@AGENTS.md From 4d0409b84538d4651e3d7f404be380702f93d526 Mon Sep 17 00:00:00 2001 From: Andrew Skowronski Date: Wed, 1 Jul 2026 10:21:40 -0400 Subject: [PATCH 2/3] Dump command tested with core numeric field types and other serialization primitives --- UnityDataTool.Tests/DumpTests.cs | 50 ++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/UnityDataTool.Tests/DumpTests.cs b/UnityDataTool.Tests/DumpTests.cs index a809eb9..a813d49 100644 --- a/UnityDataTool.Tests/DumpTests.cs +++ b/UnityDataTool.Tests/DumpTests.cs @@ -15,6 +15,7 @@ public class DumpTests private string m_MultiSerializedFileArchivePath; private string m_NoTypeTreeSerializedFilePath; private string m_NoTypeTreeArchivePath; + private string m_SerializationDemoBundlePath; [OneTimeSetUp] public void OneTimeSetup() @@ -25,6 +26,7 @@ public void OneTimeSetup() m_MultiSerializedFileArchivePath = Path.Combine(m_TestDataFolder, "PlayerDataCompressed", "data.unity3d"); m_NoTypeTreeSerializedFilePath = Path.Combine(m_TestDataFolder, "PlayerNoTypeTree", "level0"); m_NoTypeTreeArchivePath = Path.Combine(m_TestDataFolder, "AssetBundleTypeTreeVariations", "AssetBundle-NoTypeTree", "small.bundle"); + m_SerializationDemoBundlePath = Path.Combine(m_TestDataFolder, "LeadingEdgeBuilds", "AssetBundles", "serializationdemo"); } [Test] @@ -259,4 +261,52 @@ public async Task Dump_NoTypeTreeArchive_ReportsMissingTypeTreesWithoutCrashing( Assert.That(output, Does.Contain("has no TypeTrees"), "Expected a clear missing-TypeTrees message"); Assert.That(output, Does.Not.Contain("SerializedFileOpenException"), "Should not leak an exception/stack trace"); } + + // Dumps the SerializationDemo ScriptableObject from the LeadingEdge AssetBundle build and confirms the + // serialized field layout and default values (see UnityProjects/LeadingEdge/Assets/Scripts/SerializationDemo.cs). + // Uses substring checks against the pseudo-YAML text output; once JSON output is supported this can parse and + // assert more precisely. + [Test] + public async Task Dump_Stdout_AssetBundle_SerializationDemo_ContainsExpectedFields() + { + using var sw = new StringWriter(); + var currentOut = Console.Out; + try + { + Console.SetOut(sw); + Assert.AreEqual(0, await Program.Main(new string[] { "dump", m_SerializationDemoBundlePath, "--stdout", "--type", "MonoBehaviour" })); + } + finally + { + Console.SetOut(currentOut); + } + + var output = sw.ToString(); + + // The MonoBehaviour (ScriptableObject) and its SerializeReference-held data object. + Assert.That(output, Does.Contain("(ClassID: 114) MonoBehaviour")); + Assert.That(output, Does.Contain("m_Name (string) SerializationDemo")); + Assert.That(output, Does.Contain("data (managedReference)")); + Assert.That(output, Does.Contain("references (ManagedReferencesRegistry)")); + Assert.That(output, Does.Contain("class (string) SerializationDemo/SerializedData")); + + // Scalar fields: name, serialized type and value. + Assert.That(output, Does.Contain("longValue (SInt64) -1234567890123456789")); + Assert.That(output, Does.Contain("ulongValue (UInt64) 12345678901234567890")); + Assert.That(output, Does.Contain("intValue (int) -2000000000")); + Assert.That(output, Does.Contain("uintValue (unsigned int) 4000000000")); + Assert.That(output, Does.Contain("shortValue (SInt16) -12345")); + Assert.That(output, Does.Contain("ushortValue (UInt16) 54321")); + Assert.That(output, Does.Contain("signedCharValue (SInt8) -123")); + Assert.That(output, Does.Contain("unsignedCharValue (UInt8) 234")); + Assert.That(output, Does.Contain("boolValue (UInt8) 1")); + Assert.That(output, Does.Contain("floatValue (float) 3.1415927")); + Assert.That(output, Does.Contain("doubleValue (double) 2.718281828459045")); + Assert.That(output, Does.Contain("charValue (UInt16) 90")); + Assert.That(output, Does.Contain("stringValue (string) SerializationDemo string value")); + + // Int array of 512 values (0..511). Check the header and a slice of the sequence. + Assert.That(output, Does.Contain("Array[512]")); + Assert.That(output, Does.Contain("293, 294, 295, 296,")); + } } From e3046f70e128324788861cfeb180b4fa4688b65b Mon Sep 17 00:00:00 2001 From: Andrew Skowronski Date: Wed, 1 Jul 2026 11:32:15 -0400 Subject: [PATCH 3/3] [#72] Fix find-refs database open and null-ref crashes, add test coverage find-refs had no automated tests and two bugs that broke it against any current analyze database: - Issue #72: the database was opened with a hand-written connection string using the legacy System.Data.SQLite "Version=3" keyword, which Microsoft.Data.Sqlite rejects. Build the connection string with SqliteConnectionStringBuilder instead (matching SQLiteWriter). Fixed the same broken string in ExpectedDataGenerator. - A ScriptableObject is a MonoBehaviour whose m_GameObject PPtr is 0, so its game_object column is a non-null id matching no row; the game_object/script subqueries then return NULL and GetString threw. Null-check those reads. Also add a --stdout option to find-refs (mutually exclusive with -o), mirroring dump, and update command-find-refs.md. Add FindRefsTests covering both bugs, name/type lookup and disambiguation, object-id lookup, --find-all, missing objects, empty refs table, the --stdout/-o validator, and direct refs-table queries. Tests run against the LeadingEdge AssetBundle reference build. --- Documentation/command-find-refs.md | 18 +- ReferenceFinder/ReferenceFinderTool.cs | 67 ++-- UnityDataTool.Tests/ExpectedDataGenerator.cs | 3 +- UnityDataTool.Tests/FindRefsTests.cs | 315 +++++++++++++++++++ UnityDataTool/Program.cs | 23 +- 5 files changed, 389 insertions(+), 37 deletions(-) create mode 100644 UnityDataTool.Tests/FindRefsTests.cs diff --git a/Documentation/command-find-refs.md b/Documentation/command-find-refs.md index 3e44fe2..b2ec988 100644 --- a/Documentation/command-find-refs.md +++ b/Documentation/command-find-refs.md @@ -1,9 +1,9 @@ # find-refs Command -> ⚠️ **Experimental:** This command may not work as expected in all cases. - The `find-refs` command traces reference chains leading to specific objects. Use it to understand why an asset was included (and potentially duplicated) in a build. +It walks *up* the reference graph from the target object and **stops at the first asset it reaches**. The reported chains therefore end at the immediate containing asset, not at the ultimate root that transitively depends on the target. For example, if `RootAsset` references `LeafAsset` which references a texture, searching for the texture reports the chain ending at `LeafAsset`; to see that `RootAsset` pulls it in, search for `LeafAsset` instead. + ## Quick Reference ``` @@ -16,10 +16,13 @@ UnityDataTool find-refs [options] | `-i, --object-id ` | ID of object to analyze (from `id` column) | — | | `-n, --object-name ` | Name of objects to analyze | — | | `-t, --object-type ` | Type filter when using `-n` | — | -| `-o, --output-file ` | Output filename | — | +| `-o, --output-file ` | Output filename | `references.txt` | +| `--stdout` | Write the reference chains to stdout instead of a file | `false` | | `-a, --find-all` | Find all chains instead of stopping at first | `false` | > **Note:** Either `--object-id` or `--object-name` must be provided. +> +> `--stdout` and `-o/--output-file` are mutually exclusive. ## Prerequisites @@ -29,14 +32,19 @@ This command requires a database created by the [`analyze`](command-analyze.md) ## Examples -Find references to an object by name and type: +Find references to an object by name and type, printing directly to the console: +```bash +UnityDataTool find-refs my_database.db -n "MyTexture" -t "Texture2D" --stdout +``` + +Write the reference chains to a file instead: ```bash UnityDataTool find-refs my_database.db -n "MyTexture" -t "Texture2D" -o refs.txt ``` Find references to a specific object by ID: ```bash -UnityDataTool find-refs my_database.db -i 12345 -o refs.txt +UnityDataTool find-refs my_database.db -i 12345 --stdout ``` Find all duplicate references (useful for finding why an asset is duplicated): diff --git a/ReferenceFinder/ReferenceFinderTool.cs b/ReferenceFinder/ReferenceFinderTool.cs index 3c5926a..104c3bf 100644 --- a/ReferenceFinder/ReferenceFinderTool.cs +++ b/ReferenceFinder/ReferenceFinderTool.cs @@ -24,21 +24,14 @@ public class ReferenceFinderTool List m_Roots = new List(); HashSet<(long, string)> m_ProcessedObjects = new HashSet<(long, string)>(); - StreamWriter m_Writer; + TextWriter m_Writer; - public int FindReferences(string objectName, string objectType, string databasePath, string outputFile, bool findAll) + public int FindReferences(string objectName, string objectType, string databasePath, string outputFile, bool findAll, bool toStdout = false) { var objectIds = new List(); - SqliteConnection db; - - try - { - db = new SqliteConnection($"Data Source={databasePath};Version=3;Foreign Keys=False;"); - db.Open(); - } - catch (Exception e) + using var db = OpenDatabase(databasePath); + if (db == null) { - Console.WriteLine($"Error opening database: {e.Message}"); return 1; } @@ -81,33 +74,50 @@ public int FindReferences(string objectName, string objectType, string databaseP return 1; } - return FindReferences(db, outputFile, objectIds, findAll); + return FindReferences(db, outputFile, objectIds, findAll, toStdout); } - public int FindReferences(long objectId, string databasePath, string outputFile, bool findAll) + public int FindReferences(long objectId, string databasePath, string outputFile, bool findAll, bool toStdout = false) { var objectIds = new List(); - SqliteConnection db; + using var db = OpenDatabase(databasePath); + if (db == null) + { + return 1; + } + objectIds.Add(objectId); + + return FindReferences(db, outputFile, objectIds, findAll, toStdout); + } + + // Opens the analyze database for reading. Uses SqliteConnectionStringBuilder (matching SQLiteWriter) rather than a + // hand-written connection string, which used a legacy System.Data.SQLite keyword that Microsoft.Data.Sqlite rejects. + static SqliteConnection OpenDatabase(string databasePath) + { try { - db = new SqliteConnection($"Data Source={databasePath};Version=3;Foreign Keys=False;"); + var connectionString = new SqliteConnectionStringBuilder + { + DataSource = databasePath, + Mode = SqliteOpenMode.ReadOnly, + Pooling = false, + ForeignKeys = false, + }.ConnectionString; + var db = new SqliteConnection(connectionString); db.Open(); + return db; } catch (Exception e) { Console.WriteLine($"Error opening database: {e.Message}"); - return 1; + return null; } - - objectIds.Add(objectId); - - return FindReferences(db, outputFile, objectIds, findAll); } - int FindReferences(SqliteConnection db, string outputFile, IList objectIds, bool findAll) + int FindReferences(SqliteConnection db, string outputFile, IList objectIds, bool findAll, bool toStdout) { - m_Writer = new StreamWriter(outputFile); + m_Writer = toStdout ? Console.Out : new StreamWriter(outputFile); m_GetRefsCommand = db.CreateCommand(); m_GetRefsCommand.CommandText = @"SELECT object, property_path, EXISTS (SELECT * FROM assets a WHERE a.object = r.object) FROM refs r WHERE referenced_object = @id"; @@ -181,7 +191,11 @@ FROM object_view o } } - m_Writer.Close(); + // Don't close Console.Out when writing to stdout; just flush it. + if (toStdout) + m_Writer.Flush(); + else + m_Writer.Close(); return 0; } @@ -196,10 +210,13 @@ void OutputReferenceNode(ReferenceTreeNode node, string propertyPath, int indent { reader.Read(); + // game_object and script come from correlated subqueries that yield NULL when there is no matching row + // (e.g. a ScriptableObject is a MonoBehaviour whose m_GameObject PPtr is 0, or a MonoBehaviour with no + // m_Script reference), so both must be null-checked. var objectType = reader.GetString(0); var objectName = reader.GetString(1); - var gameObject = reader.GetString(2); - var script = reader.GetString(3); + var gameObject = reader.IsDBNull(2) ? "" : reader.GetString(2); + var script = reader.IsDBNull(3) ? "" : reader.GetString(3); if (propertyPath != "") { diff --git a/UnityDataTool.Tests/ExpectedDataGenerator.cs b/UnityDataTool.Tests/ExpectedDataGenerator.cs index 77707c2..4963acf 100644 --- a/UnityDataTool.Tests/ExpectedDataGenerator.cs +++ b/UnityDataTool.Tests/ExpectedDataGenerator.cs @@ -30,8 +30,7 @@ public static void Generate(Context context) Program.Main(new string[] { "analyze", Path.Combine(context.UnityDataFolder), "-r" }); - using var db = new SqliteConnection($"Data Source={Path.Combine(Directory.GetCurrentDirectory(), "database.db")};Version=3;New=True;Foreign Keys=False;"); - db.Open(); + using var db = SQLTestHelper.OpenDatabase(Path.Combine(Directory.GetCurrentDirectory(), "database.db")); using (var cmd = db.CreateCommand()) { diff --git a/UnityDataTool.Tests/FindRefsTests.cs b/UnityDataTool.Tests/FindRefsTests.cs new file mode 100644 index 0000000..efc6b70 --- /dev/null +++ b/UnityDataTool.Tests/FindRefsTests.cs @@ -0,0 +1,315 @@ +using System; +using System.IO; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Microsoft.Data.Sqlite; +using NUnit.Framework; + +namespace UnityDataTools.UnityDataTool.Tests; + +#pragma warning disable NUnit2005, NUnit2006 + +// Tests for the "find-refs" command, which traces reference chains from assets to a target object using the +// refs/object_view data produced by "analyze". They run against the LeadingEdge AssetBundle build output, which has +// well-known relationships (see UnityProjects/LeadingEdge/Assets/Editor/GenerateAssets.cs): +// +// AssetBundleRoot (DirectScriptableObjectReference) +// -> DirectAudioClipReference references AudioClips "a" and "6" +// -> SingleAudioClipDirectReference references AudioClip "a" only +// -> SerializationDemo +// +// So AudioClip "a" is referenced by two assets and "6" by one, giving deterministic chain counts to assert on. +public class FindRefsTests +{ + private string m_AssetBundlesPath; + private string m_WorkFolder; + private string m_DatabasePath; + private string m_NoRefsDatabasePath; + + [OneTimeSetUp] + public async Task OneTimeSetup() + { + var testDataFolder = Path.Combine(TestContext.CurrentContext.TestDirectory, "Data"); + m_AssetBundlesPath = Path.Combine(testDataFolder, "LeadingEdgeBuilds", "AssetBundles"); + + m_WorkFolder = Path.Combine(TestContext.CurrentContext.TestDirectory, "findrefs_test_folder"); + Directory.CreateDirectory(m_WorkFolder); + + m_DatabasePath = Path.Combine(m_WorkFolder, "refs.db"); + m_NoRefsDatabasePath = Path.Combine(m_WorkFolder, "norefs.db"); + + // A database with references (used by most tests) and one built with --skip-references (empty refs table). + Assert.AreEqual(0, await Program.Main(new[] { "analyze", m_AssetBundlesPath, "-o", m_DatabasePath }), + "analyze should succeed on the LeadingEdge AssetBundle build"); + Assert.AreEqual(0, await Program.Main(new[] { "analyze", m_AssetBundlesPath, "-o", m_NoRefsDatabasePath, "-s" }), + "analyze --skip-references should succeed"); + } + + [OneTimeTearDown] + public void OneTimeTeardown() + { + SqliteConnection.ClearAllPools(); + try + { + Directory.Delete(m_WorkFolder, true); + } + catch (Exception) + { + // Best effort cleanup; leftover files in the test output folder are harmless. + } + } + + // Runs find-refs with --stdout and captures everything it writes (both the reference chains and messages such as + // "No object found!"), returning the exit code and the combined output. + private async Task<(int exitCode, string output)> RunFindRefs(params string[] args) + { + return await RunFindRefsOn(m_DatabasePath, args); + } + + private static async Task<(int exitCode, string output)> RunFindRefsOn(string databasePath, string[] args) + { + using var sw = new StringWriter(); + var currentOut = Console.Out; + int exitCode; + try + { + Console.SetOut(sw); + var fullArgs = new string[args.Length + 3]; + fullArgs[0] = "find-refs"; + fullArgs[1] = databasePath; + Array.Copy(args, 0, fullArgs, 2, args.Length); + fullArgs[args.Length + 2] = "--stdout"; + exitCode = await Program.Main(fullArgs); + } + finally + { + Console.SetOut(currentOut); + } + + return (exitCode, sw.ToString()); + } + + // Regression test for issue #72: the command previously threw "Connection string keyword 'version' is not + // supported" when opening any analyze database. + [Test] + public async Task FindRefs_OpensAnalyzeDatabase_WithoutConnectionStringError() + { + var (exitCode, output) = await RunFindRefs("-n", "a", "-t", "AudioClip"); + + Assert.AreEqual(0, exitCode); + Assert.That(output, Does.Not.Contain("Error opening database")); + Assert.That(output, Does.Contain("Reference chains to a")); + } + + [Test] + public async Task FindRefs_ByName_AudioClipSharedByTwoAssets_FindsBothChains() + { + var (exitCode, output) = await RunFindRefs("-n", "a", "-t", "AudioClip"); + + Assert.AreEqual(0, exitCode); + Assert.That(output, Does.Contain("Type: AudioClip")); + Assert.That(output, Does.Contain("Found 2 reference chain(s).")); + + // Both referencing assets and a dictionary value property path appear. + Assert.That(output, Does.Contain("DirectAudioClipReference")); + Assert.That(output, Does.Contain("SingleAudioClipDirectReference")); + Assert.That(output, Does.Contain(".value")); + } + + [Test] + public async Task FindRefs_ByName_AudioClipReferencedOnce_FindsOneChain() + { + var (exitCode, output) = await RunFindRefs("-n", "6", "-t", "AudioClip"); + + Assert.AreEqual(0, exitCode); + Assert.That(output, Does.Contain("Found 1 reference chain(s).")); + Assert.That(output, Does.Contain("DirectAudioClipReference")); + Assert.That(output, Does.Not.Contain("SingleAudioClipDirectReference")); + } + + // "SerializationDemo" is the name of both a MonoBehaviour (the ScriptableObject) and its MonoScript, so searching + // by name alone matches two objects while adding the type narrows it to one. + [Test] + public async Task FindRefs_ByNameOnly_MatchesMonoBehaviourAndMonoScript() + { + var (exitCode, output) = await RunFindRefs("-n", "SerializationDemo"); + + Assert.AreEqual(0, exitCode); + Assert.That(output, Does.Contain("Type: MonoBehaviour")); + Assert.That(output, Does.Contain("Type: MonoScript")); + } + + [Test] + public async Task FindRefs_ByNameAndType_NarrowsToSingleObject() + { + var (exitCode, output) = await RunFindRefs("-n", "SerializationDemo", "-t", "MonoBehaviour"); + + Assert.AreEqual(0, exitCode); + Assert.That(output, Does.Contain("Type: MonoBehaviour")); + Assert.That(output, Does.Not.Contain("Type: MonoScript")); + // Referenced from the AssetBundleRoot aggregator. + Assert.That(output, Does.Contain("AssetBundleRoot")); + } + + // ScriptableObjects are MonoBehaviours whose m_GameObject PPtr is 0; the chain output must render them without + // throwing on the NULL game_object/script subquery results (a bug found while adding this coverage). + [Test] + public async Task FindRefs_ScriptableObjectChain_RendersScriptAndNoGameObject() + { + var (exitCode, output) = await RunFindRefs("-n", "a", "-t", "AudioClip"); + + Assert.AreEqual(0, exitCode); + Assert.That(output, Does.Contain("[Script = DirectAudioClipReference]")); + Assert.That(output, Does.Not.Contain("[Component of")); + } + + // find-refs reports the immediate containing asset and stops there, so searching for a leaf ScriptableObject + // asset surfaces AssetBundleRoot (which references it) as a one-hop chain. + [Test] + public async Task FindRefs_LeafAsset_ReachesAssetBundleRoot() + { + var (exitCode, output) = await RunFindRefs("-n", "DirectAudioClipReference", "-t", "MonoBehaviour"); + + Assert.AreEqual(0, exitCode); + Assert.That(output, Does.Contain("Found 1 reference chain(s).")); + Assert.That(output, Does.Contain("AssetBundleRoot")); + Assert.That(output, Does.Contain("[Script = DirectScriptableObjectReference]")); + Assert.That(output, Does.Contain("references.Array")); + } + + // The traversal stops at the first asset reached going up the graph. AudioClip "a" is referenced directly by the + // leaf ScriptableObjects, which are themselves assets, so the chains stop there and never reach AssetBundleRoot + // further up (even though AssetBundleRoot transitively depends on the clip). + [Test] + public async Task FindRefs_AudioClip_StopsAtLeafAsset_DoesNotReachAssetBundleRoot() + { + var (exitCode, output) = await RunFindRefs("-n", "a", "-t", "AudioClip"); + + Assert.AreEqual(0, exitCode); + Assert.That(output, Does.Contain("DirectAudioClipReference")); + Assert.That(output, Does.Not.Contain("AssetBundleRoot")); + } + + [Test] + public async Task FindRefs_ByObjectId_ProducesSameChainsAsByName() + { + // Look up the AudioClip "a" id, then confirm find-refs -i yields the same chains as find-refs -n. + long audioClipId; + using (var db = SQLTestHelper.OpenDatabase(m_DatabasePath)) + { + audioClipId = QueryLong(db, "SELECT id FROM object_view WHERE name = 'a' AND type = 'AudioClip'"); + } + + var (exitCode, output) = await RunFindRefs("-i", audioClipId.ToString()); + + Assert.AreEqual(0, exitCode); + Assert.That(output, Does.Contain("Reference chains to a")); + Assert.That(output, Does.Contain("Found 2 reference chain(s).")); + } + + // --find-all only differs from the default when a single asset reaches the target via more than one property path. + // In this test data the only such multi-path references come from AssetBundle bookkeeping objects (m_PreloadTable + // plus m_Container), which are dropped because they are neither assets nor referenced by anything - so the + // reference chains are identical and only the "Analyzed N object(s)" counter differs. + [Test] + public async Task FindRefs_FindAll_ProducesSameChainsAsDefault() + { + var (defExit, defOut) = await RunFindRefs("-n", "a", "-t", "AudioClip"); + var (allExit, allOut) = await RunFindRefs("-n", "a", "-t", "AudioClip", "-a"); + + Assert.AreEqual(0, defExit); + Assert.AreEqual(0, allExit); + Assert.That(allOut, Does.Contain("Found 2 reference chain(s).")); + + string StripAnalyzedCount(string s) => Regex.Replace(s, @"Analyzed \d+ object\(s\)\.", "Analyzed N object(s)."); + Assert.AreEqual(StripAnalyzedCount(defOut), StripAnalyzedCount(allOut), + "find-all should produce the same chains as the default for this data"); + } + + [Test] + public async Task FindRefs_NonExistentObject_ReportsNotFound() + { + var (exitCode, output) = await RunFindRefs("-n", "ThisObjectDoesNotExist"); + + Assert.AreNotEqual(0, exitCode); + Assert.That(output, Does.Contain("No object found!")); + } + + [Test] + public async Task FindRefs_SkipReferencesDatabase_ReportsEmptyRefsTable() + { + var (exitCode, output) = await RunFindRefsOn(m_NoRefsDatabasePath, new[] { "-n", "a", "-t", "AudioClip" }); + + Assert.AreNotEqual(0, exitCode); + Assert.That(output, Does.Contain("'refs' table empty")); + } + + [Test] + public async Task FindRefs_StdoutAndOutputFile_MutuallyExclusive() + { + using var swOut = new StringWriter(); + using var swErr = new StringWriter(); + var currentOut = Console.Out; + var currentErr = Console.Error; + int exitCode; + try + { + Console.SetOut(swOut); + Console.SetError(swErr); + exitCode = await Program.Main(new[] + { "find-refs", m_DatabasePath, "-n", "a", "-t", "AudioClip", "--stdout", "-o", "refs.txt" }); + } + finally + { + Console.SetOut(currentOut); + Console.SetError(currentErr); + } + + Assert.AreNotEqual(0, exitCode); + Assert.That(swErr.ToString(), Does.Contain("--stdout and -o/--output-file are mutually exclusive.")); + } + + // Direct checks against the refs/object_view data structures that find-refs depends on, independent of the + // command's output formatting. The refs table also holds AssetBundle bookkeeping references (m_PreloadTable, + // m_Container), so counting the asset references means restricting to the MonoBehaviour (ScriptableObject) + // referrers - which is what find-refs reports as chains. + [Test] + public void RefsTable_AudioClipReferenceCounts_MatchKnownRelationships() + { + using var db = SQLTestHelper.OpenDatabase(m_DatabasePath); + + var aId = QueryLong(db, "SELECT id FROM object_view WHERE name = 'a' AND type = 'AudioClip'"); + var sixId = QueryLong(db, "SELECT id FROM object_view WHERE name = '6' AND type = 'AudioClip'"); + + SQLTestHelper.AssertQueryInt(db, + $@"SELECT COUNT(*) FROM refs r JOIN object_view ov ON ov.id = r.object + WHERE r.referenced_object = {aId} AND ov.type = 'MonoBehaviour'", 2, + "AudioClip 'a' should be referenced by two ScriptableObjects"); + SQLTestHelper.AssertQueryInt(db, + $@"SELECT COUNT(*) FROM refs r JOIN object_view ov ON ov.id = r.object + WHERE r.referenced_object = {sixId} AND ov.type = 'MonoBehaviour'", 1, + "AudioClip '6' should be referenced by one ScriptableObject"); + } + + [Test] + public void RefsTable_DirectAudioClipReference_ReferencesBothClips() + { + using var db = SQLTestHelper.OpenDatabase(m_DatabasePath); + + // The DirectAudioClipReference asset references both AudioClips. + var count = SQLTestHelper.QueryInt(db, @" + SELECT COUNT(*) FROM refs + WHERE object = (SELECT id FROM object_view WHERE name = 'DirectAudioClipReference' AND type = 'MonoBehaviour') + AND referenced_object IN (SELECT id FROM object_view WHERE type = 'AudioClip')"); + Assert.AreEqual(2, count, "DirectAudioClipReference should reference both AudioClips"); + } + + private static long QueryLong(SqliteConnection db, string sql) + { + using var cmd = db.CreateCommand(); + cmd.CommandText = sql; + using var reader = cmd.ExecuteReader(); + Assert.IsTrue(reader.Read(), $"Query returned no rows: {sql}"); + return reader.GetInt64(0); + } +} diff --git a/UnityDataTool/Program.cs b/UnityDataTool/Program.cs index e9eb127..c8e0794 100644 --- a/UnityDataTool/Program.cs +++ b/UnityDataTool/Program.cs @@ -129,6 +129,7 @@ static Command BuildFindRefsCommand() var nOpt = new Option(aliases: new[] { "--object-name", "-n" }, description: "Object name"); var tOpt = new Option(aliases: new[] { "--object-type", "-t" }, description: "Optional object type when searching by name"); var aOpt = new Option(aliases: new[] { "--find-all", "-a" }, description: "Find all reference chains originating from the same asset (instead of only one), can be very slow"); + var stdoutOpt = new Option(aliases: new[] { "--stdout" }, description: "Write the reference chains to stdout instead of a file."); var findRefsCommand = new Command("find-refs", "Find reference chains to specified object(s).") { @@ -138,11 +139,23 @@ static Command BuildFindRefsCommand() nOpt, tOpt, iOpt, + stdoutOpt, }; + findRefsCommand.AddValidator(commandResult => + { + var stdoutResult = commandResult.FindResultFor(stdoutOpt); + var oResult = commandResult.FindResultFor(oOpt); + bool stdoutSet = stdoutResult is { IsImplicit: false }; + bool oExplicit = oResult is { IsImplicit: false }; + if (stdoutSet && oExplicit) + { + commandResult.ErrorMessage = "--stdout and -o/--output-file are mutually exclusive."; + } + }); findRefsCommand.SetHandler( - (FileInfo fi, string o, long? i, string n, string t, bool a) => Task.FromResult(HandleFindReferences(fi, o, i, n, t, a)), - pathArg, oOpt, iOpt, nOpt, tOpt, aOpt); + (FileInfo fi, string o, long? i, string n, string t, bool a, bool toStdout) => Task.FromResult(HandleFindReferences(fi, o, i, n, t, a, toStdout)), + pathArg, oOpt, iOpt, nOpt, tOpt, aOpt, stdoutOpt); return findRefsCommand; } @@ -366,7 +379,7 @@ static int HandleAnalyze( }); } - static int HandleFindReferences(FileInfo databasePath, string outputFile, long? objectId, string objectName, string objectType, bool findAll) + static int HandleFindReferences(FileInfo databasePath, string outputFile, long? objectId, string objectName, string objectType, bool findAll, bool toStdout) { var finder = new ReferenceFinderTool(); @@ -378,11 +391,11 @@ static int HandleFindReferences(FileInfo databasePath, string outputFile, long? if (objectId != null) { - return finder.FindReferences(objectId.Value, databasePath.FullName, outputFile, findAll); + return finder.FindReferences(objectId.Value, databasePath.FullName, outputFile, findAll, toStdout); } else { - return finder.FindReferences(objectName, objectType, databasePath.FullName, outputFile, findAll); + return finder.FindReferences(objectName, objectType, databasePath.FullName, outputFile, findAll, toStdout); } }