UInkPageReaderComponent) is the component that lets a player pick
up and read a page. Add it to your player — pawn, character or player controller — and
call Begin Reading: the page floats up in front of the camera, held at a distance
where it fills a comfortable slice of the screen. Call End Reading and it floats back
to exactly where it was lying. Flip Page turns the sheet over to show its back.
The reader is the presentation engine: it contains no interaction logic and almost no
input handling. It is driven by whatever runs interaction in your project — your own
interaction component, a Blueprint trigger, or the bundled
Ink Page Interactor. Every function is Blueprint-callable.
This is a production component. Unlike the bundled interaction pieces — the
Ink Page Interactor, the showroom’s demo character, game mode
and prompt widget, which are reference implementations — the reader is what your own
interaction system is meant to call. The one demo-flavored thing on it is the optional
flip-key binding (Bind Flip Key, on by default so the back of a sheet is reachable
out of the box); turn it off when you bind your own flip input.
Adding it
Add Ink Page Reader from the Add Component menu (category Inkwell) to your player pawn, character or player controller. It is Blueprint-spawnable and Blueprintable, so you can subclass it if you want your own defaults. Where you put it decides which controller the input locks reach: on a pawn, the reader resolves the pawn’s possessing controller; on a controller, that controller is used directly. Either works. (The flip-key binding is the exception: it binds on the owning pawn’s input component, so a reader living on a controller never binds it.) If you use the Ink Page Interactor for prototyping, you do not need to add a reader yourself — the interactor reuses one on its owner if there is one, and creates one if there is not.Wiring it to your interaction system
1
Add the component
Open your character Blueprint, click Add Component, and add Ink Page Reader.
Leave the defaults for now.
2
Find something to read
Your interaction code needs the page. If it already line-traces, take the Hit Actor;
if it uses an interface or an overlap, take that actor. Any actor carrying an
Ink Page Display — including a placed
Ink Page and an Ink Page Stack — is
readable.
3
Start the read
On your interact input: Branch on Is Reading. False → Begin Reading Actor
with the hit actor. True → End Reading. That single toggle is the whole open/close
loop.
4
Turn pages
Bind your page-turn input to Next Page and Previous Page on the reader. They do
nothing unless a page is up, so they are safe to leave bound all the time. On a sheet
with an authored back they follow book order — front, back, then the next
page.
5
React in the HUD
On Event Begin Play, bind On Reading Started and On Reading Ended. Hide the
crosshair and show a “put back” prompt on the first; restore the HUD on the second. Bind
On Reading Side Changed if your HUD shows a Front/Back label.
6
Play it
Walk up to a page and press your interact key. The sheet should float to your eyes over
about a third of a second, your movement should stop, and the view should freeze. Press
F to turn it over. Press your interact key again and it settles back exactly where it
was.
Properties
All properties live under Inkwell → Reading, are editable per instance, and are readable and writable from Blueprint at runtime.How a read plays out
The reader moves through four phases:- Idle — nothing held. The component does not tick at all.
- Blend in — the page floats from where it lay to the reading pose over Blend Time seconds, on a smoothstep curve so the pick-up eases in and out.
- Reading — held at the eyes. With Follow Camera on, the pose is recomputed every frame; with it off, the component stops ticking here (unless a flip is still turning), because nothing is left to move.
- Blend out — the same smoothstep in reverse, back onto the exact transform the actor had when the read began. Collision and physics are restored when it lands.
Where the page goes
The pose is derived from the player’s view point:- A possessed pawn reads through its controller’s view point, so camera managers, view targets and control rotation are all respected.
- Anything else — an unpossessed pawn, a non-pawn owner — falls back to the actor’s eyes view point.
How the hold distance is chosen
With Fit Page To View on (the default), the reader computes the distance at which the page covers View Fill Fraction of the screen — against the viewport’s real field of view and aspect ratio, height and width both, whichever runs out first. The page size used is the document’s printed size times Page Scale times the actor’s scale, not the mesh bounds — on the showroom’s poster board it is the 60×90 cm page being framed, not the plywood around it. The result is clamped between a floor and Max View Distance:- The floor is the larger of Min View Distance and the near clip plane plus half the page’s width. The second term is what guarantees a flip can swing the sheet’s edge toward the camera without any part of it crossing the near plane — applied whether or not a flip is running, so starting one never makes the page lurch backwards.
- Max View Distance yields to the floor rather than fighting it.
0 when nothing is being read.
Staying out of the furniture
The hold distance is measured along the view with no knowledge of the world, so with Keep Clear Of Obstructions on (the default) the reader traces the view ray on the Visibility channel — ignoring the page actor and the reader’s own pawn — and pulls the page in front of the first blocking hit, with a margin for the edge that swings out mid-flip. Pressed right up against a wall, the distance is floored at the near-plane term so the page stays visible rather than comfortable.Book order
On a multipage document whose sheets have authored backs (see two-sided pages), Next Page and Previous Page read the document the way a book is read:- Next Page on a front face whose sheet has an authored back turns the sheet over instead of skipping what is written on the other side. On a front with no back, it turns to the next page as usual.
- Previous Page on a back face returns to the front of the same sheet before it retreats a page.
- With Return To Front On Page Turn on (the default), an actual page turn also turns the new sheet front-up.
Turning the sheet over
Flip Page turns the held page over, animated over Flip Duration seconds. It is a toggle against the side the page is currently turning towards, not the side on screen — so tapping it twice in quick succession reverses the turn and settles back where it started rather than finishing the rotation anyway. It never changes which page is shown: “Page 2 of 3” does not move, and On Page Changed does not fire. The turn is about whichever of the page’s own axes Reading Rotation Offset puts vertically on screen, so a custom prop with its own offset still turns the way a sheet of paper turns. It rotates about the page actor’s origin: a mesh whose page face is off-center will swing rather than spin.
With Bind Flip Key on, the reader binds Flip Key (default F) on the owning
pawn once the pawn has an input component, retrying on a timer until it does. The binding
does not consume input, so it sits alongside your Enhanced Input mappings rather than
swallowing the key, and it quietly does nothing while no page is held. Turn Bind Flip
Key off when you route your own input to Flip Page.
Customizing the reading pose
The pose properties are all live: change them from Blueprint mid-read and the next frame uses the new values (with Follow Camera on). That makes tuning quick — set them on the component’s Details panel, press Play, read a page, and adjust. The showroom’s demo-only Inkwell Exhibit component is a worked example of exactly this: it writes the reader’s public properties when a read starts and restores them when it ends. Making the page bigger or smaller on screen. With Fit Page To View on, raise View Fill Fraction to fill more of the screen. With it off, apparent size is a function of distance: lower View Distance. If a page needs to be physically larger everywhere — in the world as well as in the hand — change Page Scale on the display component instead. Framing. View Offset is in centimeters at the page, not in screen percent. The default(0, -2) drops the sheet slightly below eye line, which reads as “held in the
hands” rather than “pinned to the face”. Positive X shifts it right — useful if your
HUD occupies one side. With the fit on, the nudge is scaled with the fitted distance so
its apparent size stays constant; with the fit off it is untouched, to the centimeter.
Orientation. ReadingRotationOffset is composed onto the camera rotation, so it
describes the sheet’s orientation relative to the view, not to the world. The default —
Pitch 0, Yaw 90, Roll 90 — is tuned for the Inkwell page sheet, a flat plane whose printed
face points up: it turns the sheet to face the camera and then spins it in its own plane
so the writing reads upright.
If you read from your own mesh, tune it like this:
1
Start from zero
Set Reading Rotation Offset to
(0, 0, 0) and read the page once. The sheet is now
aligned with the camera’s own axes, which tells you where its printed face is pointing.2
Point the face at the viewer
Adjust Pitch and Yaw in 90-degree steps until you can see the printed side. Both
turn the sheet’s face; which one you need depends on which axis your mesh’s face lies on.
3
Stand the writing upright
Adjust Roll in 90-degree steps. Roll spins the sheet within its own plane, so it only
changes which edge is up.
4
Fix mirrored text
Text that reads backwards means you are looking at the back of the sheet. Add 180 degrees
to whichever of Pitch or Yaw you used in step 2.
5
Save it
Put the final rotator on the reader’s defaults. If different props need different offsets,
set Reading Rotation Offset from Blueprint just before calling Begin Reading.
The flip axis follows the offset automatically, so a prop with its own offset still flips
correctly.
The locks
The reader has two independent input locks, both on by default. They engage the moment Begin Reading succeeds and release the moment End Reading is called — not when the page finishes floating down — so control comes back instantly when the player lets go.Lock Movement While Reading
- Move input on the controller is ignored (
SetIgnoreMoveInput). - The pawn’s current motion is stopped immediately — unless it is falling. An airborne pawn is left alone, because zeroing velocity mid-jump would freeze it in the air.
- Jumping is covered too. Ignoring move input does not stop a character from jumping,
so for an
ACharacterthe reader also calls Stop Jumping and clears the character movement component’s own jump permission (NavAgentProps.bCanJump), restoring the saved value on unlock. This is the part most hand-rolled “freeze the player” code misses.
Lock Look While Reading
- Look input on the controller is ignored (
SetIgnoreLookInput), so the view cannot rotate while the page is being inspected. Combined with Follow Camera, the page stays perfectly still in front of the reader.
How the locks behave around the engine
The engine’s ignore-input counters stack, so the reader is careful with them:- Each lock is taken at most once per read, and the reader remembers exactly which controller it locked, so exactly that one is released.
- If possession arrives or resets mid-read — a client restart zeroes a controller’s ignore counters — the reader re-asserts both locks from its tick while a page is up. Best effort: with Follow Camera off the tick sleeps during the reading phase, so re-assertion cannot run there.
- On release, a pawn-mounted reader whose controller has meanwhile possessed a different pawn does not decrement the counters: the engine already reset them on repossession, and decrementing would steal another system’s lock. A reader living on a controller always releases.
- The character’s jump permission is restored only if it is still disabled, so an outside system that deliberately re-enabled jumping mid-read keeps its change.
If your project runs its own input-state machine (“in menu”, “in cutscene”, “reading”),
turn both locks off and manage input yourself. On Reading Started and On Reading
Ended fire at exactly the right moments to drive it.
Physics and collision capture
When a read begins the reader captures everything needed to put the page back exactly as it was:- The page actor’s full transform is saved. That is the blend-back destination.
- Every primitive on the actor that is simulating physics — a loose sheet the player can knock off a desk — has simulation switched off for the ride, because a simulating body ignores actor moves. Each one is re-attached to the actor’s root so it follows the actor while held.
- The actor’s collision is disabled, with its previous state saved, so nothing traces against or bumps into a page held at the reader’s face. (This is also why a page’s own blocking collision — see Ink Page actor — is not a problem while reading.)
Events
Blueprint API
The flip half of the API — Flip Page, Set Reading Side, Set Showing Back,
Get Reading Side, Is Showing Back, Get Reading Side Text, Is Flipping,
Can Flip Page — is tabled under
Turning the sheet over.
Starting a read while a page is floating back
Calling Begin Reading during a blend-out is handled for you:- The same page, still on its way down: the blend reverses from wherever the page currently is. The original resting transform and physics state stay as captured, so it still lands home correctly later. A flip still unwinding keeps unwinding smoothly.
- A different page, still on its way down: the old one is put home instantly, then the new read starts from scratch.
Edge cases the reader handles
The page actor is destroyed mid-read
The page actor is destroyed mid-read
If the held actor disappears — destroyed by gameplay, or its level streamed out — the
reader lets go on its next tick: locks released, captured state cleared (there is nothing
left to snap home), and On Reading Ended broadcast. The event’s Page may
legitimately be None here, so HUD listeners must handle that. A verbose
LogInkwell
message records it.The reader is torn down mid-read
The reader is torn down mid-read
On End Play — the pawn is destroyed, the level changes — the reader never leaves a page
floating in the air with its physics off. It snaps the page home, restores collision and
physics, releases the locks and broadcasts On Reading Ended. From then until the next
Begin Play it also refuses new reads, so an On Reading Ended listener that reacts by
starting another read cannot take state that could never be released.
Blend Time is 0
Blend Time is 0
The page snaps straight to the eyes on Begin Reading and straight home on End Reading. No
blend phases, but the same capture, restore and events. Flip Duration 0 does the same for
flips.
The page is put back while turned over
The page is put back while turned over
End Reading targets the front: the sheet unwinds its flip during the descent and lands
front-up on the exact pose it was picked up from — never 180 degrees out from how it
actually lies. The flip state is then cleared silently; On Reading Ended is the only
signal for the read being over.
Restoring twice
Restoring twice
Every teardown path funnels through one restore routine, and unlocking is safe to call
when nothing is locked. You cannot double-release or leak a lock by hitting several edge
cases at once.
Next
Integration guide
Driving the reader from an interaction system you already have.
Ink Page Interactor
The demo focus trace and keys — a worked reference for what your system should call.
Ink Page Stack
Reading a whole journal instead of a single sheet.