Scripting API

UI Particle System

v2.1.2 — Scripting Reference

Welcome to the UI Particle System scripting reference. This guide provides comprehensive examples of how to control the particle system entirely via script, using the new TierStudios namespace structure.

NEW NAMESPACE ALERT: All scripts are now organized under the TierStudios.UIParticleSystem namespace. Please update your using directives as shown in the examples below.

0. Namespace Structure

Include these namespaces to access all features.

// Standard Namespace Imports
using TierStudios.UIParticleSystem.Core;
using TierStudios.UIParticleSystem.Settings;
using TierStudios.UIParticleSystem.Managers;
using TierStudios.UIParticleSystem.Utilities;
using TierStudios.UIParticleSystem.Enums;

1. Basic Initialization

How to initialize the system.

using UnityEngine;
using TierStudios.UIParticleSystem.Core;

public class ParticleStarter : MonoBehaviour
{
    private UIParticleSystem particleSystem;

    void Start()
    {
        particleSystem = GetComponent<UIParticleSystem>();
        particleSystem.StartEmitting();
    }
}

2. Emission Control

Methods to start, stop, pause, and restart.

using TierStudios.UIParticleSystem.Core;
using UnityEngine;

public class EmissionController : MonoBehaviour
{
    [SerializeField] private UIParticleSystem particleSystem;

    public void StartEmission() => particleSystem.StartEmitting();
    public void StopEmission() => particleSystem.StopEmitting();
    public void PauseEmission() => particleSystem.PauseSystem();
    public void ResumeEmission() => particleSystem.ResumeSystem();
    public void RestartEmission() => particleSystem.RestartSystem();

    public void ClearAllParticles()
    {
        UIParticleSystem.ClearAllParticles(particleSystem);
    }

    public int GetActiveCount()
    {
        return particleSystem.GetActiveParticleCount();
    }
}

3. Modifying Emission Settings

Changing emission rates and bursts at runtime.

using TierStudios.UIParticleSystem.Core;
using TierStudios.UIParticleSystem.Settings;
using TierStudios.UIParticleSystem.Enums;
using UnityEngine;

public class EmissionCustomizer : MonoBehaviour
{
    [SerializeField] private UIParticleSystem particleSystem;

    void Start()
    {
        var emission = particleSystem.EmissionSettings;
        emission.emissionRate = 50f;
        emission.maxParticles = 1000;
        emission.looping = true;
        emission.duration = 5f;
        emission.startDelay = 0.5f;
        emission.emissionShape = EmissionShapeType.Circle;
        emission.circleRadius = 100f;
        emission.emitFromEdge = false;
        emission.emissionDirection = Vector2.up;
        emission.randomizeDirection = true;
        emission.directionVariance = 45f;
        emission.simulationSpace = SimulationSpace.Local;
    }

    public void AddExplosion()
    {
        var burst = new Burst { time = 1f, count = 200, probability = 1f };
        particleSystem.EmissionSettings.bursts.Add(burst);
    }
}

4. Lifetime and Size Settings

Controlling particle lifespan and scale.

using TierStudios.UIParticleSystem.Core;
using TierStudios.UIParticleSystem.Settings;
using UnityEngine;

public class ParticleAppearance : MonoBehaviour
{
    [SerializeField] private UIParticleSystem particleSystem;

    void Start()
    {
        var lifetime = particleSystem.LifetimeSettings;
        lifetime.useRandomLifetime = true;
        lifetime.minLifetime = 1f;
        lifetime.maxLifetime = 3f;

        var size = particleSystem.SizeSettings;
        size.useSizeRange = true;
        size.minSize = 20f;
        size.maxSize = 80f;
        size.useSizeOverLifetime = true;
        size.sizeOverLifetime = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f);
        size.use2DSize = true;
        size.size2D = new Vector2(50f, 100f);
    }
}

5. Color and Gradient

Applying solid colors, random ranges, or gradients.

using TierStudios.UIParticleSystem.Core;
using TierStudios.UIParticleSystem.Settings;
using UnityEngine;

