Как смягчить повороты объекта?

Добрый день! Рисую через Line Renderer линию и пускаю объект по этому пути. Всё работает нормально за исключением дёрганья объекта на поворотах. Подскажите как убрать эти дёрганья и сделать повороты и вообще само движение объекта плавное и приятное для глаз. Спасибо. Код ниже и то, как у меня сейчас это работает
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float speed = 5f;

    [SerializeField]
    private LineRenderer lineRenderer;
    private List<Vector3> linePoints = new List<Vector3>();
    private int targetPointIndex = 0;
    private Vector3 targetPoint;
    private float lineLength;
    private float elapsedTime;
    private bool isMoving = false;

    void Start()
    {
        lineRenderer = GetComponent<LineRenderer>();
    }

    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            mousePosition.z = 0;
            linePoints.Add(mousePosition);

            if (lineRenderer != null)
            {
                lineRenderer.positionCount = linePoints.Count;
                lineRenderer.SetPosition(linePoints.Count - 1, mousePosition);
            }
        }

        if (Input.GetMouseButtonUp(0))
        {
            lineLength = 0;
            for (int i = 1; i < linePoints.Count; i++)
            {
                lineLength += Vector3.Distance(linePoints[i], linePoints[i - 1]);
            }

            targetPointIndex = 1;
            targetPoint = linePoints[targetPointIndex];
            transform.up = (targetPoint - transform.position).normalized;

            isMoving = true;
        }

        if (isMoving && linePoints.Count > 1 && targetPointIndex < linePoints.Count)
        {
            Vector3 direction = (targetPoint - transform.position).normalized;
            transform.up = direction;
            transform.position += direction * speed * Time.deltaTime;

            if (Vector3.Distance(transform.position, targetPoint) < 0.1f)
            {
                targetPointIndex++;
                if (targetPointIndex < linePoints.Count)
                {
                    targetPoint = linePoints[targetPointIndex];
                    transform.up = (targetPoint - transform.position).normalized;
                }
            }
        }
    }
}

Как это работает сейчас
  • Вопрос задан
  • 57 просмотров
Пригласить эксперта
Ответы на вопрос 1
twobomb
@twobomb
Ну естественно откуда там плавность если точки стоят друг возле друга и соеденены прямыми линиями.
Вам нужно вашу линию преобразовывать в набор квадратичных или кубических кривых безье.
И двигать нужно присваивая напрямую координаты получаемые из функции которая возвращает координату точки на кривой безье в определенном deltaT, и deltaT двигать одним шагом ну или если нужно делать ускорение,то плавно увеличивать шаг deltaT.
P.S. Когда-то делал нечто подобное на канвасе, можешь выдрать себе функции получения точки на кривой и функцию интерполяции между двумя 4х точечными кривыми
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы