From NPC to Playable Character: Turning One Sentence Into a Character

The pipeline that takes a written character description and produces a reusable low-poly NPC component — what the generator decides, what you still decide, and how to place it in a walkable world.

Creative MilaOctober 12, 2026
From NPC to Playable Character: Turning One Sentence Into a Character

From NPC to Playable Character: Turning One Sentence Into a Character

The pipeline in Neta Studio runs in one direction. You write a sentence. The generator returns a structured low-poly component: a mesh, a palette, a set of proportions, a suggested placement slot, and a suggested behaviour mode. You then decide scale, position, facing, and which of the five behaviour modes the character actually runs. The trip from npc to playable character is short, but it has five stages and only two of them are automated. Most broken scenes I look at come from assuming all five are.

This post walks those stages in order. It names the fields you get back, states which decisions belong to the generator and which belong to you, covers the two mistakes that cause most of the damage, and finishes where the character ends up: inside a world, running in a browser tab, with no engine install and no build step between the sentence and the playable result.

From NPC to Playable Character: What the Pipeline Actually Does

Five stages, in order:

  1. Sentence. Free text, one to roughly forty words.
  2. Resolution. The sentence is reduced to a constraint set: role noun, material adjectives, implied posture, implied prop.
  3. Build. The generator searches that constraint space and returns a component with five fields.
  4. Placement. You assign a slot, a scale, and a facing.
  5. Run. The world plays. The behaviour mode executes, collision resolves, and the character either reads as a resident or as a prop someone dropped on the floor.

Stages 2 and 3 are automatic. Stages 4 and 5 are yours, and they are not optional. The generator has no idea how tall your doorframe is, where the crowd stands, or which direction the counter faces. It cannot, because it never sees your scene.

That asymmetry is the whole design. Silhouette and palette are search problems with a large solution space and no ground truth, which is exactly what a generator is good at. Scale, placement, and behaviour are spatial decisions that depend on the world you built, which is exactly what a generator is bad at. So the split is not arbitrary. It falls along the line of what each side can observe.

What the sentence is actually for

The sentence is a design brief for a mesh, not a script. It describes what the thing looks like from six metres away. Everything else — what it does, who it talks to, where it stands — lives in fields you set after the component comes back.

Stage One: One Sentence, Resolved Into Constraints

The generator reads the sentence for three things.

The role noun maps to a silhouette family. "Fishmonger", "dockworker", "guard", "child", "dog". These are not labels applied to a generic body. They change limb proportions, stance width, and which props get attached. A dockworker gets a wider stance and heavier shoulders. A scribe gets narrow shoulders and a forward lean.

Material and colour words map to the palette. "Oilskin", "stained apron", "brass", "linen" each push swatches toward a family and set roughness in the material. Two material words with conflicting temperature — "rusty" and "clean white" — will resolve to whichever the generator weights higher, and you will not be told which one won. If the colour matters, keep it to one dominant word and fix the rest by hand.

Motion and posture words nudge proportions and the default behaviour mode hint. "Paces", "wanders", "strolls" bias the suggestion toward WANDER. "Sits", "dozes", "crouches" bias toward IDLE with a lowered stance.

What the sentence does not carry: scale, world position, faction, dialogue, schedule, inventory, or plot. Long sentences past roughly forty words do not improve the mesh. They change palette weighting more than geometry. If you want a different silhouette, add a noun or a prop. If you want a different colour, add a material word. Adding adjectives to describe personality does nothing measurable, because there is no field for personality.

Two examples, side by side. "A fishmonger in a stained oilskin apron, short and broad, carrying a crate" resolves to three clear silhouette decisions. "A mysterious stranger with a dark past and a hidden agenda" resolves to a humanoid in dark cloth, because that is all the constraint set contains. The second prompt is not wrong. It is just doing far less work than the person writing it thinks it is.

A single sprite is the whole brief: silhouette first, detail later

The Output Component: Five Fields, Nothing More

Here is the contract. Everything the generator returns fits in these five fields.

Field

Set by generator

Typical value on return

What you change in the editor

Mesh

Yes

900–2,400 triangles, single flat-shaded object, pivot at feet, forward +Z

Uniform scale, material overrides. Re-proportioning means regenerating.

Palette

Yes

8 swatches derived from 3 sampled hues, mapped to semantic slots

Reassign swatch indices, adjust roughness and shadow-catch strength

Proportions

Yes

One of 3 head ratios (roughly 1/5, 1/6, 1/7 of height) × one of 4 body builds

Nothing continuous. Pick a different adjective and rebuild.

Slot

Suggested

GROUND, COUNTER, DOORWAY, SEAT, or POST, inferred from the role noun

Assign the real slot in the scene. The suggestion is a hint, not a binding.

Behaviour mode

Suggested