public class ColorController : MonoBehaviour
{
    [SerializeField] private UIParticleSystem particleSystem;

    void Start()
    {
        var color = particleSystem.ColorSettings;
        color.useRandomColors = true;
        color.particleColor = Color.yellow;
        color.particleColorEnd = Color.red;

        color.useGradientColor = true;
        Gradient gradient = new Gradient();
        gradient.SetKeys(
            new GradientColorKey[] {
                new GradientColorKey(Color.white, 0f),
                new GradientColorKey(Color.blue, 0.5f),
                new GradientColorKey(Color.cyan, 1f)
            },
            new GradientAlphaKey[] {
                new GradientAlphaKey(1f, 0f),
                new GradientAlphaKey(0f, 1f)
            }
        );
        color.colorGradient = gradient;
    }
}

6. Rotation Settings

Controlling angular velocity and initial rotation.

using TierStudios.UIParticleSystem.Core;
using TierStudios.UIParticleSystem.Settings;
using UnityEngine;

public class RotationController : MonoBehaviour
{
    [SerializeField] private UIParticleSystem particleSystem;

    void Start()
    {
        var rotation = particleSystem.RotationSettings;
        rotation.useRandomRotation = true;
        rotation.minRotation = 0f;
        rotation.maxRotation = 360f;
        rotation.useRotationOverLifetime = true;
        rotation.useRandomRotationSpeed = true;
        rotation.minRotationSpeed = -180f;
        rotation.maxRotationSpeed = 180f;
    }
}

7. Velocity Over Lifetime NEW

Controlling speed, orbital movement, and gravity.

using TierStudios.UIParticleSystem.Core;
using TierStudios.UIParticleSystem.Settings;
using TierStudios.UIParticleSystem.Enums;
using UnityEngine;

public class VelocityController : MonoBehaviour
{
    [SerializeField] private UIParticleSystem particleSystem;

    void Start()
    {
        var velocity = particleSystem.VelocityOverLifetimeSettings;
        velocity.enabled = true;
        velocity.velocityX = AnimationCurve.Linear(0f, 0f, 1f, 50f);
        velocity.velocityY = AnimationCurve.Linear(0f, 100f, 1f, -100f);
        velocity.orbitalX = AnimationCurve.Constant(0f, 1f, 45f);
        velocity.orbitalY = AnimationCurve.Constant(0f, 1f, 90f);
        velocity.space = SimulationSpace.Local;
        velocity.speedModifier = AnimationCurve.Linear(0f, 1f, 1f, 0.5f);
    }

    public void ApplyGravity()
    {
        var velocity = particleSystem.VelocityOverLifetimeSettings;
        velocity.enabled = true;
        velocity.velocityY = AnimationCurve.Linear(0f, 0f, 1f, -200f);
    }
}

8. Attractor System

Creating magnets and vortex effects.

using TierStudios.UIParticleSystem.Core;
using TierStudios.UIParticleSystem.Settings;
using TierStudios.UIParticleSystem.Enums;
using UnityEngine;

public class AttractorController : MonoBehaviour
{
    [SerializeField] private UIParticleSystem particleSystem;
    [SerializeField] private Transform attractorTarget;

    void Start()
    {
        var attractor = particleSystem.AttractorSettings;
        attractor.useAttractor = true;
        attractor.attractorType = AttractorType.Attract;
        attractor.attractorPosition = attractorTarget.position;
        attractor.attractorStrength = 150f;
        attractor.attractorRadius = 300f;
        attractor.attractorFalloff = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f);
        attractor.useKillRadius = true;
        attractor.killRadius = 20f;
    }

    void Update()
    {
        particleSystem.AttractorSettings.attractorPosition = attractorTarget.position;
    }

    public void CreateVortex()
    {
        var attractor = particleSystem.AttractorSettings;
        attractor.attractorType = AttractorType.Vortex;
        attractor.attractorStrength = 100f;
    }
}

9. Noise System

Adding turbulence and organic movement.

