Unity usa código para mover objetos (movimiento suave)

Debido a que el punto de inicio y el punto final del movimiento son inciertos, usamos código para implementarlo aquí en lugar de animación (probé la animación, pero descubrí que el clip no se pudo agregar correctamente)

Hay dos métodos comúnmente utilizados para mover objetos, uno es Mathf.MoveTowards y el otro es Mathf.Lerp. Ambos se utilizan para una transición suave de valores.

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

        actual: posición inicial

        objetivo: ubicación de destino

        maxDelta: la cantidad de cambio en cada cuadro

        Mathf.MoveTowards: esta función se mueve gradualmente desde el valor actual al valor objetivo en un tamaño de paso fijo. Proporciona la máxima cantidad de cambios por fotograma, lo que garantiza que las transiciones sean suaves, pero la velocidad es fija.

  • Mathf.Lerp
Lerp(float a, float b, float t);

        a: posición inicial

        b: ubicación de destino

        t: parámetro de interpolación, el rango de valores es de 0 a 1, lo que indica el progreso de la transición de a a b .

        Mathf.Lerp: esta función logra una transición suave al interpolar linealmente entre dos valores según el coeficiente de interpolación. Acepta un parámetro de interpolación que va de 0 a 1, que se puede ajustar para controlar la velocidad de transición y el efecto.

  • La diferencia entre MoveToward y Lerp

        Mathf.MoveTowards: Adecuado para escenas que requieren un movimiento suave a una velocidad fija, como traslación, rotación o escalado de objetos.

        Mathf.Lerp: Adecuado para escenas que requieren transiciones suaves basadas en coeficientes de interpolación, como gradientes de color, efectos de aparición y desaparición gradual, seguimiento suave de la cámara, etc.

Nota: Ya sea MoveToward o Lerp, el valor solo cambiará una vez cada vez que se ejecute. Para que el objeto se mueva sin problemas, debe colocar los métodos MoveToward y Lerp en la instrucción del bucle while.

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

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

            // 等待一帧
            yield return null;

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

Aquí se utilizan condiciones de tiempo para limitar el movimiento de los objetos dentro de la duración. La velocidad aumentará a medida que la distancia se haga más larga, porque el parámetro de interpolación de Lerp es el porcentaje de movimiento, para que el objeto pueda moverse sin problemas.

  • Expandir

        En Unity, puede usar Vector3.MoveTowards y Vector3.Lerp para realizar el desplazamiento de objetos. Esto es más conveniente que usar Mathf. Es un movimiento punto a punto de coordenadas tridimensionales y también contiene información de coordenadas xyz. Si es bidimensional, puede usar Vector2 en su lugar

Como necesito que el objeto logre "este tipo de movimiento de una vuelta", necesito agregar un punto intermedio. Si uso el método de Mathf aquí, el código será mucho más complicado.

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;
            }
        }

Aquí también se usa una corrutina para implementar la operación de esperar un cuadro después de cada movimiento, la declaración if final es para evitar entrar en un bucle infinito, en este punto se implementa una función que permite que el objeto se mueva.

Supongo que te gusta

Origin blog.csdn.net/zsdxdfs/article/details/131746305
Recomendado
Clasificación