Editor validator
The editor validator: every UK-VAL rule, where it runs and how to fix it.
Assumes you have finished quick-start.
One section below is generated, not typed. § Rules is generated from the kit's own rule catalogue, one line per rule in id order, and the table in § Settings is checked against the kit's setting defaults. The rules table is compared to the catalogue byte for byte, so the page and the rules the kit reports cannot drift.
How to read the brackets. A bracket after a statement says how it is known and on which engine:
[source-read 5.x]— read in that engine's source;[measured 5.x]— observed by the kit's own tests on that engine.
What it checks and when
Before you press Play, the kit looks over the level you have open and tells you, by rule id,
what it finds wrong with the way the kit is set up: an interactable actor that does not replicate,
a preset whose prompt text is too long, a lock component on an actor with two interactables, a
detection radius smaller than an interaction range. Every finding is one UK-VAL-NNN line with the
object it is about and the fix. The runtime lines the kit already logs while a game runs use the
same ids, so a rule means the same thing wherever you meet it.
It is the UKInteractionEditor module, loaded in the editor only. It reads and never writes:
it does not load anything the level has not loaded already, and it never marks an asset dirty,
saves, selects or edits anything.
What it looks at. The actors placed in the open level that carry a UK Interactable, UK Interactor or UK Interaction Lock component; the presets those components reference (each preset once, however many actors share it); the Blueprint classes of those actors and the project's prompt widget class; the detection profiles the interactors resolve; and the project settings. A level with none of the kit's components gets the project-wide checks only.
When it runs.
- When you press Play (Play In Editor or Simulate), while
bValidateOnPIEis on — it is on by default. It runs once, before the play world is created. - On demand: type
UK.Validatein the editor console to check the level that is open now. From Blueprint or CI, run the console commandUK.Validate.
Standalone Game and launcher sessions start without this check, so bValidateOnPIE and
bBlockPIEOnError apply to Play In Editor and Simulate only. [source-read 5.6 / 5.7 / 5.8] If you
play that way, run UK.Validate first.
Play is never blocked by default. A finding is reported, and Play starts. Two settings change that, and they are the two to know about:
bBlockPIEOnError(off by default) — when it is on and a run before Play finds an Error, Play is blocked: the editor refuses to start the session, after every finding has been published, and gives the reason "UK Interaction validator: Play was blocked because the pre-flight run published Error findings and bBlockPIEOnError is on - see the kit's untitled page in the Message Log." The reason appears in the Output Log as a Warning that beginsPlay-In-Editor canceled by plugin:, and on 5.8 also as a notification in the editor[source-read 5.6 / 5.7 / 5.8]. The page it names is the one described in § Where the results appear. Fix the Error (or turn the setting off) and press Play again. A run started withUK.Validatenever blocks anything.[measured 5.6 / 5.7 / 5.8]— a real Play press is denied and no play world is created.bPromoteWarningsToErrors(off by default) — reports every Warning as an Error. An Info is never promoted.
With both on, every Warning blocks Play. That is your own configuration doing what it says — a strict setting for a team that wants no warnings at all — not a defect. The page names the rule and the fix either way.
Where the results appear
Every finding is published twice, with the same text:
-
The Message Log, on the kit's own page (the listing is named
UKInteraction). A line about an actor in the level, or about a preset, carries a link to it, so you can go straight to it; a project-wide line and a line about a Blueprint class have none. The page opens by itself when a run finds an Error (bOpenMessageLogOnError, on by default); for Warnings it stays closed unless you turn onbOpenMessageLogOnWarning; for Info it never opens. The page's tab has no title. The kit does not register a title for its page, and the engine shows an unregistered page with an empty label, so look for the untitled page in the Message Log list.[source-read 5.6 / 5.7 / 5.8](see § Known gaps). -
The Output Log, on the
LogUKInteractionEditorcategory — Error lines as errors, Warning lines as warnings, Info lines atDisplay. Every line has one shape:UK-VAL-021 [Error] /Game/Maps/L_Test:BP_Crate: actor does not replicate — the interactable is InvalidSetup on every machine; tick Replicates on the actorthat is
UK-VAL-<id> [<severity>] <subject>: <message> — <fix>, with the fix left out for a rule that has none. The subject is the asset's object path for a preset,<level>:<actor label>for an actor, and the wordprojectfor a project-wide rule. After the findings, one summary line says the run happened even when it found nothing:UK validator: <n> findings (<m> subjects).
A finding appears once per run however many times it is reached, and findings are listed most severe first, then by rule id, then by subject — so two runs over the same level print the same lines in the same order. Nothing is remembered between runs: fix a finding and it is gone the next time; leave it and it is reported again.
Settings
Project Settings → Plugins → UK Interaction → Validator. The settings are saved in your project's config, so the whole team shares them.
| Setting | Default | Range | What it does |
|---|---|---|---|
bValidateOnPIE | on | — | Run before every Play In Editor / Simulate |
bBlockPIEOnError | off | — | Block Play when the run finds an Error (§ What it checks and when) |
bPromoteWarningsToErrors | off | — | Report every Warning as an Error; Info is never promoted |
bOpenMessageLogOnError | on | — | Open the Message Log page when the run finds an Error |
bOpenMessageLogOnWarning | off | — | Open it for a Warning too |
SuppressedRules | empty | — | Rule ids the project has decided to live with (below) |
MaxValidationMilliseconds | 200 | 50 – 10000 | The fixed part of a run's time budget, in milliseconds |
PerSubjectMicroseconds | 50 | 20 – 500 | The part that grows with the level, in microseconds per checked object |
Suppressing a rule. Add its id — the whole UK-VAL-NNN — to SuppressedRules. A suppressed
rule is not checked at all and appears nowhere. Two rules cannot be suppressed: UK-VAL-121
(which reports an entry of this list that is not a rule id, so a typo is never silently ignored)
and UK-VAL-122 (the partial-run notice below). Listing either of them is itself reported as a
UK-VAL-121. Some rules also switch themselves off where they do not apply — UK-VAL-021 in a
project whose bProjectIsNetworked is off, for example — which is not suppression and needs no
entry.
The time budget. A run may take MaxValidationMilliseconds + PerSubjectMicroseconds × N / 1000
milliseconds, where N is the number of objects the run checks — the <m> subjects of its
summary line: one for the project, plus each preset, each Blueprint class, each actor, each
pairing of a preset with a detection profile, and each interactor component. With the defaults
that is 200 ms plus 0.05 ms for each object. The checks run in a fixed order and each object is
checked whole; if the budget runs out between two objects, the run stops, publishes what it
has, and adds one UK-VAL-122 Info saying how many of the objects it reached (visited /
total). A run that stopped early is therefore never reported as clean. If you see UK-VAL-122,
raise MaxValidationMilliseconds or PerSubjectMicroseconds; a run started with UK.Validate
has the same budget, so it stops at the same place.
Rules
Every rule the kit can report, with its severity, which half of the kit checks it — editor
(this validator, before Play), runtime (the game's log while it runs) or both — the message
and the fix. Words in {braces} are filled in with the actual values when the line is written.
UK-VAL-024 is a Warning, and an Error when the project's DefaultPresetClass is empty or
abstract. UK-VAL-122's fix means the two budget settings in § Settings; a UK.Validate run has
the same budget.
| Rule | Severity | Half | Message | Fix |
|---|---|---|---|---|
UK-VAL-010 | Info | editor | EnhancedInput was enabled by this plugin's Plugins[] entry, not by the project | — |
UK-VAL-011 | Error | editor | the kit is installed twice, at {path_a} and at {path_b} | keep exactly one copy |
UK-VAL-012 | Warning | both | the GameplayAbilities engine plugin is enabled but the GAS adapter is {adapter_state} | add a C++ class to the adapter module and rebuild |
UK-VAL-013 | Warning | both | the CommonUI engine plugin is enabled but the CommonUI adapter is {adapter_state} | add a C++ class to the adapter module and rebuild |
UK-VAL-020 | Error | both | the actor carries {component_count} UUKInteractableComponent, and one is the maximum | remove one |
UK-VAL-021 | Error | both | actor does not replicate | the interactable is InvalidSetup on every machine; tick Replicates on the actor |
UK-VAL-022 | Info | both | preset custom version {asset_version} is below Current ({current_version}), so the asset was migrated on load and its package is dirty | save the asset |
UK-VAL-023 | Error | both | preset custom version {asset_version} is above Current ({current_version}), so no migration exists and the preset is InvalidSetup | update the kit |
UK-VAL-024 | Warning | both | the component has no preset and DefaultPresetClass is {default_preset_class} | assign a preset |
UK-VAL-025 | Warning | both | PromptText is {len} UTF-16 code units, above the {max_len} bound | shorten the prompt |
UK-VAL-026 | Warning | both | preset LockPolicy {policy} is not in AvailableLockPolicies ({available}) | pick an available policy or upgrade the edition |
UK-VAL-027 | Error | both | preset class {class_path} has no kit concrete ancestor | derive from a kit preset class |
UK-VAL-030 | Warning | both | the pawn carries {component_count} UUKInteractorComponent, and one is the maximum | remove one |
UK-VAL-031 | Warning | both | no detection profile is resolvable, because the component override is null and DefaultDetectionProfile is {default_profile} | set DefaultDetectionProfile |
UK-VAL-032 | Warning | editor | InteractionRange {range} exceeds every detection profile's GatherRadiusCm ({radius}), so the prompt appears only inside {radius} cm | raise the profile's radius or lower the range |
UK-VAL-033 | Warning | both | GatherSource is PhysicsOverlap and this interactable's collision is {collision_state} | enable query collision or add the object type to GatherObjectTypes |
UK-VAL-034 | Warning | both | DefaultInputComponentClass is {input_component_class}, not UEnhancedInputComponent | set the project's default input component class |
UK-VAL-035 | Warning | editor | the profile and preset pair violates the slack invariant (range {range}, radius {radius}, interval {interval}) | widen the range or shorten the gather interval |
UK-VAL-040 | Warning | both | the interactor is on a pawn that does not replicate | tick Replicates on the pawn |
UK-VAL-041 | Warning | both | IUKInteractionArbiter is implemented {implementation_count} times on one owner | keep one arbiter |
UK-VAL-042 | Warning | editor | NetCullDistanceSquared ({cull}) is below the usable range squared ({range}) | raise the cull distance |
UK-VAL-050 | Warning | runtime | an authority-only event is bound on a client | — |
UK-VAL-051 | Info | editor | a Blueprint handler of {event_name} calls {call_name} | move the write after the event |
UK-VAL-052 | Warning | both | ReasonStringTable {table_path} is unloadable or is missing the key {key} | restore the table or add the key |
UK-VAL-060 | Warning | both | HoldSeconds {hold_seconds} exceeds MaxHoldSeconds {max_hold_seconds} | lower HoldSeconds |
UK-VAL-061 | Warning | editor | MaxHoldSpeedCmPerSec is 0 while bCancelOnMove is set, so any movement cancels the hold | set a non-zero threshold or disable cancel-on-move |
UK-VAL-062 | Warning | runtime | the interactor velocity sample is not finite | — |
UK-VAL-070 | Warning | both | PromptWidgetClass {class_path} is unloadable | fix the class path |
UK-VAL-071 | Warning | both | the CDO of {class_path} is focusable or Visible | leave focus and visibility to the base class |
UK-VAL-072 | Warning | both | no gamepad key is mapped to InteractAction in {mapping_context} | map a gamepad key |
UK-VAL-073 | Warning | runtime | AddToPlayerScreen returned false, so the prompt is not in the viewport | — |
UK-VAL-100 | Warning | editor | preset LockPolicy is ExclusiveQueue and the owner has no UUKInteractionLockComponent | add a lock component |
UK-VAL-101 | Warning | both | the lock component's owner has {interactable_count} interactable components | one interactable per lock |
UK-VAL-102 | Info | editor | the lock component's preset LockPolicy is None | set ExclusiveQueue or remove the lock component |
UK-VAL-110 | Warning | both | the pickup preset has IdentityTag None | set an IdentityTag |
UK-VAL-111 | Warning | both | the pickup preset has CooldownSeconds {cooldown_seconds}, which the pickup ignores | use RespawnSeconds |
UK-VAL-112 | Warning | both | the lever preset has InitialPosition {initial_position} at or above PositionCount {position_count} | lower InitialPosition |
UK-VAL-113 | Warning | both | the hold host's Hold.HoldSeconds {hold_seconds} exceeds MaxHoldSeconds {max_hold_seconds} | lower HoldSeconds |
UK-VAL-120 | Error | editor | {subject_role} holds a hard reference through {property_name} to {class_path}, whose module {module_name} is ClientOnly, so a dedicated-server cook drops the class and the reference nulls | reference it by soft path from a Client-only object, or move the reference |
UK-VAL-121 | Warning | editor | the SuppressedRules entry {entry} is not a catalogue row, or it names one of the two exempt ids | fix the typo or remove the entry |
UK-VAL-122 | Info | editor | the run exceeded MaxValidationMilliseconds and stopped early (visited={visited};total={total}), so these results are partial | raise MaxValidationMilliseconds or PerSubjectMicroseconds |
The runtime lines are the owning page's to explain: lock.md, presets.md, events.md and behaviors.md describe when their rules fire in a running game.
Limits
UK-VAL-120knows the kit's own client-only modules, not yours. It reports a hard reference to a class in a client-only module — a reference a dedicated-server build silently loses — from an actor the run checks, or from a preset or Blueprint class the run checks that lives under one of your project's always-cook directories. It recognises the kit's client-only modules,UKInteractionClientandUKInteractionDebug. A client-only module of your own project is not recognised, so a hard reference into it is not reported.- Only actors placed in the level are checked. A pawn your GameMode spawns when Play starts —
the quick-start's Third Person character is one — does not exist in the editor, so the editor
halves of
UK-VAL-030,UK-VAL-031andUK-VAL-040do not run on it; their runtime lines still do. - A rule that cannot decide stays quiet. If the information a rule needs is not loaded (a preset class whose module is not loaded, for example), the rule skips that object; a skip is not a finding and is not reported.
- Two runs asked for at once. If a second run is asked for while one is publishing, it runs once right after, over the level as it is then; a third request in the same moment is dropped.
- A duplicate install may stop the editor before any check runs.
UK-VAL-011reports the kit installed twice when the editor does start; when it does not, see install.md.
Screenshot

Captured on Unreal Engine 5.8.
Known gaps
Recorded so you can read every claim on this page as narrowly as it was proven.
- Engine coverage. In one line: "supported on 5.6–5.8; multiplayer end-to-end suite run on all three".
- Standalone and launcher play are not checked before they start (§ What it checks and when).
Run
UK.Validatefirst. - The Message Log page has no title. Naming it needs an engine module the kit does not depend on; the page and its lines are otherwise complete.
UK-VAL-120does not know your own client-only modules (§ Limits).- Not in the Lite edition. The Lite edition does not include the validator module, so none of the editor checks on this page run there; the runtime lines still do.
- No check when you save an asset, and no menu entry. The validator runs before Play and on
UK.Validate; a save-time check and a Tools-menu entry are not in this version.