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.

Back to No One Runs Alone

Contents

  • 0. Quick start: pick what you want to make
  • 1. Official stance
  • 2. End-to-end workflow
  • 3. Prerequisites (short glossary)
  • 4. Mod folder layout
  • 5. Manifest: noramod.json
  • 6. Building AssetBundles in your own project
  • 7. Custom maps
  • 8. Perks
  • 9. Balance overrides (gameConfigOverrides)
  • 10. Custom game modes
  • 11. Audio
  • 12. Cosmetics
  • 13. Uploading and enabling
  • 14. How the game loads your mod (runtime)
  • 15. Testing checklist
  • 16. Multiplayer fairness
  • 17. Versioning
  • 18. Minimal recipes
  • 19. Troubleshooting
  • 20. Design notes
  • 21. Summary

0. Quick start: pick what you want to make

I want to…What I need to buildWhere players see it
A new mapUnity scene + spawn empties + scene AssetBundleLobby → Map dropdown
Faster / slower rounds, longer chain, etc.Only noramod.json (gameConfigOverrides)During a match (rules change)
A new perkA 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 modeJSON gameModes (+ optional config overrides)Lobby → Gamemode dropdown
Extra sounds on a keyAudio clips in a content bundle + audioHotkeysIn-game when the player presses that key
A hat / backpack / glassesPrefab + icon in a content bundle + cosmeticsMain menu → Customization → Mods

You can combine several of these in one Workshop item.

1. Official stance

What we provideWhat we do not provide
Runtime loader for Workshop items (noramod.json + AssetBundles)The full game Unity project
This documentation and the manifest schemaPermission to redistribute game assets / scripts
In-game Workshop browse / upload / required-mod syncA downloadable “modder Unity project”

Unity Editor version (required)

AssetBundles load reliably only when your Editor matches the game build.

