Gameobject вибрирует на протяжении всего движения - PullRequest
0 голосов
/ 17 марта 2020

У меня есть GameObject, который получает координаты позиции из файла. Этот GameObject движется вибрирует, а не плавно. (как будто двигаясь вперед и назад.)

Это код, который предоставляет движение:

int counter = 0;
void Update()
{

        var maxDistance = speed_* Time.deltaTime;
        var oldPosition = transform.position;
        var newPosition = Vector3.MoveTowards(transform.position, positions[counter], maxDistance);
        var actualDistance = Vector3.Distance(newPosition, oldPosition);
        var distanceRemainder = maxDistance - actualDistance;

        if (distanceRemainder > 0.0001)
        {
            newPosition = Vector3.MoveTowards(newPosition, positions[counter], distanceRemainder);
            counter++;

        }

        transform.localPosition = newPosition;


}

ПРИМЕЧАНИЕ. Данные, считанные из файла, находятся в массиве «позиции» ( координаты x, y, z).

Когда я понижаю значение 300f в переменной maxDistance, вибрация прекращается, и движение становится более плавным. Тем не менее, скорость Gameobject также замедляется. Как я могу обеспечить быстрое и плавное движение?

РЕШЕНИЕ:

При поиске решения проблемы я наткнулся на this топи c. Это помогло мне узнать источник проблемы.

Я заметил, что GameObject не вибрирует в виде сцены, он двигается плавно. Но объект, казалось, вибрирует в GameView. Проблема не в движущемся объекте, а в функции камеры, которую я пишу, чтобы следить за ним.

Функция камеры, которая была написана для отслеживания объекта, была обновлена, и проблема исчезла.

Спасибо всем, кто пытается помочь.

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Я предполагаю, что вы хотите, чтобы ваш объект двигался с постоянной скоростью в первую позицию. Как только он достигнет этого, перейдите к следующему.

Я бы сделал это простым Coroutine , который лучше понять и поддержать, чем делать вещи в Update:

private void Start()
{
    // todo assign positions

    StartCoroutine(RunPositions());
}

private IEnumerator RunPositions()
{
    foreach(var position in positions)
    {
        while(!Mathf.Approximately(Vector3.Distance(transform.position, position), 0))
        {
            var maxDistance = speed_* Time.deltaTime;

            transform.position = Vector3.MoveTowards(transform.position, positions[counter], maxDistance);

            // render and continue in the next frame
            yield return null;
        }
    }
}

Если у вас все в порядке с точностью 0.00001, вы также можете просто использовать

while(transform.position != position)

.

0 голосов
/ 17 марта 2020

Это вызвано тем, что вы используете свой distanceRemainder в качестве maxDistanceDelta, что я считаю неправильным; если вы хотите плавного движения, вам нужно умножить его на Time.deltaTime, попробуйте:

newPosition = Vector3.MoveTowards(newPosition, positions[counter], distanceRemainder*Time.deltaTime);

Или просто объявите переменную скорости и выполните:

newPosition = Vector3.MoveTowards(newPosition, positions[counter], speed*Time.deltaTime);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...