using UnityEngine; using System.Collections; using ParticlePlayground; // Example of scripted preset emitting in a circle on instantiation. // To instantiate this during runtime as a preset use: Playground.InstantiatePreset("Playground Circle Shot (Script)"); [ExecuteInEditMode()] [RequireComponent(typeof(PlaygroundParticlesC))] public class PlaygroundPresetCircleShotC : MonoBehaviour { public int numberOfParticles = 30; // The number of particles to emit each cycle public float force = 10f; // The force to emit in forward direction public int cycles = 1; // The number of cycles to emit public Vector3 rotationNormal = new Vector3(0,0,1); // The axis you want to rotate around public float minimumLifetime = 3f; // The minimum lifetime of a particle public float maximumLifetime = 3f; // The maximum lifetime of a particle public Color color = Color.white; // The color of particle public float yieldBeforeEmission = 0f; // The seconds to wait before starting emission public float yieldBetweenShots = 0f; // The seconds between shots (if any) public float yieldBetweenCycles = 0f; // The seconds between cycles (if any) public WhenDoneCircleShot whenDone; // Should this GameObject inactivate or destroy when emission is done? private Transform thisTransform; private PlaygroundParticlesC particles; bool isSameLifetime = false; void Start () { particles = GetComponent<PlaygroundParticlesC>(); thisTransform = transform; isSameLifetime = minimumLifetime==maximumLifetime; StartCoroutine(Shoot()); } IEnumerator Shoot () { // We need to wait before the particle system is fully ready before we start to call for our emission while (!particles.Initialized ()) yield return null; // Set variables float rotationSpeed = 360f/numberOfParticles; float timeDone; // Set particle count to match the amount needed particles.particleCount = numberOfParticles*cycles; // Wait before emission starts (if applicable) if (yieldBeforeEmission>0) { timeDone = PlaygroundC.globalTime+yieldBeforeEmission; while (PlaygroundC.globalTime<timeDone) yield return null; } // Loop through every cycle (c) and particle (p) for (int c = 0; c<cycles; c++) { for (int p = 0; p<numberOfParticles; p++) { // Emit a particle in rotated direction particles.Emit(thisTransform.position, thisTransform.right*force, isSameLifetime? maximumLifetime : Random.Range(minimumLifetime, maximumLifetime), color); // Rotate towards direction thisTransform.Rotate(rotationNormal*rotationSpeed); // Wait for next emission (if applicable) if (yieldBetweenShots>0) { timeDone = PlaygroundC.globalTime+yieldBetweenShots; while (PlaygroundC.globalTime<timeDone) yield return null; } } // Wait for next cycle (if applicable) if (yieldBetweenCycles>0) { timeDone = PlaygroundC.globalTime+yieldBetweenCycles; while (PlaygroundC.globalTime<timeDone) yield return null; } } // Return if not in Play Mode in Editor #if UNITY_EDITOR if (!UnityEditor.EditorApplication.isPlaying) yield break; #endif // Wait for action when last particle's lifetime is over switch (whenDone) { case WhenDoneCircleShot.Inactivate: yield return new WaitForSeconds(maximumLifetime); gameObject.SetActive(false); break; case WhenDoneCircleShot.Destroy: yield return new WaitForSeconds(maximumLifetime); Destroy(gameObject); break; } } public enum WhenDoneCircleShot { Nothing, Inactivate, Destroy, } }