Usually IDLE; WANDER only if the sentence contained motion verbs

Choose one of five modes and set its parameters

Three details in that table are worth calling out.

The mesh arrives as a single object with a single material and no skeleton. Animation is a loop keyed to the behaviour mode, not a rig you open and edit. That is deliberate — a rig would multiply the file size and the authoring surface, and for a flat-shaded character at this triangle count, a keyed loop reads correctly at every distance you will actually place it.

The palette is eight swatches, not a colour picker. They are assigned to semantic slots: primary, secondary, accent, skin, metal, leather, trim, and shadow-catch. Swapping primary and secondary is a two-click operation that changes the read of the character entirely. It is also the fastest fix when a character disappears against a wall.

Proportions are discrete. You cannot slide a slider from stocky to slender. There are three head ratios and four body builds, and the generator picks one. This is a constraint, not a bug. Continuous proportion controls produce bodies that look subtly wrong at every setting and take forever to tune; discrete ones mean the worst result is merely not what you wanted, and the fix is one rebuild.

A shader-ready flipbook: a component, not an agent

The Division of Labour: The Generator Picks Silhouette, You Pick Scale

Restating the split in the direction people get backwards: the generator owns the shape of the thing, you own its size and its address.

Scale is in metres, and everything else in the scene is also in metres, so scale errors compound immediately. Working references: an adult humanoid reads correctly at 1.75 m, a child at 1.15 m, a small quadruped at 0.45 m at the shoulder, a counter-height vendor at whatever the counter dictates. Scale uniformly. Non-uniform scale on a flat-shaded mesh breaks the face normals and you get seams and striping under directional light that no amount of palette work fixes.

Set a 1.75 m reference box in the scene before you scale anything. Place it next to the first character you import. Almost every "this character looks wrong" report I have seen reduces to a figure that was scaled against the camera's apparent size instead of against the world. The camera moves; the reference box does not.

Facing comes from the slot, not from a rotation gizmo you nudge by eye. COUNTER faces the serving side of the counter. DOORWAY faces out of the door, which means the doorway's own hinge orientation propagates to the character. POST faces the approach path. If a character's back is to the player, the slot is wrong more often than the rotation is.

Position uses a 0.25 m snap grid on the ground plane. Drop to 0.125 m only when two characters share one stall and you need to break the symmetry between them. Free placement off the grid is available and is almost always a mistake at this poly count — the eye picks up sub-decimetre misalignments between a character's feet and the floor plane faster than it picks up anything else in the scene.

From NPC to Playable Character: Behaviour Modes Are a Short List

There are five modes. That is the entire list, and none of them is a personality.

Mode

Required anchor

Key parameters

Common failure

IDLE

A ground point

Facing, idle loop, loop speed

Placed alone in open space it reads as a statue

WANDER

A ground point plus clear floor

Radius 0.5–6 m, dwell time, speed

Radius exceeds the free-floor radius and the character walks into geometry

VENDOR

A station

Interaction radius 1.6 m, facing lock, greeting trigger

Station is the wrong height and the pose reads as leaning on nothing

PATROL

2–6 waypoints

Speed, pause per waypoint, loop or ping-pong

Waypoints cross a collider and the path visibly clips

TRIGGER

A zone volume

One-shot or repeatable, fire delay, target event

Zone is larger than the visual cue, so it fires before the player expects it

There is no combat AI, no dialogue tree, no schedule system, and no pathfinding across the world. If your design needs those, they belong to world logic — a trigger that fires a scripted event — not to the character. Adding them to the character would make every placed instance carry the cost, including the forty you placed as crowd filler.

WANDER is a radius on flat ground, not a navmesh. It has no obstacle avoidance. If you give a wandering character a 5 m radius in a market square with three stalls in it, the character will walk through the stalls' collision volumes and stop dead against the first wall it meets, then dwell there for the full dwell time. Keep the radius under the free-floor radius, or lay a ground patch that is bigger than the radius and treat the patch as the boundary.

Failure Mode One: Treating a Component as an Agent

This is the most common misunderstanding, and it produces a specific kind of scene: a row of figures standing in open ground, each of them facing a slightly different direction, none of them doing anything.

The mistake is treating the component as if it had autonomous agency. It does not. The component is a noun with a pose and a suggestion. The suggestion is IDLE. If you place twelve of them and expect a market, you get twelve identical stances in twelve slightly different rotations, and no amount of prompt writing fixes it, because the prompt only ever influenced the mesh.

Three symptoms to recognise:

Writing longer sentences hoping for behaviour. The character still stands still. You have added palette constraints, not a schedule.

Expecting separation. There is no steering, no separation force, no mutual awareness. Two characters placed 0.3 m apart will overlap their collision capsules and z-fight their shoulders. Space them by hand or use the snap grid at 0.125 m and accept that they will interpenetrate slightly.

