Создал 3д модель 

Нужно что бы поршень по клику мышки выдвигался , толкал впереди стоящий предмет и возвращался в свое исходное положение .
 
Я использовал изначально transform.position для выдвижного элемента, но он просто резко переходит в координаты и так же возвращается 
Я попробовал через MoveTorwards , но там происходят странные вещи.  В одну сторону все передвигается плавно а в обратную обьект трясет 
public class Porshen3D : MonoBehaviour
{
   public GameObject midleShtyka;
   public Vector3 toPosition;
   public Vector3 firstPosition;
   public float force;
    bool click;
   
  
    void Start()
    {
        toPosition = midleShtyka.transform.position + toPosition;
        firstPosition = midleShtyka.transform.position;
    }
    void FixedUpdate()
    {
     if ( click)
        {
            
            StartCoroutine(MoveForward());
        }
    }
    private void OnMouseDown()
    {    
        click = true;
    }
    IEnumerator MoveForward()
    {
        if (click)
        { 
            midleShtyka.transform.position = Vector3.MoveTowards(midleShtyka.transform.position, toPosition, Time.deltaTime * force);
            yield return new WaitForSeconds(1);
            midleShtyka.transform.position = Vector3.MoveTowards(toPosition, firstPosition, Time.deltaTime * force);
           
        }
    }
}
На данный момент я сделал просто обычную анимацию которая вызывается через тригер в коде по клику мышки на обьект. Правильно ли это?Не костыль ли это?s
Как сделать это верно?
Если есть какая нибудь книга или ресурс после которого все вопросы отпадают , буду очень признателен)))