Marketplace
particle-systems
Creating visual effects using particle systems, physics simulation, and post-processing for polished, dynamic game graphics.
$ Instalar
git clone https://github.com/pluginagentmarketplace/custom-plugin-game-developer /tmp/custom-plugin-game-developer && cp -r /tmp/custom-plugin-game-developer/skills/particle-systems ~/.claude/skills/custom-plugin-game-developer// tip: Run this command in your terminal to install the skill
SKILL.md
name: particle-systems version: "2.0.0" description: | Creating visual effects using particle systems, physics simulation, and post-processing for polished, dynamic game graphics. sasmp_version: "1.3.0" bonded_agent: 03-graphics-rendering bond_type: PRIMARY_BOND
parameters:
- name: effect_type type: string required: false validation: enum: [explosion, fire, smoke, magic, weather, impact]
- name: platform type: string required: false validation: enum: [pc, console, mobile, vr]
retry_policy: enabled: true max_attempts: 3 backoff: exponential
observability: log_events: [start, complete, error] metrics: [particle_count, draw_calls, gpu_time_ms]
Particle Systems
Particle System Architecture
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ PARTICLE LIFECYCLE โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ EMISSION โ
โ โโ Spawn Rate (particles/second) โ
โ โโ Burst (instant spawn count) โ
โ โโ Shape (point, sphere, cone, mesh) โ
โ โ โ
โ SIMULATION โ
โ โโ Velocity (initial + over lifetime) โ
โ โโ Forces (gravity, wind, turbulence) โ
โ โโ Collision (world, depth buffer) โ
โ โโ Noise (procedural movement) โ
โ โ โ
โ RENDERING โ
โ โโ Billboard (camera-facing quads) โ
โ โโ Mesh (3D geometry per particle) โ
โ โโ Trail (ribbon following path) โ
โ โโ GPU Instancing (batched draw) โ
โ โ โ
โ DEATH โ
โ โโ Lifetime expired โ recycle or destroy โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Common Effect Recipes
EXPLOSION EFFECT:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ LAYERS: โ
โ 1. Flash (instant, bright, 0.1s) โ
โ 2. Core fireball (expanding sphere, 0.3s) โ
โ 3. Debris (physics-enabled chunks, 1-2s) โ
โ 4. Smoke (slow rising, fade out, 2-3s) โ
โ 5. Sparks (fast, gravity-affected, 0.5-1s) โ
โ 6. Shockwave (expanding ring, 0.2s) โ
โ โ
โ SETTINGS: โ
โ โข Emission: Burst only (no rate) โ
โ โข Start speed: 5-20 (varies by layer) โ
โ โข Gravity: -9.8 for debris, 0 for smoke โ
โ โข Color: OrangeโRedโBlack over lifetime โ
โ โข Size: Start large, shrink (fireball) or grow (smoke) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
FIRE EFFECT:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ LAYERS: โ
โ 1. Core flame (upward, orange-yellow, looping) โ
โ 2. Ember particles (small, floating up) โ
โ 3. Smoke (dark, rises above flame) โ
โ 4. Light source (flickering point light) โ
โ โ
โ SETTINGS: โ
โ โข Emission: Continuous (50-100/sec) โ
โ โข Velocity: Upward (2-5 units/sec) โ
โ โข Noise: Turbulence for natural movement โ
โ โข Color: WhiteโYellowโOrangeโRed over lifetime โ
โ โข Size: Start small, grow, then shrink โ
โ โข Blend: Additive for glow effect โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
MAGIC SPELL EFFECT:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ LAYERS: โ
โ 1. Core glow (pulsing, bright center) โ
โ 2. Orbiting particles (circle around core) โ
โ 3. Trail particles (follow movement path) โ
โ 4. Impact burst (on hit/destination) โ
โ 5. Residual sparkles (lingering after effect) โ
โ โ
โ SETTINGS: โ
โ โข Emission: Rate + burst on cast/impact โ
โ โข Velocity: Custom curves for orbiting โ
โ โข Trails: Enable for mystical streaks โ
โ โข Color: Themed to element (blue=ice, red=fire) โ
โ โข Blend: Additive for ethereal glow โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Unity Particle System Setup
// โ
Production-Ready: Particle Effect Controller
public class ParticleEffectController : MonoBehaviour
{
[Header("Effect Settings")]
[SerializeField] private ParticleSystem mainEffect;
[SerializeField] private ParticleSystem[] subEffects;
[SerializeField] private AudioSource audioSource;
[SerializeField] private Light effectLight;
[Header("Pooling")]
[SerializeField] private bool usePooling = true;
[SerializeField] private float autoReturnDelay = 3f;
private ParticleSystem.MainModule _mainModule;
private float _originalLightIntensity;
public event Action OnEffectComplete;
private void Awake()
{
_mainModule = mainEffect.main;
if (effectLight != null)
_originalLightIntensity = effectLight.intensity;
}
public void Play(Vector3 position, Quaternion rotation)
{
transform.SetPositionAndRotation(position, rotation);
// Play all particle systems
mainEffect.Play();
foreach (var effect in subEffects)
{
effect.Play();
}
// Play audio
if (audioSource != null)
audioSource.Play();
// Animate light
if (effectLight != null)
StartCoroutine(AnimateLight());
// Auto-return to pool
if (usePooling)
StartCoroutine(ReturnToPoolAfterDelay());
}
public void Stop()
{
mainEffect.Stop(true, ParticleSystemStopBehavior.StopEmitting);
foreach (var effect in subEffects)
{
effect.Stop(true, ParticleSystemStopBehavior.StopEmitting);
}
}
private IEnumerator AnimateLight()
{
effectLight.intensity = _originalLightIntensity;
effectLight.enabled = true;
float duration = _mainModule.duration;
float elapsed = 0f;
while (elapsed < duration)
{
elapsed += Time.deltaTime;
float t = elapsed / duration;
effectLight.intensity = Mathf.Lerp(_originalLightIntensity, 0f, t);
yield return null;
}
effectLight.enabled = false;
}
private IEnumerator ReturnToPoolAfterDelay()
{
yield return new WaitForSeconds(autoReturnDelay);
OnEffectComplete?.Invoke();
// Reset for reuse
Stop();
if (effectLight != null)
{
effectLight.enabled = false;
effectLight.intensity = _originalLightIntensity;
}
}
public void SetColor(Color color)
{
var startColor = _mainModule.startColor;
startColor.color = color;
_mainModule.startColor = startColor;
if (effectLight != null)
effectLight.color = color;
}
public void SetScale(float scale)
{
transform.localScale = Vector3.one * scale;
}
}
GPU Particles (Compute Shader)
// โ
Production-Ready: GPU Particle Compute Shader
#pragma kernel UpdateParticles
struct Particle
{
float3 position;
float3 velocity;
float4 color;
float size;
float lifetime;
float maxLifetime;
};
RWStructuredBuffer<Particle> particles;
float deltaTime;
float3 gravity;
float3 windDirection;
float windStrength;
float turbulenceStrength;
float time;
float noise3D(float3 p)
{
// Simple 3D noise for turbulence
return frac(sin(dot(p, float3(12.9898, 78.233, 45.164))) * 43758.5453);
}
[numthreads(256, 1, 1)]
void UpdateParticles(uint3 id : SV_DispatchThreadID)
{
Particle p = particles[id.x];
if (p.lifetime <= 0)
return;
// Apply forces
float3 acceleration = gravity;
// Wind
acceleration += windDirection * windStrength;
// Turbulence
float3 turbulence = float3(
noise3D(p.position + time) - 0.5,
noise3D(p.position + time + 100) - 0.5,
noise3D(p.position + time + 200) - 0.5
) * turbulenceStrength;
acceleration += turbulence;
// Update velocity and position
p.velocity += acceleration * deltaTime;
p.position += p.velocity * deltaTime;
// Update lifetime
p.lifetime -= deltaTime;
// Fade out
float lifetimeRatio = p.lifetime / p.maxLifetime;
p.color.a = lifetimeRatio;
p.size *= (0.5 + 0.5 * lifetimeRatio);
particles[id.x] = p;
}
Performance Optimization
PARTICLE BUDGET GUIDELINES:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ PLATFORM โ MAX PARTICLES โ MAX DRAW CALLS โ NOTES โ
โโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโผโโโโโโโโโโโค
โ Mobile Low โ 500 โ 5 โ Simple โ
โ Mobile High โ 2,000 โ 10 โ Moderate โ
โ Console โ 50,000 โ 50 โ Complex โ
โ PC Low โ 10,000 โ 20 โ Moderate โ
โ PC High โ 1,000,000+ โ 100+ โ GPU sim โ
โ VR โ 5,000 โ 15 โ 90 FPS! โ
โโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโดโโโโโโโโโโโ
OPTIMIZATION TECHNIQUES:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ REDUCE COUNT: โ
โ โข LOD system (fewer particles at distance) โ
โ โข Cull off-screen emitters โ
โ โข Limit max particles per system โ
โ โ
โ REDUCE OVERDRAW: โ
โ โข Use smaller particle sizes โ
โ โข Reduce transparency layers โ
โ โข Use cutout instead of transparent โ
โ โ
โ BATCH DRAWS: โ
โ โข Share materials between systems โ
โ โข Use texture atlases โ
โ โข Enable GPU instancing โ
โ โ
โ GPU SIMULATION: โ
โ โข Use compute shaders for >10K particles โ
โ โข Move physics to GPU โ
โ โข VFX Graph (Unity) / Niagara (Unreal) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Effect Pooling System
// โ
Production-Ready: VFX Pool Manager
public class VFXPoolManager : MonoBehaviour
{
public static VFXPoolManager Instance { get; private set; }
[System.Serializable]
public class EffectPool
{
public string effectName;
public ParticleEffectController prefab;
public int initialSize = 5;
public int maxSize = 20;
}
[SerializeField] private EffectPool[] effectPools;
private Dictionary<string, Queue<ParticleEffectController>> _pools;
private Dictionary<string, EffectPool> _poolConfigs;
private void Awake()
{
Instance = this;
InitializePools();
}
private void InitializePools()
{
_pools = new Dictionary<string, Queue<ParticleEffectController>>();
_poolConfigs = new Dictionary<string, EffectPool>();
foreach (var pool in effectPools)
{
_pools[pool.effectName] = new Queue<ParticleEffectController>();
_poolConfigs[pool.effectName] = pool;
// Pre-warm pool
for (int i = 0; i < pool.initialSize; i++)
{
var effect = CreateEffect(pool);
_pools[pool.effectName].Enqueue(effect);
}
}
}
private ParticleEffectController CreateEffect(EffectPool pool)
{
var effect = Instantiate(pool.prefab, transform);
effect.gameObject.SetActive(false);
effect.OnEffectComplete += () => ReturnToPool(pool.effectName, effect);
return effect;
}
public ParticleEffectController SpawnEffect(
string effectName,
Vector3 position,
Quaternion rotation)
{
if (!_pools.ContainsKey(effectName))
{
Debug.LogError($"Effect pool '{effectName}' not found!");
return null;
}
var pool = _pools[effectName];
ParticleEffectController effect;
if (pool.Count > 0)
{
effect = pool.Dequeue();
}
else if (_poolConfigs[effectName].maxSize > pool.Count)
{
effect = CreateEffect(_poolConfigs[effectName]);
}
else
{
Debug.LogWarning($"Pool '{effectName}' exhausted!");
return null;
}
effect.gameObject.SetActive(true);
effect.Play(position, rotation);
return effect;
}
private void ReturnToPool(string effectName, ParticleEffectController effect)
{
effect.gameObject.SetActive(false);
_pools[effectName].Enqueue(effect);
}
}
// Usage
public class WeaponController : MonoBehaviour
{
public void OnHit(Vector3 hitPoint, Vector3 hitNormal)
{
VFXPoolManager.Instance.SpawnEffect(
"ImpactSparks",
hitPoint,
Quaternion.LookRotation(hitNormal));
}
}
๐ง Troubleshooting
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ PROBLEM: Particles popping in/out โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ SOLUTIONS: โ
โ โ Add fade-in at birth (size/alpha over lifetime) โ
โ โ Increase soft particle distance โ
โ โ Check culling settings โ
โ โ Extend lifetime with fade-out โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ PROBLEM: Low frame rate with particles โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ SOLUTIONS: โ
โ โ Reduce max particle count โ
โ โ Use LOD (fewer particles at distance) โ
โ โ Switch to GPU simulation โ
โ โ Reduce overdraw (smaller/fewer particles) โ
โ โ Use simpler shaders โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ PROBLEM: Particles clipping through geometry โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ SOLUTIONS: โ
โ โ Enable collision module โ
โ โ Use depth fade/soft particles โ
โ โ Adjust near clip plane โ
โ โ Position emitter away from surfaces โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ PROBLEM: Effect looks different in build โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ SOLUTIONS: โ
โ โ Check quality settings (particle raycast budget) โ
โ โ Verify shader compatibility โ
โ โ Test on target hardware โ
โ โ Check for editor-only components โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Engine-Specific Tools
| Engine | System | GPU Support | Visual Editor |
|---|---|---|---|
| Unity | Shuriken | VFX Graph | Yes (VFX Graph) |
| Unity | VFX Graph | Native | Yes |
| Unreal | Cascade | Limited | Yes |
| Unreal | Niagara | Native | Yes |
| Godot | GPUParticles | Yes | Inspector |
Use this skill: When creating visual effects, polishing gameplay, or optimizing particle performance.
Repository

pluginagentmarketplace
Author
pluginagentmarketplace/custom-plugin-game-developer/skills/particle-systems
1
Stars
0
Forks
Updated1d ago
Added1w ago