Diagnosis (agent + live values): tuning & tread geometry were fine, debugAutoDrive
off — the real drag was the box chassis sliding on default ~0.6 friction, which ate
forward speed AND resisted yaw (dead steering).
- Bot_LowFriction physics material (0.3, Minimum combine) on the chassis → slides +
yaws freely.
- TreadPart yaw-assist (220 N·m, sign reinforces natural differential) so a throttle
difference gives a clear turn; cancels to zero on equal throttle (straight kept).
- SeatManager: context-aware controls tooltip under the seat box (on-foot vs driving),
with a 'turn: differ vs teammate' hint.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- CameraDirector: AvatarFollow now uses always-on mouse-look (no RMB) with a
locked/hidden cursor; Esc toggles the cursor free; RobotFollow keeps RMB-look.
- PlayerAvatar: movement is camera-relative (W = camera forward, character turns
to face where it runs) instead of world/cardinal.
- PlayerAvatar: E claims a tread on foot, Q leaves while seated (locked cursor
makes the OnGUI buttons unclickable).
- Verified in play: cursor locks in on-foot mode, camera-relative basis correct,
no runtime errors.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Avatar/Robot follow cams now orbit from player input: hold right-mouse + drag to
look around (yaw/pitch clamped), scroll to zoom (3..80m so you can pull back and
survey the arena). Per-mode default distance on switch, look angle persists.
Stand/Cinematic unaffected.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Install Cinemachine 3.1.7
- Stand (raised platform behind north wall) with StandPoint_0/_1
- PlayerAvatar: seat-ownership drives the mode — hold a seat => teleport to your
stand, freeze, refuse input (control transfers/locks to your tread); release =>
teleport back, resume on-foot. Resolves the WASD overlap off one flag.
- CameraDirector on Main Camera: 4 Cinemachine vcams (AvatarFollow / RobotFollow
/ StandView / CinematicOrbit), Brain blends; V cycles; default auto-follows the
seat flag (on-foot=Avatar, driving=Robot). Retires the old FollowCamera.
- Verified in play: claim->teleport+freeze+RobotFollow, release->return+AvatarFollow
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Instant full-speed-on-press / dead-stop-on-release was the jerky/jarring feel
and made the anim pop Idle->Run. Now MoveTowards-ramps horizontal velocity
(accel 45, decel 60 m/s^2), so starts/stops ease and Idle->Walk->Run blends.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Ground scaled to 150x150m; dirt re-tiled to 24x (~6.25m/tile) to hold look
- ArenaWalls: 4 invisible BoxCollider physics walls (4m tall, sealed corners)
- Junkyard_Walls: 96 cargo containers (24/side) ringing the perimeter as the
visible wall (Junkyard models pack; physics handled by the invisible walls)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Arena_Ground_Dirt.mat = Junk Car Parts/dirt.png (seamless cracked-earth),
Repeat wrap, 8x tiling (~6m/tile) on the 50x50m Ground plane.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- ShoveBall: in-scene NetworkObject sphere (1.5m, 10kg, drag 0.5) at
(0,0.75,6), host-authoritative via NetworkRigidbody/NetworkTransform,
ShoveBall.physicsMaterial (friction 0.4/0.5, bounce 0.3). No script.
- FollowCamera on Main Camera, target=Bot, offset (0,8,-12).
- Solo host smoke test passed: ball spawns + rests on ground + shoves;
camera frames the bot.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
First 2-pilot test: bot was too hot (1200N cruise) and top-heavy -> launched
off on any nudge. Tamed in-scene: cruiseForce 1200->450, linearDamping 1.5,
angularDamping 6, maxAngularVelocity capped at 3, and lowered centerOfMass to
(0,-0.6,0) so it's bottom-heavy and resists cartwheeling. Added a host-only
debugAutoDriveFull flag on TreadPart to feel two-tread coordination solo.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Rewrote TreadPart: seat-based input gating (was mis-wired to NetworkObject
IsOwner, which needs per-tread ownership that NGO forbids for nested
NetworkObjects). Both treads now share the chassis NetworkObject; a client
drives the tread whose SeatManager seat it holds, host re-validates OwnsSeat
on a RequireOwnership=false RPC. Also swapped to Keyboard.current (New input).
- Moved SeatManager OnGUI below the connectivity panel (was overlapping).
- M1_Arena: in-scene Bot NetworkObject = chassis (Rigidbody 60kg + NetworkObject
+ NetworkTransform + NetworkRigidbody + SeatManager) + Tread_L/Tread_R children
(TreadPart, world offset +/-1.2 X for differential drive).
- Solo-verified: bot auto-spawns in-scene, seat claim + input gating wired.
Controls: W/Up throttle, Shift pivot, A/D lean.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Editor-only clone tool so the capsule/bot replication can be tested with
a second Unity instance (joins the host via Relay code) without a separate
machine or a standalone build. Clone lives at ../jankenbots_clone_0
(sibling of the repo, symlinks Assets + ProjectSettings back to it).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Project ships Active Input Handling = Input System (New) only, so the
drafted legacy Input.GetAxisRaw would throw InvalidOperationException at
runtime. Read WASD/arrows off Keyboard.current instead — no restart, no
action asset needed. (TreadPart needs the same swap when the bot lands.)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Empty host-authoritative arena: NetworkManager GameObject carries
NetworkManager, UnityTransport (wired as NetworkConfig.NetworkTransport),
and the NetworkBootstrap Relay host/join harness. Ground plane, camera,
directional light. Set as the build startup scene for two-client testing.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>