private void Update()
    {
        if (isCarrying)
        {
            // TODO: if object is hindered, Drop();

            Carry(carriedObject);

            if (Input.GetMouseButtonDown(0))
            {
                Drop();
            }
        }
        else
        {
            if (Input.GetMouseButtonDown(0))
            {
                pickupRay = Camera.main.ScreenPointToRay(Input.mousePosition);

                if (Physics.Raycast(pickupRay, out pickupHit, rayDistance))
                {
                    ILevitatable obj = pickupHit.transform.gameObject.GetInterface <ILevitatable>();
                    if (obj != null)
                    {
                        Pickup(obj);
                    }
                }
            }
        }
    }
    private void Carry(ILevitatable gObject)
    {
        Vector3 pos = Vector3.Lerp(gObject.Rigidbody.transform.position, carryTarget.position, Time.deltaTime * followSpeed);

        gObject.Rigidbody.MovePosition(pos);

        gObject.Rigidbody.transform.position = Vector3.Lerp(gObject.Rigidbody.transform.position, carryTarget.position, Time.deltaTime * followSpeed);
        gObject.Rigidbody.transform.rotation = Quaternion.Slerp(gObject.Rigidbody.transform.rotation, carryTarget.rotation, Time.deltaTime * followSpeed);
    }
    private void Pickup(ILevitatable gObject)
    {
        carriedObject         = gObject;
        isCarrying            = true;
        gObject.DestroyEvent += OnCarriedObjectDestroyEvent;
        gObject.OnLevitateStart(this);

        carriedObject.Rigidbody.useGravity  = false;
        carriedObject.Rigidbody.isKinematic = true;
    }
    private void Drop()
    {
        carriedObject.DestroyEvent -= OnCarriedObjectDestroyEvent;
        carriedObject.OnLevitateStop(this);

        carriedObject.Rigidbody.useGravity  = true;
        carriedObject.Rigidbody.isKinematic = false;

        isCarrying    = false;
        carriedObject = null;
    }