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(); 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(); } }