The Velan Codex

Art

Art Pipeline

First-pass concept art (Midjourney) and the first 3D model (Meshy). Everything under Art/ sits outside Assets/, so Unity never imports it into a build. The game-ready golem lives in Assets/Art/Models/TrainingGolem/.

Art direction (style, palettes, shape language) is written up in the "Art Direction" tab of the Mobile RPG Codex: https://claude.ai/artifact/VF3CNzQbCREegLwy2zAdBS

Midjourney setup

Style exploration

Three treatments of the same subject. The cel-shaded 3D look won: it reads as a playable 3D game at phone size and is the closest to what Meshy and URP can actually produce. The gouache is the prettiest but can't be built in 3D.

ImageJob / indexPrompt
Concepts/style/style-anchor-cel-shaded.png (chosen, the --sref anchor)e1cbf51f-e14d-47a5-878b-299fa466e41a / 1Concept art for a mobile fantasy RPG, crisp cel-shaded 3D JRPG style with soft rim light and subtle bloom, a quiet farming village on a grassy hill below a white stone shrine built of perfectly mirrored arches, morning light, warm ivory, pale gold and sky blue, chunky readable low-poly-friendly shapes, clean silhouettes, inviting and hopeful --ar 16:9
Concepts/style/style-alt-hand-painted.png1db5f4e1-9ac4-4256-87ca-e35035c01887 / 1Concept art for a mobile fantasy RPG, stylized hand-painted 3D game art, a quiet farming village on a grassy hill below a white stone shrine built of perfectly mirrored arches, soft morning light, warm ivory, pale gold and sky blue, chunky readable shapes, clean silhouettes, gentle painterly textures, inviting and hopeful --ar 16:9
Concepts/style/style-alt-gouache.png7e9e3fcb-c13e-464e-8d0f-42b65ad89c2b / 1Concept art for a mobile fantasy RPG, storybook gouache illustration with flat painted shapes and visible brush texture, a quiet farming village on a grassy hill below a white stone shrine built of perfectly mirrored arches, soft morning light, warm ivory, pale gold and sky blue, bold simple silhouettes, inviting and hopeful --ar 16:9

Subjects

All prompts below end with --sref https://cdn.midjourney.com/e1cbf51f-e14d-47a5-878b-299fa466e41a/0_1.png (written as --sref <anchor>).

The two sides

ImageJob / indexPrompt
Concepts/sides/evane-vs-facets-a.png, evane-vs-facets-b.pngc6bd1a85-d3c7-4f61-9373-0e0716f5ee3e / 3, 1Split composition concept art for a mobile fantasy RPG, two sides of magic facing each other across a dividing line: on the left the Evane, a perfectly symmetric white marble and pale gold gateway with a robed mage mirrored in a still pool, calm sky blue light; on the right the Facets, a jagged asymmetric archway of shattered prismatic crystal shards in teal, violet and magenta over dark slate, a mage in mismatched shard armor, rainbow caustics; strong contrast between order and fracture, stylized hand-painted 3D JRPG game art, soft cel shading --ar 16:9 --sref --sw 50
Concepts/evane/evane-sanctum-a.png, evane-sanctum-b.png70b07654-fc90-44cd-bfc4-0ebdaf7ccdef / 2, 3Visual language concept for a mobile fantasy RPG, the Evane, a light-side magic order whose temples, robes and sigils are perfectly bilaterally symmetric like a reflection in still water, a grand white marble sanctum with pale gold filigree and sky-blue glass, two robed adepts mirroring each other's pose, mirrored glyphs glowing on the floor, calm order and restraint, perfectly centered symmetrical composition, stylized hand-painted 3D JRPG game art, soft cel shading --ar 16:9 --sref
Concepts/facets/facets-hall-a.png, facets-hall-b.pngda75d28e-9583-4a46-8323-57416dc67e06 / 1, 2Visual language concept for a mobile fantasy RPG, the Facets, a free magic order who build from a shattered mirror, asymmetric crystalline architecture of jagged broken prismatic shards, every shard catching the light its own way, iridescent teal, violet and magenta refractions over dark slate stone, robed adepts with mismatched shard armor and one bare arm, rainbow caustics on the ground, bold off-center asymmetric composition, stylized hand-painted 3D JRPG game art, soft cel shading --ar 16:9 --sref --sw 50

Characters

