protected override JobHandle OnUpdate(JobHandle inputDeps) { var jobHandle = inputDeps; var dt = Time.deltaTime; for (int i = 0; i < emitterGroup.Length; i++) { var emitter = emitterGroup.emitters[i]; var position = emitterGroup.emitters[i].emitterPosition; emitter.emissionTimer += dt; if (emitter.emissionTimer >= emitter.emissionRate) { emitter.emissionTimer = 0; var emissionJob = new EmissionJob() { commandBuffer = endFrameBarrier.CreateCommandBuffer(), particleArchetype = BootstrapperParticles.particleArchetype, randomDirections = randomEmissionDirections, randomRotators = randomRotatorComponents, emitter = emitter, emitterPosition = new Position() { Value = position }, offset = UnityEngine.Random.Range(0, emitter.maxParticles / (int)emitter.particlesPerEmission) }; jobHandle = emissionJob.Schedule((int)emitter.particlesPerEmission, 1, inputDeps); } emitterGroup.emitters[i] = emitter; } return(jobHandle); }
protected override void OnUpdate() { float dt = Time.DeltaTime; Dependency = new EmissionJob { dt = dt, Particle2DAccelerationHandle = GetBufferTypeHandle <Particle2DAcceleration>(false), Particle2DVelocityHandle = GetBufferTypeHandle <Particle2DVelocity>(false), Particle2DPositionHandle = GetBufferTypeHandle <Particle2DPosition>(false), Particle2DColorHandle = GetBufferTypeHandle <Particle2DColor>(false), Particle2DGlyphHandle = GetBufferTypeHandle <Particle2DGlyph>(false), Particle2DLifetimeHandle = GetBufferTypeHandle <Particle2DLifetime>(false), Particle2DCountAliveHandle = GetComponentTypeHandle <Particle2DCountAlive>(false), Particle2DEmissionTimerHandle = GetComponentTypeHandle <Particle2DEmissionTimer>(false), Particle2DCountMaxHandle = GetComponentTypeHandle <Particle2DCountMax>(true), Particle2DEmissionRateHandle = GetComponentTypeHandle <Particle2DEmissionRate>(true), Particle2DNewParticleLifetimeHandle = GetComponentTypeHandle <Particle2DNewParticleLifetime>(true), Particle2DInitializedHandle = GetBufferTypeHandle <Particle2DInitializedIndex>(false) }.ScheduleParallel(_emitterQuery, Dependency); // Initialize positions based on emitter position Entities.ForEach((ref DynamicBuffer <Particle2DPosition> posBuffer, in DynamicBuffer <Particle2DInitializedIndex> initIndicesBuffer, in Translation translation) => { var initIndicesArr = initIndicesBuffer.AsNativeArray(); for (int indicesIndex = 0; indicesIndex < initIndicesBuffer.Length; ++indicesIndex) { int i = initIndicesArr[indicesIndex]; posBuffer[i] += translation.Value.xy; } }).ScheduleParallel();