Использование отдельных данных о временном шаге для преобразования позиций Лерпа? - PullRequest
1 голос
/ 30 января 2020

У меня большой набор данных, который содержит данные о местоположении транспортного средства с интервалом 0,1 секунды, и я пытался взять эти данные и плавно анимировать игровой объект вдоль этих позиций.

Я попытался использовать AnimationCurves и добавить ключевые кадры для отдельной оси, аналогичные этой

    public AnimationCurve ac;
    public AnimationCurve ac1;
    public Vector3 pos1 = new Vector3(0.0f, 0.0f, 0.0f);
    public Vector3 pos2 = new Vector3(0.0f, 0.0f, 0.0f);

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(Move(pos1, pos2, ac, ac1, 3.0f));
        }
    }

    IEnumerator Move(Vector3 pos1, Vector3 pos2, AnimationCurve ac, AnimationCurve ac1, float time)
    {
        float timer = 0.0f;
        while (timer <= time)
        {
            var x = Mathf.Lerp(pos1.x, pos2.x, ac.Evaluate(timer / time));
            var y = Mathf.Lerp(pos1.y, pos2.y, ac1.Evaluate(timer / time));

            transform.position = new Vector3(x, y, 0);
            timer += Time.deltaTime;
            yield return null;
        }
    }

Однако я не мог понять, как преобразовать позиционные данные с долей секунды в правильные значения для AnimationClip.

Я также попытался использовать цикл по позициям с сопрограммами, подобными этому:

   var coords = vehicles[0].middleCoords;
        var previousStep = coords[0];
        foreach(Vector3 step in coords)
        {
            MoveOverSeconds(step, 0.1f);
        }

  public IEnumerator MoveOverSeconds(Vector3 end, float seconds)
    {
        yield return new WaitForSeconds(seconds);
        float elapsedTime = 0;
        Vector3 startingPos = transform.position;
        while (elapsedTime < seconds)
        {
            transform.position = Vector3.Lerp(startingPos, end, (elapsedTime / seconds));
            elapsedTime += Time.deltaTime;
            yield return new WaitForEndOfFrame();
        }
        transform.position = end;

Однако, поскольку for l oop работает независимо от времени, он запускает подпрограмму раньше других один заканчивается. Любая помощь в решении этой проблемы будет принята с благодарностью.

...