Game / mod authoring EditorUnity 6000.5.1f1 (Unity 6)
Hub installInstall 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:

  1. Preferred: Unity Hub → New project → template 3D (URP) (or Universal 3D).
  2. 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:

  1. Ability to build Standalone Windows AssetBundles (StandaloneWindows64)
  2. Steam client, so you can upload from the in-game Mods menu
  3. A content folder with noramod.json at 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 effectType list
  • Overriding Color / Vector3 config fields via JSON (only float, 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:

  1. Create a new Unity project with the URP template (Hub → 3D (URP) / Universal 3D). There is no official game project to download.
  2. Confirm Project Settings → Graphics uses a URP Asset (see §1).
  3. Build your map / clips / sprites / prefabs in that project.
  4. Assign AssetBundle names in the Inspector (bottom of each asset).
  5. Build bundles for StandaloneWindows64.
  6. Create a folder on disk, e.g. MyNoraMod/.
  7. Copy the built bundle file(s) into that folder.
  8. Write noramod.json next to them.
  9. Upload the folder from the in-game Mods → UPLOAD menu.
  10. Subscribe in Steam, enable the mod in the game’s Mods menu, play.

3. Prerequisites (short glossary)

TermMeaning
SceneA Unity level. Maps are scenes.
AssetBundleA packed archive of Unity assets the game can load without your project.
Scene bundleBundle that contains your map scene (and usually its meshes/materials).
Content bundleSecond bundle for loose AudioClips, Sprites, Meshes, cosmetic Prefabs. Unity often cannot put these in the same file as a scene.
Manifestnoramod.json — tells the game what to register.
Asset nameThe name Unity shows in the Project window (usually the file name without path). Used in iconAssetName, prefabAssetName, clipAssetName, etc.
Required modsWorkshop 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.json must be in the root of the uploaded folder (not in a subfolder).
  • bundleName / contentBundleName are file names only (no paths).
  • contentBundleName and {bundleName}_content are 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

FieldTypeMeaning
bundleNamestringScene AssetBundle file name in the mod folder. Empty if you have no scene.
contentBundleNamestringContent AssetBundle file name (audio, sprites, prefabs, perk meshes). Optional; default lookup {bundleName}_content.
additiveScenestringOptional scene loaded additively when the mod loads. Most map mods leave this empty and rely on maps + round start.
mapsarrayRegisters maps in the lobby Map list.
gameConfigOverridesarrayRuntime balance overrides for everyone who loaded the mod.
perksarrayData-driven perks added to the match perk pool.
gameModesarrayCustom modes in the lobby Gamemode list.
audioHotkeysarrayLocal key → play a clip from your bundle.
cosmeticsarrayItems shown in Customization.

5.3 maps[]

FieldTypeMeaning
sceneNamestringExact Unity scene asset name inside the scene bundle. Also used as the lobby label today.
displayNamestringFriendly name for docs / future UI. Always set it.
hasDoorsboolAlways false for Workshop maps. Stock doors need game components you do not have. true does not create working doors — use static geometry.
hasFlickeringLightsboolFlickering-light presentation flag. Leave false unless you know you need that path.
supportsBlindModeboolYou tested the layout under dark Blind-like lighting.

5.4 gameConfigOverrides[]

FieldTypeMeaning
fieldstringExact setting name from the list in §9 (spelling matters).
valuestringText converted to float, int, or bool.

5.5 perks[]

FieldTypeMeaning
perkIdstringUnique ID. No commas. Keep stable after publish.
displayNamestringLabel players see.
effectTypestringSee §8.
targetTeamstringSurvivor, Hunter, or Both. Any and All mean both teams.
consumeTypestringBoth kinds go into the hotbar when picked up. Immediate clears the slot after use. Held locks the slot for duration seconds after use.
durationnumberEffect length in seconds.
speedMultipliernumberSpeedBoost only. Default 1.3 if missing or ≤ 0.
iconAssetNamestringOptional Sprite asset name in the content bundle.
meshAssetNamestringOptional Mesh asset name for the 3D world pickup.

5.6 gameModes[]

FieldTypeMeaning
modeIdstringUnique ID stored in the lobby (also the current dropdown label — keep it readable).
displayNamestringFriendly name.
useBlindLightingboolDark map lighting like Blind.
useFlashlightsboolPlayers get flashlights.
blackoutIntervalSecondsnumberSeconds of normal light before lamps cut out. 0 = no cycle.
blackoutDurationSecondsnumberSeconds of darkness (flashlights still work).

5.7 audioHotkeys[]

FieldTypeMeaning
keystringInput System key name (R, F, Space, …).
clipAssetNamestringAudioClip asset name in your content (or scene) bundle.
volumenumberOptional. Omit or 0 → game uses 1.

5.8 cosmetics[]

FieldTypeMeaning
itemIdstringUnique ID for saves / unlocks. No commas.
displayNamestringLabel in Customization.
descriptionstringOptional text.
typestringHead, Face, Body, or Back.
requiredLevelnumber0 = no level gate.
requiredXPnumber0 = no XP gate. Both 0 = always unlocked.
iconAssetNamestringSprite asset name in the content bundle.
prefabAssetNamestringPrefab asset name in the content bundle (required to equip visually).
sortOrdernumberLower = 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

  1. Select each asset that must ship.
  2. Inspector bottom → AssetBundle → New…
  3. Example:
    • Scene (+ map meshes/materials) → bundle name mymap
    • Audio, sprites, perk mesh, cosmetic prefab → bundle name mymap_content

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 optionally mymap.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 nameRole
SurvivorSpawn_1Survivor spawn
SurvivorSpawn_2Second survivor spawn (recommended)
SurvivorSpawn_3Optional
SurvivorSpawn_4Optional
HunterSpawnHunter 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.

  1. Open your map scene.
  2. In the Hierarchy, right-click → Create Empty.
  3. Select it. At the top of the Inspector, set the name. Capital letters matter. survivorperkspawn_1 is ignored. SurvivorPerkSpawn_1 works.
  4. Leave it empty. Under the name you should only see Transform. Do not click Add Component.
  5. Move it onto the floor where the pickup should appear. Nudge it up about 5 cm so it is not stuck inside the floor.
  6. Save the scene, then build the scene bundle again. An already uploaded map file does not contain empties you add later.
Exact nameWhat appears there
SurvivorPerkSpawn_1Survivor perks only. Add _2, _3, … for more spots. SurvivorPerkSpawn with no number also works.
HunterPerkSpawn_1Hunter perks only. Same numbering.
PerkSpawner_1Any 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.

  1. The player walks into it.
  2. It moves into the hotbar (the three slots).
  3. 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.

targetTeamWho sees it and can pick it upWhere it may spawn
SurvivorSurvivors onlySurvivor spots (SurvivorPerkSpawn_1, and the survivor spots on Prison / Office)
HunterHunter onlyHunter spots
BothSurvivors and the HunterSurvivor 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.

effectTypeSensible teamWhat the player gets
SpeedBoostSurvivorTemporary sprint boost. Set speedMultiplier (1.3 is a small boost, 1.8 is strong).
HunterBlindSurvivorTemporarily blinds hunters.
FearHunterNearby living survivors scream, which shows where they are.
SilenceHunterHides the hunter’s step and heartbeat feedback.
BlockSurvivor, Hunter, or BothFor duration seconds, incoming perk effects are ignored.
ReviveSurvivorRevives 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.

consumeTypeAfter use
ImmediateThe hotbar slot becomes empty.
HeldThe 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:

  • perkId is the internal name. No spaces, no commas. Never change it after you publish.
  • displayName is the text players see.
  • iconAssetName is the Project window name of a Sprite in the content bundle. Leave it "" if you have no icon.
  • meshAssetName is 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

  1. Enable the mod and start a round.
  2. Play the role from targetTeam. For Both, either role is fine.
  3. Look at a perk spot for that role. Your displayName should be one of the pickups. On a stock map it is mixed with the normal perks, but yours appears at least once.
  4. 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 a float, int, or bool ("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)

FieldTypical meaning
roundDurationRound length in seconds
roundStartCountdownCountdown before the round
survivorWalkSpeed / survivorSprintSpeedSurvivor movement
hunterWalkSpeed / hunterSprintSpeed / hunterSneakSpeedHunter movement
chainMaxLengthMax chain distance between linked survivors (meters)
captureRangeHunter capture reach
hunterKillRangeHunter kill reach
sprintStaminaMaxDurationHow long sprint lasts
adrenalinDuration / adrenalinSprintMultiplierAdrenalin perk feel
hunterBlindDurationBlind perk duration
fearScreamRadiusFear perk radius
perkBlockDurationBlock perk duration
voiceMaxDistanceVoice chat distance
blindVisibilityDistanceHow far you see in Blind lighting
flashlightRange / flashlightIntensityFlashlight 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

FlagEffect
useBlindLightingDark Blind-style lighting
useFlashlightsPlayers get flashlights
blackoutIntervalSecondsLight period before a blackout pulse (0 = off)
blackoutDurationSecondsDarkness 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.

typeBody slot
HeadTop of the head (hats, horns, …)
FaceFront of the face (glasses, masks, …)
BodyChest / torso front
BackUpper 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):

AnchorApprox. local positionNotes
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

  1. Create a root GameObject named like your asset (mymod_hat).
  2. Put the mesh as child (or on the root).
  3. Keep the root near (0,0,0) local; nudge with small offsets on a ~1.8 m tall capsule.
  4. 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°).
  5. 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

  1. Main menu → Mods
  2. UPLOAD
  3. Title, description, optional change note + preview image
  4. Select the mod content folder (noramod.json at root)
  5. Optional: UPDATE EXISTING ITEM + the existing Workshop item ID
  6. UPLOAD TO STEAM
  7. Accept the Workshop legal agreement if prompted

