public SusceptibleParticleSystem(
     ParticleSystemForceReceiver forceReceiver, float influence, ForceMaterial material
     )
 {
     this.ForceReceiver = forceReceiver;
     this.Influence     = influence;
     this.Material      = material;
 }
Exemple #2
0
    /* TODO: make ParticleSystemForceReceiver update itself.
     * Query all force fields in FixedUpdate method of ParticleSystemForceReceiver,
     * apply forces and call FlushParticles (). This way we will flush particles only once. */
    private void ApplyToParticles(float timeFactor)
    {
        var   origin               = Origin;
        float radiusSq             = Radius * Radius;
        var   susceptibleReceivers = ParticleSystemForceReceiver.GetSusceptibleReceivers(Kind);

        foreach (var receiverInfo in susceptibleReceivers)
        {
            var receiver = receiverInfo.ForceReceiver;
            var bounds   = receiver.Bounds;

            if (bounds.SqrDistance(origin) <= radiusSq)
            {
                float influence            = receiverInfo.Influence;
                float velocityChangeAmount = PhysicsHelper.ConvertToVelocityChange(Amount, Mode, receiver.ParticleMass);
                velocityChangeAmount *= influence * timeFactor * AnimatedMultiplier;
                int  count;
                var  particles = receiver.ReadParticles(out count);
                bool changed   = false;

                for (int i = 0; i < count; i++)
                {
                    var   particle       = particles [i];
                    var   distanceVector = ( Vector2 )particle.position - origin;
                    float distance       = distanceVector.magnitude;

                    if (distance < Radius)
                    {
                        float distanceFactor = DecreaseWithDistance ? 1 - distance / Radius : 1;
                        float particleVelocityChangeAmount = velocityChangeAmount * distanceFactor;
                        var   direction      = distanceVector.normalized;
                        var   velocityChange = direction * particleVelocityChangeAmount;
                        particle.velocity += ( Vector3 )velocityChange;

                        particles [i] = particle;
                        changed       = true;
                    }
                }

                if (changed)
                {
                    receiver.FlushParticles();
                }
            }
        }
    }
    /* TODO: make ParticleSystemForceReceiver update itself.
     * Query all force fields in FixedUpdate method of ParticleSystemForceReceiver,
     * apply forces and call FlushParticles (). This way we will flush particles only once. */
    private void ApplyToParticles()
    {
        var susceptibleReceivers = ParticleSystemForceReceiver.GetSusceptibleReceivers(Kind);

        foreach (var receiverInfo in susceptibleReceivers)
        {
            var   receiver             = receiverInfo.ForceReceiver;
            float velocityChangeAmount = PhysicsHelper.ConvertToVelocityChange(Amount, Mode, receiver.ParticleMass);
            var   velocityChange       = Direction * velocityChangeAmount * receiverInfo.Influence;
            int   count;
            var   particles = receiver.ReadParticles(out count);

            for (int i = 0; i < count; i++)
            {
                particles [i].velocity += ( Vector3 )velocityChange;
            }

            receiver.FlushParticles();
        }
    }