Expecting state to persist on the character. It does not. State lives in the world. A VENDOR's greeting-triggered flag is stored on the station or the zone, not on the mesh, which is also why copying a character does not copy its history.

If you find yourself writing a third sentence to describe what the character does, stop. You are not improving the mesh, and you are not going to get behaviour out of a text field that has one output slot for it. Pick a mode, set the parameters, and spend the remaining effort on the station.

Failure Mode Two: No Station, No Belonging

A character with no station reads as a prop someone dropped. Three things make a character read as belonging to a place: an anchor, a prop, and clearance.

The anchor is the exact point the character's facing and pose are locked to. For a vendor it is the point behind the counter. For a door attendant it is the point inside the door's swing arc but outside the door's collision volume — usually 0.4 m inboard, offset 0.5 m to one side.

The prop is the physical thing the pose references. A vendor needs a counter. A guard needs a post, a railing, or a step. A loafing character needs a wall to lean on. Without the prop, the pose reads as a stance rather than an action, and every pose reads as the same stance.

The clearance is the gap between the character's collision capsule and the nearest blocking geometry. Recommended 0.25 m minimum so the player can path around, and 1.6 m from the anchor point to the nearest approachable standing spot so the interaction radius can fire.

The single most common station error is height. A counter with its top at 0.9 m and a 1.6 m character behind it reads as a person at a stall. Move that counter top to 1.2 m and the same character reads as a person behind a wall. Move it to 0.7 m and the pose reads as kneeling. The station is doing most of the storytelling, and the character is doing relatively little.

Ground patches count as stations. A 2×2 m patch of differing material under a wandering character makes the wander radius legible to the player before the character moves, which means the first thing they learn about that character is correct.

Placement: Slots, Snapping, and the Ground Patch

The mechanical sequence, with the settings that matter.

Snap grid to 0.25 m. Slot assignment before rotation, always. Facing offset defaults to zero for GROUND and POST, and derives from the door or counter normal for DOORWAY and COUNTER. Collision capsule derives from mesh bounds — radius typically 0.3–0.45 m, height from feet to top of head — and for VENDOR characters you should shrink the capsule to roughly 0.25 m so the player can close to the 1.6 m interaction radius without being pushed back out.

Character pivots sit at the feet, and forward is +Z. This is consistent across every component the generator returns, which is what makes the slot system work without per-character tuning. If you import anything from outside the builder, fix the pivot before you place it. A pivot at the centre of mass produces a character that sinks half a metre into the floor and floats when you scale it up.

Ground patches go down before the character, not after. Lay the patch, match its material to the surrounding floor with a deliberate difference in roughness rather than a difference in hue, then place the character on it. Doing it in the other order means you will move the character to fit the patch, and the slot will end up in the wrong place relative to the wall.

Into the World: Browser, No Engine, No Build Step

The placed character is a node in a scene graph. The world is serialised — geometry in binary buffers, the rest as structured data — and the runtime is Three.js. There is no engine to install, no export step, no asset pipeline, and no build. The world is a browser tab. Sharing it is the same operation as viewing it.

Budget numbers, because placement decisions are budget decisions. A single generated character is 900–2,400 triangles and one draw call. A scene that holds 60 fps on integrated graphics sits around 250,000 triangles and under 300 draw calls. Forty copies of the same character instanced together collapse to a single draw call, which is why crowd filler should be built from one component and instanced rather than generated forty times — forty separately generated meshes will not batch, because their vertex buffers differ.

Texture atlases for generated characters are 512×512, which is enough for flat-shaded low-poly at every distance you will place them. Shadow maps are the usual culprit when frame time drifts: 2048 for the primary directional light, 1024 for anything secondary, and disable shadow casting on characters that never leave a station in shadow anyway.

The world you end up with is playable in the tab it was built in. The Cyclops' Island is a full example of this at scale — characters with stations, slots, and behaviour modes running as one scene. Mini World is the faster loop: one character, one station, one ground patch, placed and walked through in under a minute, which is the right way to test whether a silhouette reads before you build a market around it. Agent Sprite Forge is where sprite-based characters come from when the world needs a two-dimensional counterpart.

The character you started with was a sentence. What you have now is a node with a mesh, a palette, a scale you chose, a slot you assigned, a mode you selected, and a station that makes it belong. Nothing in that chain required an engine download, a compile step, or a level format you had to learn. That is the whole point of the pipeline: the generator handles the part that is a search problem, you handle the part that is a spatial decision, and the world runs where the player already is.


One palette keeps a generated cast coherent

Keep going


Build the world it walks in

A character, a tile or a model is a material with nowhere to stand. Every world on the 3D game builder was made from one written description and published as a page you can play — including Mini World and The Cyclops' Island.

Open the 3D Game Builder →