This is the “I just cloned the repo, now what” guide. Follow it top to bottom and you will have a playable prototype of VALE running in the Unity editor in about 30 to 50 minutes, depending on how fast your downloads go.
If you get stuck, the Troubleshooting section at the end covers the most common issues. For a high-level overview of what you are building, see README.md. For details on the codebase after setup, see ARCHITECTURE.md.
You will need the following installed before opening the project.
6000.0.x). Any LTS release works.
The project targets 6000.0.23f1, but any 6000.0.x will import without
issues.You do not need to install Visual Studio, Rider, or any C# IDE. The Unity editor has a built-in script viewer, and you will only be filling in inspector fields in this guide, not writing code.
apps/vale/ directory. It should show a Unity icon and a label like
“VALE (6000.0.x)”.The first open triggers a full package import (HDRP, Cinemachine, Input System, VFX Graph, ProBuilder, Terrain Tools). You will see a progress bar in the bottom-left corner of the Unity window. On a modern SSD this takes about 3 to 5 minutes. On a slower drive, give it up to 10.
While you wait, the console will show lines like:
Importing package 'com.unity.render-pipelines.high-definition'...
Importing package 'com.unity.cinemachine'...
Do not close the editor. If the console shows red errors after the import finishes, see Troubleshooting before continuing.
Once the import finishes, the editor will show an empty or partially built scene. This is expected. The scene is generated by the editor menu items in Step 7 below.
The game uses the Unity New Input System. You need to create a single
.inputactions asset that defines all player and UI actions.
Assets/Vale/Settings/. If the Settings folder does not exist, create
it: right-click in Assets/Vale/, then Create > Folder, name it
Settings.Settings folder.ValeInput (Unity appends .inputactions
automatically). It should appear as
Assets/Vale/Settings/ValeInput.inputactions.The new asset comes with an empty Player action map already. Select the
Player action map in the Inspector. You will see an Actions section
with a (+) button. For each action below, click (+), then fill in
the fields.
| Action name | Interaction type | Control(s) to add |
|---|---|---|
Move |
Value (Vector 2) | W (Y axis, +1), S (Y axis, -1), A (X axis, -1), D (X axis, +1) |
Look |
Value (Vector 2) | Mouse X (X axis), Mouse Y (Y axis) |
Jump |
Button | Space |
Interact |
Button | E |
ToggleFlight |
Button | F |
Sprint |
Button | Left Shift |
QuestLog |
Button | Tab |
Pause |
Button | Escape |
How to add a key (example for Move):
Move.W, and
confirm. Then set the Processor or Axis to Y = +1.S (Y = -1), A (X = -1), D (X = +1).For Look, the controls are Mouse X and Mouse Y (these are built-in
mouse delta controls available in the control picker).
For the button actions (Jump, Interact, etc.), set Type to Button and add the corresponding key as the binding.
UI.UI action map.| Action name | Interaction type | Control(s) |
|---|---|---|
Submit |
Button | Enter, Space |
Cancel |
Button | Escape |
Click File > Save (or press Ctrl+S). The asset now exists on disk at
Assets/Vale/Settings/ValeInput.inputactions.
You will drag this asset onto the InputManager component later
(Step 9).
HDRP (High Definition Render Pipeline) is already listed in the project’s
Packages/manifest.json. Unity imported it when you opened the project.
You just need to make sure it is set as the active render pipeline.
If you see an HDRP asset (its name usually contains “HDRP” or “HDRenderPipelineAsset”), you are done with this step.
Assets/HighDefinitionRP/Settings/ in the Project window. You will find
an asset called HDRenderPipelineAsset (or similar).HDRP uses a “Volume Profile” to store post-processing effects (bloom, color grading, fog, etc.). The HDRP Starter Assets pack you import in Step 5 includes a ready-made profile. If you skip that pack, create a default one:
Assets/Vale/Settings/ > Create > HDRP > Volume Profile.ValeVolumeProfile.ValeVolumeProfile.VALE is designed to work with free, publicly available assets. The full list with URLs, licenses, and install instructions is in ASSETS.md. The three required assets are summarized here.
This pack provides sample scenes, materials, and a volume profile tuned for HDRP. You will reuse its materials and lighting setup.
Assets/HDRP Starter Assets/. Leave it
where it is. The editor scripts in VALE reference materials from this
folder.The HDRI (high dynamic range image) provides the skybox and ambient light for the forest. Without it, the scene will look flat and dark.
kloofendal_48d (a partly cloudy South African landscape that
suits a soft, golden forest light). Any bright, outdoor HDRI will work..hdr file.Assets/Vale/Settings/HDRIs/ if it does not exist
(right-click Assets/Vale/Settings/ > Create > Folder)..hdr file from your file explorer into
Assets/Vale/Settings/HDRIs/ in the Unity Project window..hdr file. In the Inspector, set
Texture Type to Environment (360) and click Apply.This pack provides low-poly trees, mushrooms, rocks, and other foliage prefabs. The forest populator script uses these to scatter vegetation.
Assets/Vale/Prefabs/Vegetation/ if it does
not exist.Prefabs folder from the extracted Kenney package into
Assets/Vale/Prefabs/Vegetation/.ForestPopulator editor script (Step 7) references prefabs from this
folder by name.For a richer look, you can also import:
These are optional. The prototype is playable without them.
The game systems (quests, dialogue, NPCs, collectibles) are driven by
ScriptableObject data assets. You need to create one asset of each type per
entry in the table below. All assets go in Assets/Vale/Data/.
Note: The
Create > Vale > ...menu items appear in the context menu only after Unity has compiled the C# scripts. If you do not see them, wait for the compile to finish (watch the progress bar at the bottom of the editor) or restart the editor.
Assets/Vale/ > Create > Folder.Data.Quest_MainQuest:
Assets/Vale/Data/ > Create > Vale > Quest Data.Quest_MainQuest.Select it and fill in the Inspector fields:
| Field | Value |
|---|---|
questId |
main_quest |
title |
The Fading Light |
description |
The light of the Vale is fading. The Elder asks you to recover five lost Lumenshards and bring them to the Sacred Glade. |
offerText |
Will you help us, traveller? The five Lumenshards have been scattered across the Vale. Find them, speak to their keepers, and bring them to the Sacred Glade. |
In the Objectives list, click the Size field and set it to 6.
Fill in each row:
| Index | objectiveId |
description |
type |
targetId |
requiredCount |
|---|---|---|---|---|---|
| 0 | talk_elder |
Speak with the Fairy Elder |
Talk |
fairy_elder |
1 |
| 1 | collect_shard_1 |
Find the first Lumenshard |
Collect |
lumenshard_1 |
1 |
| 2 | collect_shard_2 |
Find the second Lumenshard |
Collect |
lumenshard_2 |
1 |
| 3 | collect_shard_3 |
Find the third Lumenshard |
Collect |
lumenshard_3 |
1 |
| 4 | collect_shard_4 |
Find the fourth Lumenshard |
Collect |
lumenshard_4 |
1 |
| 5 | collect_shard_5 |
Find the fifth Lumenshard |
Collect |
lumenshard_5 |
1 |
1. Set completionMessage to
"The Vale's light returns. You did it.". Set nextQuestId to
sacred_glade.Quest_SacredGlade:
Assets/Vale/Data/ > Create > Vale > Quest Data.Quest_SacredGlade.Fill in:
| Field | Value |
|---|---|
questId |
sacred_glade |
title |
The Sacred Glade |
description |
Place all five Lumenshards on the altar at the Sacred Glade to restore the Vale's light. |
Objectives list, size 1:
| Index | objectiveId |
description |
type |
targetId |
requiredCount |
|---|---|---|---|---|---|
| 0 | place_all_shards |
Place all 5 Lumenshards on the altar |
Place |
altar_sacred_glade |
5 |
Create one DialogueData asset per NPC. The Elder needs a quest-offer
dialogue; each Keeper needs a greeting, hint, and farewell.
Assets/Vale/Data/ > Create > Vale > Dialogue Data.Dialogue_Elder_Default.dialogueId: elder_defaultnpcId: fairy_elderstartNodeId: greetingIn the Nodes list, set size to 3:
| Index | nodeId |
speakerName |
text |
nextNodeId |
|---|---|---|---|---|
| 0 | greeting |
Fairy Elder |
Ah, a traveller. You have come at a strange time. The Vale's light is fading, and we need your help. |
hint |
| 1 | hint |
Fairy Elder |
Five Lumenshards were lost when the first darkness came. Find them, speak to the keepers who guard them, and bring them to the Sacred Glade at the Vale's heart. |
farewell |
| 2 | farewell |
Fairy Elder |
Go now, traveller. The forest will guide you. The keepers will share their memories with you. |
(leave empty) |
On node greeting, add one choice:
label: I will help younextNodeId: hintadvanceObjective: main_quest/talk_elderRepeat for each Keeper. Use this naming convention:
| File name | dialogueId |
npcId |
|---|---|---|
Dialogue_Keeper1_Default |
keeper1_default |
keeper_1 |
Dialogue_Keeper2_Default |
keeper2_default |
keeper_2 |
Dialogue_Keeper3_Default |
keeper3_default |
keeper_3 |
Dialogue_Keeper4_Default |
keeper4_default |
keeper_4 |
Dialogue_Keeper5_Default |
keeper5_default |
keeper_5 |
For each Keeper, use 3 nodes: greeting, hint, farewell. The hint
node should mention the location of their shard (e.g. “My shard rests
beyond the eastern ridge, past the old oaks”). The farewell node ends the
dialogue.
Assets/Vale/Data/ > Create > Vale > NPC Data.NPC_Elder.Fill in:
| Field | Value |
|---|---|
npcId |
fairy_elder |
displayName |
Fairy Elder |
isQuestGiver |
true |
questsOffered |
Add 1 entry: main_quest |
wanderRadius |
2 |
wanderSpeed |
0.5 |
wanderInterval |
8 |
1 and drag the
Dialogue_Elder_Default asset into the slot.Repeat for the five Keepers:
| File name | npcId |
displayName |
isQuestGiver |
wanderRadius |
|---|---|---|---|---|
NPC_Keeper1 |
keeper_1 |
Keeper of the East |
false |
4 |
NPC_Keeper2 |
keeper_2 |
Keeper of the West |
false |
4 |
NPC_Keeper3 |
keeper_3 |
Keeper of the South |
false |
4 |
NPC_Keeper4 |
keeper_4 |
Keeper of the North |
false |
4 |
NPC_Keeper5 |
keeper_5 |
Keeper of the Grove |
false |
4 |
For each, set wanderSpeed to 1.2 and wanderInterval to 4. Drag the
corresponding Dialogue_Keeper*_Default asset into their Dialogues list.
Assets/Vale/Data/ > Create > Vale > Collectible Data.Collectible_Lumenshard1.Fill in:
| Field | Value |
|---|---|
collectibleId |
lumenshard_1 |
displayName |
Lumenshard I |
description |
A shard of crystallized fairy light, warm to the touch. |
value |
10 |
pickupPrompt |
Press E to pick up |
icon field empty for now (you can assign a sprite later).Repeat for Lumenshards 2 through 5:
| File name | collectibleId |
displayName |
|---|---|---|
Collectible_Lumenshard2 |
lumenshard_2 |
Lumenshard II |
Collectible_Lumenshard3 |
lumenshard_3 |
Lumenshard III |
Collectible_Lumenshard4 |
lumenshard_4 |
Lumenshard IV |
Collectible_Lumenshard5 |
lumenshard_5 |
Lumenshard V |
The scene is built procedurally by four editor scripts. Each one creates
specific GameObjects in the currently open scene. Make sure you have a scene
open (File > New Scene, or open Assets/Vale/Scenes/FairyVale.unity if it
exists) before running these.
Run them in this order:
Go to Vale > Build Vale Scene in the top menu bar.
This creates the base scene hierarchy: a Lighting group with an HDRP
Volume, a Terrain group (Unity Terrain object with default grass
splatting), a SacredGlade group with an Altar child (5 slot positions),
a Player Start empty GameObject at the spawn point, and a Main Camera
with a Cinemachine Virtual Camera.
You should see the new objects appear in the Hierarchy window. If the terrain looks flat and grey, that is normal at this stage. The HDRI from Step 5 will provide the lighting.
Go to Vale > Populate Forest.
This script scatters tree and mushroom prefabs across the terrain. It
references prefabs from Assets/Vale/Prefabs/Vegetation/ (the Kenney Nature
Kit folder you imported in Step 5). If you skipped the Kenney import, the
script will log a warning to the console and place fewer objects.
You should see hundreds of trees and mushrooms appear on the terrain. The
placement is random but seeded, so running it again produces the same
layout. If you want a different layout, delete the Foliage group in the
Hierarchy and run the menu item again.
Go to Vale > Place Lumenshards.
This creates five Lumenshard GameObjects in cleared circular glades
spread around the forest. Each shard is a small glowing sphere (using an
HDRP Unlit material) with a point light and a particle emitter for fairy
dust. Each one references the corresponding CollectibleData asset you
created in Step 6.
You should see five glowing orbs in the Hierarchy under a Collectibles
group. If you cannot see them in the scene, they may be far from the camera.
Select one in the Hierarchy and press F to frame it.
Go to Vale > Place NPCs.
This places the Fairy Elder near the Player Start position and the five
Keepers near their respective Lumenshard glades. Each NPC is a
GameObject with a FairyNPC component, a capsule collider, and a
NPCData reference.
You should see six NPC objects in the Hierarchy under an NPCs group. The
Elder will be the closest to the spawn point.
After running all four menu items, go to File > Save Scene As and save
it as Assets/Vale/Scenes/FairyVale.unity.
The game uses UGUI (Unity’s built-in UI system) for all HUD elements. You need to create a Canvas and attach the five UI scripts to child objects.
Canvas GameObject and a EventSystem GameObject.Canvas in the Hierarchy.1920 x 1080.Right-click the Canvas in the Hierarchy and create five empty child
GameObjects. For each one, add the appropriate UI script component.
| Child name | Script to add (via Add Component) | What it controls |
|---|---|---|
HUD |
HUDController |
Shard count, quest tracker, health (if added later) |
QuestLog |
QuestLogUI |
Tab-toggle quest log overlay |
Dialogue |
DialogueUI |
Speaker name, dialogue text, choice buttons |
InteractionPrompt |
InteractionPromptUI |
“Press E to talk” / “Press E to pick up” prompt at screen bottom |
Pause |
PauseMenuUI |
Pause overlay with Resume, Save, Quit buttons |
For each child:
HUDController) and click it to add.Reference wiring table:
| Script | Field | Drag in |
|---|---|---|
HUDController |
shardCountText |
A Text (TMP) component (create via right-click > UI > Text) |
HUDController |
questTrackerText |
A second Text (TMP) component |
QuestLogUI |
questLogPanel |
An empty GameObject with an Image component (background) |
QuestLogUI |
questEntriesContainer |
A Content Size Fitter or Vertical Layout Group parent |
DialogueUI |
speakerNameText |
A Text (TMP) component |
DialogueUI |
dialogueText |
A Text (TMP) component |
DialogueUI |
choiceButtons |
A Vertical Layout Group parent for choice Button objects |
InteractionPromptUI |
promptText |
A Text (TMP) component |
InteractionPromptUI |
promptImage |
An Image component (background behind the text) |
PauseMenuUI |
pausePanel |
An empty GameObject with an Image component |
PauseMenuUI |
resumeButton |
A Button object |
PauseMenuUI |
quitButton |
A Button object |
Tip: To create UI elements quickly, right-click a panel in the Hierarchy > UI > Text - TextMeshPro for text, UI > Image for backgrounds, UI > Button for buttons. Unity will auto-arrange them with layout groups.
If the UI scripts have not been created yet (check
Assets/Vale/Scripts/UI/), the Add Component search will not find them. In
that case, skip this step for now. The game is still playable without UI;
you can add the canvas later once the scripts are in place.
The InputManager component needs the ValeInput.inputactions asset
assigned. Without it, none of the game’s input will work.
GameManager GameObject. If you do not see
one, the GameManager script auto-creates its subsystems in Awake(),
so the InputManager will be a child of GameManager. Look for a
child named InputManager.InputManager object.Assets/Vale/Settings/ValeInput.inputactions from the Project
window into that field.Ctrl+S).If you cannot find an InputManager object in the scene, select the
GameManager and check the Input Manager field in its Inspector.
GameManager.EnsureSubsystems() creates the InputManager automatically
on first Play, but it is cleaner to create it manually:
GameManager > Create Empty. Name it InputManager.InputManager component (Add Component > search “InputManager”).ValeInput.inputactions asset into the Input Actions field.InputManager object into the GameManager’s Input Manager
serialized field.FairyVale.unity is the active scene (double-click it in the
Project window if needed).What should happen:
FairyVale scene.Player Start position, which is near the Fairy Elder.W to walk forward. A/D to strafe. S to back up.Space to jump.F to toggle flight. In flight mode, Space makes you rise and
S makes you descend. Press F again to land.Left Shift to sprint (faster movement).E to start the dialogue.Tab to toggle the quest log overlay.Escape to open the pause menu.If everything works, congratulations. You have a playable prototype of VALE.
HDRP is not set as the active render pipeline, or no HDRI is assigned.
Check the Console window (Window > General > Console) for the exact error message. Common causes:
Assets/Vale/Scripts/Vale.Runtime.asmdef
and make sure the References list includes Vale.Editor only if
runtime code references editor types (it should not; editor code is
separate). Open Assets/Vale/Scripts/Editor/Vale.Editor.asmdef and make
sure it references Vale.Runtime.UnityEngine.Cinemachine or UnityEngine.InputSystem, the corresponding
package is missing. Go to Window > Package Manager, check the
Packages: In Project tab, and confirm the package is listed. If not,
add it via Packages: Registry and search for it.The InputManager does not have the input asset assigned.
InputManager GameObject in the scene.ValeInput.inputactions
dragged in.The Canvas render mode is wrong or the UI elements have no size.
Canvas GameObject. Confirm Render Mode is
Screen Space - Overlay.HUD). In the Inspector, check the
Rect Transform component. If the Width or Height is 0, the element
is invisible. Set reasonable values (e.g. 1920 x 1080 for a full-screen
panel, 200 x 50 for a text label).The editor scripts in Assets/Vale/Scripts/Editor/ have not compiled.
Vale.Editor.asmdef file exists at
Assets/Vale/Scripts/Editor/Vale.Editor.asmdef.Vale menu should appear once compilation
finishes.The script could not find any tree or mushroom prefabs.
Assets/Vale/Prefabs/Vegetation/.ForestPopulator script looks for prefabs by name. If the names do not
match what the script expects, you may need to rename the prefabs or
update the script’s search list.Player GameObject has a PlayerController component.PlayerController has a Character Controller or
Rigidbody component.GameManager is set (see
Save the Input asset reference).W.Assets/Vale/Scripts/ folder to see how the managers,
player, quest, dialogue, and NPC systems are implemented.