Пример #1
0
    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();