watch_pie_property
Arm before PIE starts, then sample one or more Unreal properties during play to record value changes, including BeginPlay writes. Use it to observe runtime behavior, not find the writer.
Instructions
Sample one or SEVERAL properties across a PIE session, arming BEFORE PIE starts so a write that happens in BeginPlay is still observable. Answers "what did this value do during play", NOT "who wrote it": it SAMPLES rather than intercepting writes, so identifies_writer is always false and a transient A->B->A between two samples is invisible. THE ORDER MATTERS: action="start" arms and returns immediately (it cannot block the game thread), THEN you start PIE, and afterwards action="status" returns the recorded samples. Arming while PIE is ALREADY running is honoured but flagged (armed_while_pie_running) -- the BeginPlay window has already passed for that session, which is precisely the failure this tool exists to avoid, so stop PIE, arm, then start PIE. It self-disarms on duration_seconds or max_samples (it can never leak a ticker) and the recorded samples survive until action="clear".
Returns: { action: string, watch_id?: int, armed?: bool, watches: [{ watch_id, property_name, class_name, actor_label, component, sample_interval_seconds, duration_seconds, max_samples, active, saw_pie_world, armed_while_pie_running, sample_count, elapsed_real_seconds, stop_reason, distinct_objects_seen, samples?: [{ phase, object_path, actor_label, value_text, value, elapsed_real_seconds, world_time_seconds, world, changed_from_previous }] }], identifies_writer: bool, sampling_only: bool, armed_pre_pie?: bool, pie_running?: bool, class_resolved?: bool, hint?: string, world_name: string|null, world_package: string|null, world_type: string|null, net_mode: string|null, pie_instance: number }. The five world_* / net_mode / pie_instance fields identify the PIE world the ticker is sampling AT THE MOMENT OF THE CALL (all null / pie_instance -1 when no PIE session is running, which is the normal state right after arming).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | Optional: "start" (default) | "status" | "stop" | "clear" | "list". | |
| watch_id | No | Target watch for "status" / "stop" / "clear" (omit = all of them). | |
| component | No | Optional component name: sample the property on that component of the matched actor instead of on the actor. | |
| class_name | No | Optional actor class filter (exact UClass name; a Blueprint class needs the "_C" suffix). At least one of class_name / actor_label is required for "start". | |
| properties | No | Optional array of property names sampled TOGETHER, in the SAME tick, as one ROW. This is what answers correlation questions ("movement_mode changed in the same tick immersion crossed the threshold"), which N separate watches cannot: each would dedupe on its own clock and the columns would not line up. The row is the dedup unit -- if ANY field changes the whole row is recorded -- and each sample carries a `values` object with the per-property breakdown. With one property there is no `values` object. | |
| actor_label | No | Optional actor filter, matched against the editor label OR the object name. | |
| max_samples | No | Optional hard cap on recorded samples (default 400). | |
| property_name | No | Property to sample on the matched object. Required for "start" unless `properties` is given. | |
| duration_seconds | No | Optional auto-disarm after this many real seconds (default 300; 0 = no time cap, disarms only on max_samples or an explicit stop). | |
| sample_interval_seconds | No | Optional periodic sampling interval (default 0.1, min 0.01). |