public override void Update(int timeLastFrame) { // generate particle if (m_isEmitting) { m_accumulateMillionSecond += timeLastFrame; // timeLastFrame past, so generateNum particles will be generated int generateNum = (int)(m_accumulateMillionSecond * m_generateRatePerSecond / 1000.0); m_accumulateMillionSecond -= (int)(generateNum * 1000 / (float)m_generateRatePerSecond); OneShot(generateNum); } // update living particle CatComponent particleUpdateBase = m_gameObject.GetComponent(m_particleUpdateComponentName); if (particleUpdateBase != null && particleUpdateBase is IParticleUpdater) { IParticleUpdater particleUpdate = (IParticleUpdater)particleUpdateBase; foreach (Particle particle in m_particles) { if (particle.m_lifeInMS > 0) { particleUpdate.ParticleUpdate(timeLastFrame, particle, this); } } } }
private void UpdateTopologyParameters() { ITopologyUpdater oldTopologyUpdater = TopologyUpdater; IParticleUpdater oldParticleUpdater = ParticleUpdater; ClearTopologyParameters(); if (Problem != null) { IParticleUpdater defaultParticleUpdater = null; if (TopologyInitializer != null) { foreach (ITopologyUpdater topologyUpdater in ApplicationManager.Manager.GetInstances <ITopologyUpdater>()) { TopologyUpdaterParameter.ValidValues.Add(topologyUpdater); } defaultParticleUpdater = Problem.Operators.OfType <ILocalParticleUpdater>().FirstOrDefault(); foreach (IParticleUpdater particleUpdater in Problem.Operators.OfType <ILocalParticleUpdater>().OrderBy(x => x.Name)) { ParticleUpdaterParameter.ValidValues.Add(particleUpdater); } } else { defaultParticleUpdater = Problem.Operators.OfType <IGlobalParticleUpdater>().FirstOrDefault(); foreach (IParticleUpdater particleUpdater in Problem.Operators.OfType <IGlobalParticleUpdater>().OrderBy(x => x.Name)) { ParticleUpdaterParameter.ValidValues.Add(particleUpdater); } } if (oldTopologyUpdater != null) { ITopologyUpdater newTopologyUpdater = TopologyUpdaterParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldParticleUpdater.GetType()); if (newTopologyUpdater != null) { TopologyUpdater = newTopologyUpdater; } } if (oldParticleUpdater != null) { IParticleUpdater newParticleUpdater = ParticleUpdaterParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldParticleUpdater.GetType()); if (newParticleUpdater != null) { ParticleUpdater = newParticleUpdater; } else { oldParticleUpdater = null; } } if (oldParticleUpdater == null && defaultParticleUpdater != null) { ParticleUpdater = defaultParticleUpdater; } ParameterizeTopologyUpdaters(); } }
/// <summary> /// 移除粒子更新器 /// </summary> /// <param name="updater"></param> public virtual void RemoveParticleUpdater(IParticleUpdater updater) { _updaters.Remove(updater); }
/// <summary> /// 添加粒子更新器 /// </summary> /// <param name="updater"></param> public virtual void AddParticleUpdater(IParticleUpdater updater) { _updaters.Add(updater); }