protected override void UpdateOverride(EntityBehaviour entity)
        {
            if (IsFinished || entity == null) {
                return;
            }

            var isCloseEnough = entity.transform.position.y - SeaLevel < 0.02f;
            if (elapsedTime >= Duration && isCloseEnough) {
                InvokeControllerFinished(entity);
                return;
            }

            var percent = elapsedTime.TotalMilliseconds / Duration.TotalMilliseconds;
            var reverse = 1 - percent;

            // create impact wave form, with slight depth offset, since we wont start at 0.
            var sin = -Math.Sin(percent * Math.PI * 16 * reverse + Math.PI / 6);

            // reduce amplitude above the sea level, we can't fly
            var strength = sin < 0 ? Strength : Strength / 1.5;

            // reduce amplitude exponentially
            strength *= (float) reverse * (float) reverse;

            // add amplitude modulation to wave
            var offset = (float) (strength * sin);

            // apply offset to sealevel depth
            var p = entity.transform.position;
            entity.transform.position = new Vector3(p.x, SeaLevel + offset, p.z);
            elapsedTime += TimeSpan.FromSeconds(Time.deltaTime);
        }
        protected override void UpdateOverride(EntityBehaviour entity)
        {
            if (IsFinished || entity == null) {
                return;
            }

            var isCloseEnough = entity.transform.position.IsCloseEnoughTo(target.transform.position, IsYAxisIgnored);
            if (isCloseEnough) {
                if (IsFinishedOnCatchup) {
                    InvokeControllerFinished(entity);
                }
                return;
            }

            elapsedTime = elapsedTime.Add(TimeSpan.FromSeconds(Time.deltaTime));

            var currentPosition = entity.transform.position;
            var targetPosition = target.transform.position;

            var direction = CalculateDirectonalVector(targetPosition, currentPosition);

            var normalizedDirection = direction;
            normalizedDirection.Normalize();

            var offset = entity.Speed * Time.deltaTime;
            var movementVector = normalizedDirection * offset;

            entity.transform.position = entity.transform.position + movementVector;

            var lookAtCoords = target.transform.position;
            if (IsPitchLocked) {
                lookAtCoords.y = entity.transform.position.y;
            }
            entity.transform.LookAt(lookAtCoords);
        }
        protected override void UpdateOverride(EntityBehaviour entity)
        {
            if (IsFinished || entity == null) {
                return;
            }

            var isCloseEnough = entity.transform.position.IsCloseEnoughTo(targetPosition);
            if (isCloseEnough) {
                return;
            }

            // v = s / t
            // s = v * t
            var currentPosition = entity.transform.position;

            var direction = targetPosition - currentPosition;

            var normalizedDirection = direction;
            normalizedDirection.Normalize();

            var offset = entity.Speed * Time.deltaTime;
            var movementVector = normalizedDirection * offset;

            entity.transform.position = entity.transform.position + movementVector;
            if (lookAt) {
                entity.gameObject.transform.LookAt(entity.transform.position + normalizedDirection);
            }
        }
        protected override void UpdateOverride(EntityBehaviour entity)
        {
            if (IsFinished || entity == null) {
                return;
            }

            var offset = Convert.ToSingle(Math.Sin(Time.timeSinceLevelLoad)) * 1.4f;
            var pos = entity.transform.position;
             entity.transform.position = new Vector3(pos.x, SeaLevel + offset, pos.z);
        }
 public ArcMovementController(EntityBehaviour start, GameObject target, int flatness)
 {
     TimeSinceStart = TimeSpan.Zero;
     MovingStartPosition = start.transform.position;
     MovingEndPosition = target.transform.position;
     Flatness = flatness;
     MovingCenterPosition = GetCenter ();
     Distance = (MovingStartPosition - MovingEndPosition).magnitude;
     // v = s / t
     MovingTime = Distance / start.Speed;
     Target = target;
     IsMoving = true;
 }
        protected override void UpdateOverride(EntityBehaviour entity)
        {
            if (IsFinished || entity == null) {
                return;
            }

            duration += Time.deltaTime;

            var offset = Convert.ToSingle(Math.Sin(Time.timeSinceLevelLoad)) * 2.0f;
            var pos = entity.transform.position;
            entity.transform.position = new Vector3(startPosition.x + offset, pos.y, pos.z);

            var to = Quaternion.FromToRotation(entity.transform.up, Vector3.up);
            entity.transform.rotation =  Quaternion.Slerp(entity.transform.rotation, to, duration * speed);
        }
 public BalloonFloatingController(EntityBehaviour entity)
 {
     speed = 0.03f;
     startPosition = entity.transform.position;
 }
        protected override void UpdateOverride(EntityBehaviour entity)
        {
            if (IsFinished || entity == null) {
                return;
            }

            MovingObject = entity.gameObject.transform;

            if (IsMoving) {
                TimeSinceStart = TimeSinceStart.Add (TimeSpan.FromSeconds ((double)Time.deltaTime));
                if (TimeSinceStart.TotalSeconds >= MovingTime) {
                    IsMoving = false;
                    InvokeControllerFinished(entity);
                    return;
                }
                Rotate();
                Move ();
            }
        }
 public SinkEffect(EntityBehaviour entity)
 {
     this.entity = entity;
 }