No One Runs Alone
Workshop Modding Guide
This guide is for people who have never seen the game’s source code.
You do not get a second Unity project from GiantNetwork Studios. You make content in your own Unity project, pack it into AssetBundles, write one JSON file (noramod.json), and upload a folder to Steam Workshop. The installed game reads that folder.
Think of it like packing a zip of level data the game already knows how to open — not like forking the game on GitHub.
0. Quick start: pick what you want to make
| I want to… | What I need to build | Where players see it |
|---|---|---|
| A new map | Unity scene + spawn empties + scene AssetBundle | Lobby → Map dropdown |
| Faster / slower rounds, longer chain, etc. | Only noramod.json (gameConfigOverrides) | During a match (rules change) |
| A new perk | A perks entry in noramod.json. On your own map, empty objects named SurvivorPerkSpawn_1 / HunterPerkSpawn_1 (optional). Icon is optional. | A pickup on the ground during a round. Walk into it. It goes to the hotbar. |
| A new game mode | JSON gameModes (+ optional config overrides) | Lobby → Gamemode dropdown |
| Extra sounds on a key | Audio clips in a content bundle + audioHotkeys | In-game when the player presses that key |
| A hat / backpack / glasses | Prefab + icon in a content bundle + cosmetics | Main menu → Customization → Mods |
You can combine several of these in one Workshop item.
1. Official stance
| What we provide | What we do not provide |
|---|---|
Runtime loader for Workshop items (noramod.json + AssetBundles) | The full game Unity project |
| This documentation and the manifest schema | Permission to redistribute game assets / scripts |
| In-game Workshop browse / upload / required-mod sync | A downloadable “modder Unity project” |
Unity Editor version (required)
AssetBundles load reliably only when your Editor matches the game build.
| Game / mod authoring Editor | Unity 6000.5.1f1 (Unity 6) |
| Hub install | Install that exact patch from the Unity Hub (not “any Unity 6”). |
A different major or minor patch often produces bundles the player build cannot load (missing scripts, pink materials, empty cosmetics). If the store build later moves to a newer Unity patch, this number will be updated here — always match whatever this guide lists.
URP (required)
The game uses the Universal Render Pipeline. Materials authored for the Built-in pipeline show up pink in-game.
Do one of the following when creating your project:
- Preferred: Unity Hub → New project → template 3D (URP) (or Universal 3D).
- If you already created a blank 3D project:
- Window → Package Manager → install Universal RP
- Create → Rendering → URP Asset (with Universal Renderer)
- Edit → Project Settings → Graphics → assign that URP Asset as the Scriptable Render Pipeline Settings
- Project Settings → Quality → assign the same URP Asset on each quality level you use
- Convert or recreate materials with URP/Lit (or URP Unlit)
Anyone can mod. You also need:
- Ability to build Standalone Windows AssetBundles (
StandaloneWindows64) - Steam client, so you can upload from the in-game Mods menu
- A content folder with
noramod.jsonat the root (and usually 1–2 AssetBundle files)
Intentionally not supported
- Arbitrary C# / DLL plugins injected into the game
- New perk effects outside the published
effectTypelist - Overriding
Color/Vector3config fields via JSON (onlyfloat,int,bool) - Expecting the game to compile your scripts
Gameplay is host-authoritative. Every peer in the lobby must load the same Workshop mods.
2. End-to-end workflow
Your Unity project Mod folder Steam Players
───────────────── ────────── ───── ───────
Scenes / meshes / noramod.json Workshop item Subscribe
audio / sprites → + AssetBundle(s) → (UGC content) → Enable in Mods menu
Bundle name(s) set (same folder) │ Host can require mods
Build AssetBundles └── download ───► Game loads folder
Step by step:
- Create a new Unity project with the URP template (Hub → 3D (URP) / Universal 3D). There is no official game project to download.
- Confirm Project Settings → Graphics uses a URP Asset (see §1).
- Build your map / clips / sprites / prefabs in that project.
- Assign AssetBundle names in the Inspector (bottom of each asset).
- Build bundles for StandaloneWindows64.
- Create a folder on disk, e.g.
MyNoraMod/. - Copy the built bundle file(s) into that folder.
- Write
noramod.jsonnext to them. - Upload the folder from the in-game Mods → UPLOAD menu.
- Subscribe in Steam, enable the mod in the game’s Mods menu, play.
3. Prerequisites (short glossary)
| Term | Meaning |
|---|---|
| Scene | A Unity level. Maps are scenes. |
| AssetBundle | A packed archive of Unity assets the game can load without your project. |
| Scene bundle | Bundle that contains your map scene (and usually its meshes/materials). |
| Content bundle | Second bundle for loose AudioClips, Sprites, Meshes, cosmetic Prefabs. Unity often cannot put these in the same file as a scene. |
| Manifest | noramod.json — tells the game what to register. |
| Asset name | The name Unity shows in the Project window (usually the file name without path). Used in iconAssetName, prefabAssetName, clipAssetName, etc. |
| Required mods | Workshop IDs the lobby host pins; every client must install them. |
4. Mod folder layout
A Workshop item is a folder, not a Unity project:
MyNoraMod/
noramod.json ← required, always at the folder root
mymap ← scene AssetBundle (file name = "bundleName")
mymap_content ← optional content AssetBundle (file name = "contentBundleName")
Rules:
noramod.jsonmust be in the root of the uploaded folder (not in a subfolder).bundleName/contentBundleNameare file names only (no paths).contentBundleNameand{bundleName}_contentare optional hints. The game reads every AssetBundle in the mod folder (including subfolders), whatever the file is called.- Prefer ASCII IDs without commas or spaces (
warehouse_night,mod_team_rush). - JSON-only mods (balance / modes / perks without icons) can omit bundles. As soon as you ship a scene, mesh, sprite, clip, or cosmetic prefab, you need a bundle.
Why two bundles?
Unity’s AssetBundle pipeline typically cannot put a scene and loose AudioClip / Sprite / Prefab assets into one named bundle cleanly. Map geometry → scene bundle. Icons, audio, perk meshes, cosmetic prefabs → content bundle.
5. Manifest: noramod.json
The game reads this file as JSON:
- Field names are case-sensitive.
- Use the object/array shapes below.
- Numbers and booleans must be valid JSON.
- Strings use double quotes. No trailing commas.
5.1 Full example (all systems)
{
"additiveScene": "",
"bundleName": "mymap",
"contentBundleName": "mymap_content",
"maps": [
{
"sceneName": "Warehouse_Night",
"displayName": "Warehouse Night",
"hasDoors": false,
"hasFlickeringLights": false,
"supportsBlindMode": true
}
],
"gameConfigOverrides": [
{ "field": "roundDuration", "value": "240" },
{ "field": "chainMaxLength", "value": "6" },
{ "field": "survivorSprintSpeed", "value": "6.8" }
],
"perks": [
{
"perkId": "mod_superspeed",
"displayName": "Super Speed",
"effectType": "SpeedBoost",
"targetTeam": "Survivor",
"consumeType": "Immediate",
"duration": 6.0,
"speedMultiplier": 1.6,
"iconAssetName": "superspeed_icon",
"meshAssetName": "superspeed_mesh"
}
],
"gameModes": [
{
"modeId": "short_rounds",
"displayName": "Short Rounds",
"useBlindLighting": false,
"useFlashlights": false,
"blackoutIntervalSeconds": 0,
"blackoutDurationSeconds": 0
}
],
"audioHotkeys": [
{ "key": "R", "clipAssetName": "mymod_stinger", "volume": 1 }
],
"cosmetics": [
{
"itemId": "back_poster",
"displayName": "Poster",
"description": "Example mod cosmetic",
"type": "Back",
"requiredLevel": 0,
"requiredXP": 0,
"iconAssetName": "poster_icon",
"prefabAssetName": "poster_prefab",
"sortOrder": 10
}
]
}
5.2 Top-level fields
| Field | Type | Meaning |
|---|---|---|
bundleName | string | Scene AssetBundle file name in the mod folder. Empty if you have no scene. |
contentBundleName | string | Content AssetBundle file name (audio, sprites, prefabs, perk meshes). Optional; default lookup {bundleName}_content. |
additiveScene | string | Optional scene loaded additively when the mod loads. Most map mods leave this empty and rely on maps + round start. |
maps | array | Registers maps in the lobby Map list. |
gameConfigOverrides | array | Runtime balance overrides for everyone who loaded the mod. |
perks | array | Data-driven perks added to the match perk pool. |
gameModes | array | Custom modes in the lobby Gamemode list. |
audioHotkeys | array | Local key → play a clip from your bundle. |
cosmetics | array | Items shown in Customization. |
5.3 maps[]
| Field | Type | Meaning |
|---|---|---|
sceneName | string | Exact Unity scene asset name inside the scene bundle. Also used as the lobby label today. |
displayName | string | Friendly name for docs / future UI. Always set it. |
hasDoors | bool | Always false for Workshop maps. Stock doors need game components you do not have. true does not create working doors — use static geometry. |
hasFlickeringLights | bool | Flickering-light presentation flag. Leave false unless you know you need that path. |
supportsBlindMode | bool | You tested the layout under dark Blind-like lighting. |
5.4 gameConfigOverrides[]
| Field | Type | Meaning |
|---|---|---|
field | string | Exact setting name from the list in §9 (spelling matters). |
value | string | Text converted to float, int, or bool. |
5.5 perks[]
| Field | Type | Meaning |
|---|---|---|
perkId | string | Unique ID. No commas. Keep stable after publish. |
displayName | string | Label players see. |
effectType | string | See §8. |
targetTeam | string | Survivor, Hunter, or Both. Any and All mean both teams. |
consumeType | string | Both kinds go into the hotbar when picked up. Immediate clears the slot after use. Held locks the slot for duration seconds after use. |
duration | number | Effect length in seconds. |
speedMultiplier | number | SpeedBoost only. Default 1.3 if missing or ≤ 0. |
iconAssetName | string | Optional Sprite asset name in the content bundle. |
meshAssetName | string | Optional Mesh asset name for the 3D world pickup. |
5.6 gameModes[]
| Field | Type | Meaning |
|---|---|---|
modeId | string | Unique ID stored in the lobby (also the current dropdown label — keep it readable). |
displayName | string | Friendly name. |
useBlindLighting | bool | Dark map lighting like Blind. |
useFlashlights | bool | Players get flashlights. |
blackoutIntervalSeconds | number | Seconds of normal light before lamps cut out. 0 = no cycle. |
blackoutDurationSeconds | number | Seconds of darkness (flashlights still work). |
5.7 audioHotkeys[]
| Field | Type | Meaning |
|---|---|---|
key | string | Input System key name (R, F, Space, …). |
clipAssetName | string | AudioClip asset name in your content (or scene) bundle. |
volume | number | Optional. Omit or 0 → game uses 1. |
5.8 cosmetics[]
| Field | Type | Meaning |
|---|---|---|
itemId | string | Unique ID for saves / unlocks. No commas. |
displayName | string | Label in Customization. |
description | string | Optional text. |
type | string | Head, Face, Body, or Back. |
requiredLevel | number | 0 = no level gate. |
requiredXP | number | 0 = no XP gate. Both 0 = always unlocked. |
iconAssetName | string | Sprite asset name in the content bundle. |
prefabAssetName | string | Prefab asset name in the content bundle (required to equip visually). |
sortOrder | number | Lower = earlier in the grid (after the unequip slot). |
6. Building AssetBundles in your own project
Ordinary Unity AssetBundle work. Nothing here is game-specific except Windows standalone + URP.
6.1 Assign bundle names
- Select each asset that must ship.
- Inspector bottom → AssetBundle → New…
- Example:
- Scene (+ map meshes/materials) → bundle name
mymap - Audio, sprites, perk mesh, cosmetic prefab → bundle name
mymap_content
- Scene (+ map meshes/materials) → bundle name
6.2 Build
Paste into Assets/Editor/BuildModBundles.cs in your project:
using UnityEditor;
using System.IO;
public static class BuildModBundles
{
[MenuItem("Assets/Build Mod AssetBundles")]
static void Build()
{
const string output = "ModBuilds";
if (!Directory.Exists(output))
Directory.CreateDirectory(output);
BuildPipeline.BuildAssetBundles(
output,
BuildAssetBundleOptions.None,
BuildTarget.StandaloneWindows64);
}
}
Menu: Assets → Build Mod AssetBundles.
Copy from ModBuilds/ into your Workshop folder:
mymap(and optionallymymap.manifest— not required by the game)mymap_content
Do not upload your Unity Assets/, Library/, or .meta folders. Only the built bundle files + noramod.json.
7. Custom maps
7.1 Where players see it
Lobby (host) → Map dropdown. Your map is appended after built-in maps (Prison, Office, Random Map). It never replaces them.
7.2 Spawn markers (required)
In your blank Unity scene, create empty GameObjects with these exact names:
| Object name | Role |
|---|---|
SurvivorSpawn_1 | Survivor spawn |
SurvivorSpawn_2 | Second survivor spawn (recommended) |
SurvivorSpawn_3 | Optional |
SurvivorSpawn_4 | Optional |
HunterSpawn | Hunter spawn |
SurvivorPerkSpawn / SurvivorPerkSpawn_1 … | Survivor perk pickup |
HunterPerkSpawn / HunterPerkSpawn_1 … | Hunter perk pickup |
PerkSpawner / PerkSpawner_1 … | Perk pickup for either team |
Perk pickup spots (do this if you want to choose where a perk sits)
You do not attach a script. An empty object with the right name is enough.
- Open your map scene.
- In the Hierarchy, right-click → Create Empty.
- Select it. At the top of the Inspector, set the name. Capital letters matter.
survivorperkspawn_1is ignored.SurvivorPerkSpawn_1works. - Leave it empty. Under the name you should only see Transform. Do not click Add Component.
- Move it onto the floor where the pickup should appear. Nudge it up about 5 cm so it is not stuck inside the floor.
- Save the scene, then build the scene bundle again. An already uploaded map file does not contain empties you add later.
| Exact name | What appears there |
|---|---|
SurvivorPerkSpawn_1 | Survivor perks only. Add _2, _3, … for more spots. SurvivorPerkSpawn with no number also works. |
HunterPerkSpawn_1 | Hunter perks only. Same numbering. |
PerkSpawner_1 | Any perk. Who may pick it up is still decided by that perk’s targetTeam. |
Do not put a space or (1) in the name. SurvivorPerkSpawn_1 (1) is ignored.
If your map has none of these names, the game invents two spots: one 4 m in front of SurvivorSpawn_1, and one 4 m in front of HunterSpawn. Those can end up in a wall. Place your own empties when you care about the position.
Prison and Office already have perk spots. Your perk is mixed into those as well. The empties above are only for your map.
You do not attach game scripts. The game finds these objects by name at round start.
Placement rules (follow these literally):
- Put each marker on a walkable floor.
- Raise the empty’s pivot about 5 cm above the floor surface so players do not spawn stuck inside the mesh.
- Object rotation = facing direction at round start.
- Leave clearance for player capsules (radius roughly 0.35 m).
- Keep human scale: door / ceiling height about 2 m. Wrong FBX import scale is the #1 beginner bug.
7.3 Geometry and collision
- Floors and walls need real colliders.
- Survivors are chained. Default max chain length is
chainMaxLength= 4 m. Corridors and doorways should be wider than 4 m (aim for ~5 m+) so the chain does not constantly yank people when they walk abreast. - Prefer simple collision; fancy mesh colliders that trap capsules feel broken, not hard.
7.4 Lighting / URP
Author materials for URP (see §1). Pink materials almost always mean the project is still on the Built-in pipeline or materials were never converted to URP/Lit.
Remove extra cameras from the map scene when possible.
Set hasDoors to false. You cannot ship working stock doors without the game’s door components — static archways / openings only.
7.5 Register the map
{
"bundleName": "mymap",
"maps": [
{
"sceneName": "Warehouse_Night",
"displayName": "Warehouse Night",
"hasDoors": false,
"hasFlickeringLights": false,
"supportsBlindMode": true
}
]
}
sceneName must equal the Unity scene asset name inside the scene bundle.
Reserved names (do not use): Prison, Office, Random Map. Bundles that contain a reserved scene name are rejected and unloaded.
7.6 What not to put in a map scene
- Game player prefabs, NetworkManager, or HUD
- Pirated meshes from the base game
- Editor-only lighting setups that never appear in a Windows player build
8. Perks
You do not write code for a perk. You add one block to noramod.json. The game already knows the effects in the table below. You only pick one and fill in the numbers.
8.1 Where players see it
During a round a glowing pickup sits on the ground.
- The player walks into it.
- It moves into the hotbar (the three slots).
- They use it with the perk button. Default is the right mouse button.
A perk for Survivors is invisible to the Hunter. A perk for the Hunter is invisible to Survivors. If you test as the wrong role, it looks like the perk did not load. That is normal. Use targetTeam Both when everyone should see it.
Each of your perks shows up at least once per round on a spot for its team. It can also show up again later when that spot refreshes (about every 20 seconds).
On Prison and Office it uses the perk spots already in those maps. On your map it uses the empties from §7.2. If you placed none, it uses the two automatic spots in front of the player spawns.
No icon and no mesh is allowed. Players still see a pickup. The icon is a gold square until you supply a real sprite.
8.2 Who the perk is for (targetTeam)
Write exactly one of these words. Capitalization does not matter. both and Both both work.
targetTeam | Who sees it and can pick it up | Where it may spawn |
|---|---|---|
Survivor | Survivors only | Survivor spots (SurvivorPerkSpawn_1, and the survivor spots on Prison / Office) |
Hunter | Hunter only | Hunter spots |
Both | Survivors and the Hunter | Survivor spots and hunter spots |
Any and All mean the same thing as Both.
If you leave targetTeam out, or you misspell it, the perk is for Survivors only.
8.3 What the perk does (effectType)
Copy one name from this list. You cannot invent a new one. SuperJump does nothing useful; the game treats an unknown name as SpeedBoost.
effectType | Sensible team | What the player gets |
|---|---|---|
SpeedBoost | Survivor | Temporary sprint boost. Set speedMultiplier (1.3 is a small boost, 1.8 is strong). |
HunterBlind | Survivor | Temporarily blinds hunters. |
Fear | Hunter | Nearby living survivors scream, which shows where they are. |
Silence | Hunter | Hides the hunter’s step and heartbeat feedback. |
Block | Survivor, Hunter, or Both | For duration seconds, incoming perk effects are ignored. |
Revive | Survivor | Revives a downed teammate. |
duration is seconds. A strong speedMultiplier should use a short duration (about 3–6 seconds), or the perk is unfair.
8.4 After they use it (consumeType)
Both values go into the hotbar first. The difference is what happens after the player uses the perk.
consumeType | After use |
|---|---|
Immediate | The hotbar slot becomes empty. |
Held | The slot locks for duration seconds, then becomes empty. |
8.5 Copy-paste examples
Survivor perk. Only survivors see it.
"perks": [
{
"perkId": "mod_gold_rush",
"displayName": "Gold Rush",
"effectType": "SpeedBoost",
"targetTeam": "Survivor",
"consumeType": "Immediate",
"duration": 5.0,
"speedMultiplier": 1.8,
"iconAssetName": "gold_icon",
"meshAssetName": ""
}
]
Same idea, but both roles can see and pick it up:
"targetTeam": "Both"
Rules for the other fields:
perkIdis the internal name. No spaces, no commas. Never change it after you publish.displayNameis the text players see.iconAssetNameis the Project window name of a Sprite in the content bundle. Leave it""if you have no icon.meshAssetNameis the same idea for a 3D mesh. Leave it""to keep the default pickup shape.- The icon name and the mesh name must not be the same word if both point at one file.
8.6 How to check that it worked
- Enable the mod and start a round.
- Play the role from
targetTeam. ForBoth, either role is fine. - Look at a perk spot for that role. Your
displayNameshould be one of the pickups. On a stock map it is mixed with the normal perks, but yours appears at least once. - Walk into it. It should land in the hotbar. Right-click to use it.
9. Balance overrides (gameConfigOverrides)
9.1 Where players feel it
As soon as the mod loads, the matching round settings are overwritten for that session. They do not edit files on disk. Every peer who loaded the mod should get the same overrides.
9.2 How to write them
"gameConfigOverrides": [
{ "field": "roundDuration", "value": "120" },
{ "field": "chainMaxLength", "value": "5" },
{ "field": "survivorSprintSpeed", "value": "6.8" }
]
field= exact setting name from the list below.value= string form of afloat,int, orbool("true"/"false").- Unknown names are skipped (warning in the player log).
- If two mods override the same field, last loaded wins.
9.3 Useful fields (beginner-safe)
| Field | Typical meaning |
|---|---|
roundDuration | Round length in seconds |
roundStartCountdown | Countdown before the round |
survivorWalkSpeed / survivorSprintSpeed | Survivor movement |
hunterWalkSpeed / hunterSprintSpeed / hunterSneakSpeed | Hunter movement |
chainMaxLength | Max chain distance between linked survivors (meters) |
captureRange | Hunter capture reach |
hunterKillRange | Hunter kill reach |
sprintStaminaMaxDuration | How long sprint lasts |
adrenalinDuration / adrenalinSprintMultiplier | Adrenalin perk feel |
hunterBlindDuration | Blind perk duration |
fearScreamRadius | Fear perk radius |
perkBlockDuration | Block perk duration |
voiceMaxDistance | Voice chat distance |
blindVisibilityDistance | How far you see in Blind lighting |
flashlightRange / flashlightIntensity | Flashlight feel |
There are many more fields (camera, ragdoll, soul-binder polish, …). Prefer the list above unless you know what you are changing. Wrong camera values make the game feel broken rather than “balanced.”
10. Custom game modes
10.1 Where players see it
Lobby (host) → Gamemode dropdown. Your mode is appended after built-ins (CLASSIC, RANDOM, BLIND). It never replaces them.
10.2 Built-in IDs you must not reuse
Classic, Random, Blind, Custom, Standard.
10.3 What the mode flags do
| Flag | Effect |
|---|---|
useBlindLighting | Dark Blind-style lighting |
useFlashlights | Players get flashlights |
blackoutIntervalSeconds | Light period before a blackout pulse (0 = off) |
blackoutDurationSeconds | Darkness length during the pulse |
Timers / speeds still come from gameConfigOverrides (e.g. short roundDuration).
Example blackout mode:
"gameModes": [
{
"modeId": "Blackout",
"displayName": "Blackout",
"useBlindLighting": false,
"useFlashlights": true,
"blackoutIntervalSeconds": 20,
"blackoutDurationSeconds": 20
}
]
11. Audio
Declare audioHotkeys in JSON. The game plays the clip locally for the player who presses that key.
"audioHotkeys": [
{ "key": "R", "clipAssetName": "mymod_stinger", "volume": 1 }
]
Put mymod_stinger (the AudioClip) in the content bundle. Prefix names to avoid collisions (mymod_…).
12. Cosmetics
12.1 Where players see it
Main menu → Customization.
type | Body slot |
|---|---|
Head | Top of the head (hats, horns, …) |
Face | Front of the face (glasses, masks, …) |
Body | Chest / torso front |
Back | Upper back (backpacks, posters, …) |
requiredLevel / requiredXP both 0 → unlocked immediately.
Where it shows: every mod cosmetic is listed in Customization → Mods, not mixed into the stock Head / Face / Body / Back tabs. type still chooses the attach point on the body. The Mods grid scrolls, so a pack can contain more than one item.
12.2 How to declare it
Declare the item in cosmetics[]. Put a Sprite icon and a Prefab in the content bundle. Give them different Unity asset names — never reuse one name for both, or the icon or prefab will silently fail to resolve.
"cosmetics": [
{
"itemId": "back_poster",
"displayName": "Poster",
"description": "Optional text",
"type": "Back",
"requiredLevel": 0,
"requiredXP": 0,
"iconAssetName": "poster_icon",
"prefabAssetName": "poster_prefab",
"sortOrder": 10
}
]
Without a working prefab, the item may appear but cannot equip visually.
12.3 How placement works (critical)
The game attaches your prefab to a fixed anchor on the player. Your prefab root’s local position, rotation, and scale are offsets from that anchor. Put the pivot at the attach point, not out in world space. One item per type: a second Head replaces the first.
Approximate anchor positions on a human-scale player (meters, facing +Z, up +Y):
| Anchor | Approx. local position | Notes |
|---|---|---|
| Head | (0, 1.7, 0) | Crown of the head |
| Face | (0, 1.55, 0.12) | Slightly in front of the face |
| Body | (0, 1.1, 0) | Chest height |
| Back | (0, 1.2, -0.2) | Upper back (−Z) |
Practical recipe
- Create a root GameObject named like your asset (
mymod_hat). - Put the mesh as child (or on the root).
- Keep the root near
(0,0,0)local; nudge with small offsets on a ~1.8 m tall capsule. - Back items often need 180° Y rotation so a quad faces outward (example: local ≈
(0, 0.05, -0.06), scale ≈0.5, Y rot 180°). - Leave colliders off unless you intentionally want physics (stock cosmetics are visual-only).
12.4 First-person
Head and Face cosmetics become shadows-only in first-person so they do not cover the camera. Body and Back stay visible.
13. Uploading and enabling
13.1 Upload
- Main menu → Mods
- UPLOAD
- Title, description, optional change note + preview image
- Select the mod content folder (
noramod.jsonat root) - Optional: UPDATE EXISTING ITEM + the existing Workshop item ID
- UPLOAD TO STEAM
- Accept the Workshop legal agreement if prompted
13.2 Play with the mod
- Subscribe on Steam and wait until the item is installed.
- In-game Mods menu: enable the item (reload happens automatically).
- Host a lobby. The host's enabled mods are required for everyone in that lobby.
- Guests keep only those host mods while they are in the lobby. Their own other mods turn off until they leave, then the previous selection comes back.
- Check lobby dropdowns / Customization / round behaviour.
If a required mod fails to install or load, join fails. Everyone must run the same Workshop revision.
14. How the game loads your mod (runtime)
- Enabled / required Workshop IDs are collected.
- For each ID, Steam provides the install directory.
- The game reads
noramod.jsonfrom that directory. - It loads every AssetBundle in the mod folder. The scene bundle is used for the map. Every other bundle is searched for cosmetics, icons, prefabs, audio, and perk meshes.
contentBundleNameis only a hint. - It registers maps, cosmetics, perks, modes, audio hotkeys, and config overrides.
- When a round starts, the selected map
sceneNameis loaded like a stock map. - Customization and lobby UI refresh so new entries appear.
15. Testing checklist
In your Unity project
- Scene name matches
maps[].sceneName - Scene assigned to the scene AssetBundle
- Icons / audio / prefabs / perk meshes assigned to the content AssetBundle
- Windows standalone bundles build without missing refs
- Spawn empties
SurvivorSpawn_1… andHunterSpawnexist, pivots ~5 cm above floor - Perk empties, if you want to choose the spot: exact names
SurvivorPerkSpawn_1,HunterPerkSpawn_1, orPerkSpawner_1(capitals, no space). Empty object, Transform only, pivot ~5 cm above the floor. Rebuild the scene bundle after adding them. - Corridors ≥ ~5 m wide (default chain length is 4 m)
- Materials are URP (Graphics SRP asset assigned)
- Cosmetic icon and prefab use different asset names
hasDoorsisfalse
Folder / Steam / in-game
- Folder root has
noramod.json+ bundle file(s) - Host and client subscribed / updated to the same revision
- Mod enabled in the Mods menu
- Map appears under lobby Map (after Prison / Office / Random Map)
- Mode appears under lobby Gamemode (after CLASSIC / RANDOM / BLIND)
- Cosmetic appears under Customization → Mods
- Perk spawns / can be picked up
- Hotkey plays the clip
- Config overrides match expectations
Logs
Windows player log:
%USERPROFILE%\AppData\LocalLow\GiantNetwork Studios\NORA\Player.log
Example: C:\Users\YourName\AppData\LocalLow\GiantNetwork Studios\NORA\Player.log
Search that file for scene load errors and lines about your mod.
16. Multiplayer fairness
The host simulates capture, timer, win/loss, chain state, and perk execution.
- Required mods must load on every peer.
- Do not design “client-only” cheats; they are not authoritative.
- Desync after an update usually means one player is on an old Workshop build — resubscribe / verify.
17. Versioning
- Treat
perkId,itemId,modeId, andsceneNameas permanent once published. - Note your minimum game version on the Workshop page.
- Prefer additive updates over renames.
- Conflicting
gameConfigOverridesacross mods: last loaded wins — document incompatibilities.
18. Minimal recipes
Map only
- Own Unity project → scene + named spawn empties → URP materials.
- Assign scene AssetBundle → build Windows bundle.
- Folder:
noramod.json+ bundle file. - Upload → enable → select map in lobby.
Balance / mode only
{
"bundleName": "",
"gameModes": [
{
"modeId": "blitz",
"displayName": "Blitz",
"useBlindLighting": false,
"useFlashlights": false,
"blackoutIntervalSeconds": 0,
"blackoutDurationSeconds": 0
}
],
"gameConfigOverrides": [
{ "field": "roundDuration", "value": "90" }
]
}
Perk pack
perks in JSON + optional sprites/meshes in a content bundle.
Cosmetic pack
cosmetics in JSON + icon Sprite + Prefab in a content bundle. Players open Customization → Mods. type is only the body slot (Head / Face / Body / Back).
Audio hotkey pack
AudioClips in a content bundle + audioHotkeys in JSON.
19. Troubleshooting
| Symptom | Likely cause |
|---|---|
| Join fails on mods | Not subscribed; download incomplete; required-mod mismatch |
| Bundle warning / assets empty | Wrong bundleName / contentBundleName; file not in folder root; Unity Editor version ≠ 6000.5.1f1 |
| Map listed but will not load | Scene not in scene bundle; sceneName mismatch |
| Players fall / stuck at start | Missing SurvivorSpawn_* / HunterSpawn; spawn pivot inside the floor (raise ~5 cm) |
| Chain constantly pulls in corridors | Corridor narrower than 4 m (chainMaxLength); widen to ~5 m+ |
| Pink materials | Project not on URP / materials not URP-Lit (see §1) |
| Override ignored | Typo in field name; unsupported type (Color / Vector3) |
| Perk icon is a plain gold square | iconAssetName is empty, misspelled, or the sprite is not in the content bundle. The perk still works. |
| I never see my perk | You are the wrong role. A Survivor perk is invisible to the Hunter, and the other way around. Use targetTeam Both, or join as the matching role. Also check the empty’s name: capitals must match, no space. |
| Perk sits in a wall or in front of spawn | The map has no SurvivorPerkSpawn_* / HunterPerkSpawn_* empties, so the game placed one 4 m in front of the player spawn. Add the empties and rebuild the scene bundle. |
| Mode / map overwrote a stock entry visually | Should not happen — report if stock labels vanish; mods must use unique IDs / scene names |
| Cosmetic not listed | Missing cosmetics[]; mod not enabled; look under Customization → Mods, not the stock tabs |
| Cosmetic icon or prefab missing | iconAssetName and prefabAssetName set to the same asset name; use two distinct names |
| Cosmetic listed but will not equip | Missing / broken prefab; prefabAssetName wrong; prefab not in content bundle |
Doors do nothing with hasDoors: true | Expected — Workshop maps cannot use stock door components; keep hasDoors: false |
| Hotkey silent | Clip not in a loaded bundle; clipAssetName mismatch; wrong key name |
| Two bundles, assets “missing” | Assets assigned to the wrong AssetBundle name before build |
| Cannot find log lines | Wrong log path — use %USERPROFILE%\AppData\LocalLow\GiantNetwork Studios\NORA\Player.log |
20. Design notes
- Chained survivors need space; cruelty via corridor width is not difficulty.
- Strong perk multipliers need short durations.
- Blind-style modes on landmark-free maps frustrate quickly.
- Say clearly on the Workshop page what you change and what you conflict with.
21. Summary
No One Runs Alone mods follow the usual Unity pattern:
your project → AssetBundles (scene + optional content) → noramod.json → Steam Workshop folder → game runtime loader.
There is no official second Unity project to download. Keep proprietary game content out of your packs. Prefer named spawn empties, data-driven perks / cosmetics / modes, config overrides, and audio hotkeys for the widest compatibility.
Public guide for Workshop mods: noramod.json, AssetBundles, named map spawns, config overrides, perks, custom modes, cosmetics, and audio hotkeys.