private WasteObject DropObject()
        {
            GrabbedObject.rigidbody.detectCollisions = true;
            HoldPointCollider.enabled = false;
            var obj = GrabbedObject;

            GrabbedObject = null;
            return(obj);
        }
 private void GrabObject(GameObject grabbedObject)
 {
     GrabbedObject = grabbedObject.GetComponent <WasteObject>();
     GrabbedObject.rigidbody.detectCollisions = false;
     GrabbedObject.rigidbody.velocity         = Vector3.zero;
     GrabbedObject.rigidbody.angularVelocity  = Vector3.zero;
     GrabbedObject.transform.rotation         = Quaternion.identity;
     HoldPointCollider.enabled = true;
 }
        private void Update()
        {
            if (GameManager.Paused)
            {
                return;
            }

            if (remainingSpawnDuration > 0)
            {
                remainingSpawnDuration -= Time.deltaTime;
                return;
            }

            // Movement
            var moveInput = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")).normalized;

            // Dashing
            var dashDuration = DashSpeedModifier.keys[DashSpeedModifier.length - 1].time;

            if (remainingDashDuration > -DashDelay)
            {
                remainingDashDuration -= Time.deltaTime;
            }
            if (Input.GetButtonDown("Dash") && remainingDashDuration <= -DashDelay)
            {
                remainingDashDuration = dashDuration;
            }
            var dashSpeed = remainingDashDuration <= 0 ? 1 : DashSpeedModifier.Evaluate((dashDuration - remainingDashDuration) / dashDuration);

            // Velocity
            rigidbody.velocity = moveInput * PlayerSpeed * dashSpeed + new Vector3(0, rigidbody.velocity.y, 0);
            Animator.SetBool("IsMoving", moveInput.sqrMagnitude > 0);

            if (moveInput.sqrMagnitude > 0)
            {
                // TODO: Smooth rotation
                // Use -moveInput.z to correct z-axis rotation inversion
                transform.rotation = Quaternion.AngleAxis(Mathf.Atan2(-moveInput.z, moveInput.x) * Mathf.Rad2Deg + 90, Vector3.up);
            }

            if (WindingUp)
            {
                WindupDuration += Time.deltaTime;
            }


            // Grab/Drop
            if (grabDelay > 0)
            {
                grabDelay -= Time.deltaTime;
            }


            if (Input.GetButtonDown("Grab") && grabDelay <= 0)
            {
                if (GrabbedObject != null)
                {
                    DropObject();
                }
                else
                {
                    GrabObject();
                }
                grabDelay = GrabDelay;
            }

            // Throw/Interact
            if (Input.GetButtonDown("Throw"))
            {
                if (GrabbedObject != null)
                {
                    StartThrowWindup();
                }
                else
                {
                    Interact();
                }
            }
            if (Input.GetButtonUp("Throw") && GrabbedObject != null)
            {
                ThrowObject();
            }


            // TODO: Maybe make this better?
            if (GrabbedObject != null)
            {
                if (!GrabbedObject.gameObject.activeSelf)
                {
                    GrabbedObject = null;
                }
                else
                {
                    GrabbedObject.transform.position = HoldPoint.position;
                }
            }
            Animator.SetBool("IsHoldingObject", GrabbedObject != null);
        }