Set up DOTS + Netcode for Entities foundation
One-time stack setup per Docs/dots-setup-task.md (Unity 6.4.7 / 6000.4.7f1).
Packages: entities 6.4.0, entities.graphics 6.4.0, netcode 1.13.2, physics 1.4.6.
- Assets/_Project asmdef split: ProjectM.Simulation/Client/Server/Authoring (root ns ProjectM)
- GameBootstrap : ClientServerBootstrap; verified separate client + server worlds in Play Mode
- Gameplay subscene wired into SampleScene as a baking target
- Heartbeat component + Burst ISystem; EditMode smoke test green (1/1)
- In-repo Obsidian vault (Docs/Vault) incl. DR-001 (plain-Entities test over internal NetCodeTestWorld)
- Portable .mcp.json (basic-memory + serena via ${CLAUDE_PROJECT_DIR}); CLAUDE.md conventions
- .gitignore for DOTS baking cache + machine-local config
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Vendored
+1
@@ -0,0 +1 @@
|
||||
{}
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
{}
|
||||
+33
@@ -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
|
||||
}
|
||||
@@ -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.
|
||||
@@ -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/`
|
||||
@@ -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.
|
||||
@@ -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`).
|
||||
@@ -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.
|
||||
@@ -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]]).
|
||||
@@ -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.
|
||||
@@ -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/<year>/`) → 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.
|
||||
@@ -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`
|
||||
@@ -0,0 +1,25 @@
|
||||
---
|
||||
permalink: gamevault/templates/decision-record-template
|
||||
---
|
||||
|
||||
---
|
||||
id: DR-###
|
||||
title: <short title>
|
||||
status: proposed # proposed | accepted | superseded
|
||||
date: {{date:YYYY-MM-DD}}
|
||||
tags: [decision]
|
||||
---
|
||||
|
||||
# DR-### — <title>
|
||||
|
||||
## Context
|
||||
|
||||
_What forced a choice? Constraints, versions, evidence._
|
||||
|
||||
## Decision
|
||||
|
||||
_What we chose, stated plainly._
|
||||
|
||||
## Consequences
|
||||
|
||||
_Trade-offs accepted; what to revisit later and when._
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user