diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 000000000..0eefc5599 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,31 @@ +{ + "permissions": { + "allow": [ + "mcp__UnityMCP__read_console", + "mcp__UnityMCP__find_gameobjects", + "mcp__UnityMCP__find_in_file", + "mcp__UnityMCP__get_sha", + "mcp__UnityMCP__get_test_job", + "mcp__UnityMCP__unity_docs", + "mcp__UnityMCP__unity_reflect", + "mcp__UnityMCP__validate_script", + "mcp__UnityMCP__debug_request_context", + "mcp__UnityMCP__manage_script_capabilities", + "Bash(git status:*)", + "Bash(git diff:*)", + "Bash(git log:*)", + "Bash(git show:*)", + "Bash(git branch:*)", + "Bash(git add:*)", + "Bash(git commit:*)" + ], + "deny": [ + "Bash(rm -rf:*)", + "Bash(rm -fr:*)", + "Bash(git reset --hard:*)", + "Bash(git push --force:*)", + "Bash(git push -f:*)", + "Bash(git clean -fd:*)" + ] + } +} diff --git a/.gitignore b/.gitignore index e77622b95..89c074d80 100644 --- a/.gitignore +++ b/.gitignore @@ -105,3 +105,17 @@ InitTestScene*.unity* # Auto-generated scenes by play mode tests /[Aa]ssets/[Ii]nit[Tt]est[Ss]cene*.unity* + +# DOTS / Entities subscene baking cache (regenerated by the bake pipeline) +/[Aa]ssets/SceneDependencyCache/ +/[Aa]ssets/SceneDependencyCache.meta + +# macOS +.DS_Store + +# Claude Code — share settings.json, keep local overrides machine-local +.claude/settings.local.json + +# Obsidian — share vault config, ignore per-machine UI/workspace state +[Dd]ocs/[Vv]ault/.obsidian/workspace.json +[Dd]ocs/[Vv]ault/.obsidian/workspace-mobile.json diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 000000000..c6e08bcc6 --- /dev/null +++ b/.mcp.json @@ -0,0 +1,17 @@ +{ + "mcpServers": { + "basic-memory": { + "command": "uvx", + "args": ["basic-memory", "mcp"] + }, + "serena": { + "command": "uvx", + "args": [ + "--from", "git+https://github.com/oraios/serena", + "serena", "start-mcp-server", + "--context", "ide-assistant", + "--project", "${CLAUDE_PROJECT_DIR}" + ] + } + } +} diff --git a/Assets/Plugins.meta b/Assets/Plugins.meta new file mode 100644 index 000000000..47e72462a --- /dev/null +++ b/Assets/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c44f15acbc41d4764a00ec2b3fd5f834 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Roslyn.meta b/Assets/Plugins/Roslyn.meta new file mode 100644 index 000000000..3aaa01dfd --- /dev/null +++ b/Assets/Plugins/Roslyn.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e3978628240fb4ce49274c7f75b3a8af +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Roslyn/Microsoft.CodeAnalysis.CSharp.dll b/Assets/Plugins/Roslyn/Microsoft.CodeAnalysis.CSharp.dll new file mode 100644 index 000000000..4a1c0ed6a --- /dev/null +++ b/Assets/Plugins/Roslyn/Microsoft.CodeAnalysis.CSharp.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81b578b15e4a3f2ba928fab9d014e9fad6b885fa25a2a7e6176beda937588764 +size 7021856 diff --git a/Assets/Plugins/Roslyn/Microsoft.CodeAnalysis.CSharp.dll.meta b/Assets/Plugins/Roslyn/Microsoft.CodeAnalysis.CSharp.dll.meta new file mode 100644 index 000000000..cc947fe44 --- /dev/null +++ b/Assets/Plugins/Roslyn/Microsoft.CodeAnalysis.CSharp.dll.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 855e02ee0efda4425adb9e89d837c252 \ No newline at end of file diff --git a/Assets/Plugins/Roslyn/Microsoft.CodeAnalysis.dll b/Assets/Plugins/Roslyn/Microsoft.CodeAnalysis.dll new file mode 100644 index 000000000..17196b98a --- /dev/null +++ b/Assets/Plugins/Roslyn/Microsoft.CodeAnalysis.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8aef0aaec005c7c9c246669d35575c6075bd876f3095ef06fb07fee7df43b61 +size 4986664 diff --git a/Assets/Plugins/Roslyn/Microsoft.CodeAnalysis.dll.meta b/Assets/Plugins/Roslyn/Microsoft.CodeAnalysis.dll.meta new file mode 100644 index 000000000..2f1309013 --- /dev/null +++ b/Assets/Plugins/Roslyn/Microsoft.CodeAnalysis.dll.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0418c1059cea74e319a3b91ad3f3f9ef \ No newline at end of file diff --git a/Assets/Plugins/Roslyn/System.Collections.Immutable.dll b/Assets/Plugins/Roslyn/System.Collections.Immutable.dll new file mode 100644 index 000000000..dd91140c6 --- /dev/null +++ b/Assets/Plugins/Roslyn/System.Collections.Immutable.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b1b1c83ba3d135c2fdfe425842fbe9c7432878b7e468623acb554c69b4c130f +size 252680 diff --git a/Assets/Plugins/Roslyn/System.Collections.Immutable.dll.meta b/Assets/Plugins/Roslyn/System.Collections.Immutable.dll.meta new file mode 100644 index 000000000..3f79ed195 --- /dev/null +++ b/Assets/Plugins/Roslyn/System.Collections.Immutable.dll.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5c156ec5221b649f6bfda72adfc4c683 \ No newline at end of file diff --git a/Assets/Plugins/Roslyn/System.Reflection.Metadata.dll b/Assets/Plugins/Roslyn/System.Reflection.Metadata.dll new file mode 100644 index 000000000..276168044 --- /dev/null +++ b/Assets/Plugins/Roslyn/System.Reflection.Metadata.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:55ef768ffa305de58e38e15420669258b16f420618eb1f702bddb30e5c797961 +size 487696 diff --git a/Assets/Plugins/Roslyn/System.Reflection.Metadata.dll.meta b/Assets/Plugins/Roslyn/System.Reflection.Metadata.dll.meta new file mode 100644 index 000000000..142a6cd22 --- /dev/null +++ b/Assets/Plugins/Roslyn/System.Reflection.Metadata.dll.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 954700a0df695454a8a03d2afef026c2 \ No newline at end of file diff --git a/Assets/Plugins/Roslyn/System.Runtime.CompilerServices.Unsafe.dll b/Assets/Plugins/Roslyn/System.Runtime.CompilerServices.Unsafe.dll new file mode 100644 index 000000000..a7af8db9d --- /dev/null +++ b/Assets/Plugins/Roslyn/System.Runtime.CompilerServices.Unsafe.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01748200f2400c742aa689f1f5101bd6298efdfd92c00c18f4fa473847235ba9 +size 18024 diff --git a/Assets/Plugins/Roslyn/System.Runtime.CompilerServices.Unsafe.dll.meta b/Assets/Plugins/Roslyn/System.Runtime.CompilerServices.Unsafe.dll.meta new file mode 100644 index 000000000..c63db4147 --- /dev/null +++ b/Assets/Plugins/Roslyn/System.Runtime.CompilerServices.Unsafe.dll.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 424b2cc358689428aa8226a2f6a9bd61 \ No newline at end of file diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity index 1c63aa8de..482a87133 100644 --- a/Assets/Scenes/SampleScene.unity +++ b/Assets/Scenes/SampleScene.unity @@ -38,12 +38,12 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.18028378, g: 0.22571412, b: 0.30692285, a: 1} m_UseRadianceAmbientProbe: 0 --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 12 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 m_GISettings: serializedVersion: 2 m_BounceScale: 1 @@ -248,14 +248,14 @@ MonoBehaviour: m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} m_RequiresDepthTexture: 0 m_RequiresColorTexture: 0 - m_Version: 2 m_TaaSettings: - quality: 3 - frameInfluence: 0.1 - jitterScale: 1 - mipBias: 0 - varianceClampScale: 0.9 - contrastAdaptiveSharpening: 0 + m_Quality: 3 + m_FrameInfluence: 0.1 + m_JitterScale: 1 + m_MipBias: 0 + m_VarianceClampScale: 0.9 + m_ContrastAdaptiveSharpening: 0 + m_Version: 2 --- !u!1 &410087039 GameObject: m_ObjectHideFlags: 0 @@ -282,14 +282,14 @@ Light: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 410087039} m_Enabled: 1 - serializedVersion: 11 + serializedVersion: 13 m_Type: 1 m_Color: {r: 1, g: 1, b: 1, a: 1} m_Intensity: 2 m_Range: 10 m_SpotAngle: 30 m_InnerSpotAngle: 21.80208 - m_CookieSize: 10 + m_CookieSize2D: {x: 10, y: 10} m_Shadows: m_Type: 2 m_Resolution: -1 @@ -334,8 +334,11 @@ Light: m_UseBoundingSphereOverride: 0 m_UseViewFrustumForShadowCasterCull: 1 m_ForceVisible: 0 - m_ShadowRadius: 0 + m_ShapeRadius: 0 m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 --- !u!4 &410087041 Transform: m_ObjectHideFlags: 0 @@ -363,17 +366,23 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3} m_Name: m_EditorClassIdentifier: - m_Version: 3 m_UsePipelineSettings: 1 m_AdditionalLightsShadowResolutionTier: 2 - m_LightLayerMask: 1 - m_RenderingLayers: 1 m_CustomShadowLayers: 0 - m_ShadowLayerMask: 1 - m_ShadowRenderingLayers: 1 m_LightCookieSize: {x: 1, y: 1} m_LightCookieOffset: {x: 0, y: 0} m_SoftShadowQuality: 1 + m_RenderingLayersMask: + serializedVersion: 0 + m_Bits: 1 + m_ShadowRenderingLayersMask: + serializedVersion: 0 + m_Bits: 1 + m_Version: 4 + m_LightLayerMask: 1 + m_ShadowLayerMask: 1 + m_RenderingLayers: 1 + m_ShadowRenderingLayers: 1 --- !u!1 &832575517 GameObject: m_ObjectHideFlags: 0 @@ -423,6 +432,59 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1314640898 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1314640900} + - component: {fileID: 1314640899} + m_Layer: 0 + m_Name: GameplaySubScene + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1314640899 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1314640898} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45a335734b1572644a6a5d09d87adc65, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.Scenes::Unity.Scenes.SubScene + _SceneAsset: {fileID: 102900000, guid: 9dc8ce2e486074792932d618c976e312, type: 3} + _HierarchyColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + AutoLoadScene: 1 + _SceneGUID: + Value: + x: 3807153369 + y: 2538014340 + z: 2171413394 + w: 557737884 +--- !u!4 &1314640900 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1314640898} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1660057539 &9223372036854775807 SceneRoots: m_ObjectHideFlags: 0 @@ -430,3 +492,4 @@ SceneRoots: - {fileID: 330585546} - {fileID: 410087041} - {fileID: 832575519} + - {fileID: 1314640900} diff --git a/Assets/Settings/Mobile_RPAsset.asset b/Assets/Settings/Mobile_RPAsset.asset index 7ceffe7ad..4ccfb7082 100644 --- a/Assets/Settings/Mobile_RPAsset.asset +++ b/Assets/Settings/Mobile_RPAsset.asset @@ -12,8 +12,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3} m_Name: Mobile_RPAsset m_EditorClassIdentifier: - k_AssetVersion: 12 - k_AssetPreviousVersion: 12 + k_AssetVersion: 13 + k_AssetPreviousVersion: 13 m_RendererType: 1 m_RendererData: {fileID: 0} m_RendererDataList: @@ -53,6 +53,7 @@ MonoBehaviour: m_AdditionalLightsShadowResolutionTierHigh: 1024 m_ReflectionProbeBlending: 1 m_ReflectionProbeBoxProjection: 1 + m_ReflectionProbeAtlas: 1 m_ShadowDistance: 50 m_ShadowCascadeCount: 1 m_Cascade2Split: 0.25 @@ -78,11 +79,11 @@ MonoBehaviour: m_UseAdaptivePerformance: 1 m_ColorGradingMode: 0 m_ColorGradingLutSize: 32 + m_AllowPostProcessAlphaOutput: 0 m_UseFastSRGBLinearConversion: 1 m_SupportDataDrivenLensFlare: 1 m_SupportScreenSpaceLensFlare: 1 m_GPUResidentDrawerMode: 0 - m_UseLegacyLightmaps: 0 m_SmallMeshScreenPercentage: 0 m_GPUResidentDrawerEnableOcclusionCullingInCameras: 0 m_ShadowType: 1 @@ -109,6 +110,7 @@ MonoBehaviour: m_PrefilterDebugKeywords: 1 m_PrefilterWriteRenderingLayers: 1 m_PrefilterHDROutput: 1 + m_PrefilterAlphaOutput: 0 m_PrefilterSSAODepthNormals: 1 m_PrefilterSSAOSourceDepthLow: 1 m_PrefilterSSAOSourceDepthMedium: 0 @@ -126,8 +128,15 @@ MonoBehaviour: m_PrefilterSoftShadowsQualityHigh: 1 m_PrefilterSoftShadows: 0 m_PrefilterScreenCoord: 1 + m_PrefilterScreenSpaceIrradiance: 0 m_PrefilterNativeRenderPass: 1 m_PrefilterUseLegacyLightmaps: 0 + m_PrefilterBicubicLightmapSampling: 0 + m_PrefilterReflectionProbeRotation: 0 + m_PrefilterReflectionProbeBlending: 0 + m_PrefilterReflectionProbeBoxProjection: 0 + m_PrefilterReflectionProbeAtlas: 0 + m_PrefilterPointSamplingUpsampling: 0 m_ShaderVariantLogLevel: 0 m_ShadowCascades: 0 m_Textures: diff --git a/Assets/Settings/PC_RPAsset.asset b/Assets/Settings/PC_RPAsset.asset index 8b30a060d..d918ef6de 100644 --- a/Assets/Settings/PC_RPAsset.asset +++ b/Assets/Settings/PC_RPAsset.asset @@ -12,8 +12,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3} m_Name: PC_RPAsset m_EditorClassIdentifier: - k_AssetVersion: 12 - k_AssetPreviousVersion: 12 + k_AssetVersion: 13 + k_AssetPreviousVersion: 13 m_RendererType: 1 m_RendererData: {fileID: 0} m_RendererDataList: @@ -53,6 +53,7 @@ MonoBehaviour: m_AdditionalLightsShadowResolutionTierHigh: 1024 m_ReflectionProbeBlending: 1 m_ReflectionProbeBoxProjection: 1 + m_ReflectionProbeAtlas: 1 m_ShadowDistance: 50 m_ShadowCascadeCount: 4 m_Cascade2Split: 0.25 @@ -78,11 +79,11 @@ MonoBehaviour: m_UseAdaptivePerformance: 1 m_ColorGradingMode: 0 m_ColorGradingLutSize: 32 + m_AllowPostProcessAlphaOutput: 0 m_UseFastSRGBLinearConversion: 0 m_SupportDataDrivenLensFlare: 1 m_SupportScreenSpaceLensFlare: 1 m_GPUResidentDrawerMode: 0 - m_UseLegacyLightmaps: 0 m_SmallMeshScreenPercentage: 0 m_GPUResidentDrawerEnableOcclusionCullingInCameras: 0 m_ShadowType: 1 @@ -109,6 +110,7 @@ MonoBehaviour: m_PrefilterDebugKeywords: 1 m_PrefilterWriteRenderingLayers: 0 m_PrefilterHDROutput: 1 + m_PrefilterAlphaOutput: 0 m_PrefilterSSAODepthNormals: 0 m_PrefilterSSAOSourceDepthLow: 1 m_PrefilterSSAOSourceDepthMedium: 1 @@ -126,8 +128,15 @@ MonoBehaviour: m_PrefilterSoftShadowsQualityHigh: 0 m_PrefilterSoftShadows: 0 m_PrefilterScreenCoord: 1 + m_PrefilterScreenSpaceIrradiance: 0 m_PrefilterNativeRenderPass: 1 m_PrefilterUseLegacyLightmaps: 0 + m_PrefilterBicubicLightmapSampling: 0 + m_PrefilterReflectionProbeRotation: 0 + m_PrefilterReflectionProbeBlending: 0 + m_PrefilterReflectionProbeBoxProjection: 0 + m_PrefilterReflectionProbeAtlas: 0 + m_PrefilterPointSamplingUpsampling: 0 m_ShaderVariantLogLevel: 0 m_ShadowCascades: 0 m_Textures: diff --git a/Assets/_Project.meta b/Assets/_Project.meta new file mode 100644 index 000000000..7ed8764ad --- /dev/null +++ b/Assets/_Project.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 91d97bacd64f4470681e90c016d7bd67 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Scripts.meta b/Assets/_Project/Scripts.meta new file mode 100644 index 000000000..755e5591e --- /dev/null +++ b/Assets/_Project/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: eac3f5ab514a741ff9af8d4891f18ed4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Scripts/Authoring.meta b/Assets/_Project/Scripts/Authoring.meta new file mode 100644 index 000000000..358a7e49f --- /dev/null +++ b/Assets/_Project/Scripts/Authoring.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1d1aa4405eacf4870a4a196c1003df87 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Scripts/Authoring/ProjectM.Authoring.asmdef b/Assets/_Project/Scripts/Authoring/ProjectM.Authoring.asmdef new file mode 100644 index 000000000..c6a2bf4ab --- /dev/null +++ b/Assets/_Project/Scripts/Authoring/ProjectM.Authoring.asmdef @@ -0,0 +1,19 @@ +{ + "name": "ProjectM.Authoring", + "rootNamespace": "ProjectM.Authoring", + "references": [ + "ProjectM.Simulation", + "Unity.Entities", + "Unity.Mathematics", + "Unity.NetCode" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": true, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} diff --git a/Assets/_Project/Scripts/Authoring/ProjectM.Authoring.asmdef.meta b/Assets/_Project/Scripts/Authoring/ProjectM.Authoring.asmdef.meta new file mode 100644 index 000000000..54f072dd3 --- /dev/null +++ b/Assets/_Project/Scripts/Authoring/ProjectM.Authoring.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 58fe4442d47fb4ab1a1de5ec2fa1bc4a +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Scripts/Client.meta b/Assets/_Project/Scripts/Client.meta new file mode 100644 index 000000000..57518ba6d --- /dev/null +++ b/Assets/_Project/Scripts/Client.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ea6b9bcd5e8084ceca808056442d4634 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Scripts/Client/ProjectM.Client.asmdef b/Assets/_Project/Scripts/Client/ProjectM.Client.asmdef new file mode 100644 index 000000000..b1e4a96e2 --- /dev/null +++ b/Assets/_Project/Scripts/Client/ProjectM.Client.asmdef @@ -0,0 +1,22 @@ +{ + "name": "ProjectM.Client", + "rootNamespace": "ProjectM.Client", + "references": [ + "ProjectM.Simulation", + "Unity.Entities", + "Unity.Collections", + "Unity.Mathematics", + "Unity.Burst", + "Unity.NetCode", + "Unity.Entities.Graphics" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": true, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} diff --git a/Assets/_Project/Scripts/Client/ProjectM.Client.asmdef.meta b/Assets/_Project/Scripts/Client/ProjectM.Client.asmdef.meta new file mode 100644 index 000000000..2dea87343 --- /dev/null +++ b/Assets/_Project/Scripts/Client/ProjectM.Client.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6b021a17bba824c5799f8f2c87ada5e3 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Scripts/Server.meta b/Assets/_Project/Scripts/Server.meta new file mode 100644 index 000000000..270cd6e72 --- /dev/null +++ b/Assets/_Project/Scripts/Server.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 03b6366760d1f4cbc88f29039a6e70cf +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Scripts/Server/ProjectM.Server.asmdef b/Assets/_Project/Scripts/Server/ProjectM.Server.asmdef new file mode 100644 index 000000000..544fe647c --- /dev/null +++ b/Assets/_Project/Scripts/Server/ProjectM.Server.asmdef @@ -0,0 +1,21 @@ +{ + "name": "ProjectM.Server", + "rootNamespace": "ProjectM.Server", + "references": [ + "ProjectM.Simulation", + "Unity.Entities", + "Unity.Collections", + "Unity.Mathematics", + "Unity.Burst", + "Unity.NetCode" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": true, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} diff --git a/Assets/_Project/Scripts/Server/ProjectM.Server.asmdef.meta b/Assets/_Project/Scripts/Server/ProjectM.Server.asmdef.meta new file mode 100644 index 000000000..46ad575a5 --- /dev/null +++ b/Assets/_Project/Scripts/Server/ProjectM.Server.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 634384718530e45608c20d4952b5acb2 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Scripts/Simulation.meta b/Assets/_Project/Scripts/Simulation.meta new file mode 100644 index 000000000..336843617 --- /dev/null +++ b/Assets/_Project/Scripts/Simulation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 090d9f42a3883497c9be2006e4fa486f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Scripts/Simulation/GameBootstrap.cs b/Assets/_Project/Scripts/Simulation/GameBootstrap.cs new file mode 100644 index 000000000..68196117c --- /dev/null +++ b/Assets/_Project/Scripts/Simulation/GameBootstrap.cs @@ -0,0 +1,24 @@ +using Unity.Entities; +using Unity.NetCode; +using UnityEngine.Scripting; + +namespace ProjectM.Simulation +{ + /// + /// Custom Netcode for Entities bootstrap. Subclassing + /// gives an explicit hook to customize world creation, tick rate, and auto-connect. + /// For now it reproduces the default behavior: create separate client and server worlds + /// based on the Multiplayer PlayMode Tools settings, without auto-connecting. + /// + [Preserve] + public class GameBootstrap : ClientServerBootstrap + { + public override bool Initialize(string defaultWorldName) + { + // 0 = do not auto-connect; worlds are still created. Set a port later to auto-connect. + AutoConnectPort = 0; + CreateDefaultClientServerWorlds(); + return true; + } + } +} diff --git a/Assets/_Project/Scripts/Simulation/GameBootstrap.cs.meta b/Assets/_Project/Scripts/Simulation/GameBootstrap.cs.meta new file mode 100644 index 000000000..7d75012fe --- /dev/null +++ b/Assets/_Project/Scripts/Simulation/GameBootstrap.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9f727ee3d680248a8b0e2e55d234ab5f \ No newline at end of file diff --git a/Assets/_Project/Scripts/Simulation/Heartbeat.cs b/Assets/_Project/Scripts/Simulation/Heartbeat.cs new file mode 100644 index 000000000..2d4d5f113 --- /dev/null +++ b/Assets/_Project/Scripts/Simulation/Heartbeat.cs @@ -0,0 +1,13 @@ +using Unity.Entities; + +namespace ProjectM.Simulation +{ + /// + /// Trivial unmanaged component used by the setup smoke test to prove the ECS + /// compile + source-gen + tick path works. Safe to delete once real gameplay exists. + /// + public struct Heartbeat : IComponentData + { + public int Tick; + } +} diff --git a/Assets/_Project/Scripts/Simulation/Heartbeat.cs.meta b/Assets/_Project/Scripts/Simulation/Heartbeat.cs.meta new file mode 100644 index 000000000..bf809efa1 --- /dev/null +++ b/Assets/_Project/Scripts/Simulation/Heartbeat.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a0347bd6d99db438f85ec1985b7f81e1 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Simulation/HeartbeatSystem.cs b/Assets/_Project/Scripts/Simulation/HeartbeatSystem.cs new file mode 100644 index 000000000..11bf4c9c1 --- /dev/null +++ b/Assets/_Project/Scripts/Simulation/HeartbeatSystem.cs @@ -0,0 +1,23 @@ +using Unity.Burst; +using Unity.Entities; + +namespace ProjectM.Simulation +{ + /// + /// Smoke-test system: increments every once per tick. + /// Default (no [WorldSystemFilter]) so it runs in the SimulationSystemGroup of + /// every world. Burst-compiled and unmanaged () per DOTS convention. + /// + [BurstCompile] + public partial struct HeartbeatSystem : ISystem + { + [BurstCompile] + public void OnUpdate(ref SystemState state) + { + foreach (var heartbeat in SystemAPI.Query>()) + { + heartbeat.ValueRW.Tick++; + } + } + } +} diff --git a/Assets/_Project/Scripts/Simulation/HeartbeatSystem.cs.meta b/Assets/_Project/Scripts/Simulation/HeartbeatSystem.cs.meta new file mode 100644 index 000000000..e742fdef4 --- /dev/null +++ b/Assets/_Project/Scripts/Simulation/HeartbeatSystem.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 78349f49733934f348acb488689fc9ec \ No newline at end of file diff --git a/Assets/_Project/Scripts/Simulation/ProjectM.Simulation.asmdef b/Assets/_Project/Scripts/Simulation/ProjectM.Simulation.asmdef new file mode 100644 index 000000000..77795d0a7 --- /dev/null +++ b/Assets/_Project/Scripts/Simulation/ProjectM.Simulation.asmdef @@ -0,0 +1,21 @@ +{ + "name": "ProjectM.Simulation", + "rootNamespace": "ProjectM.Simulation", + "references": [ + "Unity.Entities", + "Unity.Collections", + "Unity.Mathematics", + "Unity.Burst", + "Unity.Physics", + "Unity.NetCode" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": true, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} diff --git a/Assets/_Project/Scripts/Simulation/ProjectM.Simulation.asmdef.meta b/Assets/_Project/Scripts/Simulation/ProjectM.Simulation.asmdef.meta new file mode 100644 index 000000000..ba06523a0 --- /dev/null +++ b/Assets/_Project/Scripts/Simulation/ProjectM.Simulation.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 113bb240387ed4cd397f37597898de62 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Subscenes.meta b/Assets/_Project/Subscenes.meta new file mode 100644 index 000000000..ea8a270d3 --- /dev/null +++ b/Assets/_Project/Subscenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b7f5b732d379744829318dee89eaf7bc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Subscenes/Gameplay.unity b/Assets/_Project/Subscenes/Gameplay.unity new file mode 100644 index 000000000..b44c97096 --- /dev/null +++ b/Assets/_Project/Subscenes/Gameplay.unity @@ -0,0 +1,125 @@ +%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: 10 + 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: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 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_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + 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_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 2 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + 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 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: [] diff --git a/Assets/_Project/Subscenes/Gameplay.unity.meta b/Assets/_Project/Subscenes/Gameplay.unity.meta new file mode 100644 index 000000000..9e79607cb --- /dev/null +++ b/Assets/_Project/Subscenes/Gameplay.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9dc8ce2e486074792932d618c976e312 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Tests.meta b/Assets/_Project/Tests.meta new file mode 100644 index 000000000..fa2dcb5d5 --- /dev/null +++ b/Assets/_Project/Tests.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 63a9defe75b7a4f95bbdc6993c9f0153 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Tests/EditMode.meta b/Assets/_Project/Tests/EditMode.meta new file mode 100644 index 000000000..f9b57ad97 --- /dev/null +++ b/Assets/_Project/Tests/EditMode.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0510e8296168e47ffbccd9777823a996 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Tests/EditMode/HeartbeatSystemTests.cs b/Assets/_Project/Tests/EditMode/HeartbeatSystemTests.cs new file mode 100644 index 000000000..e137c6dce --- /dev/null +++ b/Assets/_Project/Tests/EditMode/HeartbeatSystemTests.cs @@ -0,0 +1,40 @@ +using NUnit.Framework; +using Unity.Entities; +using ProjectM.Simulation; + +namespace ProjectM.Tests +{ + /// + /// Setup smoke test: proves the DOTS toolchain compiles, source-generates, and ticks. + /// Boots a bare ECS world, registers in the + /// SimulationSystemGroup, and asserts the component advances once per group update. + /// (Netcode client/server world boot is covered separately by the §3 Play Mode check.) + /// + public class HeartbeatSystemTests + { + [Test] + public void Heartbeat_Advances_Once_Per_SimulationGroup_Tick() + { + using var world = new World("HeartbeatTestWorld"); + var simulationGroup = world.GetOrCreateSystemManaged(); + var heartbeatSystem = world.GetOrCreateSystem(); + simulationGroup.AddSystemToUpdateList(heartbeatSystem); + simulationGroup.SortSystems(); + + var entityManager = world.EntityManager; + var entity = entityManager.CreateEntity(typeof(Heartbeat)); + + Assert.AreEqual(0, entityManager.GetComponentData(entity).Tick, + "Heartbeat should start at 0."); + + const int ticks = 8; + for (int i = 0; i < ticks; i++) + { + simulationGroup.Update(); + } + + Assert.AreEqual(ticks, entityManager.GetComponentData(entity).Tick, + "Heartbeat.Tick should advance exactly once per SimulationSystemGroup update."); + } + } +} diff --git a/Assets/_Project/Tests/EditMode/HeartbeatSystemTests.cs.meta b/Assets/_Project/Tests/EditMode/HeartbeatSystemTests.cs.meta new file mode 100644 index 000000000..65b0e599a --- /dev/null +++ b/Assets/_Project/Tests/EditMode/HeartbeatSystemTests.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 74e3326af426947cfaff903aa94ed9f0 \ No newline at end of file diff --git a/Assets/_Project/Tests/EditMode/ProjectM.Tests.EditMode.asmdef b/Assets/_Project/Tests/EditMode/ProjectM.Tests.EditMode.asmdef new file mode 100644 index 000000000..8b9ef0697 --- /dev/null +++ b/Assets/_Project/Tests/EditMode/ProjectM.Tests.EditMode.asmdef @@ -0,0 +1,27 @@ +{ + "name": "ProjectM.Tests.EditMode", + "rootNamespace": "ProjectM.Tests", + "references": [ + "ProjectM.Simulation", + "Unity.Entities", + "Unity.Collections", + "Unity.Mathematics", + "UnityEngine.TestRunner", + "UnityEditor.TestRunner" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "nunit.framework.dll" + ], + "autoReferenced": false, + "defineConstraints": [ + "UNITY_INCLUDE_TESTS" + ], + "versionDefines": [], + "noEngineReferences": false +} diff --git a/Assets/_Project/Tests/EditMode/ProjectM.Tests.EditMode.asmdef.meta b/Assets/_Project/Tests/EditMode/ProjectM.Tests.EditMode.asmdef.meta new file mode 100644 index 000000000..56efb7671 --- /dev/null +++ b/Assets/_Project/Tests/EditMode/ProjectM.Tests.EditMode.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1fc76dfd7bbd349d188d6561a2e30e0d +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 000000000..8ffeb9e8a --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,82 @@ +# Project M — CLAUDE.md + +Multiplayer game on **Unity DOTS (Entities) + Netcode for Entities** — server-authoritative, input-only clients, client prediction. This file is committed and is the authoritative, cross-machine source of conventions. The `/dots-dev` skill drives feature work; the one-time stack setup lives in `Docs/dots-setup-task.md`. + +## Stack (installed versions — Unity 6.4.7 / `6000.4.7f1`) + +| Package | Version | Notes | +|---|---|---| +| `com.unity.entities` | **6.4.0** | Entities/Collections/Graphics now track the **Editor** version (6.x), not the old 1.x line. | +| `com.unity.entities.graphics` | **6.4.0** | Renders entities under URP 17.4. | +| `com.unity.collections` | 6.4.0 | (transitive) | +| `com.unity.netcode` | **1.13.2** | Netcode **for Entities** (ECS). NOT `com.unity.netcode.gameobjects`. Independent 1.x versioning. | +| `com.unity.physics` | **1.4.6** | Unity Physics (DOTS). Independent 1.x. | +| `com.unity.transport` | 2.7.2 | (transitive) | +| `com.unity.burst` | 1.8.29 | (transitive) | +| `com.unity.mathematics` | 1.3.3 | (transitive) | + +> **Upgrading Unity 6.4 → 6.6:** Entities/Collections/Graphics would renumber to 6.6.x; Netcode/Physics stay independent 1.x (slated to become Core packages later in 2026). The setup here (asmdefs, bootstrap, subscene, smoke test) is forward-compatible — just let packages re-resolve. The `NetCodeTestWorld` access constraint below is **unchanged** by the upgrade. + +## Namespaces & assembly split + +Root namespace: **`ProjectM`**. Code lives under `Assets/_Project/Scripts/` in four asmdefs (never create/edit `.csproj`/`.sln`; only `.asmdef`): + +| Assembly | Namespace | Runs in | References | +|---|---|---|---| +| `ProjectM.Simulation` | `ProjectM.Simulation` | **client + server** worlds | Entities, Collections, Mathematics, Burst, Unity.Physics, Unity.NetCode | +| `ProjectM.Client` | `ProjectM.Client` | client world only | + Simulation, Unity.Entities.Graphics | +| `ProjectM.Server` | `ProjectM.Server` | server world only | + Simulation, Unity.NetCode | +| `ProjectM.Authoring` | `ProjectM.Authoring` | bake time (+ scene runtime) | Simulation, Entities, Mathematics, Unity.NetCode | + +- **Simulation** = components + systems shared by both worlds (most gameplay). **Client/Server** = world-specific. **Authoring** = `…Authoring` MonoBehaviours + `Baker`. +- Other folders: `Assets/_Project/Subscenes/` (baked entity subscenes), `Assets/_Project/Prefabs/`, `Assets/_Project/Tests/EditMode/`. + +## Bootstrap & worlds + +- `ProjectM.Simulation.GameBootstrap : ClientServerBootstrap` → overrides `Initialize`, sets `AutoConnectPort = 0` (no auto-connect), calls `CreateDefaultClientServerWorlds()`. Entering Play Mode creates separate `ServerWorld` (`WorldFlags.GameServer`) and `ClientWorld` (`WorldFlags.GameClient`) — verified. +- `Assets/_Project/Subscenes/Gameplay.unity` is wired into `SampleScene` (GameObject `GameplaySubScene`) as a baking target. Replace `SampleScene` with a dedicated bootstrap scene when building for real. + +## DOTS / ECS conventions (authoritative summary) + +Full rules: `~/.claude/skills/dots-dev/references/dots-conventions.md` (Windows: `%USERPROFILE%\.claude\skills\dots-dev\references\`). These **replace** classic MonoBehaviour/GameObject patterns. + +- **`struct : IComponentData`** is the default (unmanaged, Burst/job-friendly). `class : IComponentData` only for genuine managed refs (main-thread, no Burst). `IBufferElementData` for per-entity arrays. `IEnableableComponent` to toggle state without a structural change. +- **Systems:** `ISystem` (struct) + `[BurstCompile]` is the **default**; `SystemBase` only when touching managed objects. `SystemAPI.Query<…>()` to iterate. **Aspects (`IAspect`) are DEPRECATED (Entities 1.4+) — do not author new ones.** `Entities.ForEach` is legacy. +- **Jobs:** `IJobEntity` / `IJobChunk`; thread `JobHandle` through `state.Dependency`; mark inputs `[ReadOnly]`. Allocators: `Temp` (frame), `TempJob` (one job), `Persistent` (must dispose). Burst breaks on managed types/exceptions/reflection/strings. +- **Structural changes** (add/remove component, create/destroy entity) invalidate handles + cause sync points → batch via **`EntityCommandBuffer`** (Begin/End`Simulation`EntityCommandBufferSystem; `.AsParallelWriter()` in parallel jobs). +- **Baking:** `…Authoring` MonoBehaviour + `class FooBaker : Baker` → `GetEntity(authoring, TransformUsageFlags.…)` then `AddComponent`. Subscenes stream async — entities aren't present the instant a reference exists. +- **Netcode:** ghosts = replicated entities (`GhostAuthoringComponent` + `[GhostField]`); predicted (player-controlled, rolled back) vs interpolated. Core sim runs in `PredictedSimulationSystemGroup` (fixed step, **runs multiple times per frame** on rollback → must be deterministic/idempotent; filter with `.WithAll()`). **Server-authoritative: clients send input (`IInputComponentData`), not state.** RPCs (`IRpcCommand`) for one-off events. **No wall-clock/`Time.deltaTime`/`System.Random` in predicted sim.** +- **Always verify volatile DOTS/Netcode API shape via context7 at code-time** — do not trust memory. See `context7-libraries.md`. Pinned IDs for our versions: Entities → `/websites/unity3d_packages_com_unity_entities_6_5_manual`; Netcode → `/websites/unity3d_packages_com_unity_netcode_1_10_api` (closest published; we run 1.13.2 — re-resolve if a 1.13 set appears); ECS samples → `/unity-technologies/entitycomponentsystemsamples`. + +## Testing + +- **Default pattern = plain-Entities EditMode test:** create a `World`, register the system in `SimulationSystemGroup`, tick, assert. Public API, always green, version-independent. Example: `Assets/_Project/Tests/EditMode/HeartbeatSystemTests.cs`. Run via Unity Test Runner or MCP `run_tests(mode="EditMode", assembly_names=["ProjectM.Tests.EditMode"])`. +- **`NetCodeTestWorld` is `internal`** in netcode 1.13.2 (`Unity.NetCode.Tests`, assembly `Unity.NetCode.TestsUtils.Runtime.Tests`), exposed only via a fixed `[InternalsVisibleTo]` allow-list of Unity assemblies. To use it you must name a test asmdef to match an entry (e.g. `Unity.NetcodeSamples.EditModeTests`) — or vendor the test utils. See `Docs/Vault/07_Sessions/_Decisions/DR-001_Netcode_Test_Harness.md`. **This does not change on Unity 6.6.** Netcode world boot is covered by the Play Mode check, not a NetCodeTestWorld test. +- Burst/source-gen errors surface at editor compile, not a plain build — always check `read_console` after script changes, and run a play/tick test, not just a compile. + +## Guardrails + +- **Never** edit a `.meta` independently of its asset; delete an asset **and** its `.meta` together. +- **Never** read/write `Library/`, `Temp/`, `obj/`, `Logs/`, `UserSettings/` (generated/cache). Use MCP resources for editor state instead. +- **Never** create/edit/commit `.csproj`/`.sln` — only `.asmdef`. +- **No asset/scene edits during Play Mode.** Check `editor_state.advice.ready_for_tools` before mutating; package adds/refreshes trigger domain reloads — wait for `is_compiling=false`. + +## Memory — four layers (which tool when) + +| Layer | Use for | Crosses machines? | +|---|---|---| +| **In-repo vault** `Docs/Vault/` | Design docs, decision records (DR-###), session logs, roadmap — human-facing truth | **Yes** (git) | +| **basic-memory** MCP | Semantic/wikilink recall over those same vault files | Yes (indexes the vault) | +| **serena** MCP | C# symbol nav (`find_symbol`, references) of `Assets/_Project/` | N/A (from code) | +| **Native Claude memory** (`memory/`, `MEMORY.md`) | Machine-local facts, working-style, preferences | **No** | + +- Where is X defined / who calls it → **serena** (fallback `Grep`/`Glob`). What did we decide / how does Z work → **basic-memory** → read the vault note. Literal string / asset GUID → **Grep/Glob**. Current DOTS API → **context7**. Conventions → this file. +- **Cross-machine rule:** durable truth goes in the **vault** or **this file** (both committed). Native `memory/` is local-only and does NOT sync — never the sole home of a decision. +- **serena C# caveat:** its language server is flaky on Unity (can auto-install the wrong .NET, `.sln` load timeouts). If `find_symbol` errors/stalls, **fall back to `Glob`/`Grep`** (or add `claude-context` with local embeddings as a code-search index). serena live-verification was deferred at setup; confirm on first use. + +## Per-machine setup (NOT in git — redo on each machine) + +`.mcp.json` is committed and portable (`${CLAUDE_PROJECT_DIR}` only). But each machine still needs: +1. `uv`/`uvx`, the Obsidian app + `obsidian-cli`, and the `dots-dev` skill in `~/.claude/skills/`. +2. **basic-memory project registration** (machine-local config): `uvx basic-memory project add gamevault "/Docs/Vault" --default`, then `uvx basic-memory reindex --full --search --embeddings --project gamevault`. +3. Unity 6.4 opens the project and the CoplayDev Unity-MCP bridge connects (`mcpforunity://editor/state` → `ready_for_tools`). diff --git a/Docs/Vault/.obsidian/app.json b/Docs/Vault/.obsidian/app.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/Docs/Vault/.obsidian/app.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/Docs/Vault/.obsidian/appearance.json b/Docs/Vault/.obsidian/appearance.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/Docs/Vault/.obsidian/appearance.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/Docs/Vault/.obsidian/core-plugins.json b/Docs/Vault/.obsidian/core-plugins.json new file mode 100644 index 000000000..639b90da7 --- /dev/null +++ b/Docs/Vault/.obsidian/core-plugins.json @@ -0,0 +1,33 @@ +{ + "file-explorer": true, + "global-search": true, + "switcher": true, + "graph": true, + "backlink": true, + "canvas": true, + "outgoing-link": true, + "tag-pane": true, + "footnotes": false, + "properties": true, + "page-preview": true, + "daily-notes": true, + "templates": true, + "note-composer": true, + "command-palette": true, + "slash-command": false, + "editor-status": true, + "bookmarks": true, + "markdown-importer": false, + "zk-prefixer": false, + "random-note": false, + "outline": true, + "word-count": true, + "slides": false, + "audio-recorder": false, + "workspaces": false, + "file-recovery": true, + "publish": false, + "sync": true, + "bases": true, + "webviewer": false +} \ No newline at end of file diff --git a/Docs/Vault/00_Home/Home.md b/Docs/Vault/00_Home/Home.md new file mode 100644 index 000000000..7d24351c3 --- /dev/null +++ b/Docs/Vault/00_Home/Home.md @@ -0,0 +1,25 @@ +--- +tags: +- moc +- home +updated: 2026-05-29 +permalink: gamevault/00-home/home +--- + +# Project M — Home (Map of Content) + +Multiplayer game on **Unity DOTS** (Entities) + **Netcode for Entities** (server-authoritative, client prediction). This vault is the canonical, cross-machine, human-facing record. Code lives in `Assets/_Project/`; engine/API truth comes from **context7**, not this vault. + +## Map of Content + +- **Vision** → [[Pillars]] — design pillars & locked decisions +- **Game Design** → [[Systems_Index]] — per-system design docs +- **Roadmap** → [[Milestones]] · [[Backlog]] +- **Sessions** → `07_Sessions/2026/` — dated work logs (latest: [[2026-05-29_Project_Setup]]) +- **Decisions** → `07_Sessions/_Decisions/` — decision records (DR-###) · [[DR-001_Netcode_Test_Harness]] +- **Meta** → [[Documentation_Protocol]] · [[Tags]] +- **Templates** → [[Session_Log_Template]] · [[Decision_Record_Template]] + +## How knowledge is organized + +See [[Documentation_Protocol]]. In short: design / decisions / sessions live here (committed to git); **basic-memory** recalls over these notes; **serena** navigates C# symbols; native Claude memory holds machine-local facts; **context7** is the source of truth for DOTS / Netcode APIs. \ No newline at end of file diff --git a/Docs/Vault/01_Vision/Pillars.md b/Docs/Vault/01_Vision/Pillars.md new file mode 100644 index 000000000..1ed4e6731 --- /dev/null +++ b/Docs/Vault/01_Vision/Pillars.md @@ -0,0 +1,24 @@ +--- +tags: +- vision +- pillars +status: draft +updated: 2026-05-29 +permalink: gamevault/01-vision/pillars +--- + +# Design Pillars & Locked Decisions + +> The few non-negotiables every system must serve. Keep this short; promote only decisions that are truly locked. + +## Pillars + +- _TBD — define the 3–5 experiential pillars of Project M._ + +## Locked decisions + +- **Tech stack:** Unity DOTS (Entities) + Netcode for Entities — server-authoritative, input-only clients, client prediction. Established [[2026-05-29_Project_Setup]]. + +## Related + +- Decision records: `07_Sessions/_Decisions/` \ No newline at end of file diff --git a/Docs/Vault/02_Game_Design/Systems_Index.md b/Docs/Vault/02_Game_Design/Systems_Index.md new file mode 100644 index 000000000..538218f33 --- /dev/null +++ b/Docs/Vault/02_Game_Design/Systems_Index.md @@ -0,0 +1,19 @@ +--- +tags: +- design +- index +updated: 2026-05-29 +permalink: gamevault/02-game-design/systems-index +--- + +# Systems Design — Index + +One design doc per gameplay system, linked here. Each should state: purpose, components (`IComponentData`), systems (`ISystem`), netcode shape (ghost? predicted vs interpolated? inputs / RPCs), and open questions. + +## Systems + +- _None yet._ + +## Conventions + +DOTS/ECS conventions live in repo `CLAUDE.md` and the `dots-dev` skill's `dots-conventions.md`. Don't duplicate volatile API details here — link to context7-derived notes instead. \ No newline at end of file diff --git a/Docs/Vault/06_Roadmap/Backlog.md b/Docs/Vault/06_Roadmap/Backlog.md new file mode 100644 index 000000000..27ccdc9c7 --- /dev/null +++ b/Docs/Vault/06_Roadmap/Backlog.md @@ -0,0 +1,16 @@ +--- +tags: +- roadmap +- backlog +updated: 2026-05-29 +permalink: gamevault/06-roadmap/backlog +--- + +# Backlog + +Unordered pool of candidate work. Promote to a [[Milestones|milestone]] when committed. + +- [ ] Decide whether to upgrade Unity 6.4 → 6.6 for newer Entities (6.6.x). Stack is forward-compatible; `NetCodeTestWorld` stays internal regardless — see [[DR-001_Netcode_Test_Harness]]. +- [ ] Define the core gameplay loop and the first predicted player ghost. +- [ ] Replace template `SampleScene` with a dedicated bootstrap scene + gameplay subscene. +- [ ] Optional template cleanup: remove `com.unity.visualscripting`, `Assets/TutorialInfo/`, `Assets/Readme.asset` (delete each asset **with** its `.meta`). \ No newline at end of file diff --git a/Docs/Vault/06_Roadmap/Milestones.md b/Docs/Vault/06_Roadmap/Milestones.md new file mode 100644 index 000000000..d20a89178 --- /dev/null +++ b/Docs/Vault/06_Roadmap/Milestones.md @@ -0,0 +1,16 @@ +--- +tags: +- roadmap +- milestones +updated: 2026-05-29 +permalink: gamevault/06-roadmap/milestones +--- + +# Milestones + +| Milestone | Goal | Status | +|---|---|---| +| **M0 — Foundation** | DOTS + Netcode stack, asmdef split, bootstrap, smoke test green | ✅ Done 2026-05-29 — [[2026-05-29_Project_Setup]] | +| **M1 — _TBD_** | Define the first playable slice (core loop + first predicted ghost) | ⬜ | + +Promote items from [[Backlog]] here when committed. \ No newline at end of file diff --git a/Docs/Vault/07_Sessions/2026/2026-05-29_Project_Setup.md b/Docs/Vault/07_Sessions/2026/2026-05-29_Project_Setup.md new file mode 100644 index 000000000..108d97fd9 --- /dev/null +++ b/Docs/Vault/07_Sessions/2026/2026-05-29_Project_Setup.md @@ -0,0 +1,36 @@ +--- +date: 2026-05-29 +type: session +tags: +- session +- setup +- dots +- netcode +permalink: gamevault/07-sessions/2026/2026-05-29-project-setup +--- + +# Session 2026-05-29 — DOTS + Netcode + Memory Stack Setup + +One-time project setup per `Docs/dots-setup-task.md`. + +## Done + +- **DOTS stack** (Unity 6.4.7 / 6000.4.7f1): `com.unity.entities` 6.4.0, `com.unity.netcode` 1.13.2, `com.unity.physics` 1.4.6, `com.unity.entities.graphics` 6.4.0. Console clean. (Entities / Collections / Graphics now track the Editor version → 6.4.0; Netcode / Physics still independent 1.x.) +- **Asmdef split** under `Assets/_Project/Scripts/`: `ProjectM.Simulation` (shared), `ProjectM.Client`, `ProjectM.Server`, `ProjectM.Authoring`. Root namespace `ProjectM`. +- **Bootstrap**: `GameBootstrap : ClientServerBootstrap` (Simulation) → `CreateDefaultClientServerWorlds()`, auto-connect off. Play Mode verified: separate `ServerWorld` (GameServer) + `ClientWorld` (GameClient). +- **Subscene**: `Assets/_Project/Subscenes/Gameplay.unity` wired into `SampleScene` as a baking target. +- **Smoke test**: `Heartbeat` IComponentData + `[BurstCompile] HeartbeatSystem : ISystem`; EditMode test ticks `SimulationSystemGroup` 8× and asserts advance → green (1/1). +- **Vault + memory MCPs + `CLAUDE.md`**: scaffolded. + +## Decisions + +- [[DR-001_Netcode_Test_Harness]] — smoke test uses a plain-Entities tick test, not the internal `NetCodeTestWorld`. + +## Open / deferred + +- Unity 6.6 upgrade considered, deferred. Stack is forward-compatible; `NetCodeTestWorld` stays internal regardless of version. +- Optional template cleanup (visualscripting / TutorialInfo / Readme) deferred → [[Backlog]]. + +## Next + +- Define pillars ([[Pillars]]) and the first playable slice ([[Milestones]]). \ No newline at end of file diff --git a/Docs/Vault/07_Sessions/_Decisions/DR-001_Netcode_Test_Harness.md b/Docs/Vault/07_Sessions/_Decisions/DR-001_Netcode_Test_Harness.md new file mode 100644 index 000000000..b6a795aa0 --- /dev/null +++ b/Docs/Vault/07_Sessions/_Decisions/DR-001_Netcode_Test_Harness.md @@ -0,0 +1,26 @@ +--- +id: DR-001 +title: Netcode smoke/test harness approach +status: accepted +date: 2026-05-29 +tags: +- decision +- netcode +- testing +permalink: gamevault/07-sessions/decisions/dr-001-netcode-test-harness +--- + +# DR-001 — Test harness: plain-Entities over internal NetCodeTestWorld + +## Context + +Setup (`Docs/dots-setup-task.md` §4) called for a `NetCodeTestWorld` EditMode test. In **Netcode for Entities 1.13.2**, `Unity.NetCode.Tests.NetCodeTestWorld` (assembly `Unity.NetCode.TestsUtils.Runtime.Tests`) is **`internal`**, reachable only via a fixed `[InternalsVisibleTo]` allow-list of Unity's own assemblies. A consumer test can use it only by naming its test assembly to match an entry (e.g. `Unity.NetcodeSamples.EditModeTests`) — effectively impersonating a Unity sample assembly. Research (Unity ECS status, Dec 2025) shows no public consumer test harness on the roadmap, and that this is **unchanged by a Unity 6.6 upgrade** (Netcode stays independent 1.x; only Entities/Collections/Graphics renumber to the Editor version). + +## Decision + +Use a **plain-Entities EditMode test** as the default test pattern: create a `World`, register the system under test in `SimulationSystemGroup`, tick, assert. Public API only, no assembly-name impersonation, version-independent. Netcode **world boot** is verified separately by the §3 Play Mode check (`GameBootstrap` creates `ServerWorld` + `ClientWorld`). + +## Consequences + +- Clean, always-green tests with no fragile naming hacks. +- Full client+server **connect+tick** coverage is not provided by this pattern. When needed (ghost/prediction work), revisit per-system: either name a dedicated test asmdef `Unity.NetcodeSamples.EditModeTests` to borrow the IVT grant, or vendor a copy of the netcode test utilities. \ No newline at end of file diff --git a/Docs/Vault/_Meta/Documentation_Protocol.md b/Docs/Vault/_Meta/Documentation_Protocol.md new file mode 100644 index 000000000..ea82f34c1 --- /dev/null +++ b/Docs/Vault/_Meta/Documentation_Protocol.md @@ -0,0 +1,37 @@ +--- +tags: +- meta +- protocol +updated: 2026-05-29 +permalink: gamevault/meta/documentation-protocol +--- + +# Documentation Protocol + +How knowledge is read and written for Project M. Four layers, each with a distinct job; the **in-repo vault is the single source of human-facing, cross-machine truth**. + +## Layers + +| Layer | Holds | Crosses machines? | +|---|---|---| +| **This vault** (`Docs/Vault/`) | Design docs, decision records, session logs, roadmap | **Yes** (git) | +| **basic-memory** MCP | Semantic + wikilink recall over these same vault files | Yes (indexes the vault) | +| **serena** MCP | C# symbol navigation of `Assets/_Project/` | N/A (from code) | +| **Native Claude memory** | Machine-local facts / preferences (`memory/`, `MEMORY.md`) | **No** | + +**Cross-machine rule:** durable truth → vault or repo `CLAUDE.md` (both committed). Native memory is local-only, never the sole home of a decision or design fact. + +## Which tool when + +- Where is X defined / who calls it → **serena** (fallback `Grep` / `Glob`). +- What did we decide / how does system Z work → **basic-memory** recall → read the note here. +- Literal string / asset GUID → **Grep / Glob**. +- Current DOTS / Netcode API → **context7** (never memory). +- Conventions / preferences → repo `CLAUDE.md` + native memory. + +## Session bookends + +- **Start (read-only):** `CLAUDE.md` → [[Home]] + latest session log → open decision records + [[Backlog]] → basic-memory recall on the goal's nouns. +- **End:** write a session log (`07_Sessions//`) → firm decisions to DR records → edit touched design docs in place (wikilink, don't duplicate) → durable knowledge to basic-memory, machine-local facts to native `MEMORY.md`. + +Driven by the `/dots-dev` skill; this scaffold was created by the one-time setup task. \ No newline at end of file diff --git a/Docs/Vault/_Meta/Tags.md b/Docs/Vault/_Meta/Tags.md new file mode 100644 index 000000000..7cd4f0a6b --- /dev/null +++ b/Docs/Vault/_Meta/Tags.md @@ -0,0 +1,20 @@ +--- +tags: +- meta +- taxonomy +updated: 2026-05-29 +permalink: gamevault/meta/tags +--- + +# Tag Taxonomy + +Keep tags few and meaningful. + +- `#moc` — map of content / index notes +- `#vision`, `#pillars` — north-star docs +- `#design` — system design docs +- `#roadmap`, `#milestones`, `#backlog` +- `#session` — dated work logs +- `#decision` — decision records (DR-###) +- `#meta` — protocol / taxonomy +- Domain: `#dots`, `#netcode`, `#physics`, `#rendering`, `#testing` \ No newline at end of file diff --git a/Docs/Vault/_Templates/Decision_Record_Template.md b/Docs/Vault/_Templates/Decision_Record_Template.md new file mode 100644 index 000000000..eaa168d8a --- /dev/null +++ b/Docs/Vault/_Templates/Decision_Record_Template.md @@ -0,0 +1,25 @@ +--- +permalink: gamevault/templates/decision-record-template +--- + +--- +id: DR-### +title: +status: proposed # proposed | accepted | superseded +date: {{date:YYYY-MM-DD}} +tags: [decision] +--- + +# DR-### — + +## Context + +_What forced a choice? Constraints, versions, evidence._ + +## Decision + +_What we chose, stated plainly._ + +## Consequences + +_Trade-offs accepted; what to revisit later and when._ \ No newline at end of file diff --git a/Docs/Vault/_Templates/Session_Log_Template.md b/Docs/Vault/_Templates/Session_Log_Template.md new file mode 100644 index 000000000..106e4a46a --- /dev/null +++ b/Docs/Vault/_Templates/Session_Log_Template.md @@ -0,0 +1,23 @@ +--- +permalink: gamevault/templates/session-log-template +--- + +--- +date: {{date:YYYY-MM-DD}} +type: session +tags: [session] +--- + +# Session {{date:YYYY-MM-DD}} — <title> + +## Goal + +## Done + +## Decisions + +- <link any DR-### created this session> + +## Open / deferred + +## Next \ No newline at end of file diff --git a/Docs/dots-setup-task.md b/Docs/dots-setup-task.md new file mode 100644 index 000000000..ccb085f93 --- /dev/null +++ b/Docs/dots-setup-task.md @@ -0,0 +1,138 @@ +# One-Time Project Setup Task — DOTS + Netcode + Memory Stack + +**This is the separate setup task referenced by the `/dots-dev` skill.** Run it ONCE per project (some steps once per machine — see §0). It installs the DOTS stack, scaffolds the project + vault, wires the memory MCPs, and writes `CLAUDE.md`. After this completes, `/dots-dev` drives feature work; this file is no longer needed (keep it for reference / the second machine). + +> **How to run:** open a normal Claude Code session in this project (NOT a worktree — the open Unity Editor + UnityMCP target the live working copy) and say *"Run the DOTS setup task in Docs/dots-setup-task.md."* Work top to bottom; each step has a verification. + +> **Conventions reference:** the ECS rules and context7 library IDs live in the skill at +> `~/.claude/skills/dots-dev/references/dots-conventions.md` and `…/context7-libraries.md` +> (Windows: `%USERPROFILE%\.claude\skills\dots-dev\references\`). Use context7 for any current API shape — do not trust memory for DOTS APIs. + +> **Cross-platform rule:** never write a machine-specific absolute path (`/Users/...`, `C:\...`) into any committed file. Use `${CLAUDE_PROJECT_DIR}` and repo-relative paths. The vault lives in-repo so it travels via git. + +--- + +## §0 — Per-machine prerequisites (do on EACH machine, once) + +- [ ] Install **uv / uvx** (for the `basic-memory` and `serena` MCP servers). macOS: `brew install uv` or the official installer; Windows: the official installer / `winget install astral-sh.uv`. +- [ ] Install the **Obsidian** app and the **obsidian-cli** (the `obsidian-cli` skill drives it). Point Obsidian at `<repo>/Docs/Vault` once it exists (§5). +- [ ] Copy/sync the **`dots-dev` skill** to this machine's user skills dir (`~/.claude/skills/dots-dev/` on macOS, `%USERPROFILE%\.claude\skills\dots-dev\` on Windows). It is path-agnostic — same files on both. +- [ ] Confirm Unity 6.4 opens the project and the **CoplayDev Unity-MCP** bridge connects (`mcpforunity://editor/state` → `ready_for_tools`). + +The repo-committed parts (§1–§6) are done once total; §0 is the only per-machine work. + +--- + +## §1 — Install the DOTS stack + +Add these to `Packages/manifest.json` (it is NOT a `.csproj`/`.sln` — editing it is correct) or via UnityMCP `manage_packages(action="add", ...)`. Let UPM resolve the version compatible with Unity 6.4; then pin from `Packages/packages-lock.json`. + +- [ ] `com.unity.entities` +- [ ] `com.unity.netcode` ← **Netcode for Entities** (ECS). NOT `com.unity.netcode.gameobjects`. +- [ ] `com.unity.physics` ← Unity Physics (DOTS), if the game needs collision/triggers +- [ ] `com.unity.entities.graphics` ← renders entities under URP (already on URP 17.4) + +(`com.unity.burst`, `com.unity.collections`, `com.unity.mathematics`, `com.unity.transport` come transitively.) + +- [ ] `read_console` until clean after the domain reload. **Verify:** `manage_packages(action="list")` shows all four; `packages-lock.json` records the resolved versions. +- [ ] Optional cleanup: the template's `com.unity.visualscripting` and `TutorialInfo`/`Readme.asset` are unused for a DOTS game — remove if you don't want them (delete the asset **and** its `.meta` together). + +## §2 — Project structure & asmdefs + +Pick a root namespace (e.g. `ProjectM`) and record it in `CLAUDE.md`. Create a Netcode-aware assembly split under `Assets/_Project/`: + +``` +Assets/_Project/ + Scripts/ + Simulation/ <Root>.Simulation.asmdef → Entities, Collections, Mathematics, Burst, Unity.Physics, Unity.NetCode + Client/ <Root>.Client.asmdef → Simulation, Entities, Unity.NetCode, Unity.Entities.Graphics + Server/ <Root>.Server.asmdef → Simulation, Entities, Unity.NetCode + Authoring/ <Root>.Authoring.asmdef → Simulation, Entities, Unity.NetCode + Subscenes/ + Prefabs/ +``` + +- Shared **Simulation** = components + systems that run in BOTH client and server worlds. Client/Server hold world-specific systems; Authoring holds `…Authoring` MonoBehaviours + `Baker<T>`. +- [ ] **Verify** against the official ECS Samples / Netcode sample layout (context7 ID `/unity-technologies/entitycomponentsystemsamples`) — adjust the split if the current sample differs. Confirm each asmdef compiles (`read_console`). +- Never create/edit `.csproj`/`.sln`; only `.asmdef`. + +## §3 — Bootstrap & worlds + +- [ ] Add a `ClientServerBootstrap` subclass (confirm exact method names — `CreateClientWorld`/`CreateServerWorld`/`WorldSystemFilter` — via context7 `…com_unity_netcode_…`). +- [ ] Create a minimal subscene so baking has a target. +- [ ] **Verify:** entering Play Mode creates separate client and server `World`s (check the Entities Hierarchy / world dropdown). + +## §4 — Smoke test (prove it compiles AND ticks) + +- [ ] One trivial unmanaged component (`struct Heartbeat : IComponentData { public int Tick; }`) + one `ISystem`+`[BurstCompile]` that increments it in `SimulationSystemGroup`. +- [ ] One **`NetCodeTestWorld`** EditMode test that boots in-process client+server, connects, ticks N times, and asserts the component advanced. (Get the current `NetCodeTestWorld` API from context7.) +- [ ] **Verify:** `run_tests(mode="EditMode")` → green; console clean of Burst/source-gen errors. + +## §5 — In-repo vault + +Create `<repo>/Docs/Vault/` via the `obsidian-cli` skill (plain markdown is fine if obsidian-cli isn't set up yet): + +``` +Docs/Vault/ + 00_Home/Home.md (Map of Content) + 01_Vision/ (pillars, locked decisions) + 02_Game_Design/ (systems design docs) + 06_Roadmap/{Milestones,Backlog}.md + 07_Sessions/<year>/ (session logs) + 07_Sessions/_Decisions/ (decision records, DR-001…) + _Templates/{Session_Log,Decision_Record}_Template.md + _Meta/{Documentation_Protocol,Tags}.md +``` + +- [ ] Point the Obsidian app at this folder as a vault. +- [ ] **Verify:** obsidian-cli can list/read a note here. + +## §6 — Memory MCPs (`.mcp.json`, committed, portable) + +Create `<repo>/.mcp.json` (or merge into existing) using `${CLAUDE_PROJECT_DIR}` so it loads unchanged on both machines: + +```json +{ + "mcpServers": { + "basic-memory": { + "command": "uvx", + "args": ["basic-memory", "mcp"] + }, + "serena": { + "command": "uvx", + "args": ["--from", "git+https://github.com/oraios/serena", + "serena", "start-mcp-server", + "--context", "ide-assistant", + "--project", "${CLAUDE_PROJECT_DIR}"] + } + } +} +``` + +- [ ] Configure **basic-memory**'s project to point at the vault: `basic-memory project add gamevault "<repo>/Docs/Vault"` (and set it default), per basic-memory's current docs. **Verify:** a semantic recall returns a hit on a vault note. +- [ ] Run **serena** onboarding; test `find_symbol` on the §4 smoke-test system. + - ⚠️ **Serena C# caveat:** its language server is flaky on Unity (auto-installs the wrong .NET, `.sln` load timeouts). If `find_symbol` errors/stalls, record it in `CLAUDE.md` and **fall back** to `Glob`/`Grep` — or add **`claude-context`** (local LanceDB vector index over `Assets/` + the vault) as the documented code-search fallback. Prefer local embeddings (FastEmbed/Ollama) to keep game code off third-party APIs. +- [ ] **Verify:** `.mcp.json` contains no machine-specific absolute paths (only `${CLAUDE_PROJECT_DIR}`), so it loads on the other machine as-is. + +## §7 — `CLAUDE.md` (repo root, committed) + +Write `<repo>/CLAUDE.md` covering: +- [ ] Project root namespace + the asmdef split from §2. +- [ ] The **DOTS/ECS conventions** (summarize / link the skill's `dots-conventions.md`): `ISystem`+Burst default, unmanaged `IComponentData`, `IEnableableComponent`, baking, jobs+allocators, ECB for structural changes, determinism (no wall-clock in predicted sim), server-authoritative + input-only clients, `[GhostField]`/ghost authoring. **Aspects deprecated (1.4).** +- [ ] Guardrails (still valid from classic Unity): never edit `.meta` independently of its asset; never read/write `Library/`, `Temp/`, `obj/`, `Logs/`, `UserSettings/`; never edit/commit `.csproj`/`.sln`; no edits during Play Mode. +- [ ] **"Which memory tool when"**: serena = C# symbols, basic-memory = design knowledge over the vault, grep = literals, context7 = current DOTS APIs, native memory = machine-local facts. +- [ ] **Cross-machine rule:** durable/cross-machine truth goes in the in-repo vault or `CLAUDE.md` (both committed); native `memory/` is machine-local and does NOT sync. + +## §8 — Native memory seed (machine-local) + +- [ ] Append to `MEMORY.md` (this machine): project uses Unity DOTS + Netcode for Entities; the chosen memory stack (vault + basic-memory + serena, claude-context fallback); that `/dots-dev` is the dev driver and this setup is one-time. (Repeat on the other machine, or re-derive from `CLAUDE.md`.) + +--- + +## Done-when + +- All four DOTS packages installed, console clean, smoke-test `NetCodeTestWorld` green. +- `Assets/_Project` asmdef split compiles; client+server worlds spin up. +- Vault scaffolded; obsidian-cli reads it; basic-memory recalls a note; serena resolves a symbol (or fallback recorded). +- `CLAUDE.md` + committed `.mcp.json` (portable) exist. +- Second machine reproduces from §0 alone (everything else is in git). diff --git a/Packages/manifest.json b/Packages/manifest.json index 8f768bef0..32c6a4005 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -1,15 +1,23 @@ { "dependencies": { + "com.coplaydev.unity-mcp": "https://github.com/CoplayDev/unity-mcp.git?path=/MCPForUnity#main", "com.unity.ai.navigation": "2.0.12", + "com.unity.cinemachine": "3.1.6", "com.unity.collab-proxy": "2.12.4", + "com.unity.entities": "6.4.0", + "com.unity.entities.graphics": "6.4.0", "com.unity.ide.rider": "3.0.40", "com.unity.ide.visualstudio": "2.0.27", "com.unity.inputsystem": "1.19.0", "com.unity.multiplayer.center": "1.0.1", + "com.unity.netcode": "1.13.2", + "com.unity.physics": "1.4.6", + "com.unity.probuilder": "6.0.9", "com.unity.render-pipelines.universal": "17.4.0", "com.unity.test-framework": "1.6.0", "com.unity.timeline": "1.8.12", "com.unity.ugui": "2.0.0", + "com.unity.visualeffectgraph": "17.4.0", "com.unity.visualscripting": "1.9.11", "com.unity.modules.accessibility": "1.0.0", "com.unity.modules.adaptiveperformance": "1.0.0", diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index 769077233..45aa15452 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -1,5 +1,15 @@ { "dependencies": { + "com.coplaydev.unity-mcp": { + "version": "https://github.com/CoplayDev/unity-mcp.git?path=/MCPForUnity#main", + "depth": 0, + "source": "git", + "dependencies": { + "com.unity.nuget.newtonsoft-json": "3.0.2", + "com.unity.test-framework": "1.1.31" + }, + "hash": "78ee5418415953b79c358bfe6355fcc3fde7912b" + }, "com.unity.ai.navigation": { "version": "2.0.12", "depth": 0, @@ -11,7 +21,7 @@ }, "com.unity.burst": { "version": "1.8.29", - "depth": 2, + "depth": 1, "source": "registry", "dependencies": { "com.unity.mathematics": "1.2.1", @@ -19,6 +29,16 @@ }, "url": "https://packages.unity.com" }, + "com.unity.cinemachine": { + "version": "3.1.6", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.splines": "2.0.0", + "com.unity.modules.imgui": "1.0.0" + }, + "url": "https://packages.unity.com" + }, "com.unity.collab-proxy": { "version": "2.12.4", "depth": 0, @@ -28,7 +48,7 @@ }, "com.unity.collections": { "version": "6.4.0", - "depth": 2, + "depth": 1, "source": "builtin", "dependencies": { "com.unity.burst": "1.8.23", @@ -38,6 +58,37 @@ "com.unity.test-framework.performance": "3.0.3" } }, + "com.unity.entities": { + "version": "6.4.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.burst": "1.8.23", + "com.unity.collections": "6.4.0", + "com.unity.mathematics": "1.3.2", + "com.unity.nuget.mono-cecil": "1.11.5", + "com.unity.profiling.core": "1.0.2", + "com.unity.scriptablebuildpipeline": "2.4.3", + "com.unity.serialization": "3.1.2", + "com.unity.test-framework.performance": "3.0.3", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" + } + }, + "com.unity.entities.graphics": { + "version": "6.4.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.entities": "6.4.0", + "com.unity.modules.particlesystem": "1.0.0", + "com.unity.render-pipelines.core": "14.0.10" + } + }, "com.unity.ext.nunit": { "version": "2.0.5", "depth": 1, @@ -73,7 +124,7 @@ }, "com.unity.mathematics": { "version": "1.3.3", - "depth": 2, + "depth": 1, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" @@ -86,9 +137,61 @@ "com.unity.modules.uielements": "1.0.0" } }, + "com.unity.netcode": { + "version": "1.13.2", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.entities": "1.4.4", + "com.unity.transport": "2.5.3", + "com.unity.modules.animation": "1.0.0" + }, + "url": "https://packages.unity.com" + }, "com.unity.nuget.mono-cecil": { "version": "1.11.6", - "depth": 3, + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.nuget.newtonsoft-json": { + "version": "3.2.2", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.physics": { + "version": "1.4.6", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.burst": "1.8.28", + "com.unity.entities": "1.4.6", + "com.unity.collections": "2.6.6", + "com.unity.mathematics": "1.3.2", + "com.unity.modules.imgui": "1.0.0", + "com.unity.test-framework": "1.4.6", + "com.unity.modules.jsonserialize": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.probuilder": { + "version": "6.0.9", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.shadergraph": "17.0.3", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.settings-manager": "1.0.3" + }, + "url": "https://packages.unity.com" + }, + "com.unity.profiling.core": { + "version": "1.0.3", + "depth": 1, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" @@ -124,6 +227,16 @@ "com.unity.render-pipelines.core": "17.4.0" } }, + "com.unity.scriptablebuildpipeline": { + "version": "2.6.1", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.test-framework": "1.4.5", + "com.unity.modules.assetbundle": "1.0.0" + }, + "url": "https://packages.unity.com" + }, "com.unity.searcher": { "version": "4.9.4", "depth": 2, @@ -131,6 +244,23 @@ "dependencies": {}, "url": "https://packages.unity.com" }, + "com.unity.serialization": { + "version": "3.1.5", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.burst": "1.8.13", + "com.unity.collections": "2.4.2" + }, + "url": "https://packages.unity.com" + }, + "com.unity.settings-manager": { + "version": "2.1.1", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, "com.unity.shadergraph": { "version": "17.4.0", "depth": 1, @@ -140,6 +270,17 @@ "com.unity.searcher": "4.9.3" } }, + "com.unity.splines": { + "version": "2.8.4", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.mathematics": "1.2.1", + "com.unity.modules.imgui": "1.0.0", + "com.unity.settings-manager": "1.0.3" + }, + "url": "https://packages.unity.com" + }, "com.unity.test-framework": { "version": "1.6.0", "depth": 0, @@ -152,7 +293,7 @@ }, "com.unity.test-framework.performance": { "version": "3.4.0", - "depth": 3, + "depth": 1, "source": "registry", "dependencies": { "com.unity.test-framework": "1.1.33", @@ -172,6 +313,17 @@ }, "url": "https://packages.unity.com" }, + "com.unity.transport": { + "version": "2.7.2", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.burst": "1.8.24", + "com.unity.collections": "2.2.1", + "com.unity.mathematics": "1.3.2" + }, + "url": "https://packages.unity.com" + }, "com.unity.ugui": { "version": "2.0.0", "depth": 0, @@ -181,6 +333,15 @@ "com.unity.modules.imgui": "1.0.0" } }, + "com.unity.visualeffectgraph": { + "version": "17.4.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.shadergraph": "17.4.0", + "com.unity.render-pipelines.core": "17.4.0" + } + }, "com.unity.visualscripting": { "version": "1.9.11", "depth": 0, diff --git a/ProjectSettings/EntitiesClientSettings.asset b/ProjectSettings/EntitiesClientSettings.asset new file mode 100644 index 000000000..baf6668fd --- /dev/null +++ b/ProjectSettings/EntitiesClientSettings.asset @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 53 + 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: e2ea235c1fcfe29488ed97c467a0da53, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.Entities.Build::Unity.Entities.Build.EntitiesClientSettings + FilterSettings: + ExcludedBakingSystemAssemblies: [] diff --git a/ProjectSettings/NetCodeClientAndServerSettings.asset b/ProjectSettings/NetCodeClientAndServerSettings.asset new file mode 100644 index 000000000..0d9f79e41 --- /dev/null +++ b/ProjectSettings/NetCodeClientAndServerSettings.asset @@ -0,0 +1,41 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 53 + 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: 4111970df3904877aade1a474116e5c2, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.NetCode.Authoring.Hybrid::Unity.NetCode.Hybrid.NetCodeClientAndServerSettings + FilterSettings: + ExcludedBakingSystemAssemblies: [] + AdditionalScriptingDefines: [] + GlobalNetCodeConfig: {fileID: 0} + CurrentImportanceSuggestions: + - MinValue: 1 + MaxValue: 4 + Name: Low Importance + Tooltip: For cosmetic (i.e. visual-only) ghosts like glass bottles, signs, beach-balls, + and cones etc. Typically <b>Static</b>. + - MinValue: 5 + MaxValue: 40 + Name: Medium Importance + Tooltip: For common gameplay-affecting ghosts like trees, doors, explosive barrels, + dropped loot etc. Typically <b>Static</b>. + - MinValue: 50 + MaxValue: 250 + Name: High Importance + Tooltip: For per-player and objective-critical ghosts like Player Character Controllers + and CTF flags etc. Typically for <b>Dynamic</b> i.e. <b>Predicted</b> ghosts. + <b>UsePreSerialization</b> is likely a good fit. + - MinValue: 1000 + MaxValue: 0 + Name: Critical Importance + Tooltip: For gameplay critical singletons like the one keeping the current score, + or the one denoting whether or not the current round has started etc. Choose + <b>UsePreSerialization</b>, and use sparingly. diff --git a/ProjectSettings/NetCodeServerSettings.asset b/ProjectSettings/NetCodeServerSettings.asset new file mode 100644 index 000000000..a53b8eef7 --- /dev/null +++ b/ProjectSettings/NetCodeServerSettings.asset @@ -0,0 +1,17 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 53 + 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: 70bae3f5df04479cba47f4cd56a60d53, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.NetCode.Authoring.Hybrid::Unity.NetCode.Hybrid.NetCodeServerSettings + FilterSettings: + ExcludedBakingSystemAssemblies: [] + AdditionalScriptingDefines: [] diff --git a/ProjectSettings/Packages/com.unity.probuilder/Settings.json b/ProjectSettings/Packages/com.unity.probuilder/Settings.json new file mode 100644 index 000000000..6effc1e99 --- /dev/null +++ b/ProjectSettings/Packages/com.unity.probuilder/Settings.json @@ -0,0 +1,36 @@ +{ + "m_Dictionary": { + "m_DictionaryValues": [ + { + "type": "System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", + "key": "lightmapping.autoUnwrapLightmapUV", + "value": "{\"m_Value\":true}" + }, + { + "type": "UnityEngine.ProBuilder.LogLevel, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", + "key": "log.level", + "value": "{\"m_Value\":3}" + }, + { + "type": "UnityEngine.ProBuilder.LogOutput, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", + "key": "log.output", + "value": "{\"m_Value\":1}" + }, + { + "type": "System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", + "key": "log.path", + "value": "{\"m_Value\":\"ProBuilderLog.txt\"}" + }, + { + "type": "UnityEngine.ProBuilder.SemVer, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", + "key": "about.identifier", + "value": "{\"m_Value\":{\"m_Major\":6,\"m_Minor\":0,\"m_Patch\":9,\"m_Build\":-1,\"m_Type\":\"\",\"m_Metadata\":\"\",\"m_Date\":\"\"}}" + }, + { + "type": "UnityEngine.ProBuilder.SemVer, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", + "key": "preferences.version", + "value": "{\"m_Value\":{\"m_Major\":6,\"m_Minor\":0,\"m_Patch\":9,\"m_Build\":-1,\"m_Type\":\"\",\"m_Metadata\":\"\",\"m_Date\":\"\"}}" + } + ] + } +} \ No newline at end of file diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 07e72c2cc..72e68cea6 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -923,11 +923,11 @@ PlayerSettings: activeInputHandler: 1 windowsGamepadBackendHint: 0 enableDirectStorage: 0 - cloudProjectId: + cloudProjectId: e222f40d-3106-4f0a-843d-c0237ded721b framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] - projectName: - organizationId: + projectName: Project M + organizationId: rain-entertainment-llc cloudEnabled: 0 legacyClampBlendShapeWeights: 0 hmiLoadingImage: {fileID: 0} diff --git a/ProjectSettings/SceneTemplateSettings.json b/ProjectSettings/SceneTemplateSettings.json new file mode 100644 index 000000000..ede5887b3 --- /dev/null +++ b/ProjectSettings/SceneTemplateSettings.json @@ -0,0 +1,121 @@ +{ + "templatePinStates": [], + "dependencyTypeInfos": [ + { + "userAdded": false, + "type": "UnityEngine.AnimationClip", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.Animations.AnimatorController", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.AnimatorOverrideController", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.Audio.AudioMixerController", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.ComputeShader", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.Cubemap", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.GameObject", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.LightingDataAsset", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.LightingSettings", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Material", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.MonoScript", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.PhysicsMaterial", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.PhysicsMaterial2D", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.PostProcessing.PostProcessProfile", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.PostProcessing.PostProcessResources", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.VolumeProfile", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.SceneAsset", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.Shader", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.ShaderVariantCollection", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.Texture", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Texture2D", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Timeline.TimelineAsset", + "defaultInstantiationMode": 0 + } + ], + "defaultDependencyTypeInfo": { + "userAdded": false, + "type": "<default_scene_template_dependencies>", + "defaultInstantiationMode": 1 + }, + "newSceneOverride": 0 +} \ No newline at end of file diff --git a/ProjectSettings/ShaderGraphSettings.asset b/ProjectSettings/ShaderGraphSettings.asset index e66042a7c..ce8c24328 100644 --- a/ProjectSettings/ShaderGraphSettings.asset +++ b/ProjectSettings/ShaderGraphSettings.asset @@ -13,6 +13,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: shaderVariantLimit: 128 + overrideShaderVariantLimit: 0 customInterpolatorErrorThreshold: 32 customInterpolatorWarningThreshold: 16 customHeatmapValues: {fileID: 0} diff --git a/ProjectSettings/URPProjectSettings.asset b/ProjectSettings/URPProjectSettings.asset index 08faf0336..6ad563183 100644 --- a/ProjectSettings/URPProjectSettings.asset +++ b/ProjectSettings/URPProjectSettings.asset @@ -12,4 +12,5 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 247994e1f5a72c2419c26a37e9334c01, type: 3} m_Name: m_EditorClassIdentifier: - m_LastMaterialVersion: 9 + m_LastMaterialVersion: 10 + m_ProjectSettingFolderPath: URPDefaultResources diff --git a/ProjectSettings/VFXManager.asset b/ProjectSettings/VFXManager.asset index 3a95c98be..0462703c6 100644 --- a/ProjectSettings/VFXManager.asset +++ b/ProjectSettings/VFXManager.asset @@ -3,10 +3,18 @@ --- !u!937362698 &1 VFXManager: m_ObjectHideFlags: 0 - m_IndirectShader: {fileID: 0} - m_CopyBufferShader: {fileID: 0} - m_SortShader: {fileID: 0} - m_StripUpdateShader: {fileID: 0} + m_IndirectShader: {fileID: 7200000, guid: 84a17cfa13e40ae4082ef42714f0a81c, type: 3} + m_CopyBufferShader: {fileID: 7200000, guid: 23c51f21a3503f6428b527b01f8a2f4e, type: 3} + m_PrefixSumShader: {fileID: 7200000, guid: 783e0fdc1a277f54bb851fd2ceab1e7f, type: 3} + m_SortShader: {fileID: 7200000, guid: ea257ca3cfb12a642a5025e612af6b2a, type: 3} + m_StripUpdateShader: {fileID: 7200000, guid: 8fa6c4009fe2a4d4486c62736fc30ad8, type: 3} + m_EmptyShader: {fileID: 4800000, guid: 33a2079f6a2db4c4eb2e44b33f4ddf6b, type: 3} m_RenderPipeSettingsPath: m_FixedTimeStep: 0.016666668 m_MaxDeltaTime: 0.05 + m_MaxScrubTime: 30 + m_MaxCapacity: 100000000 + m_CompiledVersion: 7 + m_RuntimeVersion: 39 + m_RuntimeResources: {fileID: 11400000, guid: bc10b42afe3813544bffd38ae2cd893d, type: 2} + m_BatchEmptyLifetime: 300