public static void InitEmitterRectSource(EntityManager mgr, Entity emitter, NativeArray <Entity> particles, bool isWorld) { var source = mgr.GetComponentData <EmitterRectSource>(emitter); var localToWorld = mgr.GetComponentData <LocalToWorld>(emitter); foreach (var particle in particles) { var pos2 = ParticlesUtil.RandomPointInRect(source.rect); var pos = new float3(pos2.x, pos2.y, 0.0f); if (isWorld) { pos = math.mul(localToWorld.Rotation, pos); } var Translation = mgr.GetComponentData <Translation>(particle); Translation.Value += pos; mgr.SetComponentData(particle, Translation); var particleVelocity = mgr.GetComponentData <ParticleVelocity>(particle);//new ParticleVelocity(); float speed = particleVelocity.initSpeed; if (speed != 0f) { var direction = math.normalizesafe(pos); var velocity = direction * speed; particleVelocity.velocity = velocity; mgr.SetComponentData(particle, particleVelocity); } } }
static void InitTime(EntityManager mgr, float deltaTime, Range lifetime, NativeArray <Entity> newParticles) { // The time is evenly distributted from 0.0 to deltaTime. // The time of each subsequent particle will be increased by this value. // particle.time[0..n] = (0 * timeStep, 1 * timeStep, 2 * timeStep, ..., n * timeStep). float timeStep = newParticles.Length > 1 ? (deltaTime / (float)(newParticles.Length - 1)) : 0.0f; // We need to subtract deltaTime from the particle's relative time, because later in // the same frame we are adding deltaTime to the particle's relative time when we process // them. This ensures that the first, newly created particle will start at a relative time 0.0. float time = -deltaTime; foreach (var particle in newParticles) { var cParticle = mgr.GetComponentData <Particle>(particle); cParticle.lifetime = ParticlesUtil.RandomRange(lifetime); cParticle.time = time; time += timeStep; mgr.SetComponentData(particle, cParticle); } }