2.7 KiB
uid
| uid |
|---|
| input-system-record-events |
Record events
NOTE: To download a sample project which contains a reusable MonoBehaviour called
InputRecorder, which can capture and replay input from arbitrary devices, open the Package Manager, select the Input System Package, and choose the sample project "Input Recorder" to download.
You can use the InputEventTrace class to record input events for later processing:
var trace = new InputEventTrace(); // Can also give device ID to only
// trace events for a specific device.
trace.Enable();
//... run stuff
var current = new InputEventPtr();
while (trace.GetNextEvent(ref current))
{
Debug.Log("Got some event: " + current);
}
// Also supports IEnumerable.
foreach (var eventPtr in trace)
Debug.Log("Got some event: " + eventPtr);
// Trace consumes unmanaged resources. Make sure to dispose.
trace.Dispose();
Dispose event traces after use, so that they do not leak memory on the unmanaged (C++) memory heap.
Note
Keyboard text input is not replayed to UI text fields. Keyboard state (key presses) is captured and replayed correctly and remains accessible via
Keyboard.current. However, there is a known limitation with character delivery to UI Framework components (uGUIInputFieldor UI ToolkitTextField). These components receive text through a separate native pipeline that is not fed by event replay. As a result, text typed into UI text fields during recording will not appear during playback.
You can also write event traces out to files/streams, load them back in, and replay recorded streams.
// Set up a trace with such that it automatically grows in size as needed.
var trace = new InputEventTrace(growBuffer: true);
trace.Enable();
// ... capture some input ...
// Write trace to file.
trace.WriteTo("mytrace.inputtrace.");
// Load trace from same file.
var loadedTrace = InputEventTrace.LoadFrom("mytrace.inputtrace");
You can replay captured traces directly from InputEventTrace instances using the Replay method.
// The Replay method returns a ReplayController that can be used to
// configure and control playback.
var controller = trace.Replay();
// For example, to not replay the events as is but rather create new devices and send
// the events to them, call WithAllDevicesMappedToNewInstances.
controller.WithAllDevicessMappedToNewInstances();
// Replay all frames one by one.
controller.PlayAllFramesOnyByOne();
// Replay events in a way that tries to simulate original event timing.
controller.PlayAllEventsAccordingToTimestamps();