Как сделать «плавное» перемещение обьекта?
Сейчас игрок может перемещать обьект, но это не достаточно плавно. Как сделать плавнее?
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.