Penetratio system
Last updated
Last updated
The S.A.T. Penetration System is a lightweight, easy-to-extend mechanic for ballistic projectiles that uses Physical Materials to define how well surfaces resist penetration. It works out-of-the-box with no need to manually tag surface types in Project Settings.
Ballistic projectiles carry a Penetration
integer.
On every hit, the projectile checks the Physical Material of the surface.
It reads the Penetration Index from a data table (DT_MaterialsIndex
).
The index value is subtracted from the projectile’s current penetration.
If penetration ≥ material index → projectile continues
If penetration < material index → projectile stops and resets to pool
Damage is reduced after each penetration by the Penetration Ratio Variable.
When the projectile is stopped by a material it can’t penetrate, it:
Triggers impact logic
Resets penetration value and damage to original
Returns to pool (if pooling is enabled)
PM_Flesh
Enemy flesh
1
PM_Concrete
Wall surface
3
This means a projectile with penetration value 3:
✅ Can pierce 3 enemies with PM_Flesh
❌ Will stop on the first PM_Concrete
surface
DT_MaterialsIndex
You can add your own materials by:
Creating a new Physical Material in your project.
Assigning that material to a row in the DT_MaterialsIndex
, giving it a penetration index.
Applying the physical material to a mesh's material slot under "Phys Material".
Want armor to block more? Just give it a high index (e.g., 5–10).
Want paper-thin surfaces? Set index to 0.
Want to simulate light cover? Use fractional damage reduction via the Penetration Ratio.
After each penetration, projectile damage is scaled down using a predefined ratio (set on the projectile). For example:
Penetration Ratio = 0.75
Initial damage = 100
After 1st hit = 75
After 2nd hit = 56.25
And so on...
This prevents infinite multi-kills with a single bullet and creates diminishing returns on deep penetrations.
✅ Create new Physical Materials for the surfaces you want.
✅ Add each to DT_MaterialsIndex
with desired index.
✅ Assign Physical Materials to your meshes (Static or Skeletal).
✅ Ensure projectiles hitting those meshes are Ballistic and have Penetration > 0.
✅ Tweak penetration value and penetration ratio per projectile.
Use pooling only for ballistic projectiles, not explosive.
Use clear Physical Material naming (like PM_Wood
, PM_Armor
, PM_Glass
) for organization.
Keep indexes intuitive: lower = easier to pass, higher = stronger resistance.
Always test with debug lines or prints to confirm material is correctly detected!