Unity использует код для перемещения объектов (плавное движение)

Поскольку начальная и конечная точки движения неопределенны, мы используем здесь код для его реализации вместо анимации (я попробовал анимацию, но обнаружил, что клип не удалось успешно добавить).

Существует два широко используемых метода перемещения объектов: Mathf.MoveTowards и Mathf.Lerp. Оба они используются для плавного перехода значений.

  • Mathf.MoveTowards 
MoveTowards(float current, float target, float maxDelta);

        текущий: стартовая позиция

        цель: целевое местоположение

        maxDelta: количество изменений в каждом кадре.

        Mathf.MoveTowards: эта функция постепенно перемещается от текущего значения к целевому значению с фиксированным шагом. Он обеспечивает максимальное количество изменений за кадр, обеспечивая плавность переходов, но скорость фиксирована.

  • Матф.Лерп
Lerp(float a, float b, float t);

        а: исходное положение

        б: целевое местоположение

        t: параметр интерполяции, диапазон значений от 0 до 1, указывающий ход перехода от a к b .

        Mathf.Lerp: Эта функция обеспечивает плавный переход за счет линейной интерполяции между двумя значениями на основе коэффициента интерполяции. Он принимает параметр интерполяции в диапазоне от 0 до 1, который можно регулировать для управления скоростью и эффектом перехода.

  • Разница между MoveToward и Lerp

        Mathf.MoveTowards: подходит для сцен, требующих плавного движения с фиксированной скоростью, например перемещения, вращения или масштабирования объектов.

        Mathf.Lerp: подходит для сцен, требующих плавных переходов на основе коэффициентов интерполяции, таких как цветовые градиенты, эффекты постепенного появления и затухания, плавное отслеживание камеры и т. д.

Примечание. Независимо от того, является ли это MoveToward или Lerp, значение будет меняться только один раз при каждом запуске. Чтобы объект перемещался плавно, вам необходимо поместить методы MoveToward и Lerp в оператор цикла while.

   while (elapsedTime < moveDuration)
        {
            // 使用插值方法计算当前位置
            float t = elapsedTime / moveDuration;
            Vector3 newPosition = Vector3.Lerp(initialPosition, targetPosition, t);

            // 更新物体的位置
            transform.position = newPosition;

            // 等待一帧
            yield return null;

            // 更新已经经过的时间
            elapsedTime += Time.deltaTime;
        }

Здесь используются временные условия, чтобы ограничить движение объектов в пределах продолжительности.Скорость будет увеличиваться по мере увеличения расстояния, поскольку параметром интерполяции Lerp является процент движения, чтобы объект мог двигаться плавно.

  • Расширять

        В единстве вы можете использовать Vector3.MoveTowards и Vector3.Lerp для реализации смещения объектов. Это удобнее, чем использование Mathf. Это перемещение трехмерных координат от точки к точке, а также содержит информацию о координатах xyz. Если он двумерный, вместо него можно использовать Vector2

Поскольку мне нужно, чтобы объект достиг «такого типа движения за один оборот, мне нужно добавить промежуточную точку. Если я использую здесь метод Mathf, код будет намного сложнее.

Vector3 targetPosition1 = new Vector3(targetPosition2.x, startPosition.y, 0);

while (obj.transform.position != targetPosition1)//当前位置等于目标位置是跳出循环
        {
            float t = elapsedTime / moveDuration;

            Vector3 newPosition = Vector3.Lerp(startPosition, targetPosition1, t);

            obj.transform.position = newPosition;//新的位置要赋值给物体
            // 等待一帧
            yield return null;

            elapsedTime += Time.deltaTime;
            if(elapsedTime > 5f)
            {
                Debug.Log("移动物体进入死循环");
                break;
            }
        }

Здесь также используется сопрограмма для реализации операции ожидания одного кадра после каждого движения.Последний оператор if предназначен для предотвращения входа в бесконечный цикл.На этом этапе реализуется функция, позволяющая объекту двигаться.

Guess you like

Origin blog.csdn.net/zsdxdfs/article/details/131746305