Deep Dive · EXTRA
No Counterpart: Construction Script, Timeline, Animation Blueprint
Three words with no translation. What each of them actually does, why Verse has no direct equivalent, and roughly how UE6 is likely to handle them.
Open the extra →Learning a new language, the expensive part isn't the syntax — it's "I know what I want, I just don't know what it's called over there". This lesson is a dictionary you can keep coming back to: six tables grouped by domain, translating every Blueprint thing into its Verse name, then pointing out which ones share a name but not a meaning, and which ones have no counterpart at all. Get through this page and every later lesson gets easier.
You already know how to make a door that opens: add a Boolean called IsOpen in the variables panel, Bind the button's event in Event BeginPlay, wire a Branch into the callback, and hang a Set node on the branch that passes. You could wire that up with your eyes closed.
In Verse you're doing the same thing. What actually stops you is a different question: that Boolean type — what do I pick in the dropdown? Search the docs and you won't find bool — because in Verse it's called logic. You aren't stuck on the concept. You just didn't know it changed names.
That "I know what I want, I don't know what it's called" stall will hit you dozens of times in your first two weeks of Verse. None of them are hard, and every one of them costs you ten minutes. This lesson clears all of them at once: six tables, more than fifty terms, looked up once.
Every table has three columns: what it's called in Blueprints / what it's called in Verse / the difference. The first two columns are for lookups. The third column is the valuable part — plenty of terms look like a clean one-to-one match and then behave differently, and you only find out the hard way. Bookmark this page and keep it open while you write.
Start with the group you'll look up most: everything you can pick from the Variable Type dropdown.
| In Blueprints | In Verse | The difference |
|---|---|---|
| Blueprint Class (asset) | class |
Not an asset — a declaration inside a .verse text file. Still one parent class only, still as many interfaces as you like |
| Structure (asset) | struct |
Still value semantics (copied wholesale). But a Verse struct can't hold mutable fields and can't have methods — it's stricter than a Blueprint structure |
| Enumeration (asset) | enum |
No hidden integer underneath; it can't be converted to a number or a string. Branching per value is case's job |
| Blueprint Interface (BPI) | interface |
Identical concept. Every implementing method must carry <override>; there's no "Message call vs direct call" split |
| Integer | int |
Just a shorter name. One curiosity: integer ÷ integer doesn't give an integer, it gives an exact fraction, rational |
| Float | float |
Decimals must carry a decimal point (1.0, not 1). int and float never auto-convert the way Blueprints does — mixing them is an error |
| Boolean | logic |
Renamed, and it can't be an if condition directly — you write if (IsOpen?), where the question mark translates "true / false" into "passes / doesn't pass" |
| String / Text / Name (three text types) | string (just one) |
Verse has no Text/Name split. In UE, Text handles localization and Name handles fast comparison; in Verse both concerns are handled elsewhere, not as types |
| Array (container) | array |
A Verse array is an immutable value — "changing an array" really means swapping in a new one. Indexing is a step that can fail, and going out of bounds won't crash the game |
| Map (container) | map |
Both reading and writing can fail, so even a write goes inside an if. Key types must come from the "comparable" family |
| Set (container) | No built-in counterpart | Verse does not provide a set type. The idiomatic stand-in is map(t, logic) — use the keys, let the values be filler. "No duplicates" becomes your job to maintain |
| Object Reference (pin) | Just the type name, e.g. my_door |
There's no separate "reference type" syntax — class instances are references by nature. "Might be empty" isn't a runtime check, it's written into the type: ?my_door |
The three rows worth memorizing here are Boolean, String and Set. The first two are "renamed and behaves differently"; the third is "simply absent". The rest translate more or less straight across.
Group two is the variables panel itself: creating, reading, writing, exposing, permissions. This group maps the most cleanly — nearly every row is a straight translation.
| In Blueprints | In Verse | The difference |
|---|---|---|
| Variables panel (My Blueprint › Variables) | A field declared one indent level inside the class | No panel — where you write the declaration is what it belongs to. "This variable belongs to this class" is expressed by indentation alone |
| Get node | Just write the name | Reading a value needs no node at all. Writing the name is reading it |
| Set node | set Name = value |
set is a required keyword. Leave it out and a lone = is read as a comparison, producing an error no newcomer can parse |
| Default Value field | The = value at the declaration |
Declarations in functions and modules must have an initial value on the spot; class fields may skip it and let whoever uses the class fill it in on the Details panel |
| Instance Editable / Expose on Spawn (the little eye) | @editable |
One attribute covers both: it shows up on the Details panel, and each instance can hold its own value |
| Private / Protected / Public (access dropdown) | <private> / <protected> / <public> |
The default isn't public — it's "visible within the same module". Verse can also tag "who may read" separately from "who may change" |
| Local Variable (in a function graph) | var Name:int = 0 in the function body |
Locals are immutable by default too — no var means a local constant. Scope follows indentation |
| Const (Blueprint variables can't) | Write nothing at all | Verse has no const keyword, because immutable is the default treatment. It's "mutable" that has to apply, with var |
That last row deserves a second look: Blueprints has no concept of an immutable variable — every variable can take a Set node. Verse flipped the default. That's not pedantry; it's so that anyone opening your code can tell at a glance which values are set in stone and which are live.
Group three is the nodes on the execution wire. This is where the differences are largest, because Verse treats "failure" as a first-class citizen — a lot of what Blueprints solves with Booleans and Is Valid runs on a different mechanism here.
| In Blueprints | In Verse | The difference |
|---|---|---|
| Event BeginPlay | OnBegin<override>()<suspends>:void = |
It carries <suspends>, so it can wait seconds, wait for events — it's a long-lived line that can suspend. BeginPlay can't do that |
| Branch | if (condition): |
Verse's if doesn't take a Boolean, it takes "does this step get through". So a failed Cast, an out-of-range index and a missing map key all land in the same else |
| Sequence | Just write the lines in order | No node needed — lines at the same indent level already run top to bottom |
| ForEach Loop | for (X : Arr): |
A completed for collects a new array, so "loop and gather results" is free. Want the index? for (I -> X : Arr) |
| For Loop (with index) | for (I := 0..9): |
The range 0..9 includes both ends, and it's the same keyword as ForEach. Verse merged the two loops into one |
| While Loop | loop + break |
Verse has no while, and no continue. Move the condition into the body and jump out with if (…) { break } |
| Delay (the latent node with the clock) | Sleep(1.0) |
The calling function must carry <suspends>. It's asynchronous, so it can't go inside an if condition |
| Is Valid / Accessed None errors | option (?t) plus failure context |
"Might be empty" is written into the type; you unwrap with X? inside an if. Runtime Accessed None crashes don't exist in Verse — the compiler makes you handle it |
| Switch on Enum | case (value): |
Branches must cover every value, or include a _ => catch-all, otherwise it won't compile |
| Return Node | Implicit return (last value computed) / return |
Most of the time you write nothing — the last expression's value is the return value automatically. return is for leaving early |
There's also a category Blueprints simply doesn't have: running several lines at once. To "count down while waiting for a player to step on a plate", Blueprints makes you assemble it from Timelines or Tick; Verse builds sync (everyone finishes), race (first one wins), rush (first result, everyone still finishes) and branch (fork a line off) into the language itself. That group gets its own chapter in Chapter 7.
Group four is "how code is organized and how it gets triggered". The Event Dispatcher row is usually the first one people need during a migration.
| In Blueprints | In Verse | The difference |
|---|---|---|
| Function (Blueprint function) | A function on the class: DoThing():void = … |
One trick Blueprints doesn't have: a function tagged <decides> "might not get through", and you call it with square brackets, DoThing[] |
| Macro | No direct counterpart | A Blueprint macro is a graph that gets expanded inline — it exists partly because node graphs make execution wires awkward to reuse. In Verse an ordinary function covers it |
| Pure node (green, no execution pins) | A function with no side effects (<computes> / <converges>) |
Blueprints has you tick a Pure checkbox; Verse has you declare the function's effects. The difference is that Verse checks whether your declaration is true |
| Event Dispatcher | event(t) |
Events are first-class values in Verse: they can be fields, parameters, array elements. A dispatcher can only live on a class |
| Call (the dispatcher) | Signal(payload) |
Same "broadcast once", and it can carry a payload |
| Bind Event | Subscribe(callback) |
The callback's parameters must match what the event hands over. Subscribe returns a handle whose Cancel() unbinds it; binding twice stacks up and fires twice |
| Custom Event | An ordinary method on the class | "Event" and "function" are two separate concepts in Verse. Nine times out of ten, a Blueprint custom event translates into a plain method |
| Blueprint Function Library | <public> functions in a module |
No dedicated "library" asset needed. Every folder in the project is automatically a module; tag a function <public> and others can use it |
| Implements Interface + Interface Call | my_class := class(my_interface): plus <override> on the methods |
No "Message call vs direct call" split — there's one way to call it, and the compiler already guaranteed the other side implements it |
This group needs its status spelled out first, or the lookups will mislead you.
Today (August 2026): the only place Verse actually runs is UEFN, where "a thing in the level" is a creative_device. Where UE6 is headed: Epic built a brand-new gameplay framework for UE6 called Scene Graph, built from the ground up on Verse, where entities hold components — and it is already usable in UEFN today. At the same time Epic has been explicit: Actors and Blueprints are fully supported in UE6 Early Access (targeting late 2027) and the early releases after it; deprecation waits until Scene Graph is mature enough, with no date set. Epic has committed to shipping conversion tools before any deprecation, but they have not been released.
So the Verse column below gives two answers: what you write today, and where things are headed.
| In Blueprints | In Verse | The difference |
|---|---|---|
| Actor | Today: creative_device; direction: Scene Graph's entity |
An Actor is the root of an inheritance tree — you add capability by deriving a child class. An entity is a nearly empty container — you add capability by attaching components. Two models, not just a rename |
| Actor Component / Scene Component | Scene Graph's component |
Same word, different job: in Scene Graph, components are the only place behavior lives — there is no "and the Actor also carries a pile of logic" |
| Level Blueprint | A class in a .verse file, dropped into the level |
There's no special "level blueprint" container. Want level-wide logic? Make a device and place it — with the bonus that it can be duplicated and reused |
| Details panel | Fields exposed with @editable |
The panel is a mirror of the code, not a second copy of the data. No @editable in the code means no row on the panel |
| World Outliner | The entity tree in the level (Scene Graph) | Scene Graph's parent/child hierarchy isn't just "how things are arranged" — it is the data structure components use to find each other |
| Spawn Actor from Class | Today: place devices ahead of time and wire references with @editable; direction: spawning entities |
UEFN can't conjure arbitrary devices out of nothing today, so the idiom is "place first, enable later". That's a limit of the current tooling, not of the language |
| Get All Actors of Class | No equivalent today | You reach other devices by wiring a reference in on the panel via @editable. Code perfect, panel unwired is the single most common beginner trap |
This is the group where outdated articles will lead you astray fastest. To judge whether a tutorial is current, check whether it mentions entities and components at all. Scene Graph's full worldview is Chapter 8; here you only need to remember one thing: the Actor row is not a rename, it's a different way of organizing everything.
Sooner or later a lookup comes up empty. There are two kinds of empty: "Verse hasn't done it yet", and "this was never Verse's job". The five below are the second kind — they are separate systems, outside the scope of what Verse replaces, and there will never be an answer to "how do I write a Timeline in Verse".
| In Blueprints | In Verse | The difference |
|---|---|---|
| Construction Script | No counterpart | It runs at edit time: nudge the Actor in the level and it recomputes. Verse doesn't participate in edit-time construction today — its code runs when the game runs |
| Timeline | No counterpart | A Timeline is a curve asset plus a player. Verse has Sleep and loops, so you can hand-write interpolation, but there's no curve editor — curves belong to the animation / sequencing side |
| Animation Blueprint | No counterpart | State machines, blend spaces and skeletal controls are a whole independent animation system. Verse can tell it to change state; it won't replace it |
| Material Graph | No counterpart | Material nodes compile into shaders and run on the GPU — not the same kind of thing as gameplay logic at all |
| Niagara (VFX) | No counterpart | Same story: the effects system has its own editor and its own runtime model. Verse's role is to set it off at the right moment |
Seeing that boundary clearly saves an enormous amount of anxiety. "Will my Blueprint skills become worthless?" — this table answers half the question for free: everything you've built up in materials, animation, VFX and sequencing has nothing to do with Verse, and is therefore entirely unaffected. Verse only replaces the gameplay-logic slice — which is exactly what the first six tables cover.
Reading tables doesn't stick. The device below is that door from the opening — nineteen lines that use nearly every word you just looked up. Click "Run Next Step"; each step tells you what that line is called in Blueprints.
using { /Fortnite.com/Devices }
using { /UnrealEngine.com/Temporary/Diagnostics }
door_device := class(creative_device):
@editable
OpenButton:button_device = button_device{}
var IsOpen:logic = false
OnBegin<override>()<suspends>:void =
OpenButton.InteractedWithEvent.Subscribe(OnPressed)
OnPressed(Agent:agent):void =
if (IsOpen?):
Print("The door is already open")
else:
set IsOpen = true
Print("The door opened")
Click "Run Next Step" to watch the code execute line by line.
Count them: class, @editable, object reference, var, logic, OnBegin, Subscribe, callback method, if, ?, set, Print — twelve terms, every one of them findable in the tables above. That's how this dictionary is meant to be used: hit something you don't recognize, go back and read that row's third column.
The dangerous part of a lookup isn't coming up empty. It's finding a word that looks identical and doesn't mean the same thing. Three you need to know in advance:
Trap one: Verse's boolean isn't called bool, and it can't be a condition on its own. It's logic, with exactly true and false — so far, identical to Boolean. But if won't take it: Verse's if asks "does this step get through", not "is this value true". So you add a question mark: if (IsOpen?). Forgetting it is the most common day-one error, and the message won't tell you a question mark is missing.
Trap two: Verse's = is a comparison, not an assignment. Blueprint authors don't fall into this easily (there's no equals sign to type in Blueprints), but the moment you've read code in any other language your hands will type Score = 100 on their own. In Verse that line means "question: does Score equal 100?" — and Verse has no == at all. Keep three symbols straight: := declares for the first time, set … = changes a value (the Set node), and a lone = asks a question. Whenever "failure context" appears in a compile error, first check whether a set went missing.
Trap three: Scene Graph's component and Blueprints' Actor Component share a name, not a model. Both are "a chunk of capability attached to something". But in the Blueprint world the protagonist is the Actor: it's a class you can derive from, it carries plenty of logic itself, and components are accessories. In the Scene Graph world an entity is nearly an empty shell, all data and behavior live in components, and "what this thing is" is answered by "which components it has" rather than "which class it derives from". Same word — accessory on one side, everything on the other. That gap is big enough to deserve its own page; see the extras below.
One more layer of translation gets overlooked: the shape of the names themselves. UE has a prefix system (BP_, S_, E_); Verse has no prefixes, but it does assign clear jobs to casing.
| In Blueprints | In Verse | The difference |
|---|---|---|
BP_MyDoor (Blueprint class asset) |
my_door |
Type names are always snake_case — lowercase with underscores, no prefix of any kind |
S_PlayerStats (Structure asset) |
player_stats |
Same rule. Whether it's a class, a struct or an enum is stated by the declaration, not by a prefix |
E_DoorState (Enumeration asset) |
door_state |
Same rule |
IsOpen (variable, PascalCase) |
IsOpen |
Nothing to change here: fields and locals are PascalCase in Verse too |
OpenDoor (function, PascalCase) |
OpenDoor() |
Also unchanged. Function names are PascalCase |
SCREAMING_CASE constants (e.g. MAX_HEALTH) |
MaxHealth |
Verse has no all-caps constant convention — constants look like any other member, because immutable is already the default |
/Game/Doors (asset path) |
/MyProject/Doors (module path) |
Every folder in the project automatically becomes a module of the same name; the path is the module path |
One line to remember it by: types are lowercase with underscores, everything else is capitalized. See my_door and you know it's a type; see MyDoor and you know it's a value or a function — a rule that makes half of any Verse file readable without context. The full renaming table and an exercise are in extra x3.
The whole lesson is comparison tables; this section is about how to read them. Any lookup lands in one of three buckets: direct (same thing, new name), approximate (the concept exists, the syntax and the edges differ), and no counterpart (it belongs to another system). Knowing which bucket you're in matters more than memorizing the translation.
| What you do in Blueprints | How you write it in Verse | The difference |
|---|---|---|
| A Set node changing an Integer variable | set Score = 100 |
Direct: one extra keyword, identical behavior |
| A Branch testing a Boolean | if (IsOpen?): |
Approximate: the condition shifts from "true / false" to "passes / doesn't pass", so a ? is required |
| Is Valid guarding a null reference | if (D := MaybeDoor?): |
Approximate: the check moved from runtime into the type. Different syntax, same purpose |
| A Set container to deduplicate a list | Hand-rolled map(t, logic) |
Approximate: Verse has no set type, so the "no duplicates" guarantee becomes yours to maintain |
| Construction Script placing props in the editor | Nothing | No counterpart: it runs at edit time, outside Verse's remit — don't waste time hunting for a translation |
Why is there an "approximate" bucket at all? Because Verse isn't a node-by-node transcription of Blueprints — it's a different design: failure was turned into control flow, immutability into the default, concurrency into part of the language. Any term touching those three is guaranteed not to map one-to-one.
So the right way to use these tables is three steps: one, find your thing in column one; two, take the syntax from column two; three, always read column three. Skip column three and you'll write code that compiles and behaves wrong — far harder to track down than code that doesn't compile.
Dictionary read — three lookup questions to finish. Correct answers earn a star ★; wrong answers can be retried forever, zero penalty.
The Boolean in the Blueprint variables panel — what is it called in Verse's type table?
You used a Set container in Blueprints to keep a list free of duplicates. Translating to Verse, what do you do?
Is Scene Graph's component the same thing as a Blueprint Actor Component?
Deep Dive · EXTRA
Three words with no translation. What each of them actually does, why Verse has no direct equivalent, and roughly how UE6 is likely to handle them.
Open the extra →Advanced · EXTRA
The fundamental gap between an inheritance-tree model and a composition model — and why one word means two different things. A setup for Chapter 8.
Open the extra →Technique · EXTRA
How Verse's naming conventions line up with UE's prefix system, plus a full renaming table and a hands-on exercise.
Open the extra →