using TierStudios.UIParticleSystem.Core;
using TierStudios.UIParticleSystem.Settings;
using TierStudios.UIParticleSystem.Enums;
using UnityEngine;

public class NoiseController : MonoBehaviour
{
    [SerializeField] private UIParticleSystem particleSystem;

    void Start()
    {
        var noise = particleSystem.NoiseSettings;
        noise.useNoise = true;
        noise.noiseType = NoiseType.Perlin;
        noise.noiseStrength = 50f;
        noise.noiseFrequency = 1f;
        noise.noiseScrollSpeed = 10f;
        noise.noiseOctaves = 3;
        noise.useNoiseStrengthOverLifetime = true;
        noise.noiseStrengthOverLifetime = AnimationCurve.Linear(0f, 0f, 1f, 1f);
    }

    public void ApplyTurbulence()
    {
        var noise = particleSystem.NoiseSettings;
        noise.noiseType = NoiseType.Turbulence;
        noise.noiseStrength = 100f;
    }
}

10. Trail System

Rendering trails behind particles.

using TierStudios.UIParticleSystem.Core;
using TierStudios.UIParticleSystem.Settings;
using UnityEngine;

public class TrailController : MonoBehaviour
{
    [SerializeField] private UIParticleSystem particleSystem;

    void Start()
    {
        var trail = particleSystem.TrailSettings;
        trail.useTrails = true;
        trail.trailLifetime = 0.5f;
        trail.trailWidth = 5f;
        trail.trailMaxPoints = 20;
        trail.trailUpdateInterval = 0.05f;
        trail.maxVerticesPerFrame = 1000;
        trail.inheritParticleColor = true;
        trail.trailStartColor = Color.white;
        trail.trailEndColor = new Color(1f, 1f, 1f, 0f);
        trail.trailWidthCurve = AnimationCurve.Linear(0f, 1f, 1f, 0f);
        trail.trailMaterial = Resources.Load<Material>("TrailMaterial");
    }

    public void RefreshTrails()
    {
        particleSystem.RefreshTrailSettings();
    }
}

11. Texture Sheet Animation

Using sprite sheets for animated particles.

using TierStudios.UIParticleSystem.Core;
using TierStudios.UIParticleSystem.Settings;
using TierStudios.UIParticleSystem.Enums;
using UnityEngine;

public class TextureSheetController : MonoBehaviour
{
    [SerializeField] private UIParticleSystem particleSystem;
    [SerializeField] private Texture2D spriteSheet;

    void Start()
    {
        var textureSheet = particleSystem.TextureSheetSettings;
        textureSheet.useTextureSheetAnimation = true;
        textureSheet.textureSheet = spriteSheet;
        textureSheet.tilesX = 4;
        textureSheet.tilesY = 4;
        textureSheet.animationCycle = AnimationCycle.WholeSheet;
        textureSheet.animationFrames = 16;
        textureSheet.animationSpeed = 24f;
        textureSheet.loopAnimation = true;
        textureSheet.randomStartFrame = true;
    }

    public void PlaySingleRow(int rowIndex)
    {
        var ts = particleSystem.TextureSheetSettings;
        ts.animationCycle = AnimationCycle.SingleRow;
        ts.singleRowIndex = rowIndex;
    }
}

12. Event System

