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