Common problems
From symptom to cause: a loop that stops after one iteration, an ensure when an actor is moved, a console command that does nothing, a node that will not compile, pins that come back as wildcards.
Table of contents
- A loop runs one iteration and then nothing happens
Completednever firesWait Untilnever fires anything- An
ensurefires every time an actor is moved in the editor - The tickable object does not tick
- The object keeps ticking while PIE is paused
- A console command is in autocomplete but does nothing
Register Console Commandreturnsfalseunresolved external symbolwhen building- A node is missing from the palette
Print String Formattedpins are wildcards after restarting the editorCreate Event Signature Erroron theConditionpin- Behaviours that look like a fault
A loop runs one iteration and then nothing happens
Auto Continue is cleared and the body never calls Continue Loop. The loop is waiting,
not stuck: after 30 seconds it logs a Warning on
LogStillCooking that says so and names
the call. Either wire Continue Loop (on the node’s Loop pin) at the end of the latent body, or
check Auto Continue if the body is synchronous.
If the body is synchronous and Auto Continue is checked, the loop cannot park — look for a
Break Loop fired from the body at index 0, and check Count.
Completed never fires
In order of likelihood:
- The loop is suspended — see above.
- The world was torn down under the task.
Completedis deliberately not broadcast on teardown. - The node was started with no world. The log has
A StillCooking|Flow task was started without a world; it is aborted.and nothing fires — the one message every Flow node can write. On a loop node it comes right after the engine’s own warning about the world context object. In C++, pass a world context that resolves to a world. Countwas0and the delegate was bound afterActivate()in C++.Completedfires during activation in that case; bind first.
Wait Until never fires anything
Timeout is 0 — no deadline — and the condition never becomes true. After 30 seconds
the log carries a Warning starting FSCFlowConditionPoll has polled … —
the warning for a wait with no deadline, in full. Set a Timeout, or
fix the condition.
On Timed Out fired at once, with an Error in the log starting Wait Until has no callable Condition — the error for a condition that can never answer:
the Condition pin is not bound, or the object owning the bound function was
destroyed. Bind through Create Event to a Blueprint
function, on an object that outlives the wait.
On Timed Out fired without the condition being asked on any tick: Poll Interval is at or
above Timeout. Lower the interval or
raise the timeout.
An ensure fires every time an actor is moved in the editor
The ensure that names the object and the Shutdown() that never came:
<ObjectName>: destroyed while still initialized - the owner never called Shutdown().The tickable object is created from the Construction Script, which
is mutually exclusive with the ownership contract.
Create the object in BeginPlay and shut it down in EndPlay.
The same ensure mid-game means an owner dropped or reassigned its reference without calling
Shutdown() first; the message names the object. (A missing Shutdown() in EndPlay alone
does not produce it at the end of a Play session — the object shuts itself down when its world
is cleaned up.)
The tickable object does not tick
- Was
Initialize()called? Ticking starts there, not in the constructor.IsInitialized()tells you. - Did
Initialize()logInitialize found no world on the outer chain.? ThatError, and the two other messages this class writes. The outer passed toNewObject/ Construct Object from Class resolves no world. Use an actor, a component or the world as the outer, not the transient package. - Is it an editor world? Without
bTickInEditoran initialized, enabled object stays silent outside Play. - Was
DisableTick()called beforeInitialize()? That is honoured — an explicit call outranksbStartTickingOnInitialize. - Is the game paused and
bTickWhenPausedoff?
The object keeps ticking while PIE is paused
bTickInEditor is true, and the editor branch it turns on bypasses the pause rule for the
whole editor process, PIE included. Clear
bTickInEditor if you need pause handling; in the editor you cannot have both. A packaged build
does not have this behaviour.
A console command is in autocomplete but does nothing
Outside Play: the name is there and the body is not — a static command is visible from editor start and executable only with a game world. The log says so:
SC.<Id>: no game world - a statically registered command is visible from editor start, but its body lives in a Blueprint that exists only once the game or a PIE session runs.Start Play and run it again.
During Play: there is no Blueprint child of the registry implementing On Static Command,
or its switch has no case for this CommandId. Check the registry’s startup line in the log —
Console command registry initialized (<ClassName>) — to see whether your Blueprint child is the
class that runs. If the class name is the C++ one, no subclass was found: the child does not
exist, or, in a cooked build, it was not loaded when the subsystem collection initialized.
Register Console Command returns false
In the log, a Warning names the reason — these three, and
every other message the registry can write:
| Message | Cause → fix |
|---|---|
rejected '<Name>' - empty name or unbound callback. | no name, or nothing bound → give it a name; bind Callback to a custom event with an Args pin |
'<Name>' already exists, skipped. | another owner has the name — a second actor of the same class, or a previous session’s command that was never unregistered; the first registration stays → choose a unique name, or unregister the old one |
'<Name>' was refused by the console manager. | the console manager rejected the name → choose a different name |
No message at all and false: the build is Shipping, where
the registry’s registration is compiled out.
Registered from the Construction Script? It runs in the editor world, where there is no
registry, and silently does nothing outside PIE. Move
it to BeginPlay.
unresolved external symbol when building
Your module calls a StillCookingCore class and does not list the module. Add
"StillCookingCore" to PublicDependencyModuleNames in your Build.cs.
Blueprint-only use never sees this error.
A node is missing from the palette
- All four Flow nodes missing: the runtime module did not build or the plugin is disabled. Verification walks through it.
- Only
Print String Formattedmissing: theStillCookingCoreEditormodule did not build. It is a separate module; check the build output for it. - All four Flow nodes missing, but only inside a function graph: that is expected — they are placeable on an event graph only.
Print String Formatted pins are wildcards after restarting the editor
Versions 0.6.0 and 0.7.0: on load, connected argument pins came back typed as wildcards and the Blueprint would not compile until each was unplugged and plugged back in. Fixed in 0.7.1. Update, reopen the asset; no resave is needed.
Create Event Signature Error on the Condition pin
The compiler, not the plugin, writes this one —
why Condition has to be a function:
Create Event Signature Error: The function/event '<name>' does not match the necessary signature - has the delegate or function/event changed?The pin is bound to a custom event. Condition returns a Boolean, and an event cannot. Create
a Blueprint function with input Attempt (Integer) and a Boolean output, and bind that.
Behaviours that look like a fault
For Each Index With Delayruns index0immediately, not afterDelay. That is the default;Delay Before First Iterationchanges it.Completedfollows the last iteration with no delay. The delay is between iterations.Do For Duration’s firstAlphais not0. The first update is one delta in.Do For Durationdelivers anAlphaabove1. The curve overshoots; that is honoured.Items Per Tickseems ignored.Auto Continueis cleared.1234prints as1 234fromPrint String Formatted. Numeric arguments are formatted by the current culture.SC.Debug.Pingdoes nothing in a fresh project. There is no Blueprint child implementingOn Static Command; reaching the registry is all the example promises.