ImageJob / indexPrompt
Concepts/protagonist/protagonist-a.png, protagonist-b.pngdcd6142f-f689-4104-be03-f962cd707b9d / 1, 0Character concept sheet for a mobile fantasy RPG protagonist, a young orphan farmhand from a small village, shown as a young man and a young woman side by side, simple homespun linen tunic, rolled sleeves, long woven scarf, patched trousers, worn leather boots, both hands faintly glowing with two mirrored white-gold glyphs, hopeful determined expression, full body, front view, plain warm grey background, stylized hand-painted 3D JRPG game art, soft cel shading, clean readable silhouettes --ar 3:2 --sref
Concepts/mentor/mentor-a.png, mentor-b.pngc6f2a179-57a9-4449-9b03-9c5a057bc450 / 1, 3Character concept for a mobile fantasy RPG, the mentor, a jaded but trustworthy village elder, a retired magic-user who walked away from an endless war between two magic orders, weathered lined face, short grey beard, tired kind eyes, long patched travelling coat whose faded emblem is half a symmetric white-gold sigil and half a broken prismatic shard, plain walking staff, clay pipe, slightly stooped, full body, three-quarter view, plain warm grey background, stylized hand-painted 3D JRPG game art, soft cel shading, clean readable silhouette --ar 3:4 --sref

Training Golem

ImageJob / indexPrompt
Concepts/training-golem/golem-front-meshy-input.png (Meshy input), golem-front-alt.png7d0c078d-63f0-4756-91a5-82d2b31d1bc0 / 3, 03D game character model reference, the Training Golem, a sturdy practice golem built from pale carved stone blocks and wooden training-dummy planks bound with iron bands and rope, one glowing white-gold mirrored glyph carved on its chest, chunky top-heavy proportions, huge fists, short thick legs, small head, full body, straight front view, symmetrical standing pose with arms slightly away from the body, centered, whole figure in frame, plain flat white background, no ground shadow, stylized hand-painted game asset, soft even lighting --ar 1:1 --sref --sw 40
Concepts/training-golem/golem-three-quarter.png937a7353-1f41-4ada-960e-63bd19514b42 / 23D game creature concept for a mobile fantasy RPG, the Training Golem, a sturdy practice golem built from pale carved stone blocks and wooden training-dummy planks bound with iron bands and rope, one glowing mirrored glyph carved on its chest, chunky top-heavy proportions, huge fists, short thick legs, small head, full body, front three-quarter view, standing idle pose, centered, plain light grey background, stylized hand-painted 3D JRPG game art, soft cel shading, clean readable silhouette --ar 1:1 --sref

Places

ImageJob / indexPrompt
Concepts/battle-arena/arena-a.png, arena-b.pngc8e7b085-59d9-4ecd-a17d-703630d611a1 / 3, 2Battle arena environment for a mobile JRPG with fully 3D battles, a circular village training ground paved with pale stone tiles inlaid with a faint mirrored glyph, ringed by low ruined symmetric white arches and wooden practice posts, meadow and distant hills beyond, empty open center stage, seen from a low camera behind the player looking toward the far side, clear open space in the upper middle of the frame, warm afternoon light, stylized hand-painted 3D JRPG game art, soft cel shading --ar 16:9 --sref
Concepts/overworld/overworld-a.png, overworld-b.png3e0c223a-0aaf-4a0f-989d-56289bb7702b / 1, 0Overworld gameplay screen of a mobile JRPG, faux-3D world map, camera looking steeply down at the ground from high above at 60 degrees, HD-2D miniature diorama, a tiny hero figure standing on a dirt path in the center of the frame, around him a small farming village of six cottages, square crop fields, a river with a stone bridge, clumps of round trees, a white symmetric shrine on a little hill, map edges fading into soft tilt-shift blur, toy-like readable landmarks, warm daylight, stylized hand-painted 3D game art, soft cel shading --ar 16:9 --sref --sw 40

The first overworld attempt (job dbbc8014-e630-487d-b002-45148aa095f0, "tilted high three-quarter top-down diorama view…") came out as a perspective landscape, not a top-down map, so it was re-rolled with an explicit steep camera angle and lower style weight.

Spells

