es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Unity 3D Hacer que los objetos sigan al jugador

Estoy tratando de hacer que los objetos sigan al jugador con un desplazamiento sin demora en el eje Z, pero con retraso en el eje X. Cuando el jugador entra en el desencadenador de un objeto (moneda), agrego este objeto a una lista y actualizo la posición de cada uno utilizando este código. Cada moneda tiene una moneda anterior y una siguiente a la que sigue la moneda actual.

“`private void UpdateCoinPositions()
{
foreach (Coin coin in coins)
{
Vector3 desiredPos = new Vector3(
coin.previous.transform.position.x,
coin.previous.transform.position.y,
coin.previous.transform.position.z + .15f);

<pre><code> Vector3 smoothedPos = Vector3.Lerp(
coin.transform.position,
desiredPos,
smoothness);

coin.transform.position = smoothedPos;
}
</code></pre>

}
“`

Quiero obtener este resultado:

Esto es lo que obtuve:

Pero como puedes ver, las monedas a veces tienen dificultades. No están actualizando sus posiciones correctamente. No quiero hacerlos hijos porque necesito moverlos en el eje X con retraso.

Agradecería si puedes ayudarme.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución para mover objetos suavemente con un desplazamiento

    Para hacer que las monedas sigan al jugador sin retrasos en el eje Z, pero con un movimiento retrasado en el eje X, se pueden seguir los siguientes pasos:

    1. Revisar el código que actualiza la posición de las monedas para tener en cuenta el desplazamiento en el eje X.
    2. Utilizar un enfoque diferente para mover suavemente las monedas, como utilizar una rutina.
    3. Asegurarse de que la posición de cada moneda se actualice de manera consistente, incluso cuando el jugador se mueva rápidamente.

    1. Actualizar el código de posición de las monedas

    Para mover las monedas con un desplazamiento sin introducir retrasos, se debe actualizar el código utilizado para actualizar sus posiciones. Se puede utilizar el siguiente código:

    private void UpdateCoinPositions()
    {
        foreach (Coin coin in coins)
        {
            Vector3 desiredPos = new Vector3(
                coin.previous.transform.position.x + x_offset,
                coin.previous.transform.position.y,
                coin.previous.transform.position.z + z_offset);
    
            coin.transform.position = desiredPos;
        }
    }
    

    La variable “x_offset” se utiliza para controlar la cantidad de retraso en el eje X. Por ejemplo, si se establece “x_offset” en 0.5, cada moneda seguirá a la moneda anterior en la lista, pero lo hará con un retraso de 0.5 unidades en el eje X.

    2. Utilizar una rutina

    Otro enfoque para mover objetos suavemente es utilizar una rutina. Una rutina es un método que puede pausar y reanudar la ejecución en puntos específicos, lo que permite un control más preciso sobre el tiempo y la ejecución del código.

    Aquí tienes un ejemplo de una rutina que mueve una moneda suavemente con un desplazamiento:

    IEnumerator MoveCoin(Coin coin)
    {
        Vector3 startPos = coin.transform.position;
        Vector3 endPos = new Vector3(
            coin.previous.transform.position.x + x_offset,
            coin.previous.transform.position.y,
            coin.previous.transform.position.z + z_offset);
    
        float t = 0;
    
        while (t < duration)
        {
            t += Time.deltaTime;
            coin.transform.position = Vector3.Lerp(startPos, endPos, t / duration);
            yield return null;
        }
    
        coin.transform.position = endPos;
    }
    

    En este ejemplo, la variable “duration” controla el tiempo que tarda la moneda en moverse desde su posición actual hasta su posición deseada. La rutina “MoveCoin” se puede llamar para cada moneda de la lista, lo que permite un control más preciso sobre el tiempo y la ejecución del código.

    3. Actualizaciones consistentes

    Para asegurarse de que la posición de cada moneda se actualice de manera consistente, incluso cuando el jugador se mueva rápidamente, es importante llamar a la función de actualización regularmente. Esto se puede hacer agregando el siguiente código a la función Update:

    private void Update()
    {
        UpdateCoinPositions();
    }
    

    Al llamar a la función de actualización de posición en cada frame, la posición de cada moneda se actualizará de manera consistente, independientemente de la velocidad de movimiento del jugador o del número de monedas en la lista.

    Siguiendo estos pasos, las monedas deberían moverse suavemente con un retraso en el eje X mientras se actualizan sus posiciones de manera consistente.

Comments are closed.