public bool update() { _elapsedTime += Time.deltaTime; // fading block if (_elapsedTime > _fadeDelay && _elapsedTime < _fadeDuration + _fadeDelay) { var t = Mathf.map01(_elapsedTime, 0f, _fadeDelay + _fadeDuration); ColorExt.lerp(ref _initialColor, ref _targetColor, out _renderColor, t); } else if (_elapsedTime >= _fadeDuration + _fadeDelay) { return(true); } return(false); }
public bool update() { // update values _timeToLive -= Time.deltaTime; if (_timeToLive > 0) { // TODO: update kinematics position += velocity * Time.deltaTime; // interpolate values ColorExt.lerp(ref _startColor, ref _endColor, out color, (_lifetime - _timeToLive) / (_lifetime)); scale += _scaleDelta * Time.deltaTime; alpha += _alphaDelta * Time.deltaTime; color.A = (byte)(255 * alpha); } else { return(true); } return(false); }
/// <summary> /// updates the particle. Returns true when the particle is no longer alive /// </summary> /// <param name="emitterConfig">Emitter config.</param> public bool update(ParticleEmitterConfig emitterConfig, ref ParticleCollisionConfig collisionConfig, Vector2 rootPosition) { // PART 1: reduce the life span of the particle _timeToLive -= Time.deltaTime; // if the current particle is alive then update it if (_timeToLive > 0) { // only update the particle position if it has not collided. If it has, physics takes over if (!_collided) { // if maxRadius is greater than 0 then the particles are going to spin otherwise they are affected by speed and gravity if (emitterConfig.emitterType == ParticleEmitterType.Radial) { // PART 2: update the angle of the particle from the radius. This is only done if the particles are rotating _angle += _degreesPerSecond * Time.deltaTime; _radius += _radiusDelta * Time.deltaTime; Vector2 tmp; tmp.X = -Mathf.cos(_angle) * _radius; tmp.Y = -Mathf.sin(_angle) * _radius; _velocity = tmp - position; position = tmp; } else { Vector2 tmp, radial, tangential; radial = Vector2.Zero; if (position.X != 0 || position.Y != 0) { Vector2.Normalize(ref position, out radial); } tangential = radial; radial = radial * _radialAcceleration; var newy = tangential.X; tangential.X = -tangential.Y; tangential.Y = newy; tangential = tangential * _tangentialAcceleration; tmp = radial + tangential + emitterConfig.gravity; tmp = tmp * Time.deltaTime; _direction = _direction + tmp; tmp = _direction * Time.deltaTime; _velocity = tmp / Time.deltaTime; position = position + tmp; } } // update the particles color. we do the lerp from finish-to-start because timeToLive counts from particleLifespan to 0 var t = (_particleLifetime - _timeToLive) / _particleLifetime; ColorExt.lerp(ref _startColor, ref _finishColor, out color, t); // update the particle size particleSize += _particleSizeDelta * Time.deltaTime; particleSize = MathHelper.Max(0, particleSize); // update the rotation of the particle rotation += _rotationDelta * Time.deltaTime; if (collisionConfig.enabled) { // if we already collided we have to handle the collision response if (_collided) { // handle after collision movement. we need to track velocity for this _velocity += collisionConfig.gravity * Time.deltaTime; position += _velocity * Time.deltaTime; // if we move too slow we die if (_velocity.LengthSquared() < collisionConfig.minKillSpeedSquared) { return(true); } } // should we use our spawnPosition as a reference or the parent Transforms position? var pos = emitterConfig.simulateInWorldSpace ? spawnPosition : rootPosition; _circleCollisionShape.recalculateBounds(particleSize * 0.5f * collisionConfig.radiusScale, pos + position); var neighbors = Physics.boxcastBroadphase(ref _circleCollisionShape.bounds, collisionConfig.collidesWithLayers); foreach (var neighbor in neighbors) { CollisionResult result; if (_circleCollisionShape.collidesWithShape(neighbor.shape, out result)) { // handle the overlap position -= result.minimumTranslationVector; calculateCollisionResponseVelocity(collisionConfig.friction, collisionConfig.elasticity, ref result.minimumTranslationVector); // handle collision config props _timeToLive -= _timeToLive * collisionConfig.lifetimeLoss; _collided = true; } } } } else { // timeToLive expired. were done return(true); } return(false); }