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.

  1. When you press Play (Play In Editor or Simulate), while bValidateOnPIE is on — it is on by default. It runs once, before the play world is created.
  2. On demand: type UK.Validate in the editor console to check the level that is open now. From Blueprint or CI, run the console command UK.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 begins Play-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 with UK.Validate never 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:

  1. 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 on bOpenMessageLogOnWarning; 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).

  2. The Output Log, on the LogUKInteractionEditor category — Error lines as errors, Warning lines as warnings, Info lines at Display. 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 actor
    

    that 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 word project for 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.

SettingDefaultRangeWhat it does
bValidateOnPIEon—Run before every Play In Editor / Simulate
bBlockPIEOnErroroff—Block Play when the run finds an Error (§ What it checks and when)
bPromoteWarningsToErrorsoff—Report every Warning as an Error; Info is never promoted
bOpenMessageLogOnErroron—Open the Message Log page when the run finds an Error
bOpenMessageLogOnWarningoff—Open it for a Warning too
SuppressedRulesempty—Rule ids the project has decided to live with (below)
MaxValidationMilliseconds20050 – 10000The fixed part of a run's time budget, in milliseconds
PerSubjectMicroseconds5020 – 500The 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.

RuleSeverityHalfMessageFix
UK-VAL-010InfoeditorEnhancedInput was enabled by this plugin's Plugins[] entry, not by the project—
UK-VAL-011Erroreditorthe kit is installed twice, at {path_a} and at {path_b}keep exactly one copy
UK-VAL-012Warningboththe GameplayAbilities engine plugin is enabled but the GAS adapter is {adapter_state}add a C++ class to the adapter module and rebuild
UK-VAL-013Warningboththe CommonUI engine plugin is enabled but the CommonUI adapter is {adapter_state}add a C++ class to the adapter module and rebuild
UK-VAL-020Errorboththe actor carries {component_count} UUKInteractableComponent, and one is the maximumremove one
UK-VAL-021Errorbothactor does not replicatethe interactable is InvalidSetup on every machine; tick Replicates on the actor
UK-VAL-022Infobothpreset custom version {asset_version} is below Current ({current_version}), so the asset was migrated on load and its package is dirtysave the asset
UK-VAL-023Errorbothpreset custom version {asset_version} is above Current ({current_version}), so no migration exists and the preset is InvalidSetupupdate the kit
UK-VAL-024Warningboththe component has no preset and DefaultPresetClass is {default_preset_class}assign a preset
UK-VAL-025WarningbothPromptText is {len} UTF-16 code units, above the {max_len} boundshorten the prompt
UK-VAL-026Warningbothpreset LockPolicy {policy} is not in AvailableLockPolicies ({available})pick an available policy or upgrade the edition
UK-VAL-027Errorbothpreset class {class_path} has no kit concrete ancestorderive from a kit preset class
UK-VAL-030Warningboththe pawn carries {component_count} UUKInteractorComponent, and one is the maximumremove one
UK-VAL-031Warningbothno detection profile is resolvable, because the component override is null and DefaultDetectionProfile is {default_profile}set DefaultDetectionProfile
UK-VAL-032WarningeditorInteractionRange {range} exceeds every detection profile's GatherRadiusCm ({radius}), so the prompt appears only inside {radius} cmraise the profile's radius or lower the range
UK-VAL-033WarningbothGatherSource is PhysicsOverlap and this interactable's collision is {collision_state}enable query collision or add the object type to GatherObjectTypes
UK-VAL-034WarningbothDefaultInputComponentClass is {input_component_class}, not UEnhancedInputComponentset the project's default input component class
UK-VAL-035Warningeditorthe profile and preset pair violates the slack invariant (range {range}, radius {radius}, interval {interval})widen the range or shorten the gather interval
UK-VAL-040Warningboththe interactor is on a pawn that does not replicatetick Replicates on the pawn
UK-VAL-041WarningbothIUKInteractionArbiter is implemented {implementation_count} times on one ownerkeep one arbiter
UK-VAL-042WarningeditorNetCullDistanceSquared ({cull}) is below the usable range squared ({range})raise the cull distance
UK-VAL-050Warningruntimean authority-only event is bound on a client—
UK-VAL-051Infoeditora Blueprint handler of {event_name} calls {call_name}move the write after the event
UK-VAL-052WarningbothReasonStringTable {table_path} is unloadable or is missing the key {key}restore the table or add the key
UK-VAL-060WarningbothHoldSeconds {hold_seconds} exceeds MaxHoldSeconds {max_hold_seconds}lower HoldSeconds
UK-VAL-061WarningeditorMaxHoldSpeedCmPerSec is 0 while bCancelOnMove is set, so any movement cancels the holdset a non-zero threshold or disable cancel-on-move
UK-VAL-062Warningruntimethe interactor velocity sample is not finite—
UK-VAL-070WarningbothPromptWidgetClass {class_path} is unloadablefix the class path
UK-VAL-071Warningboththe CDO of {class_path} is focusable or Visibleleave focus and visibility to the base class
UK-VAL-072Warningbothno gamepad key is mapped to InteractAction in {mapping_context}map a gamepad key
UK-VAL-073WarningruntimeAddToPlayerScreen returned false, so the prompt is not in the viewport—
UK-VAL-100Warningeditorpreset LockPolicy is ExclusiveQueue and the owner has no UUKInteractionLockComponentadd a lock component
UK-VAL-101Warningboththe lock component's owner has {interactable_count} interactable componentsone interactable per lock
UK-VAL-102Infoeditorthe lock component's preset LockPolicy is Noneset ExclusiveQueue or remove the lock component
UK-VAL-110Warningboththe pickup preset has IdentityTag Noneset an IdentityTag
UK-VAL-111Warningboththe pickup preset has CooldownSeconds {cooldown_seconds}, which the pickup ignoresuse RespawnSeconds
UK-VAL-112Warningboththe lever preset has InitialPosition {initial_position} at or above PositionCount {position_count}lower InitialPosition
UK-VAL-113Warningboththe hold host's Hold.HoldSeconds {hold_seconds} exceeds MaxHoldSeconds {max_hold_seconds}lower HoldSeconds
UK-VAL-120Erroreditor{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 nullsreference it by soft path from a Client-only object, or move the reference
UK-VAL-121Warningeditorthe SuppressedRules entry {entry} is not a catalogue row, or it names one of the two exempt idsfix the typo or remove the entry
UK-VAL-122Infoeditorthe run exceeded MaxValidationMilliseconds and stopped early (visited={visited};total={total}), so these results are partialraise 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-120 knows 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, UKInteractionClient and UKInteractionDebug. 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-031 and UK-VAL-040 do 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-011 reports the kit installed twice when the editor does start; when it does not, see install.md.

Screenshot

The UKInteraction message log page with a UK-VAL-021 Error on an actor that does not replicate and a UK-VAL-025 Warning on a preset whose prompt text is too long (Unreal Engine 5.8)

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.Validate first.
  • 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-120 does 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.