public virtual void UpdateInternal() { if (owner == null) { return; } Vector2 attachPoint = owner.transform.position + owner.transform.rotation * (Vector3)attachOffset; Vector2 direction = attachPoint - rigidBody.position; float distanceSqr = direction.sqrMagnitude; // accidental drop immunity when just pickup if (attachDropImmuninity > 0f) { attachDropImmuninity -= Time.deltaTime; } bool canDrop = attachDropImmuninity <= 0f; if (canDrop && distanceSqr > dropDistance * dropDistance) { owner.DropGrabbedObject(false); Drop(false); return; } // rotate rigidBody.MoveRotation(owner.transform.rotation * Quaternion.Euler(0, 0, -90)); // close enough, stop moving (avoid jitter) if (distanceSqr < 0.15f) { rigidBody.velocity = Vector2.zero; return; } direction = direction.normalized; rigidBody.velocity = direction * speed * 5f; // extra speed to better match player }