Weapons

Weapons are data assets. Building one is authoring data, not writing code — and the same weapon works on the player, an enemy or a boss.

🧩Data-driven
⏱️12 min read
🎯Mounts, levels, patterns
🔫Projectiles & beams

The three pieces

Every weapon in ShmupKit is assembled from three layers. Knowing which layer owns which setting is the single most useful thing to learn here — it answers most "why isn't this working" questions.

LayerWhat it isOwns
Weapon Component A gun position on a pawn Where it sits on the hull, which team it shoots for, which button fires it
Weapon Data The weapon itself, as an asset Display name, what it costs to fire, and its list of power levels
Weapon Level One power tier, as an asset Fire rate, projectile count, spread, sound, fire points, the visible gun
One weapon component is one gun position. A ship with a left and a right sidekick has two weapon components, not one component firing twice. This is why a weapon has exactly one gun mesh but any number of fire points — the cannon is the object, the fire points are the places shots leave it.
Damage is not on the weapon. A projectile's damage, speed and lifespan live on the projectile Blueprint; a beam's damage lives on the beam class. Weapon levels decide how many shots go out and in what shape, never how hard they hit.

Mounts

Every pawn has a Front mount. The player pawn adds Left, Right and Rear. Select one in the Components panel to configure it.

PropertyPurpose
Weapon DataThe weapon fitted here, and the only source of firing behaviour. A mount with none logs a one-off warning and stays silent.
Mount SlotWhich hardpoint this is — Front, Left, Right or Rear. Drives pickup targeting and upgrade banking.
Mount OffsetWhere the gun sits on the hull, relative to the pawn. This is the ship's hardpoint, so it stays on the component rather than the weapon.
Fire DirectionWhich way it shoots, in owner space. The rear mount ships as (-1, 0, 0).
FactionPlayer, Enemy or Neutral. Shots pass straight through anything on the same faction — no block, no impact effect, no damage. Neutral hits everyone.
Fire TriggerWhich button fires this mount. See below.
Inherit Owner VelocityAdds the ship's forward speed to the shot so bullets don't appear to crawl when you're flying into them. On by default.
Fire ComponentOptional. Fire from a named component (a turret head) instead of the mount offset, so shots follow whatever that component is doing.

Fire Trigger

Leave this on Derive unless you need something specific. Derive follows the convention players already expect from the genre:

  • Front and rear mounts fire on the main button.
  • A side mount fires on the main button while its weapon is free.
  • A side mount whose weapon costs energy or ammo gets its own button, because spending should be a decision.

A free side weapon answers both the main button and its own — it fires with everything else, and can still be let off alone. Because routing is driven by which buttons are currently held rather than by press and release events, letting go of one button while the other is still down does not interrupt fire.

OptionBehaviour
DeriveWork it out from the mount slot and the weapon's cost, as described above. The default.
PrimaryAlways the main fire button, whatever the mount or cost.
Manual LeftIts own button — middle mouse by default.
Manual RightIts own button — right mouse by default.
AutoFires by itself with no input. What enemies use.

Weapon Data

The weapon asset. Create it with right-click → Miscellaneous → Data Asset → SKWeaponData.

PropertyPurpose
Display NameShown in UI and on the weapon select screen.
LevelsThe power tiers in order, weakest first. Index 0 is the base weapon; a single entry means a weapon that never upgrades.
Auto FireFires by itself while equipped, no trigger needed — for auto secondaries like a missile pack. Enemies auto-fire regardless, having no trigger.
Cost TypeFree, Energy or Ammo.

Cost

Free weapons always fire.

Energy weapons drain the pawn's energy generator by Energy Per Volley. If the pawn has no energy component, energy weapons simply fire for free — the system strips out cleanly, so you can ship without one.

Ammo weapons carry their own supply, independent of any other mount:

PropertyPurpose
Max AmmoCapacity. Refilled to full whenever the weapon is equipped.
Ammo Per VolleySpent per shot.
Ammo Refill RateAmmo regained per second, trickled continuously. 0 means pickups only.

Pickup grants

When a pickup hands the player this weapon, Grant Mode decides how long they keep it. This is about ownership duration — not how long a single trigger press lasts.

ModeBehaviour
PermanentKept until something replaces it.
TimedReverts to the previous weapon after Grant Duration seconds.
Shot CountReverts after Grant Shots shots.
A granted weapon arrives at the run's banked upgrade level, so picking up a new gun never costs you progress. Upgrades are banked per mount slot for the whole run and survive death, so a level-6 pilot's new laser fires at 6 — capped by that weapon's own top level.

Weapon Levels

Each level is its own data asset (SKWeaponLevelData) and holds everything about how the weapon behaves at that tier. A weapon fires at min(banked level, its own top level).

Firing

PropertyDefaultPurpose
Projectile ClassThe projectile Blueprint this level fires. Damage, speed and lifespan live there.
Fire ModeAutomaticAutomatic repeats while held at Fire Rate. Salvo fires one volley per press, then waits for a fresh press.
Fire Rate10Volleys per second while held. Automatic only.
Projectile Count1Projectiles per volley.
Burst Count1Splits one volley into a rattle of sub-volleys.
Burst Delay0.1Seconds between those sub-volleys.
Fire Rate caps fire across separate presses, not just while held, so tapping cannot out-shoot the weapon's stated rate. An early press is deferred rather than dropped — an Automatic weapon latches it and fires the instant the interval elapses.

Shape

Three independent controls that compose freely. Getting the pattern you want is almost always a matter of picking the right one rather than fighting a single setting.