Listening to system events (C# & UnityEvents).

using TierStudios.UIParticleSystem.Core;
using TierStudios.UIParticleSystem.Settings;
using UnityEngine;

public class ParticleEventHandler : MonoBehaviour
{
    [SerializeField] private UIParticleSystem particleSystem;

    void OnEnable()
    {
        particleSystem.EventSettings.EnableEvents = true;
        particleSystem.OnParticleSpawned += OnParticleSpawned;
        particleSystem.OnParticleDied += OnParticleDied;
        particleSystem.EventSettings.onParticleSpawned.AddListener(OnSpawn);
    }

    void OnDisable()
    {
        particleSystem.OnParticleSpawned -= OnParticleSpawned;
        particleSystem.OnParticleDied -= OnParticleDied;
    }

    void OnParticleSpawned(ParticleEventArgs args)
    {
        Debug.Log($"Particle Spawned! Pos: {args.Particle.position}");
    }

    void OnParticleDied(ParticleEventArgs args)
    {
        Debug.Log($"Particle Died! Age: {args.Particle.age}");
    }

    void OnSpawn(ParticleEventData data)
    {
        Debug.Log($"UnityEvent Spawn! Index: {data.particleIndex}");
    }
}

13. Mobile Optimization NEW

Optimizing performance for mobile devices.

using TierStudios.UIParticleSystem.Core;
using UnityEngine;

public class MobileOptimizer : MonoBehaviour
{
    [SerializeField] private UIParticleSystem particleSystem;

    void Start()
    {
#if UNITY_ANDROID || UNITY_IOS
        particleSystem.SetMobileOptimization(
            enabled: true,
            maxParticles: 50,
            updateInterval: 0.033f
        );
#endif
    }

    public void EnableMobileMode()
    {
        particleSystem.MobileOptimizationMode = true;
        particleSystem.MobileMaxParticles = 75;
    }

    public void CheckPerformance()
    {
        int effectiveMax = particleSystem.EffectiveMaxParticles;
        Debug.Log($"Max Particles: {effectiveMax}");
    }
}

14. Direct Particle Manipulation

Modifying active particles at runtime.

using TierStudios.UIParticleSystem.Core;
using System.Collections.Generic;
using UnityEngine;

public class ParticleManipulator : MonoBehaviour
{
    [SerializeField] private UIParticleSystem particleSystem;

    void Update()
    {
        List<Particle> particles = particleSystem.ActiveParticles;
        foreach (Particle particle in particles)
        {
            if (particle == null || !particle.isAlive) continue;
            particle.position += Vector2.up * Time.deltaTime * 10f;
            particle.velocity *= 0.99f;
            particle.color = Color.Lerp(particle.color, Color.red, Time.deltaTime);
            particle.size += Time.deltaTime * 5f;
            particle.rotation += Time.deltaTime * 90f;
        }
    }
}

15. Complete Example: Dynamic System

A comprehensive example combining multiple features.

using TierStudios.UIParticleSystem.Core;
using TierStudios.UIParticleSystem.Settings;
using TierStudios.UIParticleSystem.Enums;
using UnityEngine;

public class DynamicFeedbackSystem : MonoBehaviour
{
    [SerializeField] private UIParticleSystem particleSystem;
    [SerializeField] private Transform player;

    void Start() { SetupParticleSystem(); }

    void SetupParticleSystem()
    {
        var emission = particleSystem.EmissionSettings;
        emission.emissionRate = 50f;
        emission.maxParticles = 300;
        emission.emissionShape = EmissionShapeType.Circle;

        var velocity = particleSystem.VelocityOverLifetimeSettings;
        velocity.enabled = true;
        velocity.velocityY = AnimationCurve.Linear(0f, 0f, 1f, -100f);

        var attractor = particleSystem.AttractorSettings;
        attractor.useAttractor = true;
        attractor.attractorStrength = 200f;
        attractor.attractorPosition = player.position;

        particleSystem.StartEmitting();
    }

    void Update()
    {
        if (player != null)
            particleSystem.AttractorSettings.attractorPosition = player.position;
    }

    public void TriggerHitEffect(Vector2 hitPosition)
    {
        var burst = new Burst { time = 0f, count = 100, probability = 1f };
        particleSystem.EmissionSettings.bursts.Add(burst);
        particleSystem.transform.position = hitPosition;
        particleSystem.RestartSystem();
    }
}

Summary of Features

Emission

Start, Stop, Pause, Resume, Restart controls.

Settings

Full access to Emission, Lifetime, Size, Color, etc.

Velocity New

Orbital velocity, gravity, and speed modifiers.

Mobile New

Optimization settings for Android/iOS.

Effects

Attractor, Noise, Trail, Texture Sheet Animation.

Events

Complete C# and UnityEvent system support.