ImageJob / indexPrompt
Concepts/spells/repel-a.png, repel-b.pngd841f0c0-4b96-4dda-ba0c-2dd24615c516 / 1, 0Spell effect concept for a mobile JRPG battle, Repel: two mirrored L-shaped glyphs of white-gold light flash side by side in front of the caster, and a wide curved shockwave wall bursts outward and shoves a chunky stone training golem backward off its feet, ring of dust and grass blowing away, bright symmetrical radial burst, over-the-shoulder battle camera, training ground arena, stylized hand-painted 3D JRPG game art, soft cel shading --ar 16:9 --sref
Concepts/spells/coil-a.png, coil-b.pngecfcfe51-b1a6-43a1-b193-a83be4e1e052 / 1, 3Spell effect concept for a mobile JRPG battle, Coil: two mirrored S-shaped ribbons of white-gold and sky-blue light spiral around each other into one heavy twisting coil and slam down onto a chunky stone training golem, crushing impact, cracked ground, chips of stone flying, strong symmetric motion arcs, over-the-shoulder battle camera, training ground arena, stylized hand-painted 3D JRPG game art, soft cel shading --ar 16:9 --sref
Concepts/spells/gale-a.png, gale-b.png01825f10-e1fd-4480-a38f-724513cd281d / 1, 2Spell effect concept for a mobile JRPG battle, Gale: two identical parallel glyphs shaped like sharp mountain peaks glow pale green side by side, releasing a howling gust of crescent wind blades and swirling leaves that sweeps across the arena and buffets a chunky stone training golem, streaks of air, over-the-shoulder battle camera, training ground arena, stylized hand-painted 3D JRPG game art, soft cel shading --ar 16:9 --sref
Concepts/spells/facet-seal-a.png, facet-seal-b.pnga7c75f51-562a-4046-af58-0c3b9c08c231 / 1, 3Spell effect concept for a mobile JRPG battle, Facet Seal: a glowing circle glyph on the left and a glowing square glyph on the right fuse into an asymmetric shield of jagged prismatic crystal shards in front of the caster, refracting teal, violet and magenta light, rainbow caustics on the ground, a chunky stone training golem's fist striking the shield and glancing off, over-the-shoulder battle camera, stylized hand-painted 3D JRPG game art, soft cel shading --ar 16:9 --sref --sw 50

November concept push

A second Midjourney pass (VEL-48 to VEL-51) covered the rest of the game. Each folder has its own README with every prompt and job id, a contact sheet and a list of Meshy candidates:

Meshy: Training Golem

Built through the Meshy REST API (the key lives in ~/.secrets/velan_meshy_api_key, never in the repo). Total cost: 68 credits.

Meshy preview

1. Image to 3D (30 credits)

Input: Concepts/training-golem/golem-front-meshy-input.png, sent as a base64 data URI.

POST https://api.meshy.ai/openapi/v1/image-to-3d
{
  "image_url": "data:image/png;base64,…",
  "ai_model": "latest",
  "should_remesh": true,
  "topology": "triangle",
  "target_polycount": 15000,
  "should_texture": true,
  "enable_pbr": true,
  "texture_resolution": "2k",
  "target_formats": ["glb", "fbx"]
}

Task 01a19b3f-5bf3-75a4-91c1-bf35dafcb1f2. Result: one mesh, 15,435 triangles, 30,744 vertices, one material with a 2K PBR set (base colour, metallic, roughness, normal; Meshy's current model has no emission map, so the chest glyph's glow has to come from an emissive mask or a light in Unity).

2. Rigging (5 credits)

POST https://api.meshy.ai/openapi/v1/rigging
{ "input_task_id": "01a19b3f-5bf3-75a4-91c1-bf35dafcb1f2", "height_meters": 2.4 }

Task 01a19b47-70e7-7708-8cc7-7f982c6a4151. A 24-bone humanoid skeleton (Hips, Spine/Spine01/Spine02, neck, Head, shoulders, arms, forearms, hands, legs, feet, toes). Mixamo's auto-rigger was tried first and failed on this body: the head sits inside the shoulders with no neck, which its humanoid fitter can't place.

3. Animations (3 credits each)

POST https://api.meshy.ai/openapi/v1/animations
{ "rig_task_id": "01a19b47-70e7-7708-8cc7-7f982c6a4151", "action_id": <id>,
  "post_process": { "operation_type": "extract_armature" } }

extract_armature returns skeleton and motion only (~200 KB) instead of re-embedding the 14 MB mesh in every clip. The files follow Unity's Model@Clip.fbx naming.

ClipMeshy library actionFrames (30 fps)Battle use
TrainingGolem@Idle.fbx0 Idle2–122waiting
TrainingGolem@Attack.fbx214 Punch Forward with Both Fists2–106its attack
TrainingGolem@Hit.fbx178 Hit Reaction2–51Coil, Gale hits
TrainingGolem@Stagger.fbx113 Mummy Stagger2–147Repel's 2.5 s stagger
TrainingGolem@Death.fbx8 Dead2–91defeat
TrainingGolem@Walk.fbx119 Slow Orc Walk2–167approach, overworld

Animation frames: Idle, Attack, Hit / Stagger, Death, Walk

