Phase 3 updates

Phase 3 · Slice 2 ·

Input and Roll-a-Ball

  • Legacy Input: GetKey/Down/Up by KeyCode or Unity key name, mouse buttons, mousePosition, mouseScrollDelta, anyKey/anyKeyDown, and GetAxis/GetAxisRaw/GetButton* over Unity's default InputManager axes (Horizontal/Vertical with gravity 3, sensitivity 3 and snap; Fire1-3, Jump, Submit, Cancel; Mouse X/Y/ScrollWheel), smoothed like Unity once per frame. Native state is bitsets of held/pressed/released keys, fed by winit in the player and released when the window loses focus.
  • MCP input injection: play_step takes input (hold, press, mouse_buttons, mouse_position, mouse_move, scroll, keep_held); presses land on the first frame, held keys are released after the step.
  • Tags and layers: tag, CompareTag, FindWithTag/FindGameObjectsWithTag, Camera.main preferring "MainCamera"; editor commands set_tag/set_layer with undo; scenes and Instantiate carry both.
  • Fix: triangle MeshColliders collided only from below (normals were flipped when cooking); a Rust test now drops a ball on a mesh ground.
  • Milestone (3D half): dotnet/samples/scenes/rollaball.json runs tutorial-style PlayerController (axes and AddForce in FixedUpdate, OnTriggerEnter with CompareTag("PickUp")), CameraController and Rotator scripts written against plain UnityEngine. An MCP e2e test holds D and checks that the ball rolls into a pick-up and wins. Legacy input can't be injected in Unity batchmode, so there is no Input conformance scenario; the axis tables and smoothing follow Unity's InputManager.asset and documented behavior.