uloop-record-input
uloop record-input
Record keyboard and mouse input during PlayMode frame-by-frame into a JSON file. Captures key presses, mouse movement, clicks, and scroll events via Input System device state diffing.
Usage
# Start recording
uloop record-input --action Start
# Start recording with key filter
uloop record-input --action Start --keys "W,A,S,D,Space"
# Stop recording and save
uloop record-input --action Stop
# Stop and save to specific path
uloop record-input --action Stop --output-path scripts/my-play.json
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
--action |
enum | Start |
Start - begin recording, Stop - stop and save |
--output-path |
string | auto | Save path. Auto-generates under .uloop/outputs/InputRecordings/ |
--keys |
string | "" |
Comma-separated key filter. Empty = all common game keys |
Design Guidelines for Deterministic Replay
Replay injects input frame-by-frame, so the game must produce identical results given identical input on each run. The following patterns break determinism and must be avoided in replay-targeted code:
| Avoid | Use Instead | Why |
|---|---|---|
Time.deltaTime for movement |
Fixed per-frame constant (e.g. MOVE_SPEED = 0.1f) |
deltaTime varies between runs even at the same target frame rate |
Random.Range() / UnityEngine.Random |
Seeded random (new System.Random(fixedSeed)) or remove randomness |
Different random sequence each run |
Rigidbody / Physics simulation |
Kinematic movement via Transform.Translate |
Physics is non-deterministic across runs |
WaitForSeconds(n) in coroutines |
WaitForEndOfFrame or frame counting |
Real-time waits depend on frame timing |
Time.time / Time.realtimeSinceStartup |
Frame counter (Time.frameCount - startFrame) |
Time values drift between runs |
FindObjectsOfType without sort |
FindObjectsByType(FindObjectsSortMode.InstanceID) |
Iteration order is non-deterministic |
async/await with Task.Delay |
Frame-based waiting | Real-time delays are non-deterministic |
Set Application.targetFrameRate = 60 (or your target) to reduce frame timing variance. See InputReplayVerificationController for a complete example of deterministic game logic.
Prerequisites
- Unity must be in PlayMode
- Input System package must be installed (
com.unity.inputsystem) - Active Input Handling must be set to
Input System Package (New)orBothin Player Settings
Output
Returns JSON with:
Success: Whether the operation succeededMessage: Status messageOutputPath: Path to saved recording (Stop only)TotalFrames: Number of frames recorded (Stop only)DurationSeconds: Recording duration in seconds (Stop only)
More from hatayama/unity-cli-loop
uloop-control-play-mode
Control Unity Editor play mode (play/stop/pause). Use when you need to: (1) Start play mode to test game behavior, (2) Stop play mode to return to edit mode, (3) Pause play mode for frame-by-frame inspection.
3uloop-run-tests
Execute Unity Test Runner and get detailed results. Use when you need to: (1) Run EditMode or PlayMode unit tests, (2) Verify code changes pass all tests, (3) Diagnose test failures with error messages and stack traces. Auto-saves NUnit XML results on failure.
2uloop-compile
Compile Unity project and report errors/warnings. Use when you need to: (1) Verify code compiles after C# file edits, (2) Check for compile errors before testing, (3) Force full recompilation with Domain Reload. Returns error and warning counts.
2uloop-screenshot
Capture screenshots of Unity Editor windows as PNG files. Use when you need to: (1) Screenshot Game View, Scene View, Console, Inspector, or other windows, (2) Capture current visual state for debugging or documentation, (3) Save editor window appearance as image files.
2uloop-launch
Launch Unity project with matching Editor version via uloop CLI. Use when you need to: (1) Open a Unity project with the correct Editor version, (2) Restart Unity to apply changes, (3) Switch build target when launching.
2uloop-find-game-objects
Find GameObjects in the active scene by various criteria. Use when you need to: (1) Search for objects by name, regex, or path, (2) Find objects with specific components, tags, or layers, (3) Get currently selected GameObjects in Unity Editor. Returns matching GameObjects with hierarchy paths and components.
2