\ | /

Arc Angle

Angular spread, shared across the volley. A fan.

| |

Projectile Spacing

Parallel offset, side by side. A wall of shots.

⁄ | ⁄

Spread Angle

Random scatter per shot, for inaccuracy.

PropertyRangePurpose
Arc Angle0–360Total angular spread, divided across the volley's projectiles.
Projectile Spacing0+Parallel gap between shots, independent of any angle. Needs Projectile Count above 1.
Spread Angle0–180Random inaccuracy applied per shot.

Arc and spacing combine into a fan that starts wide. Spacing is also how a single floating cannon puts one shot down each side of itself — you want one fire point with Projectile Count 2 and a spacing value, not two fire points, because with two the gun mesh would sit directly on top of one of the shots.

Fire Points

A level can define any number of fire points. Each is a position with its own angle. Leave the list empty to fire from the mount position itself.

PropertyPurpose
OffsetWhere this point sits, relative to the mount.
Angle OffsetThis one point's own firing direction, measured from centre. Range −180 to 180.
Alternate Fire PointsOff: every shot fires from all points at once (dual and spread guns). On: each shot uses the next point in rotation (missile salvos alternating left and right).
The one that catches everybody: Arc Angle is the total spread shared across a volley, while Angle Offset is one point's own direction. An arc of 45 across two projectiles gives −22.5 and +22.5. Two fire points set to −45 and +45 are 90° apart. To match an arc of A across two points, use ±A/2.

Combining both expresses patterns a plain arc cannot. The classic \ || / is four fire points at −22.5, 0, 0 and +22.5, with the middle pair separated by Projectile Spacing.

The gun

The visible cannon belongs to the weapon, not the ship, so swapping weapons swaps the model on the hull automatically — and a temporary weapon takes its gun with it when it expires. Leave Gun Mesh null if the guns are painted into the ship's own mesh.

PropertyDefaultPurpose
Gun MeshThe cannon model for this level. Beams also emit from it when set.
Gun Mesh Offset0,0,0Where the model sits, in owner space. Independent of the fire points, so the cannon can sit between the shots it throws.
Gun LagOffThe gun eases toward its anchor as the ship moves, for a trailing sway. Shots sway with it, so they keep leaving the visible barrel.
Gun Lag Speed10How fast it catches up. Higher is tighter, with less sway.
Spin Rate0Continuous rotation, for gatling barrels.

Sound

PropertyPurpose
Fire SoundPlayed when the weapon fires. Leave null for a silent weapon. Beam weapons use the beam class's own sound instead.
Fire Sound ModePer Shot for slow and medium guns where each shot reads as distinct. Loop for fast or continuous guns — one looping sound while firing, which avoids machine-gun audio spam. A Loop sound asset must itself be set to loop.
Fire Sound Pitch VariancePer Shot only. Random pitch per shot so rapid fire doesn't hammer one identical sample.
Loop Pitch ReferenceLoop only. The fire rate the loop was recorded at. Set it and the loop pitches up as the weapon's rate increases with level. 0 disables the effect.

Enemy aiming

PropertyPurpose
Aimed At PlayerFire toward the player rather than along Fire Direction.
Aim Offset AngleLead or trail that aim by a fixed angle, −180 to 180. Useful for making an enemy miss deliberately, or for firing a spread either side of the player.

Cost overrides

A level can override the weapon's ammo capacity or energy cost, so a fully upgraded weapon can be made hungrier or given a deeper magazine without a second weapon asset. Tick Override Max Ammo or Override Energy Per Volley and set the value beneath it. Left off, the weapon asset's own figures apply.

Beams

Set Beam Class and the level becomes a beam weapon: firing maintains one continuous laser instead of spawning projectiles, and every projectile, burst and spread setting above is ignored. Damage and length are configured on the beam class itself.

PropertyPurpose
Beam ClassThe beam actor to maintain while firing.
Beam DurationHow long one firing lasts per trigger press — the beam's shot length. 0 keeps it on while fire is held. On an auto-firing weapon, 0 means a permanently on beam and any value above 0 gives back-to-back pulses.

Building a weapon

1

Create the levels

Right-click in the Content Browser → Miscellaneous → Data Asset → SKWeaponLevelData. Make one per power tier. Set the projectile class, fire mode and rate, then shape the volley with projectile count, arc and spacing.

2

Create the weapon

Another Data Asset, this time SKWeaponData. Set the display name and cost type, then add your level assets to Levels in order, weakest first.

3

Fit it to a mount

Select a weapon component on your pawn and set Weapon Data. The mount fires it from the next frame — there is nothing to compile and no Blueprint wiring.

4

Offer it to the player

To make it available on the pre-run select screen, add it to the weapon catalogue referenced in Project Settings → Game → ShmupKit → Weapon Catalog. To drop it in-level instead, reference it from a weapon pickup.

Common fixes

  • Nothing fires — the mount has no Weapon Data, or the weapon has no Levels
  • Shots pass through enemies — the mount's Faction matches theirs
  • Two fire points spread twice as wide as expected — use ±A/2, not ±A
  • A beam deals no damage — Damage Per Second lives on the beam Blueprint, not the weapon
  • The cannon sits on top of a shot — use one fire point with Projectile Spacing instead of two

Where next

Enemies & Spawning

Fit these weapons to enemies and place them in a level.

Read →

Pickups & Drops

Weapon pickups, power-ups and banked upgrade levels.

Read →

Resources

The energy generator, shields and ammo supply.

Read →