3.7 KiB
3.7 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
This is a Unity MOBA game with a custom RUDP (Reliable UDP) networking layer built on KCP. The architecture follows a server-authoritative hybrid sync model:
- Client: captures input, sends
MoveInput/ShootInput, predicts local movement, interpolates remote players - Server: owns gameplay truth (position, HP, combat resolution), broadcasts authoritative
PlayerState/CombatEvent
Commands
# Build test assemblies
dotnet build Network.EditMode.Tests.csproj -v minimal
# Run regression suite
dotnet test Network.EditMode.Tests.csproj --no-build -v minimal
Set DOTNET_CLI_HOME=.dotnet-home and DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 if needed.
Architecture
Dual-Lane Transport
The transport layer uses two distinct lanes with different delivery semantics:
| Lane | Policy | Messages |
|---|---|---|
Sync lane (HighFrequencySync) |
Latest-wins, stale-drop | MoveInput, PlayerState |
Reliable lane (ReliableOrdered) |
Ordered, guaranteed delivery | ShootInput, CombatEvent, login/heartbeat |
Never mix messages with different delivery requirements into the same lane.
Directory Structure
Assets/Scripts/Network/
├── Defines/ # MessageType enum, protobuf message definitions
├── NetworkTransport/ # KcpTransport, ReliableUdpTransport, ITransport
├── NetworkApplication/# MessageManager, SessionManager, DeliveryPolicy, dispatchers
└── NetworkHost/ # ServerNetworkHost, ServerAuthoritativeMovementCoordinator, ServerRuntimeHandle
Assets/Scripts/Extensions/ # Unity-specific helpers (protobuf-to-Unity conversions)
Assets/Tests/EditMode/Network/ # NUnit edit-mode regression tests
openspec/ # Specs and change artifacts
Key Types
MessageManager: routes all gameplay messages throughEnvelope, mapsMessageType→DeliveryPolicyServerNetworkHost: server lifecycle, session state, hosts authoritative coordinatorsServerAuthoritativeMovementCoordinator: server-side movement validation and state broadcastServerAuthoritativeCombatCoordinator: server-side combat resolutionSyncSequenceTracker: stale-packet filtering for sync lane (keyed byplayerId + tick)ClientPredictionBuffer: stores pending inputs for local player prediction/replayRemotePlayerSnapshotInterpolator: buffers remotePlayerStatefor smooth interpolation
Client Prediction Flow
- Client sends
MoveInputon sync lane - Client immediately applies predicted movement locally
- Server receives, validates, updates authoritative state
- Server broadcasts
PlayerStateon sync lane - Client compares authoritative state against predicted; corrects if divergence exceeds threshold
OpenSpec Workflow
Use openspec commands for substantial changes:
openspec status --change "<name>"— check progressopenspec instructions apply --change "<name>" --json— read current tasks before editing
Code Rules
- No Unity dependencies in
Assets/Scripts/Network/— shared networking must remain engine-agnostic - Server owns gameplay truth — clients submit intent only, never finalize position/HP/combat
- Tick required on all gameplay messages — enables stale filtering and reconciliation
- 4-space indentation,
PascalCasepublic APIs,_camelCaseprivate fields - Add NUnit tests for any network-layer behavior change; use explicit regression-style names