void Update()
    {
        PlayerController player = Player.GetComponent <PlayerController>();
        KinectController kinect = Kinect.GetComponent <KinectController>();
        FlyDetector      fly    = Fly.GetComponent <FlyDetector>();

        if (kinect.PlayerSkeleton == null)
        {
            return;
        }

        if (fly.IsActivated)
        {
            float elapsedTime = Time.deltaTime;

            if (takeOffTimer < takeOffTime)
            {
                transform.position += Vector3.up * speed * elapsedTime;
                takeOffTimer       += elapsedTime;
            }
            else
            {
                WindowsKinect.Body playerSkeleton = kinect.PlayerSkeleton;

                fly.Set(
                    playerSkeleton.GetPosition(WindowsKinect.JointType.ShoulderLeft),
                    playerSkeleton.GetPosition(WindowsKinect.JointType.ShoulderRight),
                    playerSkeleton.GetPosition(WindowsKinect.JointType.ElbowLeft),
                    playerSkeleton.GetPosition(WindowsKinect.JointType.ElbowRight));

                //Debug.Log(string.Format("{0} | {1}", transform.rotation.z, fly.Angle));
                if (Mathf.Abs(transform.rotation.z - fly.Angle) > 0.02f)
                {
                    FlyDirection rotation = fly.FlyDirection;

                    float degree = 0f;

                    if (rotation == FlyDirection.Right)
                    {
                        degree = fly.Angle > transform.rotation.z ? 1f : -1f;
                    }
                    else if (rotation == FlyDirection.Left)
                    {
                        degree = fly.Angle < transform.rotation.z ? -1f : 1f;
                    }

                    transform.Rotate(new Vector3(0f, 0f, 1f), 2f * degree * Mathf.PI / 2f * elapsedTime);
                }

                //transform.position += new Vector3(0f, 0f, -1f) * speed * elapsedTime;
            }
        }
        else if (!player.renderer.enabled)
        {
            fly.Activate();
        }
    }
    private void UpdateJump(KinectController kinect)
    {
        if (jumpController.IsActivated)
        {
            if (jumpController.IsPassing)
            {
                jumpController.Deactivate();
                isMoving = true;
                UpdateInstruction(noInstructionText);
            }
            else
            {
                WindowsKinect.Body body = kinect.PlayerSkeleton;

                jumpController.Set(
                    body.GetPosition(WindowsKinect.JointType.FootLeft),
                    body.GetPosition(WindowsKinect.JointType.FootRight));
            }
        }
    }
    private bool IsInRange(WindowsKinect.Body skeleton)
    {
        const float ftToMeter   = 0.3048f;
        const float minDistance = 4.5f * ftToMeter;
        const float maxDistance = 6.5f * ftToMeter;

        Vector3 spineBasePosition = skeleton.GetPosition(WindowsKinect.JointType.SpineBase);

        return(spineBasePosition.z >= minDistance &&
               spineBasePosition.z <= maxDistance &&
               Mathf.Abs(spineBasePosition.x) < 1.5f);
    }
    private void UpdateHandWave(KinectController kinect)
    {
        if (handWaveController.IsActivated)
        {
            if (handWaveController.IsPassing)
            {
                handWaveController.Deactivate();
                isMoving = true;
                UpdateInstruction(noInstructionText);
            }
            else
            {
                WindowsKinect.Body body = kinect.PlayerSkeleton;

                handWaveController.Set(
                    body.GetPosition(WindowsKinect.JointType.HandLeft),
                    body.GetPosition(WindowsKinect.JointType.HandRight),
                    body.GetPosition(WindowsKinect.JointType.ElbowLeft),
                    body.GetPosition(WindowsKinect.JointType.ElbowRight));
            }
        }
    }