using UnityEngine;
using System.Collections;

public class SparkParticles : MonoBehaviour
{
    public Transform BillboardTarget;
    ParticleSystem _particleSystem;
    // There is a fixed buffer size for particles hacked into this script.
    // This means the script will cap the max number of particles to whatever the length of this array is.
    // It's ugly I know. Sorry!
    ParticleSystem.Particle[] _particles = new ParticleSystem.Particle[25];

    void Awake()
    {
        _particleSystem = GetComponent<ParticleSystem>();

        if (BillboardTarget == null)
            BillboardTarget = Camera.main.transform;
    }

    void FixParticleRotations()
    {
        int count = _particleSystem.GetParticles(_particles);

        for (int i = 0; i < count; i++)
        {
            Vector3 dir = _particles[i].velocity.normalized;
            float rot = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
            _particles[i].rotation = rot;
        }

        _particleSystem.SetParticles(_particles, _particleSystem.particleCount);
    }

    public void Play()
    {
        transform.LookAt(BillboardTarget);
        _particleSystem.Play();
        StartCoroutine(LateFix());
    }

    // It seems setting the rotations on the frame you tell the system to Play is insufficient.
    // So this handy coroutine delays that by a single frame.
    IEnumerator LateFix()
    {
        yield return null;
        FixParticleRotations();
    }
}