The preview above is a Blender render of each clip applied to the rigged mesh (a mid-clip frame each), as a check that the skin deforms cleanly.

Files

Not done here (left for the Unity side): .meta files and import settings (Unity creates them on first import; set the rig to Generic or Humanoid and point every clip at TrainingGolem.fbx's avatar), the URP material, and the emissive chest glyph.

Meshy: protagonists

The male and female protagonist (VEL-36): Assets/Art/Models/ProtagonistMale/ and ProtagonistFemale/, each with a README listing its clips, height and Meshy task ids. 56 credits each.

Male protagonist Female protagonist

What changed from the golem:

Protagonist clips

Meshy: Aske

Aske Tarran, the ferry keeper and mentor (VEL-37), built the same way as the golem through the Meshy REST API. Total cost: 82 credits. The game-ready files, their Humanoid import settings, the clips and every task id are in Assets/Art/Models/Aske/README.md; VEL-70's Import Character builds the prefab.

Aske turnaround

1. Multi-image to 3D (30 credits)

Input: the four VEL-64 views in Concepts/model-sheets/aske/ (front.png first, then left.png, back.png, three-quarter.png), as base64 data URIs.

POST https://api.meshy.ai/openapi/v1/multi-image-to-3d
{
  "image_urls": ["data:image/png;base64,…", "…", "…", "…"],
  "ai_model": "latest",
  "pose_mode": "a-pose",
  "should_remesh": true,
  "topology": "triangle",
  "target_polycount": 15000,
  "should_texture": true,
  "enable_pbr": true,
  "texture_resolution": "2k",
  "target_formats": ["glb", "fbx"]
}

Task 01a1a026-3287-735f-9408-37448528ab36. Result: one mesh, 15,535 triangles, a 2K PBR set (base colour, metallic, roughness, normal; no emission map). The face, earrings, turtleneck, rolled sleeves, fingerless glove and silver bands all came through from the sheet.

2. Rigging (5 credits)

POST https://api.meshy.ai/openapi/v1/rigging
{ "input_task_id": "01a1a026-3287-735f-9408-37448528ab36", "height_meters": 1.65 }

Task 01a1a029-51e3-73ce-93b2-438bbd0b65f1. The same 24-bone humanoid skeleton as the golem.

3. Text to Motion (10 credits each)

The library has no point and nothing like the tracing lesson, so those two clips were generated from text, then applied to the rig like a library action ("motion_task_id" in place of "action_id", 3 credits each).

POST https://api.meshy.ai/openapi/v1/text-to-motion
{ "mode": "prime", "duration": 4, "prompt": "An older woman standing still raises her right arm and points firmly ahead and slightly to her right across a river, holds the point for a moment while looking that way, then lowers her arm back to her side and relaxes." }

Task 01a1a026-ec8d-7098-a972-60138dc0a1ed (Point). Trace, task 01a1a026-f042-74f4-b41e-908d0e930f70, 6 s: "An older woman stands behind a student and reaches both arms forward at chest height, hands together as if guiding the student's hands, and slowly traces a large curved symbol in the air in front of her: a smooth S-shaped stroke from upper left down to lower right, then returns her hands to the start and lowers them."

4. Animations (3 credits each)

POST https://api.meshy.ai/openapi/v1/animations
{ "rig_task_id": "01a1a029-51e3-73ce-93b2-438bbd0b65f1", "action_id": <id>,
  "post_process": { "operation_type": "extract_armature" } }
ClipMeshy library actionUse
Aske@Idle.fbx0 Idlestanding
Aske@Walk.fbx30 Casual Walkwalking with the player (VEL-81)
Aske@Run.fbx14 Run 2catching up
Aske@Talk.fbx313 Talk with Hands Opendialogue
Aske@Explain.fbx314 Talk with Right Hand Opendialogue
Aske@Wave.fbx290 Wave One Handgreeting, send-off
Aske@Point.fbxText to Motion above"the far bank", directions
Aske@Trace.fbxText to Motion abovethe tracing lesson, hand over hand
Aske@Cast.fbx129 Mage Spell Casther old Warden casting

Walk and Cast were picked from the library's preview GIFs: Casual Walk is unhurried without being a shuffle, and Mage Spell Cast stays standing (the other casts crouch or lunge).

Animation frames: Idle, Walk, Run, Talk, Explain, Wave, Point, Trace, Cast

The preview is a Blender render of Meshy's skinned version of each clip, one frame each. Applying the extract_armature clips to the rigged model in Blender's FBX importer mangles the arms (its bone orientation differs between the two files). Unity's Humanoid import reads them correctly.

Files

Meshy: Glint

The glint (VEL-38) is a static Meshy mesh animated in code, so it has no rig and no clips. It was built from Concepts/creatures-items/enemies/glint-ref-newt-chunky-a.png with Image to 3D, mesh only (20 credits, task 01a1a026-eda1-7219-804f-c1159290711b). The mesh is kept as Models/Glint/Glint_meshy.glb; Glint_meshy_sheet.glb is an unused alternative from the VEL-66 sheet (20 credits; it has a face). Models/Glint/build_glint.py (Blender) cuts off the shards Meshy fused onto the tail and adds three separate ones, then writes Assets/Art/Models/Glint/Glint.fbx; Velan > Art > Set Up Glint builds the prefab. The rest is in Assets/Art/Models/Glint/README.md.

Glint poses

Characters in the game (VEL-70)

Velan > Art > Import Character (select model folders) or Import All Characters turns every Humanoid Meshy model under Assets/Art/Models/<Name>/ into a game-ready character. Batchmode: -executeMethod Velan.Editor.CharacterImport.ImportAll. Re-running it is safe: it only changes what isn't right yet. Creatures (Generic or no rig) are left alone. Source: Assets/Editor/CharacterImport.cs.

For each model it:

  1. Fixes the import. The model and every clip file are Humanoid with an avatar of their own (a Meshy clip file's root is the armature, so copying the model's avatar fails; Humanoid clips are muscle-space, so they play on any avatar of the same skeleton). Jaw is unmapped (Unity maps it to headfront, which skins the face). Clips are named after their file (Aske@Talk.fbx → Talk) or keep their take names inside a merged FBX (Rook, Tamsin, the faction NPCs); Idle, Walk, Run, Talk and Sit loop; root rotation, height and position are baked into the pose. Clip settings go in a second reimport, because Unity drops them from the .meta when the avatar changes in the same one.

  2. Builds the material. Assets/Art/Characters/Materials/<id>.mat, Velan/Toon, from the base colour, normal, and metallic with inverted roughness packed into Assets/Art/Characters/Textures/<id>_MetallicSmoothness.png.

  3. Fills the shared controller. Assets/Art/Characters/Character.controller holds empty placeholder clips; <id>.overrideController puts the character's own clip in each slot and its Idle where it has none.

    ParameterWhat it does
    Speed (float, m/s)Idle, Walk (1.4) and Run (4.0) blended. CharacterModel sets it from how fast the root moves (a jump faster than 12 m/s is a warp, not a run).
    Talking (bool)Loops Talk while standing. CharacterModel sets it while the line on screen is the character's.
    Wave, Cast, Hit, Cheer, Point, Explain, Trace, Alarm, LookAround (triggers)Play once, back to locomotion.
    Defeat, Recover (triggers)Fall and stay down; get up.
    Sitting (bool)The Sit layer sits down and stands up.

    Clip aliases: KnockedDown fills Defeat and Victory fills Cheer.

  4. Builds the prefab. Assets/Art/Characters/Resources/Characters/<id>.prefab: the model with its avatar and override controller, feet at the pivot, facing +z, no root motion, one LOD that culls below 2% of the screen height. The game loads it on demand with CharacterPrefabs.Load("Characters/<id>") (Assets/Scripts/World/), the one place to change for Addressables.

  5. Writes the data if it has none: Assets/StreamingAssets/Data/Characters/<id>.json (id, name, prefab, scale, portrait, tint) and index.json. portrait is the name the concept portraits share (aske for Art/Concepts/portraits/aske-neutral.png), or null when there are none yet. The tint (the base colour's average) colours the placeholder if the prefab is missing. Edit names and scales by hand; the tool keeps them.

In the game, the player wears protagonist_male or protagonist_female for the save's body type, and a location actor with "character": "<id>" wears that character (Sallowbank's Aske does; VEL-71 points the rest). Without one, or if the prefab is missing, the placeholder capsule stands in.

Rook's one-arm fix stays an import postprocessor (Assets/Art/Models/Rook/Editor/RookOneArm.cs), because it has to run on every import of Rook.fbx, not only when the tool runs.

Sallowbank environment kit

The props for Sallowbank, the Prologue village (VEL-39): houses with the door-mark, Aske's cottage and barn, fences and gate, field tiles, farm clutter, the well, the rope ferry, river banks, trees, bushes, reeds and rocks. No generation service: every prop is built by Python scripts in Blender (Art/Environment/Sallowbank/), sized to the greybox, coloured from one 256 x 256 palette texture and shared by one Velan/Toon material.

From Art/README.md