void Dispatch(bool emit)
        {
            Profiler.BeginSample("Dispatch loop");
            PartEmitter.UpdateParticleBursts();

            BindParticles();

            if (emit)
            {
                PartEmitter.UpdatePlayEvent();
            }

            if (!NoSimulation)
            {
                //Dispatch the update kernel.
                SetPariclesToKernel(ComputeShader, UpdateAllKernel);

                Profiler.BeginSample("Main update");
                ComputeShader.Dispatch(UpdateAllKernel, DispatchCount, 1, 1);
                Profiler.EndSample();

                ColliderManager.Dispatch();
                ForceManager.Dispatch();
            }


            Profiler.EndSample();
        }
        void UpdateParticles(float deltTime)
        {
            Profiler.BeginSample("Update particles");
            ParticleTimeDelta = deltTime;

            SystemTime += ParticleTimeDelta;
            RealTime   += ParticleTimeDelta;

            if (SystemTime >= Duration)
            {
                if (looping)
                {
                    SystemTime %= Duration;
                    PartEmitter.PlayEvent();
                    m_isPlaying = true;
                }
                else
                {
                    m_isPlaying = false;
                }
            }

            Dispatch(true);
            Profiler.EndSample();
        }
        public void Emit(int count)
        {
            if (UseShuriken)
            {
                shurikenFallback.Emit(count);
                return;
            }

            PartEmitter.Emit(count);
        }
        public void Clear(bool withChildren = true)
        {
            if (UseShuriken)
            {
                shurikenFallback.Clear(withChildren);
                return;
            }

            PartEmitter.ClearAllEmittedParticles();

            if (withChildren)
            {
                Children.ForEach(s => s.Clear());
            }
        }
        IEnumerator PlayRoutine()
        {
            if (delay != 0.0f)
            {
                yield return(new WaitForSeconds(delay));
            }

            if (SystemTime >= Duration && !looping)
            {
                ResetPlayTime();
            }

            PartEmitter.PlayEvent();


            if (prewarm)
            {
                Simulate(Duration, false);
            }

            m_isPlaying = true;
        }