13.2 Play with the mod

  1. Subscribe on Steam and wait until the item is installed.
  2. In-game Mods menu: enable the item (reload happens automatically).
  3. Host a lobby. The host's enabled mods are required for everyone in that lobby.
  4. 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.
  5. 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)

  1. Enabled / required Workshop IDs are collected.
  2. For each ID, Steam provides the install directory.
  3. The game reads noramod.json from that directory.
  4. 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. contentBundleName is only a hint.
  5. It registers maps, cosmetics, perks, modes, audio hotkeys, and config overrides.
  6. When a round starts, the selected map sceneName is loaded like a stock map.
  7. 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… and HunterSpawn exist, pivots ~5 cm above floor
  • Perk empties, if you want to choose the spot: exact names SurvivorPerkSpawn_1, HunterPerkSpawn_1, or PerkSpawner_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
  • hasDoors is false

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, and sceneName as permanent once published.
  • Note your minimum game version on the Workshop page.
  • Prefer additive updates over renames.
  • Conflicting gameConfigOverrides across mods: last loaded wins — document incompatibilities.

18. Minimal recipes

Map only

  1. Own Unity project → scene + named spawn empties → URP materials.
  2. Assign scene AssetBundle → build Windows bundle.
  3. Folder: noramod.json + bundle file.
  4. 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

SymptomLikely cause
Join fails on modsNot subscribed; download incomplete; required-mod mismatch
Bundle warning / assets emptyWrong bundleName / contentBundleName; file not in folder root; Unity Editor version ≠ 6000.5.1f1
Map listed but will not loadScene not in scene bundle; sceneName mismatch
Players fall / stuck at startMissing SurvivorSpawn_* / HunterSpawn; spawn pivot inside the floor (raise ~5 cm)
Chain constantly pulls in corridorsCorridor narrower than 4 m (chainMaxLength); widen to ~5 m+
Pink materialsProject not on URP / materials not URP-Lit (see §1)
Override ignoredTypo in field name; unsupported type (Color / Vector3)
Perk icon is a plain gold squareiconAssetName is empty, misspelled, or the sprite is not in the content bundle. The perk still works.
I never see my perkYou 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 spawnThe 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 visuallyShould not happen — report if stock labels vanish; mods must use unique IDs / scene names
Cosmetic not listedMissing cosmetics[]; mod not enabled; look under Customization → Mods, not the stock tabs
Cosmetic icon or prefab missingiconAssetName and prefabAssetName set to the same asset name; use two distinct names
Cosmetic listed but will not equipMissing / broken prefab; prefabAssetName wrong; prefab not in content bundle
Doors do nothing with hasDoors: trueExpected — Workshop maps cannot use stock door components; keep hasDoors: false
Hotkey silentClip 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 linesWrong 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.