Как сделать «плавное» перемещение обьекта?

Сейчас игрок может перемещать обьект, но это не достаточно плавно. Как сделать плавнее?

Видео

using UnityEngine;

public class Grabbing : MonoBehaviour
{
[SerializeField] float maxDistance;
[SerializeField] float GrapPower;
[Space] 
[SerializeField] Transform Offset;

Transform GrabObj;
RaycastHit hit;
bool grab;

private void FixedUpdate()
{
    if (Input.GetKeyDown(KeyCode.Mouse0) || grab)
    {
        Grab();
    }
    if (Input.GetKeyDown(KeyCode.E) && grab)
    {
        Put();
    }
}

private void Grab()
{
    var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    Physics.Raycast(ray, out hit, maxDistance);
    if(grab)
    {
        GrabObj.position = Offset.position;
    }
    else if(hit.rigidbody)
    {
        grab = true;
        hit.rigidbody.useGravity = false;
        Offset.position = hit.transform.position;
        GrabObj = hit.transform;
    }
}


private void Put()
{
    GrabObj.GetComponent<Rigidbody>().useGravity = true;
    grab = false;
}
}

Ответы (1 шт):

Автор решения: SLiver

Попробуйте то, что у Вас находится в функции Grab и Put использовать прямо в самом fixedUpdate.

Сейчас у вас так:

private void FixedUpdate()
{
    if (Input.GetKeyDown(KeyCode.Mouse0) || grab)
    {
        Grab();
    }
    if (Input.GetKeyDown(KeyCode.E) && grab)
    {
        Put();
    }
}
private void Grab()
{
    //Grab код
}
private void Put()
{
    //Put код
}

Я предлагаю сделать напрямую, то есть как-то так:

private void FixedUpdate()
{
    if (Input.GetKeyDown(KeyCode.Mouse0) || grab)
    {
        //Grab код
    }
    if (Input.GetKeyDown(KeyCode.E) && grab)
    {
        //Put код
    }
}

Или grab и put код вызывать не в fixedUpdate, а в LateUpdate, но хочу заметить, что LateUpdate - это не FixedUpdate, физика в LateUpdate зависит от FPS, так что, если Вы будете использовать Grab и Put код в LateUpdate, то всё физические величины и действия (например движение) нужно умножать на Time.deltaTime.

→ Ссылка