Core Concepts
Read this once. It explains why the settings are split the way they are.
A projectile is a Mass entity, not an actor
Each projectile is a few dozen bytes of state in the Mass Entity system. There is no actor, component, or Niagara emitter per bullet. Worker threads simulate flight and collision in batches, and the game thread draws everything with a few persistent Niagara systems. That is how 100,000 live rounds fit in a frame budget.
The life of a shot
Blueprint / C++ Mass (worker threads) Game thread (once per frame)
─────────────── ───────────────────── ────────────────────────────
Spawn Projectiles ──► entities ──► Sim processor ┌──► Hits → decals, impact sounds, impulses
(type asset + gravity · drag · wind │ Hits → On Projectile Hit (authority only)
fire event) │ │ Flybys → whiz sounds
Collision processor │ Visualizer → tracers, impact bursts, smoke
swept traces on the │
Projectile channel ────────────────┘
ricochet / penetrate / stop
- You fire. A fire event (origin, direction, count, spread, speed, seed) plus a projectile type asset goes to
Spawn Projectiles. One call can spawn one round or 20,000. - Mass simulates. Each round integrates gravity, quadratic air drag and wind, then sweeps a trace along the path it covered. Distant rounds trace less often, but the sweep covers every skipped frame, so nothing tunnels.
- Surfaces respond. On a blocking hit, the physical surface's response row decides between Stop, Ricochet, or Penetration (enter → travel through the material → exit).
- The game thread reacts. Hits become decals, sounds, physics impulses, and the On Projectile Hit event, which you use for damage. Tracers, impact bursts and smoke go to the visualizer.
Four places to author
Keep each kind of data in its layer. Nothing is duplicated between them.
| Layer | Where | Holds |
|---|---|---|
| Ammo | Projectile type asset EC_Projectile_* (a Mass Entity Config) |
Ballistics, damage, tracer look, flyby audio, per-surface decals/sounds |
| World | Project Settings → Plugins → Mass Projectile Subsystem | Surface physics, budgets, decal/audio limits, networking |
| Visuals | Project Settings → Plugins → Mass Projectile Niagara | The three Niagara systems every type draws with |
| Weapon | Mass Projectile Fire component (or your own Blueprint) | Which type to fire, RPM, muzzle, pellets, spread |
Two distinctions trip people up:
- World Surfaces vs. Projectile Surface FX. World Surfaces (Project Settings) is material physics: how hard metal is, how far wood lets a round through. Surface FX (on the type) is what a given round looks and sounds like when it hits that material.
- Replicated Types is not an ammo list. It is a numbered catalog that lets a fire event name a type in one byte over the network. You never edit ballistics there.
Projectile types are Mass Entity Config assets
A type is a Mass Entity Config data asset with these traits:
| Trait | Required | Controls |
|---|---|---|
| Projectile Ballistics | Yes | Speed, drag, lifetime, trace channel, ricochet/penetration limits, impulses, Base Damage |
| Projectile Visual | No | Tracer colour/size/trail, bullet mesh, smoke trail |
| Projectile Audio | No | Flyby whiz sound and trigger radius |
| Projectile Surface FX | No | Per-surface impact/ricochet/exit decals and sounds, impact burst tint |
Three types ship: Rifle (fast, flat, penetrating), Shell (slow, heavy, heavy smoke), Plasma (bright, energy-style). Duplicate one to make your own. See Projectile Types.
Impact types
Every hit has one of four impact types. You will branch on them for damage.
| Impact type | Meaning | Counts as gameplay damage? |
|---|---|---|
| Stop | The round was absorbed (or buried inside the material) | Yes |
| Ricochet | The round bounced off | No, by default |
| Penetration Enter | The round punched into the surface | Yes |
| Penetration Exit | The round came out the far side | No, by default |
Is Gameplay Damage Impact returns true for Stop and Penetration Enter, so a round passing through one wall damages it once rather than twice.
Authority and cosmetics
| Standalone | Listen server | Dedicated server | Client | |
|---|---|---|---|---|
| Simulation & collision | ✔ | ✔ | ✔ | ✔ (deterministic mirror) |
| On Projectile Hit (damage) | ✔ | ✔ | ✔ | — |
| Physics impulses | ✔ | ✔ | ✔ | Unreplicated bodies only |
| Tracers, decals, sounds | ✔ | ✔ | — | ✔ |
Damage is always server-authoritative. Clients re-simulate the same seeded shots only for visuals. See Multiplayer.