Before you buy
What Unreal versions does it support?
What Unreal versions does it support?
Core, CoreUObject, Engine, InputCore, EnhancedInput, Slate,
SlateCore, UMG, DeveloperSettings, plus private RenderCore and RHI. The plugin
declares a dependency on the Enhanced Input plugin, which is enabled by default in every
UE5 project.One difference worth knowing about, because Unreal gives no warning when it bites: engine
packages load forward only, so content saved by a newer editor cannot be opened by an
older one at all. The 5.5 and 5.6 downloads therefore carry content authored on 5.5. It is
the same documents, meshes and materials, with one exception — the example Input Actions in
those two builds ship unbound, so wire your own keys rather than relying on
IMC_InkwellDefault. Nothing depends on them: the demo pawn builds its own input at runtime.See Installation.Do I need C++? Does my project have to be a C++ project?
Do I need C++? Does my project have to be a C++ project?
- Installed to the engine from Fab — it arrives with prebuilt binaries for that engine version, and a Blueprint-only project can enable and use it with no toolchain at all.
- Vendored into your project’s
Plugins/folder as source — the plugin then has to be compiled, which makes yours a code project and requires a C++ toolchain. This is the right choice for teams that keep plugins in source control.
Can I sell a game made with this?
Can I sell a game made with this?
Plugins/Inkwell/Resources/Licenses/, and the notices are in
Plugins/Inkwell/THIRD_PARTY_NOTICES.md. Keep those files in your distribution and the
OFL’s conditions are met.If you import your own licensed fonts with Import Font Family, their
licenses are your responsibility, not Inkwell’s.Does it work with the interaction system I already have?
Does it work with the interaction system I already have?
UInkPageReaderComponent) on your
player and call it from whatever your interact verb already is:- Begin Reading Actor (Actor) → floats that actor’s page into view.
- End Reading → puts it back, descending from wherever it is to exactly where it lay.
- Next Page / Previous Page → turn the page being read, in book order — a sheet with an authored back reads front, then back, then the next page.
- Flip Page → turns the held sheet over on its own.
The first hour
The traps that cost new buyers the most time, in the order they are usually hit.I installed it from Fab and nothing Inkwell exists in my project
I installed it from Fab and nothing Inkwell exists in my project
- Edit → Plugins, search Inkwell, tick Enabled.
- Restart the editor when prompted.
I can't find the demo content or the showroom map
I can't find the demo content or the showroom map
/Inkwell/ folder appears, with
the showroom map at /Inkwell/Maps/L_InkwellShowroom, the bundled documents under
/Inkwell/DemoProps/Documents/ (the PD_ assets) and the example input assets under
/Inkwell/Examples/Input/.Open the showroom and press Play: it brings its own game mode and pawn, so it works in an
empty project with no setup. WASD and mouse to walk, E to read, Left/Right or
the mouse wheel to turn (and flip) pages, F to flip a sheet over, Q to put it
back.My interaction trace hits the page but nothing focuses
My interaction trace hits the page but nothing focuses
- Ink Page Stack sheets answer only their own Sheet Trace Channel (Visibility by default) and ignore every other channel. Set it to your channel on every stack, or the pile never focuses — with no warning anywhere. The interactor’s Trace Channel and the stack’s Sheet Trace Channel must agree.
- The sheet spawned by Procedural Paper on an Ink Page Display blocks only the Visibility channel, deliberately, so it cannot intercept AI sight or hitscan traces. If you trace a custom channel at it, add that response yourself: Get Procedural Paper Mesh → Set Collision Response To Channel.
Paper Mode is Mesh's Own Material and no ink appears
Paper Mode is Mesh's Own Material and no ink appears
MF_InkwellPageInk material function, or the ink silently does not
appear. No error is raised: the silence is the mode’s contract, because Inkwell writes
parameters the material simply does not have.Open the mesh’s material, drop MF_InkwellPageInk into its graph, feed it your paper
color and wire its InkedColor output into your final color. Every Inkwell control —
ink, tints, strength, face mapping — starts working immediately.
See Rendering → the MF_InkwellPageInk contract.The page I'm reading is too close, too far, or buried in a podium
The page I'm reading is too close, too far, or buried in a podium
- View Fill Fraction (0.75) — how much of the screen the page covers. Higher is closer.
- Min View Distance (18 cm) / Max View Distance (90 cm) — the fitted distance’s clamps. The max is what keeps a big page from being pushed through the furniture behind it.
- Keep Clear Of Obstructions (on) — a trace pulls the held page in front of whatever the player is facing, so reading off a podium does not sink the page into it.
- Turn Fit Page To View off and the flat View Distance (45 cm) is used verbatim — the right choice for a project that wants one tuned framing to the centimeter.
Using it in a project
Can I change page text at runtime?
Can I change page text at runtime?
- Set Page Markup (Page Index, Markup) — rewrites the page’s first text box.
- Set Layer Markup (Page Index, Layer Index, Markup, Side) — rewrites one specific text layer, on either side of the sheet.
- Add Page, Remove Page, Set Page — restructure the document.
- Set Page Layers, Add Page Layer, Remove Page Layer, Move Page Layer — edit the stack.
Duplicate Object into the transient package, or a fresh
UInkPageDocument) when you want one note to differ from the others.Full recipes: Runtime Documents.How many pages can a document have? How many documents can I have?
How many pages can a document have? How many documents can I have?
Pages is a plain array and documents are ordinary Data
Assets, so the real limits are memory and taste.What actually costs something:- Baked pages. Pages are baked lazily, one side at a time, the first time something asks for one. An unread page costs only the bytes of its authored text, and an unauthored back never costs anything at all. A page that has been read holds an ink render target in the world’s cache — about 5.5 MB at the default 1024 × 1400. A 20-page journal read cover to cover is therefore around 110 MB of cache until the world ends. That number, not the page count, is what to plan against; see page size and what it costs.
- Sheet meshes on a stack. Ink Page Stack never creates more than Max Visible Sheets meshes (16 by default). A 200-page book shows a sliding window of sheets and re-bakes the hidden bottom one as you read, so the mesh count is constant.
- Layers and strokes. Each visible layer is one slot in the page’s widget tree, and each stroke is a polyline plus round dabs at its joins. Thousands of strokes on one page make its bake slower; they cost nothing afterwards.
Does it replicate? Can I use it in multiplayer?
Does it replicate? Can I use it in multiplayer?
Replicated, and no RPCs
exist. Page state is local, which is the right default — a baked page is client-side
presentation, and replicating render targets would be absurd.For a shared world, replicate your own state and drive Inkwell from it on each machine:- Replicate the page index (or the document reference) on your own actor and call
Set Page Index / Set Document on the Ink Page Display from a
RepNotify. Every client bakes locally and they stay in sync. - Do not let two players read the same placed page actor. Ink Page Reader physically moves the page actor’s transform, disables its collision and stops its physics, all locally. On a replicated actor the server will fight it, and everyone else watches the note fly across the room. Give each player a client-only page to read, or read from a UMG page widget instead, which touches no world state at all.
- The reader’s movement and look locks call
SetIgnoreMoveInput/SetIgnoreLookInputon the local controller, so they behave correctly for the reading player only — which is what you want.
Does it work in VR?
Does it work in VR?
What about localization?
What about localization?
String of rich-text markup on the asset, not an FText, so it does not
flow through Unreal’s localization pipeline automatically. Two approaches work:- One document per language. Author
PD_Letter_EN,PD_Letter_FR, and pick between them with Set Document using your own culture check. This keeps the authored styling, the layers and the layout intact per language, which matters when a translation is twice as long as the original. - Drive the text at runtime. Keep the text in a String Table or an
FTextyou format, and push it with Set Page Markup. This is the lighter option, and the right one for generated text — a player’s name, a quest log, a date.
Packaging and performance
Does it cook and package correctly?
Does it cook and package correctly?
InkwellEditor is an Editor module, so the
Page Editor window, the asset factory, the menus and the font tools never enter a packaged
build. Only the Inkwell runtime module ships.Three things are worth checking before you package:- Save documents from the Page Editor’s Save Document button — see the fonts entry below.
- Assets you repointed in settings. If you pointed Page Ink Material, Page Sheet Mesh or Default Paper Texture at a project asset that nothing else in the project references, make sure it is included in the cook — Additional Asset Directories to Cook is the usual route.
- Audit the demo key bindings. The demo/reference Ink Page Interactor should not ship on a production pawn at all — but if it does, turn off its Enable Default Input, or E, Q, the arrow keys and the mouse wheel stay live in your released game. The reader’s own Bind Flip Key (F by default) is a real runtime binding too; turn it off once your own input drives Flip Page.
Will my fonts survive a packaged build?
Will my fonts survive a packaged build?
What does it cost at runtime?
What does it cost at runtime?
Something looks wrong
My page is blank
My page is blank
LogInkwell — every misconfiguration Inkwell can
detect logs a warning there naming the fix. Then work down this list — it is ordered by
how often each one is the answer.- No document is assigned. A display with no Document deliberately shows blank paper rather than stale ink. Check the Document pin.
- It is editor startup. A component can register before the Slate renderer is usable, so the first preview bake fails and the page pops in a moment later. Inkwell retries automatically. See editor preview.
- There is no mesh to draw onto. Procedural Paper only spawns a sheet when the
actor has no mesh of its own and has a root component. With Procedural Paper off and
no mesh, nothing draws —
LogInkwellwarns: “has no mesh to draw onto — set Target Mesh, add a mesh component to the actor, or enable Procedural Paper.” - Paper Mode is Mesh’s Own Material and the material lacks
MF_InkwellPageInk. No ink, no error — by contract. See the first hour above. - Apply On Begin Play is off. Then nothing draws until you call Refresh yourself.
- The text layer is hidden, or its opacity is 0. Hidden layers are skipped by the bake as well as the preview. Check the eye toggle in the Page Editor’s Layers panel.
- Ink Strength is 0 on the document. That is invisible ink, working as designed.
- The page has no Text layer. Only reachable by deleting the Text layer from script with Remove Page Layer — a front stack handed to Set Page Layers gets a Text layer back automatically, and the Page Editor refuses to delete a page’s last one. Find Text Layer Index returning -1 confirms it.
- The page ink material could not be loaded. Then displays fall back to the mesh’s
existing material and the ink parameters do nothing on it. The Output Log carries one
LogInkwellwarning naming the setting to fix. See Project Settings.
My text looks stretched or squashed
My text looks stretched or squashed
- Non-uniform scale on the page actor or on the mesh component. The baked ink is mapped across the mesh’s page-face UVs, so a sheet scaled 2 × 1 stretches every letter on it. Reset the scale and let Inkwell size the paper.
- You supplied the mesh. Inkwell never resizes a mesh you provided — an explicit Target Mesh, or any mesh component already on the actor, is drawn onto exactly as built. Size it yourself to the page’s aspect ratio, or delete it and let Procedural Paper spawn the sheet.
- Auto Size Sheet is off on the Ink Page actor. That actor owns its sheet and fits it to the page only while that toggle is on.
- The mesh’s UVs are not clean 0–1 across the page face. For a mesh that was not
unwrapped for Inkwell — a face parked in the corner of an atlas, an unwrap that runs
sideways — set the display component’s Page Face mapping (Auto Fit measures the
region from the mesh; quarter turns fix a sideways unwrap) instead of re-unwrapping.
The bundled
SM_PageSheetneeds none of that.
The paper isn't showing up
The paper isn't showing up
- It only spawns when the actor has no mesh component of its own. Any mesh already on the actor, or an explicit Target Mesh, is used instead and no sheet appears.
- It needs the actor to have a root component to attach to.
- It is grayed out on an Ink Page Stack, which always spawns one sheet per page instead.
- Texture asset (
Texture) with Paper Texture empty resolves no paper at all. Inkwell flipsUsePaperTextureto 0 and the material falls back to its flat paper color, which reads as blank, evenly lit stock. Assign a texture, or switch to Generated. - Generated (
Procedural) draws the sheet from the ruling settings and needs no assets whatsoever — the fastest way to lined, grid or dotted stock. See Paper. - Custom Material and Mesh’s Own Material bring their own paper — Inkwell deliberately writes no paper parameters in those modes. If the surface looks wrong there, the material graph owns it.
- A page’s Paper Override beats the document. If one page in a document is wrong, check whether it carries an override — and a back has its own Back Paper and Back Paper Override to check.
- On the Ink Page widget, Show Paper must be on.
- On a custom page material set project-wide, the paper only appears if the material
carries
MF_InkwellPageInkor parameters matching the names under Material Parameters.
Colors look washed out in my own page material
Colors look washed out in my own page material
MF_InkwellPageInk avoids the problem entirely — it samples the ink
correctly for you. See the ink render target.I edited the document and the page didn't change
I edited the document and the page didn't change
- Get Page hands you a copy. Editing it changes nothing until you Set Page it back.
- Changing something no mutator covers (writing into
Pagesfrom C++, say) leaves the cache serving the old bake. Call Bump Revision first.