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>
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>